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