diff options
author | Matt A. Tobin <email@mattatobin.com> | 2020-04-17 07:43:40 -0400 |
---|---|---|
committer | Matt A. Tobin <email@mattatobin.com> | 2020-04-17 07:43:40 -0400 |
commit | 80c024779929d44397a8c03d2fa7808f97f2c21a (patch) | |
tree | e961240621bd07d87e8a45e3006da7c02c890306 /dom | |
parent | 6d76ab9b6c19d0829c343e1bc3cd7865221d64ba (diff) | |
download | UXP-80c024779929d44397a8c03d2fa7808f97f2c21a.tar UXP-80c024779929d44397a8c03d2fa7808f97f2c21a.tar.gz UXP-80c024779929d44397a8c03d2fa7808f97f2c21a.tar.lz UXP-80c024779929d44397a8c03d2fa7808f97f2c21a.tar.xz UXP-80c024779929d44397a8c03d2fa7808f97f2c21a.zip |
Issue #1375 - Fix IsWebComponentsEnabled checks
Diffstat (limited to 'dom')
-rw-r--r-- | dom/base/nsDocument.cpp | 76 | ||||
-rw-r--r-- | dom/base/nsDocument.h | 16 | ||||
-rw-r--r-- | dom/webidl/Element.webidl | 8 |
3 files changed, 32 insertions, 68 deletions
diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp index 745d170f1..7b280a188 100644 --- a/dom/base/nsDocument.cpp +++ b/dom/base/nsDocument.cpp @@ -2242,6 +2242,29 @@ WarnIfSandboxIneffective(nsIDocShell* aDocShell, } } +bool +nsDocument::IsWebComponentsEnabled(JSContext* aCx, JSObject* aObject) +{ + if (!nsContentUtils::IsWebComponentsEnabled()) { + return false; + } + + JS::Rooted<JSObject*> obj(aCx, aObject); + + JSAutoCompartment ac(aCx, obj); + JS::Rooted<JSObject*> global(aCx, JS_GetGlobalForObject(aCx, obj)); + nsCOMPtr<nsPIDOMWindowInner> window = + do_QueryInterface(nsJSUtils::GetStaticScriptGlobal(global)); + + nsIDocument* doc = window ? window->GetExtantDoc() : nullptr; + if (doc && doc->IsStyledByServo()) { + NS_WARNING("stylo: Web Components not supported yet"); + return false; + } + + return true; +} + nsresult nsDocument::StartDocumentLoad(const char* aCommand, nsIChannel* aChannel, nsILoadGroup* aLoadGroup, @@ -5582,64 +5605,11 @@ nsIDocument::CreateAttributeNS(const nsAString& aNamespaceURI, } bool -nsDocument::IsWebComponentsEnabled(JSContext* aCx, JSObject* aObject) -{ - JS::Rooted<JSObject*> obj(aCx, aObject); - - if (nsContentUtils::IsWebComponentsEnabled()) { - return true; - } - - // Check for the webcomponents permission. See Bug 1181555. - JSAutoCompartment ac(aCx, obj); - JS::Rooted<JSObject*> global(aCx, JS_GetGlobalForObject(aCx, obj)); - nsCOMPtr<nsPIDOMWindowInner> window = - do_QueryInterface(nsJSUtils::GetStaticScriptGlobal(global)); - - return IsWebComponentsEnabled(window); -} - -bool nsDocument::IsWebComponentsEnabled(const nsINode* aNode) { return aNode->OwnerDoc()->IsWebComponentsEnabled(); } -bool -nsDocument::IsWebComponentsEnabled(dom::NodeInfo* aNodeInfo) -{ - if (nsContentUtils::IsWebComponentsEnabled()) { - return true; - } - - nsIDocument* doc = aNodeInfo->GetDocument(); - // Use GetScopeObject() here so that data documents work the same way as the - // main document they're associated with. - nsCOMPtr<nsPIDOMWindowInner> window = - do_QueryInterface(doc->GetScopeObject()); - return IsWebComponentsEnabled(window); -} - -bool -nsDocument::IsWebComponentsEnabled(nsPIDOMWindowInner* aWindow) -{ - if (aWindow) { - nsresult rv; - nsCOMPtr<nsIPermissionManager> permMgr = - do_GetService(NS_PERMISSIONMANAGER_CONTRACTID, &rv); - NS_ENSURE_SUCCESS(rv, false); - - uint32_t perm; - rv = permMgr->TestPermissionFromWindow( - aWindow, "moz-extremely-unstable-and-will-change-webcomponents", &perm); - NS_ENSURE_SUCCESS(rv, false); - - return perm == nsIPermissionManager::ALLOW_ACTION; - } - - return false; -} - NS_IMETHODIMP nsDocument::GetElementsByTagName(const nsAString& aTagname, nsIDOMNodeList** aReturn) diff --git a/dom/base/nsDocument.h b/dom/base/nsDocument.h index 4ab285840..6520d905d 100644 --- a/dom/base/nsDocument.h +++ b/dom/base/nsDocument.h @@ -755,6 +755,11 @@ public: virtual void NotifyLayerManagerRecreated() override; + // Check whether web components are enabled for the global of aObject. + static bool IsWebComponentsEnabled(JSContext* aCx, JSObject* aObject); + // Check whether web components are enabled for the document this node belongs + // to. + static bool IsWebComponentsEnabled(const nsINode* aNode); private: void AddOnDemandBuiltInUASheet(mozilla::StyleSheet* aSheet); nsRadioGroupStruct* GetRadioGroupInternal(const nsAString& aName) const; @@ -1341,17 +1346,6 @@ protected: nsWeakPtr mFullscreenRoot; public: - // Check whether web components are enabled for the global of aObject. - static bool IsWebComponentsEnabled(JSContext* aCx, JSObject* aObject); - // Check whether web components are enabled for the document this node belongs - // to. - static bool IsWebComponentsEnabled(const nsINode* aNode); - // Check whether web components are enabled for the global of the document - // this nodeinfo comes from. - static bool IsWebComponentsEnabled(mozilla::dom::NodeInfo* aNodeInfo); - // Check whether web components are enabled for the given window. - static bool IsWebComponentsEnabled(nsPIDOMWindowInner* aWindow); - RefPtr<mozilla::EventListenerManager> mListenerManager; RefPtr<nsDOMStyleSheetSetList> mStyleSheetSetList; RefPtr<nsScriptLoader> mScriptLoader; diff --git a/dom/webidl/Element.webidl b/dom/webidl/Element.webidl index 2f7e934b8..d5cac7c64 100644 --- a/dom/webidl/Element.webidl +++ b/dom/webidl/Element.webidl @@ -236,17 +236,17 @@ dictionary ShadowRootInit { // https://dom.spec.whatwg.org/#element partial interface Element { // Shadow DOM v1 - [Throws, Pref="nsDocument::IsWebComponentsEnabled"] + [Throws, Func="nsDocument::IsWebComponentsEnabled"] ShadowRoot attachShadow(ShadowRootInit shadowRootInitDict); [BinaryName="shadowRootByMode", Func="nsDocument::IsWebComponentsEnabled"] readonly attribute ShadowRoot? shadowRoot; - [BinaryName="assignedSlotByMode", Pref="nsDocument::IsWebComponentsEnabled"] + [BinaryName="assignedSlotByMode", Func="nsDocument::IsWebComponentsEnabled"] readonly attribute HTMLSlotElement? assignedSlot; - [CEReactions, Unscopable, SetterThrows, Pref="nsDocument::IsWebComponentsEnabled"] + [CEReactions, Unscopable, SetterThrows, Func="nsDocument::IsWebComponentsEnabled"] attribute DOMString slot; // [deprecated] Shadow DOM v0 - [Throws, Pref="nsDocument::IsWebComponentsEnabled"] + [Throws, Func="nsDocument::IsWebComponentsEnabled"] ShadowRoot createShadowRoot(); }; |