Loading docshell/base/CanonicalBrowsingContext.cpp +6 −10 Original line number Diff line number Diff line Loading @@ -2779,12 +2779,8 @@ void CanonicalBrowsingContext::CancelSessionStoreUpdate() { } void CanonicalBrowsingContext::SetContainerFeaturePolicy( FeaturePolicy* aContainerFeaturePolicy) { mContainerFeaturePolicy = aContainerFeaturePolicy; if (WindowGlobalParent* current = GetCurrentWindowGlobal()) { Unused << current->SendSetContainerFeaturePolicy(mContainerFeaturePolicy); } Maybe<FeaturePolicyInfo>&& aContainerFeaturePolicyInfo) { mContainerFeaturePolicyInfo = std::move(aContainerFeaturePolicyInfo); } void CanonicalBrowsingContext::SetCrossGroupOpenerId(uint64_t aOpenerId) { Loading Loading @@ -3202,15 +3198,15 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(CanonicalBrowsingContext, if (tmp->mSessionHistory) { tmp->mSessionHistory->SetBrowsingContext(nullptr); } NS_IMPL_CYCLE_COLLECTION_UNLINK(mSessionHistory, mContainerFeaturePolicy, mCurrentBrowserParent, mWebProgress, NS_IMPL_CYCLE_COLLECTION_UNLINK(mSessionHistory, mCurrentBrowserParent, mWebProgress, mSessionStoreSessionStorageUpdateTimer) NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(CanonicalBrowsingContext, BrowsingContext) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSessionHistory, mContainerFeaturePolicy, mCurrentBrowserParent, mWebProgress, NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSessionHistory, mCurrentBrowserParent, mWebProgress, mSessionStoreSessionStorageUpdateTimer) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END Loading docshell/base/CanonicalBrowsingContext.h +6 −4 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ #include "mozilla/dom/BrowsingContext.h" #include "mozilla/dom/MediaControlKeySource.h" #include "mozilla/dom/BrowsingContextWebProgress.h" #include "mozilla/dom/FeaturePolicy.h" #include "mozilla/dom/ProcessIsolation.h" #include "mozilla/dom/Promise.h" #include "mozilla/dom/SessionHistoryEntry.h" Loading Loading @@ -314,9 +315,10 @@ class CanonicalBrowsingContext final : public BrowsingContext { void ResetScalingZoom(); void SetContainerFeaturePolicy(FeaturePolicy* aContainerFeaturePolicy); FeaturePolicy* GetContainerFeaturePolicy() const { return mContainerFeaturePolicy; void SetContainerFeaturePolicy( Maybe<FeaturePolicyInfo>&& aContainerFeaturePolicyInfo); const Maybe<FeaturePolicyInfo>& GetContainerFeaturePolicy() const { return mContainerFeaturePolicyInfo; } void SetRestoreData(SessionStoreRestoreData* aData, ErrorResult& aError); Loading Loading @@ -581,7 +583,7 @@ class CanonicalBrowsingContext final : public BrowsingContext { nsCOMPtr<nsIWebProgressListener> mDocShellProgressBridge; RefPtr<nsBrowserStatusFilter> mStatusFilter; RefPtr<FeaturePolicy> mContainerFeaturePolicy; Maybe<FeaturePolicyInfo> mContainerFeaturePolicyInfo; friend class BrowserSessionStore; WeakPtr<SessionStoreFormData>& GetSessionStoreFormDataRef() { Loading docshell/base/nsDocShell.cpp +6 −2 Original line number Diff line number Diff line Loading @@ -6586,8 +6586,6 @@ nsresult nsDocShell::CreateAboutBlankDocumentViewer( // after being set here. blankDoc->SetSandboxFlags(sandboxFlags); blankDoc->InitFeaturePolicy(); // create a content viewer for us and the new document docFactory->CreateInstanceForDocument( NS_ISUPPORTS_CAST(nsIDocShell*, this), blankDoc, "view", Loading @@ -6605,6 +6603,12 @@ nsresult nsDocShell::CreateAboutBlankDocumentViewer( /* aLocationFlags */ 0); rv = mIsBeingDestroyed ? NS_ERROR_NOT_AVAILABLE : NS_OK; } if (Element* embedderElement = blankDoc->GetEmbedderElement()) { blankDoc->InitFeaturePolicy(AsVariant(embedderElement)); } else { blankDoc->InitFeaturePolicy(AsVariant(Nothing{})); } } } Loading dom/base/Document.cpp +45 −49 Original line number Diff line number Diff line Loading @@ -180,6 +180,7 @@ #include "mozilla/dom/HTMLBodyElement.h" #include "mozilla/dom/HTMLCollectionBinding.h" #include "mozilla/dom/HTMLDialogElement.h" #include "mozilla/dom/HTMLEmbedElement.h" #include "mozilla/dom/HTMLFormElement.h" #include "mozilla/dom/HTMLIFrameElement.h" #include "mozilla/dom/HTMLImageElement.h" Loading @@ -187,6 +188,7 @@ #include "mozilla/dom/HTMLLinkElement.h" #include "mozilla/dom/HTMLMediaElement.h" #include "mozilla/dom/HTMLMetaElement.h" #include "mozilla/dom/HTMLObjectElement.h" #include "mozilla/dom/HTMLSharedElement.h" #include "mozilla/dom/HTMLTextAreaElement.h" #include "mozilla/dom/ImageTracker.h" Loading Loading @@ -3869,74 +3871,68 @@ nsresult Document::InitCSP(nsIChannel* aChannel) { return NS_OK; } static Document* GetInProcessParentDocumentFrom(BrowsingContext* aContext) { BrowsingContext* parentContext = aContext->GetParent(); if (!parentContext) { return nullptr; static FeaturePolicy* GetFeaturePolicyFromElement(Element* aElement) { if (auto* iframe = HTMLIFrameElement::FromNodeOrNull(aElement)) { return iframe->FeaturePolicy(); } WindowContext* windowContext = parentContext->GetCurrentWindowContext(); if (!windowContext) { if (!HTMLObjectElement::FromNodeOrNull(aElement) && !HTMLEmbedElement::FromNodeOrNull(aElement)) { return nullptr; } return windowContext->GetDocument(); return aElement->OwnerDoc()->FeaturePolicy(); } already_AddRefed<dom::FeaturePolicy> Document::GetParentFeaturePolicy() { BrowsingContext* browsingContext = GetBrowsingContext(); if (!browsingContext) { return nullptr; } if (!browsingContext->IsContentSubframe()) { return nullptr; } void Document::InitFeaturePolicy( const Variant<Nothing, FeaturePolicyInfo, Element*>& aContainerFeaturePolicy) { MOZ_ASSERT(mFeaturePolicy, "we should have FeaturePolicy created"); HTMLIFrameElement* iframe = HTMLIFrameElement::FromNodeOrNull(browsingContext->GetEmbedderElement()); if (iframe) { return do_AddRef(iframe->FeaturePolicy()); } mFeaturePolicy->ResetDeclaredPolicy(); if (XRE_IsParentProcess()) { return do_AddRef(browsingContext->Canonical()->GetContainerFeaturePolicy()); } mFeaturePolicy->SetDefaultOrigin(NodePrincipal()); if (Document* parentDocument = GetInProcessParentDocumentFrom(browsingContext)) { return do_AddRef(parentDocument->FeaturePolicy()); RefPtr<dom::FeaturePolicy> featurePolicy = mFeaturePolicy; aContainerFeaturePolicy.match( [](const Nothing&) {}, [featurePolicy](const FeaturePolicyInfo& aContainerFeaturePolicy) { // Let's inherit the policy from the possibly cross-origin container. featurePolicy->InheritPolicy(aContainerFeaturePolicy); featurePolicy->SetSrcOrigin(aContainerFeaturePolicy.mSrcOrigin); }, [featurePolicy](Element* aContainer) { // Let's inherit the policy from the parent container element if it // exists. if (RefPtr<dom::FeaturePolicy> containerFeaturePolicy = GetFeaturePolicyFromElement(aContainer)) { featurePolicy->InheritPolicy(containerFeaturePolicy); featurePolicy->SetSrcOrigin(containerFeaturePolicy->GetSrcOrigin()); } WindowContext* windowContext = browsingContext->GetCurrentWindowContext(); if (!windowContext) { return nullptr; }); } WindowGlobalChild* child = windowContext->GetWindowGlobalChild(); if (!child) { Element* GetEmbedderElementFrom(BrowsingContext* aBrowsingContext) { if (!aBrowsingContext) { return nullptr; } return do_AddRef(child->GetContainerFeaturePolicy()); if (!aBrowsingContext->IsContentSubframe()) { return nullptr; } void Document::InitFeaturePolicy() { MOZ_ASSERT(mFeaturePolicy, "we should have FeaturePolicy created"); mFeaturePolicy->ResetDeclaredPolicy(); mFeaturePolicy->SetDefaultOrigin(NodePrincipal()); RefPtr<mozilla::dom::FeaturePolicy> parentPolicy = GetParentFeaturePolicy(); if (parentPolicy) { // Let's inherit the policy from the parent HTMLIFrameElement if it exists. mFeaturePolicy->InheritPolicy(parentPolicy); mFeaturePolicy->SetSrcOrigin(parentPolicy->GetSrcOrigin()); } return aBrowsingContext->GetEmbedderElement(); } nsresult Document::InitFeaturePolicy(nsIChannel* aChannel) { InitFeaturePolicy(); nsCOMPtr<nsILoadInfo> loadInfo = aChannel->LoadInfo(); if (Element* embedderElement = GetEmbedderElementFrom(GetBrowsingContext())) { InitFeaturePolicy(AsVariant(embedderElement)); } else if (Maybe<FeaturePolicyInfo> featurePolicyContainer = loadInfo->GetContainerFeaturePolicyInfo()) { InitFeaturePolicy(AsVariant(*featurePolicyContainer)); } else { InitFeaturePolicy(AsVariant(Nothing{})); } // We don't want to parse the http Feature-Policy header if this pref is off. if (!StaticPrefs::dom_security_featurePolicy_header_enabled()) { Loading dom/base/Document.h +2 −1 Original line number Diff line number Diff line Loading @@ -1503,7 +1503,8 @@ class Document : public nsINode, void DoNotifyPossibleTitleChange(); void InitFeaturePolicy(); void InitFeaturePolicy(const Variant<Nothing, FeaturePolicyInfo, Element*>& aContainerFeaturePolicy); nsresult InitFeaturePolicy(nsIChannel* aChannel); void EnsureNotEnteringAndExitFullscreen(); Loading Loading
docshell/base/CanonicalBrowsingContext.cpp +6 −10 Original line number Diff line number Diff line Loading @@ -2779,12 +2779,8 @@ void CanonicalBrowsingContext::CancelSessionStoreUpdate() { } void CanonicalBrowsingContext::SetContainerFeaturePolicy( FeaturePolicy* aContainerFeaturePolicy) { mContainerFeaturePolicy = aContainerFeaturePolicy; if (WindowGlobalParent* current = GetCurrentWindowGlobal()) { Unused << current->SendSetContainerFeaturePolicy(mContainerFeaturePolicy); } Maybe<FeaturePolicyInfo>&& aContainerFeaturePolicyInfo) { mContainerFeaturePolicyInfo = std::move(aContainerFeaturePolicyInfo); } void CanonicalBrowsingContext::SetCrossGroupOpenerId(uint64_t aOpenerId) { Loading Loading @@ -3202,15 +3198,15 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(CanonicalBrowsingContext, if (tmp->mSessionHistory) { tmp->mSessionHistory->SetBrowsingContext(nullptr); } NS_IMPL_CYCLE_COLLECTION_UNLINK(mSessionHistory, mContainerFeaturePolicy, mCurrentBrowserParent, mWebProgress, NS_IMPL_CYCLE_COLLECTION_UNLINK(mSessionHistory, mCurrentBrowserParent, mWebProgress, mSessionStoreSessionStorageUpdateTimer) NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(CanonicalBrowsingContext, BrowsingContext) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSessionHistory, mContainerFeaturePolicy, mCurrentBrowserParent, mWebProgress, NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSessionHistory, mCurrentBrowserParent, mWebProgress, mSessionStoreSessionStorageUpdateTimer) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END Loading
docshell/base/CanonicalBrowsingContext.h +6 −4 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ #include "mozilla/dom/BrowsingContext.h" #include "mozilla/dom/MediaControlKeySource.h" #include "mozilla/dom/BrowsingContextWebProgress.h" #include "mozilla/dom/FeaturePolicy.h" #include "mozilla/dom/ProcessIsolation.h" #include "mozilla/dom/Promise.h" #include "mozilla/dom/SessionHistoryEntry.h" Loading Loading @@ -314,9 +315,10 @@ class CanonicalBrowsingContext final : public BrowsingContext { void ResetScalingZoom(); void SetContainerFeaturePolicy(FeaturePolicy* aContainerFeaturePolicy); FeaturePolicy* GetContainerFeaturePolicy() const { return mContainerFeaturePolicy; void SetContainerFeaturePolicy( Maybe<FeaturePolicyInfo>&& aContainerFeaturePolicyInfo); const Maybe<FeaturePolicyInfo>& GetContainerFeaturePolicy() const { return mContainerFeaturePolicyInfo; } void SetRestoreData(SessionStoreRestoreData* aData, ErrorResult& aError); Loading Loading @@ -581,7 +583,7 @@ class CanonicalBrowsingContext final : public BrowsingContext { nsCOMPtr<nsIWebProgressListener> mDocShellProgressBridge; RefPtr<nsBrowserStatusFilter> mStatusFilter; RefPtr<FeaturePolicy> mContainerFeaturePolicy; Maybe<FeaturePolicyInfo> mContainerFeaturePolicyInfo; friend class BrowserSessionStore; WeakPtr<SessionStoreFormData>& GetSessionStoreFormDataRef() { Loading
docshell/base/nsDocShell.cpp +6 −2 Original line number Diff line number Diff line Loading @@ -6586,8 +6586,6 @@ nsresult nsDocShell::CreateAboutBlankDocumentViewer( // after being set here. blankDoc->SetSandboxFlags(sandboxFlags); blankDoc->InitFeaturePolicy(); // create a content viewer for us and the new document docFactory->CreateInstanceForDocument( NS_ISUPPORTS_CAST(nsIDocShell*, this), blankDoc, "view", Loading @@ -6605,6 +6603,12 @@ nsresult nsDocShell::CreateAboutBlankDocumentViewer( /* aLocationFlags */ 0); rv = mIsBeingDestroyed ? NS_ERROR_NOT_AVAILABLE : NS_OK; } if (Element* embedderElement = blankDoc->GetEmbedderElement()) { blankDoc->InitFeaturePolicy(AsVariant(embedderElement)); } else { blankDoc->InitFeaturePolicy(AsVariant(Nothing{})); } } } Loading
dom/base/Document.cpp +45 −49 Original line number Diff line number Diff line Loading @@ -180,6 +180,7 @@ #include "mozilla/dom/HTMLBodyElement.h" #include "mozilla/dom/HTMLCollectionBinding.h" #include "mozilla/dom/HTMLDialogElement.h" #include "mozilla/dom/HTMLEmbedElement.h" #include "mozilla/dom/HTMLFormElement.h" #include "mozilla/dom/HTMLIFrameElement.h" #include "mozilla/dom/HTMLImageElement.h" Loading @@ -187,6 +188,7 @@ #include "mozilla/dom/HTMLLinkElement.h" #include "mozilla/dom/HTMLMediaElement.h" #include "mozilla/dom/HTMLMetaElement.h" #include "mozilla/dom/HTMLObjectElement.h" #include "mozilla/dom/HTMLSharedElement.h" #include "mozilla/dom/HTMLTextAreaElement.h" #include "mozilla/dom/ImageTracker.h" Loading Loading @@ -3869,74 +3871,68 @@ nsresult Document::InitCSP(nsIChannel* aChannel) { return NS_OK; } static Document* GetInProcessParentDocumentFrom(BrowsingContext* aContext) { BrowsingContext* parentContext = aContext->GetParent(); if (!parentContext) { return nullptr; static FeaturePolicy* GetFeaturePolicyFromElement(Element* aElement) { if (auto* iframe = HTMLIFrameElement::FromNodeOrNull(aElement)) { return iframe->FeaturePolicy(); } WindowContext* windowContext = parentContext->GetCurrentWindowContext(); if (!windowContext) { if (!HTMLObjectElement::FromNodeOrNull(aElement) && !HTMLEmbedElement::FromNodeOrNull(aElement)) { return nullptr; } return windowContext->GetDocument(); return aElement->OwnerDoc()->FeaturePolicy(); } already_AddRefed<dom::FeaturePolicy> Document::GetParentFeaturePolicy() { BrowsingContext* browsingContext = GetBrowsingContext(); if (!browsingContext) { return nullptr; } if (!browsingContext->IsContentSubframe()) { return nullptr; } void Document::InitFeaturePolicy( const Variant<Nothing, FeaturePolicyInfo, Element*>& aContainerFeaturePolicy) { MOZ_ASSERT(mFeaturePolicy, "we should have FeaturePolicy created"); HTMLIFrameElement* iframe = HTMLIFrameElement::FromNodeOrNull(browsingContext->GetEmbedderElement()); if (iframe) { return do_AddRef(iframe->FeaturePolicy()); } mFeaturePolicy->ResetDeclaredPolicy(); if (XRE_IsParentProcess()) { return do_AddRef(browsingContext->Canonical()->GetContainerFeaturePolicy()); } mFeaturePolicy->SetDefaultOrigin(NodePrincipal()); if (Document* parentDocument = GetInProcessParentDocumentFrom(browsingContext)) { return do_AddRef(parentDocument->FeaturePolicy()); RefPtr<dom::FeaturePolicy> featurePolicy = mFeaturePolicy; aContainerFeaturePolicy.match( [](const Nothing&) {}, [featurePolicy](const FeaturePolicyInfo& aContainerFeaturePolicy) { // Let's inherit the policy from the possibly cross-origin container. featurePolicy->InheritPolicy(aContainerFeaturePolicy); featurePolicy->SetSrcOrigin(aContainerFeaturePolicy.mSrcOrigin); }, [featurePolicy](Element* aContainer) { // Let's inherit the policy from the parent container element if it // exists. if (RefPtr<dom::FeaturePolicy> containerFeaturePolicy = GetFeaturePolicyFromElement(aContainer)) { featurePolicy->InheritPolicy(containerFeaturePolicy); featurePolicy->SetSrcOrigin(containerFeaturePolicy->GetSrcOrigin()); } WindowContext* windowContext = browsingContext->GetCurrentWindowContext(); if (!windowContext) { return nullptr; }); } WindowGlobalChild* child = windowContext->GetWindowGlobalChild(); if (!child) { Element* GetEmbedderElementFrom(BrowsingContext* aBrowsingContext) { if (!aBrowsingContext) { return nullptr; } return do_AddRef(child->GetContainerFeaturePolicy()); if (!aBrowsingContext->IsContentSubframe()) { return nullptr; } void Document::InitFeaturePolicy() { MOZ_ASSERT(mFeaturePolicy, "we should have FeaturePolicy created"); mFeaturePolicy->ResetDeclaredPolicy(); mFeaturePolicy->SetDefaultOrigin(NodePrincipal()); RefPtr<mozilla::dom::FeaturePolicy> parentPolicy = GetParentFeaturePolicy(); if (parentPolicy) { // Let's inherit the policy from the parent HTMLIFrameElement if it exists. mFeaturePolicy->InheritPolicy(parentPolicy); mFeaturePolicy->SetSrcOrigin(parentPolicy->GetSrcOrigin()); } return aBrowsingContext->GetEmbedderElement(); } nsresult Document::InitFeaturePolicy(nsIChannel* aChannel) { InitFeaturePolicy(); nsCOMPtr<nsILoadInfo> loadInfo = aChannel->LoadInfo(); if (Element* embedderElement = GetEmbedderElementFrom(GetBrowsingContext())) { InitFeaturePolicy(AsVariant(embedderElement)); } else if (Maybe<FeaturePolicyInfo> featurePolicyContainer = loadInfo->GetContainerFeaturePolicyInfo()) { InitFeaturePolicy(AsVariant(*featurePolicyContainer)); } else { InitFeaturePolicy(AsVariant(Nothing{})); } // We don't want to parse the http Feature-Policy header if this pref is off. if (!StaticPrefs::dom_security_featurePolicy_header_enabled()) { Loading
dom/base/Document.h +2 −1 Original line number Diff line number Diff line Loading @@ -1503,7 +1503,8 @@ class Document : public nsINode, void DoNotifyPossibleTitleChange(); void InitFeaturePolicy(); void InitFeaturePolicy(const Variant<Nothing, FeaturePolicyInfo, Element*>& aContainerFeaturePolicy); nsresult InitFeaturePolicy(nsIChannel* aChannel); void EnsureNotEnteringAndExitFullscreen(); Loading