Commit ce16e425 authored by Andreas Farre's avatar Andreas Farre
Browse files

Bug 1890748 - Move responsibility of FeaturePolicy initialization to...

Bug 1890748 - Move responsibility of FeaturePolicy initialization to nsILoadInfo. r=freddyb,necko-reviewers,jesup,dom-core,sefeng, a=dmeehan

Differential Revision: https://phabricator.services.mozilla.com/D207140
parent 94625472
Loading
Loading
Loading
Loading
+6 −10
Original line number Diff line number Diff line
@@ -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) {
@@ -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

+6 −4
Original line number Diff line number Diff line
@@ -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"
@@ -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);
@@ -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() {
+6 −2
Original line number Diff line number Diff line
@@ -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",
@@ -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{}));
      }
    }
  }

+45 −49
Original line number Diff line number Diff line
@@ -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"
@@ -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"
@@ -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()) {
+2 −1
Original line number Diff line number Diff line
@@ -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