mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-06 15:58:39 +09:00
ported from mozilla: Bug 1460920 - Part 1 - Speculative loading script should take referrerpolicy attribute in script element into account r=hsivonen (045f98957a)
This commit is contained in:
parent
ac5f375e8f
commit
281e3f4d1b
5 changed files with 67 additions and 29 deletions
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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<nsContentUtils::IsHTMLWhitespace>(
|
||||
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
|
||||
|
|
|
|||
|
|
@ -184,6 +184,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 =
|
||||
|
|
@ -196,6 +198,7 @@ nsHtml5TreeBuilder::createElement(int32_t aNamespace,
|
|||
type,
|
||||
crossOrigin,
|
||||
integrity,
|
||||
referrerPolicy,
|
||||
mode == nsHtml5TreeBuilder::IN_HEAD,
|
||||
async,
|
||||
defer,
|
||||
|
|
@ -247,12 +250,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,
|
||||
|
|
@ -349,12 +355,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 */,
|
||||
|
|
|
|||
|
|
@ -914,12 +914,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,
|
||||
|
|
@ -929,10 +940,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
|
||||
|
|
@ -947,14 +967,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);
|
||||
}
|
||||
|
||||
|
|
@ -971,18 +984,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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue