Commit 91e6e4c5 authored by Emilio Cobos Álvarez's avatar Emilio Cobos Álvarez
Browse files

Bug 1823686 - Share URLExtraData between SVG attribute mapping and style attribute. r=smaug

I don't think there's ever a way these should differ.

Got some include hell from removing ReferrerInfo.h from Document.h but
hopefully should be straight-forward to review.

Depends on D173154

Differential Revision: https://phabricator.services.mozilla.com/D173155
parent 41557197
Loading
Loading
Loading
Loading
+31 −19
Original line number Diff line number Diff line
@@ -3939,6 +3939,12 @@ nsresult Document::InitFeaturePolicy(nsIChannel* aChannel) {
  return NS_OK;
}
void Document::SetReferrerInfo(nsIReferrerInfo* aReferrerInfo) {
  mReferrerInfo = aReferrerInfo;
  mCachedReferrerInfoForInternalCSSAndSVGResources = nullptr;
  mCachedURLData = nullptr;
}
nsresult Document::InitReferrerInfo(nsIChannel* aChannel) {
  MOZ_ASSERT(mReferrerInfo);
  MOZ_ASSERT(mPreloadReferrerInfo);
@@ -3955,7 +3961,7 @@ nsresult Document::InitReferrerInfo(nsIChannel* aChannel) {
                                ? bc->GetEmbedderElement()->OwnerDoc()
                                : nullptr;
      if (parentDoc) {
        mReferrerInfo = parentDoc->GetReferrerInfo();
        SetReferrerInfo(parentDoc->GetReferrerInfo());
        mPreloadReferrerInfo = mReferrerInfo;
        return NS_OK;
      }
@@ -3975,17 +3981,17 @@ nsresult Document::InitReferrerInfo(nsIChannel* aChannel) {
    return NS_OK;
  }
  nsCOMPtr<nsIReferrerInfo> referrerInfo = httpChannel->GetReferrerInfo();
  if (referrerInfo) {
    mReferrerInfo = referrerInfo;
  if (nsCOMPtr<nsIReferrerInfo> referrerInfo = httpChannel->GetReferrerInfo()) {
    SetReferrerInfo(referrerInfo);
  }
  // Override policy if we get one from Referrerr-Policy header
  mozilla::dom::ReferrerPolicy policy =
      nsContentUtils::GetReferrerPolicyFromChannel(aChannel);
  mReferrerInfo = static_cast<dom::ReferrerInfo*>(mReferrerInfo.get())
  nsCOMPtr<nsIReferrerInfo> clone =
      static_cast<dom::ReferrerInfo*>(mReferrerInfo.get())
          ->CloneWithNewPolicy(policy);
  SetReferrerInfo(clone);
  mPreloadReferrerInfo = mReferrerInfo;
  return NS_OK;
}
@@ -4044,6 +4050,7 @@ void Document::SetDocumentURI(nsIURI* aURI) {
  // If changing the document's URI changed the base URI of the document, we
  // need to refresh the hrefs of all the links on the page.
  if (!equalBases) {
    mCachedURLData = nullptr;
    RefreshLinkHrefs();
  }
@@ -4177,9 +4184,10 @@ void Document::UpdateReferrerInfoFromMeta(const nsAString& aMetaReferrer,
        static_cast<mozilla::dom::ReferrerInfo*>((mPreloadReferrerInfo).get())
            ->CloneWithNewPolicy(policy);
  } else {
    mReferrerInfo =
    nsCOMPtr<nsIReferrerInfo> clone =
        static_cast<mozilla::dom::ReferrerInfo*>((mReferrerInfo).get())
            ->CloneWithNewPolicy(policy);
    SetReferrerInfo(clone);
  }
}
@@ -4198,6 +4206,8 @@ void Document::SetPrincipals(nsIPrincipal* aNewPrincipal,
  mNodeInfoManager->SetDocumentPrincipal(aNewPrincipal);
  mPartitionedPrincipal = aNewPartitionedPrincipal;
  mCachedURLData = nullptr;
  mCSSLoader->RegisterInSheetCache();
#ifdef DEBUG
@@ -6637,6 +6647,7 @@ void Document::SetBaseURI(nsIURI* aURI) {
  }
  mDocumentBaseURI = aURI;
  mCachedURLData = nullptr;
  RefreshLinkHrefs();
}
@@ -6648,19 +6659,20 @@ Result<OwningNonNull<nsIURI>, nsresult> Document::ResolveWithBaseURI(
  return OwningNonNull<nsIURI>(std::move(resolvedURI));
}
nsIReferrerInfo* Document::ReferrerInfoForInternalCSSAndSVGResources() {
  if (!mCachedReferrerInfoForInternalCSSAndSVGResources) {
    mCachedReferrerInfoForInternalCSSAndSVGResources =
        ReferrerInfo::CreateForInternalCSSAndSVGResources(this);
  }
  return mCachedReferrerInfoForInternalCSSAndSVGResources;
}
URLExtraData* Document::DefaultStyleAttrURLData() {
  MOZ_ASSERT(NS_IsMainThread());
  nsIURI* baseURI = GetDocBaseURI();
  nsIPrincipal* principal = NodePrincipal();
  bool equals;
  if (!mCachedURLData || mCachedURLData->BaseURI() != baseURI ||
      mCachedURLData->Principal() != principal || !mCachedReferrerInfo ||
      NS_FAILED(mCachedURLData->ReferrerInfo()->Equals(mCachedReferrerInfo,
                                                       &equals)) ||
      !equals) {
    mCachedReferrerInfo =
        ReferrerInfo::CreateForInternalCSSAndSVGResources(this);
    mCachedURLData = new URLExtraData(baseURI, mCachedReferrerInfo, principal);
  if (!mCachedURLData) {
    mCachedURLData = new URLExtraData(
        GetDocBaseURI(), ReferrerInfoForInternalCSSAndSVGResources(),
        NodePrincipal());
  }
  return mCachedURLData;
}
+4 −6
Original line number Diff line number Diff line
@@ -14,7 +14,6 @@
#include <utility>
#include "ErrorList.h"
#include "MainThreadUtils.h"
#include "ReferrerInfo.h"
#include "Units.h"
#include "imgIRequest.h"
#include "js/RootingAPI.h"
@@ -873,9 +872,7 @@ class Document : public nsINode,
    return mUpgradeInsecureRequests;
  }

  void SetReferrerInfo(nsIReferrerInfo* aReferrerInfo) {
    mReferrerInfo = aReferrerInfo;
  }
  void SetReferrerInfo(nsIReferrerInfo*);

  /*
   * Referrer policy from <meta name="referrer" content=`policy`>
@@ -966,6 +963,7 @@ class Document : public nsINode,
   * the document, a new one is created.
   */
  URLExtraData* DefaultStyleAttrURLData();
  nsIReferrerInfo* ReferrerInfoForInternalCSSAndSVGResources();

  /**
   * Get/Set the base target of a link in a document.
@@ -4490,9 +4488,9 @@ class Document : public nsINode,
  // The base domain of the document for third-party checks.
  nsCString mBaseDomain;

  // A lazily-constructed URL data for style system to resolve URL value.
  // A lazily-constructed URL data for style system to resolve URL values.
  RefPtr<URLExtraData> mCachedURLData;
  nsCOMPtr<nsIReferrerInfo> mCachedReferrerInfo;
  nsCOMPtr<nsIReferrerInfo> mCachedReferrerInfoForInternalCSSAndSVGResources;

  nsWeakPtr mDocumentLoadGroup;

+6 −7
Original line number Diff line number Diff line
@@ -341,16 +341,15 @@ already_AddRefed<URLExtraData> nsIContent::GetURLDataForStyleAttr(
      return do_AddRef(data);
    }
  }
  auto* doc = OwnerDoc();
  if (aSubjectPrincipal && aSubjectPrincipal != NodePrincipal()) {
    // TODO: Cache this?
    nsCOMPtr<nsIReferrerInfo> referrerInfo =
        ReferrerInfo::CreateForInternalCSSAndSVGResources(OwnerDoc());
    return MakeAndAddRef<URLExtraData>(OwnerDoc()->GetDocBaseURI(),
                                       referrerInfo, aSubjectPrincipal);
        doc->ReferrerInfoForInternalCSSAndSVGResources();
    // TODO: Cache this?
    return MakeAndAddRef<URLExtraData>(doc->GetDocBaseURI(), referrerInfo,
                                       aSubjectPrincipal);
  }
  // This also ignores the case that SVG inside XBL binding.
  // But it is probably fine.
  return do_AddRef(OwnerDoc()->DefaultStyleAttrURLData());
  return do_AddRef(doc->DefaultStyleAttrURLData());
}

void nsIContent::ConstructUbiNode(void* storage) {
+1 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
#include "nsGlobalWindow.h"
#include "mozilla/NullPrincipal.h"
#include "mozilla/dom/Document.h"
#include "mozilla/dom/ReferrerInfo.h"
#include "mozilla/dom/WindowContext.h"

namespace mozilla::dom {
+11 −14
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@
#include "mozilla/DebugOnly.h"
#include "mozilla/HashFunctions.h"

#include "mozilla/URLExtraData.h"
#include "nsAttrValue.h"
#include "nsAttrValueInlines.h"
#include "nsAtom.h"
@@ -1727,16 +1728,14 @@ bool nsAttrValue::ParseIntMarginValue(const nsAString& aString) {
bool nsAttrValue::ParseStyleAttribute(const nsAString& aString,
                                      nsIPrincipal* aMaybeScriptedPrincipal,
                                      nsStyledElement* aElement) {
  dom::Document* ownerDoc = aElement->OwnerDoc();
  nsHTMLCSSStyleSheet* sheet = ownerDoc->GetInlineStyleSheet();
  nsIURI* baseURI = aElement->GetBaseURIForStyleAttr();
  nsIURI* docURI = ownerDoc->GetDocumentURI();

  NS_ASSERTION(aElement->NodePrincipal() == ownerDoc->NodePrincipal(),
  dom::Document* doc = aElement->OwnerDoc();
  nsHTMLCSSStyleSheet* sheet = doc->GetInlineStyleSheet();
  NS_ASSERTION(aElement->NodePrincipal() == doc->NodePrincipal(),
               "This is unexpected");

  nsIPrincipal* principal = aMaybeScriptedPrincipal ? aMaybeScriptedPrincipal
                                                    : aElement->NodePrincipal();
  RefPtr<URLExtraData> data = aElement->GetURLDataForStyleAttr(principal);

  // If the (immutable) document URI does not match the element's base URI
  // (the common case is that they do match) do not cache the rule.  This is
@@ -1745,8 +1744,9 @@ bool nsAttrValue::ParseStyleAttribute(const nsAString& aString,
  // Similarly, if the triggering principal does not match the node principal,
  // do not cache the rule, since the principal will be encoded in any parsed
  // URLs in the rule.
  const bool cachingAllowed =
      sheet && baseURI == docURI && principal == aElement->NodePrincipal();
  const bool cachingAllowed = sheet &&
                              doc->GetDocumentURI() == data->BaseURI() &&
                              principal == aElement->NodePrincipal();
  if (cachingAllowed) {
    MiscContainer* cont = sheet->LookupStyleAttr(aString);
    if (cont) {
@@ -1757,12 +1757,9 @@ bool nsAttrValue::ParseStyleAttribute(const nsAString& aString,
    }
  }

  nsCOMPtr<nsIReferrerInfo> referrerInfo =
      dom::ReferrerInfo::CreateForInternalCSSAndSVGResources(ownerDoc);
  auto data = MakeRefPtr<URLExtraData>(baseURI, referrerInfo, principal);
  RefPtr<DeclarationBlock> decl = DeclarationBlock::FromCssText(
      aString, data, ownerDoc->GetCompatibilityMode(), ownerDoc->CSSLoader(),
      StyleCssRuleType::Style);
  RefPtr<DeclarationBlock> decl =
      DeclarationBlock::FromCssText(aString, data, doc->GetCompatibilityMode(),
                                    doc->CSSLoader(), StyleCssRuleType::Style);
  if (!decl) {
    return false;
  }
Loading