diff --git a/parser/html/nsHtml5SpeculativeLoad.cpp b/parser/html/nsHtml5SpeculativeLoad.cpp index ddbc6e096..14e8f9ea9 100644 --- a/parser/html/nsHtml5SpeculativeLoad.cpp +++ b/parser/html/nsHtml5SpeculativeLoad.cpp @@ -55,25 +55,25 @@ nsHtml5SpeculativeLoad::Perform(nsHtml5TreeOpExecutor* aExecutor) case eSpeculativeLoadScript: aExecutor->PreloadScript(mUrlOrSizes, mCharsetOrSrcset, mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, - mCrossOriginOrMedia, mReferrerPolicyOrIntegrity, false, + mCrossOriginOrMedia, mReferrerPolicyOrIntegrity, mScriptReferrerPolicy, false, mIsAsync, mIsDefer, false); break; case eSpeculativeLoadScriptFromHead: aExecutor->PreloadScript(mUrlOrSizes, mCharsetOrSrcset, mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, - mCrossOriginOrMedia, mReferrerPolicyOrIntegrity, true, + mCrossOriginOrMedia, mReferrerPolicyOrIntegrity, mScriptReferrerPolicy, true, mIsAsync, mIsDefer, false); break; case eSpeculativeLoadNoModuleScript: aExecutor->PreloadScript(mUrlOrSizes, mCharsetOrSrcset, mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, - mCrossOriginOrMedia, mReferrerPolicyOrIntegrity, false, + mCrossOriginOrMedia, mReferrerPolicyOrIntegrity, mScriptReferrerPolicy, false, mIsAsync, mIsDefer, true); break; case eSpeculativeLoadNoModuleScriptFromHead: aExecutor->PreloadScript(mUrlOrSizes, mCharsetOrSrcset, mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, - mCrossOriginOrMedia, mReferrerPolicyOrIntegrity, true, + mCrossOriginOrMedia, mReferrerPolicyOrIntegrity, mScriptReferrerPolicy, true, mIsAsync, mIsDefer, true); break; case eSpeculativeLoadStyle: diff --git a/parser/html/nsHtml5SpeculativeLoad.h b/parser/html/nsHtml5SpeculativeLoad.h index 27d526396..d9467d387 100644 --- a/parser/html/nsHtml5SpeculativeLoad.h +++ b/parser/html/nsHtml5SpeculativeLoad.h @@ -7,6 +7,7 @@ #include "nsString.h" #include "nsContentUtils.h" +#include "mozilla/net/ReferrerPolicy.h" class nsHtml5TreeOpExecutor; @@ -131,6 +132,7 @@ class nsHtml5SpeculativeLoad { nsHtml5String aType, nsHtml5String aCrossOrigin, nsHtml5String aIntegrity, + nsHtml5String aReferrerPolicy, bool aParserInHead, bool aAsync, bool aDefer, @@ -150,6 +152,14 @@ class nsHtml5SpeculativeLoad { aType.ToString(mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity); aCrossOrigin.ToString(mCrossOriginOrMedia); aIntegrity.ToString(mReferrerPolicyOrIntegrity); + nsAutoString referrerPolicy; + aReferrerPolicy.ToString(referrerPolicy); + referrerPolicy = + nsContentUtils::TrimWhitespace< + nsContentUtils::IsHTMLWhitespace>(referrerPolicy); + mScriptReferrerPolicy = + mozilla::net::AttributeReferrerPolicyFromString(referrerPolicy); + mIsAsync = aAsync; mIsDefer = aDefer; } @@ -166,7 +176,12 @@ class nsHtml5SpeculativeLoad { aUrl.ToString(mUrlOrSizes); aCharset.ToString(mCharsetOrSrcset); aCrossOrigin.ToString(mCrossOriginOrMedia); - aReferrerPolicy.ToString(mReferrerPolicyOrIntegrity); + nsString + referrerPolicy; // Not Auto, because using it to hold nsStringBuffer* + aReferrerPolicy.ToString(referrerPolicy); + mReferrerPolicyOrIntegrity.Assign( + nsContentUtils::TrimWhitespace( + referrerPolicy)); aIntegrity.ToString(mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity); } @@ -287,6 +302,12 @@ class nsHtml5SpeculativeLoad { * "media" attribute. If the attribute is not set, this will be a void string. */ nsString mCrossOriginOrMedia; + /** + * If mOpCode is eSpeculativeLoadScript[FromHead] this represents the value + * of the "referrerpolicy" attribute. This field holds one of the values + * (REFERRER_POLICY_*) defined in nsIHttpChannel. + */ + mozilla::net::ReferrerPolicy mScriptReferrerPolicy; }; #endif // nsHtml5SpeculativeLoad_h diff --git a/parser/html/nsHtml5TreeBuilderCppSupplement.h b/parser/html/nsHtml5TreeBuilderCppSupplement.h index 16110d81d..efbccd8bd 100644 --- a/parser/html/nsHtml5TreeBuilderCppSupplement.h +++ b/parser/html/nsHtml5TreeBuilderCppSupplement.h @@ -185,6 +185,8 @@ nsHtml5TreeBuilder::createElement(int32_t aNamespace, aAttributes->getValue(nsHtml5AttributeName::ATTR_CROSSORIGIN); nsHtml5String integrity = aAttributes->getValue(nsHtml5AttributeName::ATTR_INTEGRITY); + nsHtml5String referrerPolicy = + aAttributes->getValue(nsHtml5AttributeName::ATTR_REFERRERPOLICY); bool async = aAttributes->contains(nsHtml5AttributeName::ATTR_ASYNC); bool defer = @@ -197,6 +199,7 @@ nsHtml5TreeBuilder::createElement(int32_t aNamespace, type, crossOrigin, integrity, + referrerPolicy, mode == nsHtml5TreeBuilder::IN_HEAD, async, defer, @@ -248,12 +251,15 @@ nsHtml5TreeBuilder::createElement(int32_t aNamespace, aAttributes->getValue(nsHtml5AttributeName::ATTR_CROSSORIGIN); nsHtml5String integrity = aAttributes->getValue(nsHtml5AttributeName::ATTR_INTEGRITY); + nsHtml5String referrerPolicy = + aAttributes->getValue(nsHtml5AttributeName::ATTR_REFERRERPOLICY); mSpeculativeLoadQueue.AppendElement()->InitScript( url, charset, type, crossOrigin, integrity, + referrerPolicy, mode == nsHtml5TreeBuilder::IN_HEAD, false, false, @@ -350,12 +356,15 @@ nsHtml5TreeBuilder::createElement(int32_t aNamespace, aAttributes->getValue(nsHtml5AttributeName::ATTR_CROSSORIGIN); nsHtml5String integrity = aAttributes->getValue(nsHtml5AttributeName::ATTR_INTEGRITY); + nsHtml5String referrerPolicy = + aAttributes->getValue(nsHtml5AttributeName::ATTR_REFERRERPOLICY); mSpeculativeLoadQueue.AppendElement()->InitScript( url, nullptr, type, crossOrigin, integrity, + referrerPolicy, mode == nsHtml5TreeBuilder::IN_HEAD, false /* async */, false /* defer */, diff --git a/parser/html/nsHtml5TreeOpExecutor.cpp b/parser/html/nsHtml5TreeOpExecutor.cpp index dfe252da0..bcbbd1add 100644 --- a/parser/html/nsHtml5TreeOpExecutor.cpp +++ b/parser/html/nsHtml5TreeOpExecutor.cpp @@ -917,12 +917,23 @@ nsHtml5TreeOpExecutor::ShouldPreloadURI(nsIURI *aURI) return true; } +net::ReferrerPolicy +nsHtml5TreeOpExecutor::GetPreloadReferrerPolicy( + const nsAString& aReferrerPolicy) +{ + net::ReferrerPolicy referrerPolicy = + net::AttributeReferrerPolicyFromString(aReferrerPolicy); + return referrerPolicy != net::RP_Unset ? referrerPolicy : + mSpeculationReferrerPolicy; +} + void nsHtml5TreeOpExecutor::PreloadScript(const nsAString& aURL, const nsAString& aCharset, const nsAString& aType, const nsAString& aCrossOrigin, const nsAString& aIntegrity, + net::ReferrerPolicy aReferrerPolicy, bool aScriptFromHead, bool aAsync, bool aDefer, @@ -932,10 +943,19 @@ nsHtml5TreeOpExecutor::PreloadScript(const nsAString& aURL, if (!uri) { return; } - mDocument->ScriptLoader()->PreloadURI(uri, aCharset, aType, aCrossOrigin, - aIntegrity, aScriptFromHead, aAsync, - aDefer, aNoModule, - mSpeculationReferrerPolicy); + net::ReferrerPolicy referrerPolicy = aReferrerPolicy != net::RP_Unset ? + aReferrerPolicy : mSpeculationReferrerPolicy; + mDocument->ScriptLoader() + ->PreloadURI(uri, + aCharset, + aType, + aCrossOrigin, + aIntegrity, + aScriptFromHead, + aAsync, + aDefer, + aNoModule, + referrerPolicy); } void @@ -950,14 +970,7 @@ nsHtml5TreeOpExecutor::PreloadStyle(const nsAString& aURL, return; } - mozilla::net::ReferrerPolicy referrerPolicy = mSpeculationReferrerPolicy; - mozilla::net::ReferrerPolicy styleReferrerPolicy = - mozilla::net::AttributeReferrerPolicyFromString(aReferrerPolicy); - if (styleReferrerPolicy != mozilla::net::RP_Unset) { - referrerPolicy = styleReferrerPolicy; - } - - mDocument->PreloadStyle(uri, aCharset, aCrossOrigin, referrerPolicy, + mDocument->PreloadStyle(uri, aCharset, aCrossOrigin, GetPreloadReferrerPolicy(aReferrerPolicy), aIntegrity); } @@ -974,18 +987,10 @@ nsHtml5TreeOpExecutor::PreloadImage(const nsAString& aURL, aSizes, &isImgSet); if (uri && ShouldPreloadURI(uri)) { // use document wide referrer policy - mozilla::net::ReferrerPolicy referrerPolicy = mSpeculationReferrerPolicy; - // if enabled in preferences, use the referrer attribute from the image, if provided - bool referrerAttributeEnabled = Preferences::GetBool("network.http.enablePerElementReferrer", true); - if (referrerAttributeEnabled) { - mozilla::net::ReferrerPolicy imageReferrerPolicy = - mozilla::net::AttributeReferrerPolicyFromString(aImageReferrerPolicy); - if (imageReferrerPolicy != mozilla::net::RP_Unset) { - referrerPolicy = imageReferrerPolicy; - } - } - - mDocument->MaybePreLoadImage(uri, aCrossOrigin, referrerPolicy, isImgSet); + mDocument->MaybePreLoadImage(uri, + aCrossOrigin, + GetPreloadReferrerPolicy(aImageReferrerPolicy), + isImgSet); } } diff --git a/parser/html/nsHtml5TreeOpExecutor.h b/parser/html/nsHtml5TreeOpExecutor.h index ca4dc8dec..1aba08d16 100644 --- a/parser/html/nsHtml5TreeOpExecutor.h +++ b/parser/html/nsHtml5TreeOpExecutor.h @@ -249,6 +249,7 @@ class nsHtml5TreeOpExecutor final : public nsHtml5DocumentBuilder, const nsAString& aType, const nsAString& aCrossOrigin, const nsAString& aIntegrity, + ReferrerPolicy aReferrerPolicy, bool aScriptFromHead, bool aAsync, bool aDefer, @@ -305,6 +306,8 @@ class nsHtml5TreeOpExecutor final : public nsHtml5DocumentBuilder, * list of preloaded URIs */ bool ShouldPreloadURI(nsIURI *aURI); + + ReferrerPolicy GetPreloadReferrerPolicy(const nsAString& aReferrerPolicy); }; #endif // nsHtml5TreeOpExecutor_h