Bug 1865610: part 3) Add fetchpriority attribute support for preloaded stylesheets. r=smaug,emilio,necko-reviewers,jesup

Includes corresponding Link header fields.

Differential Revision: https://phabricator.services.mozilla.com/D191866
This commit is contained in:
Mirko Brodesser 2023-11-23 14:36:12 +00:00
parent 49a3f2c3eb
commit c7f6b261d8
16 changed files with 63 additions and 68 deletions

View file

@ -12538,7 +12538,7 @@ SheetPreloadStatus Document::PreloadStyle(
nsIURI* uri, const Encoding* aEncoding, const nsAString& aCrossOriginAttr, nsIURI* uri, const Encoding* aEncoding, const nsAString& aCrossOriginAttr,
const enum ReferrerPolicy aReferrerPolicy, const nsAString& aNonce, const enum ReferrerPolicy aReferrerPolicy, const nsAString& aNonce,
const nsAString& aIntegrity, css::StylePreloadKind aKind, const nsAString& aIntegrity, css::StylePreloadKind aKind,
uint64_t aEarlyHintPreloaderId) { uint64_t aEarlyHintPreloaderId, const nsAString& aFetchPriority) {
MOZ_ASSERT(aKind != css::StylePreloadKind::None); MOZ_ASSERT(aKind != css::StylePreloadKind::None);
// The CSSLoader will retain this object after we return. // The CSSLoader will retain this object after we return.
@ -12550,7 +12550,8 @@ SheetPreloadStatus Document::PreloadStyle(
// Charset names are always ASCII. // Charset names are always ASCII.
auto result = CSSLoader()->LoadSheet( auto result = CSSLoader()->LoadSheet(
uri, aKind, aEncoding, referrerInfo, obs, aEarlyHintPreloaderId, uri, aKind, aEncoding, referrerInfo, obs, aEarlyHintPreloaderId,
Element::StringToCORSMode(aCrossOriginAttr), aNonce, aIntegrity); Element::StringToCORSMode(aCrossOriginAttr), aNonce, aIntegrity,
nsGenericHTMLElement::ToFetchPriority(aFetchPriority));
if (result.isErr()) { if (result.isErr()) {
return SheetPreloadStatus::Errored; return SheetPreloadStatus::Errored;
} }

View file

@ -2945,7 +2945,8 @@ class Document : public nsINode,
const nsAString& aNonce, const nsAString& aNonce,
const nsAString& aIntegrity, const nsAString& aIntegrity,
css::StylePreloadKind, css::StylePreloadKind,
uint64_t aEarlyHintPreloaderId); uint64_t aEarlyHintPreloaderId,
const nsAString& aFetchPriority);
/** /**
* Called by the chrome registry to load style sheets. * Called by the chrome registry to load style sheets.

View file

@ -317,14 +317,15 @@ nsresult nsContentSink::ProcessLinkFromHeader(const net::LinkHeader& aHeader,
PreloadHref(aHeader.mHref, aHeader.mAs, aHeader.mType, aHeader.mMedia, PreloadHref(aHeader.mHref, aHeader.mAs, aHeader.mType, aHeader.mMedia,
aHeader.mNonce, aHeader.mIntegrity, aHeader.mSrcset, aHeader.mNonce, aHeader.mIntegrity, aHeader.mSrcset,
aHeader.mSizes, aHeader.mCrossOrigin, aHeader.mReferrerPolicy, aHeader.mSizes, aHeader.mCrossOrigin, aHeader.mReferrerPolicy,
aEarlyHintPreloaderId); aEarlyHintPreloaderId, aHeader.mFetchPriority);
} }
if ((linkTypes & LinkStyle::eMODULE_PRELOAD) && if ((linkTypes & LinkStyle::eMODULE_PRELOAD) &&
mDocument->ScriptLoader()->GetModuleLoader()) { mDocument->ScriptLoader()->GetModuleLoader()) {
PreloadModule(aHeader.mHref, aHeader.mAs, aHeader.mMedia, aHeader.mNonce, PreloadModule(aHeader.mHref, aHeader.mAs, aHeader.mMedia, aHeader.mNonce,
aHeader.mIntegrity, aHeader.mCrossOrigin, aHeader.mIntegrity, aHeader.mCrossOrigin,
aHeader.mReferrerPolicy, aEarlyHintPreloaderId); aHeader.mReferrerPolicy, aEarlyHintPreloaderId,
aHeader.mFetchPriority);
} }
} }
@ -436,7 +437,8 @@ void nsContentSink::PreloadHref(const nsAString& aHref, const nsAString& aAs,
const nsAString& aSrcset, const nsAString& aSrcset,
const nsAString& aSizes, const nsAString& aCORS, const nsAString& aSizes, const nsAString& aCORS,
const nsAString& aReferrerPolicy, const nsAString& aReferrerPolicy,
uint64_t aEarlyHintPreloaderId) { uint64_t aEarlyHintPreloaderId,
const nsAString& aFetchPriority) {
auto encoding = mDocument->GetDocumentCharacterSet(); auto encoding = mDocument->GetDocumentCharacterSet();
nsCOMPtr<nsIURI> uri; nsCOMPtr<nsIURI> uri;
NS_NewURI(getter_AddRefs(uri), aHref, encoding, mDocument->GetDocBaseURI()); NS_NewURI(getter_AddRefs(uri), aHref, encoding, mDocument->GetDocBaseURI());
@ -462,16 +464,14 @@ void nsContentSink::PreloadHref(const nsAString& aHref, const nsAString& aAs,
mDocument->Preloads().PreloadLinkHeader( mDocument->Preloads().PreloadLinkHeader(
uri, aHref, policyType, aAs, aType, aNonce, aIntegrity, aSrcset, aSizes, uri, aHref, policyType, aAs, aType, aNonce, aIntegrity, aSrcset, aSizes,
aCORS, aReferrerPolicy, aEarlyHintPreloaderId); aCORS, aReferrerPolicy, aEarlyHintPreloaderId, aFetchPriority);
} }
void nsContentSink::PreloadModule(const nsAString& aHref, const nsAString& aAs, void nsContentSink::PreloadModule(
const nsAString& aMedia, const nsAString& aHref, const nsAString& aAs, const nsAString& aMedia,
const nsAString& aNonce, const nsAString& aNonce, const nsAString& aIntegrity,
const nsAString& aIntegrity, const nsAString& aCORS, const nsAString& aReferrerPolicy,
const nsAString& aCORS, uint64_t aEarlyHintPreloaderId, const nsAString& aFetchPriority) {
const nsAString& aReferrerPolicy,
uint64_t aEarlyHintPreloaderId) {
ModuleLoader* moduleLoader = mDocument->ScriptLoader()->GetModuleLoader(); ModuleLoader* moduleLoader = mDocument->ScriptLoader()->GetModuleLoader();
if (!StaticPrefs::network_modulepreload()) { if (!StaticPrefs::network_modulepreload()) {
@ -507,7 +507,7 @@ void nsContentSink::PreloadModule(const nsAString& aHref, const nsAString& aAs,
mDocument->Preloads().PreloadLinkHeader( mDocument->Preloads().PreloadLinkHeader(
uri, aHref, nsIContentPolicy::TYPE_SCRIPT, u"script"_ns, u"module"_ns, uri, aHref, nsIContentPolicy::TYPE_SCRIPT, u"script"_ns, u"module"_ns,
aNonce, aIntegrity, u""_ns, u""_ns, aCORS, aReferrerPolicy, aNonce, aIntegrity, u""_ns, u""_ns, aCORS, aReferrerPolicy,
aEarlyHintPreloaderId); aEarlyHintPreloaderId, aFetchPriority);
} }
void nsContentSink::PrefetchDNS(const nsAString& aHref) { void nsContentSink::PrefetchDNS(const nsAString& aHref) {

View file

@ -144,13 +144,15 @@ class nsContentSink : public nsICSSLoaderObserver,
const nsAString& aNonce, const nsAString& aIntegrity, const nsAString& aNonce, const nsAString& aIntegrity,
const nsAString& aSrcset, const nsAString& aSizes, const nsAString& aSrcset, const nsAString& aSizes,
const nsAString& aCORS, const nsAString& aReferrerPolicy, const nsAString& aCORS, const nsAString& aReferrerPolicy,
uint64_t aEarlyHintPreloaderId); uint64_t aEarlyHintPreloaderId,
const nsAString& aFetchPriority);
void PreloadModule(const nsAString& aHref, const nsAString& aAs, void PreloadModule(const nsAString& aHref, const nsAString& aAs,
const nsAString& aMedia, const nsAString& aNonce, const nsAString& aMedia, const nsAString& aNonce,
const nsAString& aIntegrity, const nsAString& aCORS, const nsAString& aIntegrity, const nsAString& aCORS,
const nsAString& aReferrerPolicy, const nsAString& aReferrerPolicy,
uint64_t aEarlyHintPreloaderId); uint64_t aEarlyHintPreloaderId,
const nsAString& aFetchPriority);
// For PrefetchDNS() aHref can either be the usual // For PrefetchDNS() aHref can either be the usual
// URI format or of the form "//www.hostname.com" without a scheme. // URI format or of the form "//www.hostname.com" without a scheme.

View file

@ -362,7 +362,7 @@ SheetLoadData::SheetLoadData(
UseSystemPrincipal aUseSystemPrincipal, StylePreloadKind aPreloadKind, UseSystemPrincipal aUseSystemPrincipal, StylePreloadKind aPreloadKind,
const Encoding* aPreloadEncoding, nsICSSLoaderObserver* aObserver, const Encoding* aPreloadEncoding, nsICSSLoaderObserver* aObserver,
nsIPrincipal* aTriggeringPrincipal, nsIReferrerInfo* aReferrerInfo, nsIPrincipal* aTriggeringPrincipal, nsIReferrerInfo* aReferrerInfo,
const nsAString& aNonce) const nsAString& aNonce, FetchPriority aFetchPriority)
: mLoader(aLoader), : mLoader(aLoader),
mEncoding(nullptr), mEncoding(nullptr),
mURI(aURI), mURI(aURI),
@ -388,7 +388,7 @@ SheetLoadData::SheetLoadData(
mTriggeringPrincipal(aTriggeringPrincipal), mTriggeringPrincipal(aTriggeringPrincipal),
mReferrerInfo(aReferrerInfo), mReferrerInfo(aReferrerInfo),
mNonce(aNonce), mNonce(aNonce),
mFetchPriority(FetchPriority::Auto), mFetchPriority(aFetchPriority),
mGuessedEncoding( mGuessedEncoding(
GetFallbackEncoding(*aLoader, nullptr, aPreloadEncoding)), GetFallbackEncoding(*aLoader, nullptr, aPreloadEncoding)),
mCompatMode(aLoader->CompatMode(aPreloadKind)) { mCompatMode(aLoader->CompatMode(aPreloadKind)) {
@ -2120,7 +2120,7 @@ Result<RefPtr<StyleSheet>, nsresult> Loader::LoadSheetSync(
nsCOMPtr<nsIReferrerInfo> referrerInfo = new ReferrerInfo(nullptr); nsCOMPtr<nsIReferrerInfo> referrerInfo = new ReferrerInfo(nullptr);
return InternalLoadNonDocumentSheet( return InternalLoadNonDocumentSheet(
aURL, StylePreloadKind::None, aParsingMode, aUseSystemPrincipal, nullptr, aURL, StylePreloadKind::None, aParsingMode, aUseSystemPrincipal, nullptr,
referrerInfo, nullptr, CORS_NONE, u""_ns, u""_ns, 0); referrerInfo, nullptr, CORS_NONE, u""_ns, u""_ns, 0, FetchPriority::Auto);
} }
Result<RefPtr<StyleSheet>, nsresult> Loader::LoadSheet( Result<RefPtr<StyleSheet>, nsresult> Loader::LoadSheet(
@ -2129,19 +2129,21 @@ Result<RefPtr<StyleSheet>, nsresult> Loader::LoadSheet(
nsCOMPtr<nsIReferrerInfo> referrerInfo = new ReferrerInfo(nullptr); nsCOMPtr<nsIReferrerInfo> referrerInfo = new ReferrerInfo(nullptr);
return InternalLoadNonDocumentSheet( return InternalLoadNonDocumentSheet(
aURI, StylePreloadKind::None, aParsingMode, aUseSystemPrincipal, nullptr, aURI, StylePreloadKind::None, aParsingMode, aUseSystemPrincipal, nullptr,
referrerInfo, aObserver, CORS_NONE, u""_ns, u""_ns, 0); referrerInfo, aObserver, CORS_NONE, u""_ns, u""_ns, 0,
FetchPriority::Auto);
} }
Result<RefPtr<StyleSheet>, nsresult> Loader::LoadSheet( Result<RefPtr<StyleSheet>, nsresult> Loader::LoadSheet(
nsIURI* aURL, StylePreloadKind aPreloadKind, nsIURI* aURL, StylePreloadKind aPreloadKind,
const Encoding* aPreloadEncoding, nsIReferrerInfo* aReferrerInfo, const Encoding* aPreloadEncoding, nsIReferrerInfo* aReferrerInfo,
nsICSSLoaderObserver* aObserver, uint64_t aEarlyHintPreloaderId, nsICSSLoaderObserver* aObserver, uint64_t aEarlyHintPreloaderId,
CORSMode aCORSMode, const nsAString& aNonce, const nsAString& aIntegrity) { CORSMode aCORSMode, const nsAString& aNonce, const nsAString& aIntegrity,
FetchPriority aFetchPriority) {
LOG(("css::Loader::LoadSheet(aURL, aObserver) api call")); LOG(("css::Loader::LoadSheet(aURL, aObserver) api call"));
return InternalLoadNonDocumentSheet( return InternalLoadNonDocumentSheet(
aURL, aPreloadKind, eAuthorSheetFeatures, UseSystemPrincipal::No, aURL, aPreloadKind, eAuthorSheetFeatures, UseSystemPrincipal::No,
aPreloadEncoding, aReferrerInfo, aObserver, aCORSMode, aNonce, aIntegrity, aPreloadEncoding, aReferrerInfo, aObserver, aCORSMode, aNonce, aIntegrity,
aEarlyHintPreloaderId); aEarlyHintPreloaderId, aFetchPriority);
} }
Result<RefPtr<StyleSheet>, nsresult> Loader::InternalLoadNonDocumentSheet( Result<RefPtr<StyleSheet>, nsresult> Loader::InternalLoadNonDocumentSheet(
@ -2149,7 +2151,7 @@ Result<RefPtr<StyleSheet>, nsresult> Loader::InternalLoadNonDocumentSheet(
UseSystemPrincipal aUseSystemPrincipal, const Encoding* aPreloadEncoding, UseSystemPrincipal aUseSystemPrincipal, const Encoding* aPreloadEncoding,
nsIReferrerInfo* aReferrerInfo, nsICSSLoaderObserver* aObserver, nsIReferrerInfo* aReferrerInfo, nsICSSLoaderObserver* aObserver,
CORSMode aCORSMode, const nsAString& aNonce, const nsAString& aIntegrity, CORSMode aCORSMode, const nsAString& aNonce, const nsAString& aIntegrity,
uint64_t aEarlyHintPreloaderId) { uint64_t aEarlyHintPreloaderId, FetchPriority aFetchPriority) {
MOZ_ASSERT(aURL, "Must have a URI to load"); MOZ_ASSERT(aURL, "Must have a URI to load");
MOZ_ASSERT(aUseSystemPrincipal == UseSystemPrincipal::No || !aObserver, MOZ_ASSERT(aUseSystemPrincipal == UseSystemPrincipal::No || !aObserver,
"Shouldn't load system-principal sheets async"); "Shouldn't load system-principal sheets async");
@ -2180,7 +2182,8 @@ Result<RefPtr<StyleSheet>, nsresult> Loader::InternalLoadNonDocumentSheet(
auto data = MakeRefPtr<SheetLoadData>( auto data = MakeRefPtr<SheetLoadData>(
this, aURL, sheet, SyncLoad(syncLoad), aUseSystemPrincipal, aPreloadKind, this, aURL, sheet, SyncLoad(syncLoad), aUseSystemPrincipal, aPreloadKind,
aPreloadEncoding, aObserver, triggeringPrincipal, aReferrerInfo, aNonce); aPreloadEncoding, aObserver, triggeringPrincipal, aReferrerInfo, aNonce,
aFetchPriority);
MOZ_ASSERT(data->GetRequestingNode() == mDocument); MOZ_ASSERT(data->GetRequestingNode() == mDocument);
if (state == SheetState::Complete) { if (state == SheetState::Complete) {
LOG((" Sheet already complete")); LOG((" Sheet already complete"));

View file

@ -41,6 +41,7 @@ class StyleSheet;
namespace dom { namespace dom {
class DocGroup; class DocGroup;
class Element; class Element;
enum class FetchPriority : uint8_t;
} // namespace dom } // namespace dom
// The load data for a <link> or @import style-sheet. // The load data for a <link> or @import style-sheet.
@ -373,10 +374,12 @@ class Loader final {
nsIURI* aURI, StylePreloadKind, const Encoding* aPreloadEncoding, nsIURI* aURI, StylePreloadKind, const Encoding* aPreloadEncoding,
nsIReferrerInfo* aReferrerInfo, nsICSSLoaderObserver* aObserver, nsIReferrerInfo* aReferrerInfo, nsICSSLoaderObserver* aObserver,
uint64_t aEarlyHintPreloaderId, CORSMode aCORSMode, uint64_t aEarlyHintPreloaderId, CORSMode aCORSMode,
const nsAString& aNonce, const nsAString& aIntegrity); const nsAString& aNonce, const nsAString& aIntegrity,
dom::FetchPriority aFetchPriority);
/** /**
* As above, but without caring for a couple things. * As above, but without caring for a couple things.
* Only to be called by `PreloadedStyleSheet::PreloadAsync`.
*/ */
Result<RefPtr<StyleSheet>, nsresult> LoadSheet(nsIURI*, SheetParsingMode, Result<RefPtr<StyleSheet>, nsresult> LoadSheet(nsIURI*, SheetParsingMode,
UseSystemPrincipal, UseSystemPrincipal,
@ -560,7 +563,7 @@ class Loader final {
UseSystemPrincipal, const Encoding* aPreloadEncoding, UseSystemPrincipal, const Encoding* aPreloadEncoding,
nsIReferrerInfo* aReferrerInfo, nsICSSLoaderObserver* aObserver, nsIReferrerInfo* aReferrerInfo, nsICSSLoaderObserver* aObserver,
CORSMode aCORSMode, const nsAString& aNonce, const nsAString& aIntegrity, CORSMode aCORSMode, const nsAString& aNonce, const nsAString& aIntegrity,
uint64_t aEarlyHintPreloaderId); uint64_t aEarlyHintPreloaderId, dom::FetchPriority aFetchPriority);
RefPtr<StyleSheet> LookupInlineSheetInCache(const nsAString&, nsIPrincipal*); RefPtr<StyleSheet> LookupInlineSheetInCache(const nsAString&, nsIPrincipal*);

View file

@ -70,14 +70,12 @@ class SheetLoadData final
nsIPrincipal* aTriggeringPrincipal, nsIReferrerInfo*); nsIPrincipal* aTriggeringPrincipal, nsIReferrerInfo*);
// Data for loading a non-document sheet // Data for loading a non-document sheet
// TODO: does this include sheets linked from a Link header? If so, the fetch
// priority needs to be passed too.
SheetLoadData(css::Loader*, nsIURI*, StyleSheet*, SyncLoad, SheetLoadData(css::Loader*, nsIURI*, StyleSheet*, SyncLoad,
UseSystemPrincipal, StylePreloadKind, UseSystemPrincipal, StylePreloadKind,
const Encoding* aPreloadEncoding, const Encoding* aPreloadEncoding,
nsICSSLoaderObserver* aObserver, nsICSSLoaderObserver* aObserver,
nsIPrincipal* aTriggeringPrincipal, nsIReferrerInfo*, nsIPrincipal* aTriggeringPrincipal, nsIReferrerInfo*,
const nsAString& aNonce); const nsAString& aNonce, dom::FetchPriority aFetchPriority);
nsIReferrerInfo* ReferrerInfo() const { return mReferrerInfo; } nsIReferrerInfo* ReferrerInfo() const { return mReferrerInfo; }

View file

@ -13,6 +13,7 @@
#include "mozilla/dom/CSSImportRule.h" #include "mozilla/dom/CSSImportRule.h"
#include "mozilla/dom/CSSRuleList.h" #include "mozilla/dom/CSSRuleList.h"
#include "mozilla/dom/Element.h" #include "mozilla/dom/Element.h"
#include "mozilla/dom/FetchPriority.h"
#include "mozilla/dom/MediaList.h" #include "mozilla/dom/MediaList.h"
#include "mozilla/dom/Promise.h" #include "mozilla/dom/Promise.h"
#include "mozilla/dom/ReferrerInfo.h" #include "mozilla/dom/ReferrerInfo.h"
@ -680,7 +681,7 @@ void StyleSheet::MaybeRejectReplacePromise() {
mReplacePromise = nullptr; mReplacePromise = nullptr;
} }
// https://wicg.github.io/construct-stylesheets/#dom-cssstylesheet-replace // https://drafts.csswg.org/cssom/#dom-cssstylesheet-replace
already_AddRefed<dom::Promise> StyleSheet::Replace(const nsACString& aText, already_AddRefed<dom::Promise> StyleSheet::Replace(const nsACString& aText,
ErrorResult& aRv) { ErrorResult& aRv) {
nsIGlobalObject* globalObject = nullptr; nsIGlobalObject* globalObject = nullptr;
@ -725,7 +726,7 @@ already_AddRefed<dom::Promise> StyleSheet::Replace(const nsACString& aText,
css::Loader::UseSystemPrincipal::No, css::StylePreloadKind::None, css::Loader::UseSystemPrincipal::No, css::StylePreloadKind::None,
/* aPreloadEncoding */ nullptr, /* aObserver */ nullptr, /* aPreloadEncoding */ nullptr, /* aObserver */ nullptr,
mConstructorDocument->NodePrincipal(), GetReferrerInfo(), mConstructorDocument->NodePrincipal(), GetReferrerInfo(),
/* aNonce */ u""_ns); /* aNonce */ u""_ns, FetchPriority::Auto);
// In parallel // In parallel
// 5.1 Parse aText into rules. // 5.1 Parse aText into rules.

View file

@ -80,7 +80,7 @@ void nsHtml5SpeculativeLoad::Perform(nsHtml5TreeOpExecutor* aExecutor) {
mUrlOrSizes, mCharsetOrSrcset, mCrossOrigin, mMedia, mUrlOrSizes, mCharsetOrSrcset, mCrossOrigin, mMedia,
mReferrerPolicyOrIntegrity, mNonce, mReferrerPolicyOrIntegrity, mNonce,
mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity,
mIsLinkPreload); mIsLinkPreload, mFetchPriority);
break; break;
case eSpeculativeLoadManifest: case eSpeculativeLoadManifest:
// TODO: remove this // TODO: remove this

View file

@ -213,7 +213,8 @@ class nsHtml5SpeculativeLoad {
inline void InitStyle(nsHtml5String aUrl, nsHtml5String aCharset, inline void InitStyle(nsHtml5String aUrl, nsHtml5String aCharset,
nsHtml5String aCrossOrigin, nsHtml5String aMedia, nsHtml5String aCrossOrigin, nsHtml5String aMedia,
nsHtml5String aReferrerPolicy, nsHtml5String aNonce, nsHtml5String aReferrerPolicy, nsHtml5String aNonce,
nsHtml5String aIntegrity, bool aLinkPreload) { nsHtml5String aIntegrity, bool aLinkPreload,
nsHtml5String aFetchPriority) {
MOZ_ASSERT(mOpCode == eSpeculativeLoadUninitialized, MOZ_ASSERT(mOpCode == eSpeculativeLoadUninitialized,
"Trying to reinitialize a speculative load!"); "Trying to reinitialize a speculative load!");
mOpCode = eSpeculativeLoadStyle; mOpCode = eSpeculativeLoadStyle;
@ -231,6 +232,7 @@ class nsHtml5SpeculativeLoad {
aIntegrity.ToString( aIntegrity.ToString(
mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity); mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity);
mIsLinkPreload = aLinkPreload; mIsLinkPreload = aLinkPreload;
aFetchPriority.ToString(mFetchPriority);
} }
/** /**

View file

@ -364,9 +364,11 @@ nsIContentHandle* nsHtml5TreeBuilder::createElement(
nsHtml5AttributeName::ATTR_REFERRERPOLICY); nsHtml5AttributeName::ATTR_REFERRERPOLICY);
nsHtml5String media = nsHtml5String media =
aAttributes->getValue(nsHtml5AttributeName::ATTR_MEDIA); aAttributes->getValue(nsHtml5AttributeName::ATTR_MEDIA);
nsHtml5String fetchPriority = aAttributes->getValue(
nsHtml5AttributeName::ATTR_FETCHPRIORITY);
mSpeculativeLoadQueue.AppendElement()->InitStyle( mSpeculativeLoadQueue.AppendElement()->InitStyle(
url, charset, crossOrigin, media, referrerPolicy, nonce, url, charset, crossOrigin, media, referrerPolicy, nonce,
integrity, false); integrity, false, fetchPriority);
} }
} else if (rel.LowerCaseEqualsASCII("preconnect")) { } else if (rel.LowerCaseEqualsASCII("preconnect")) {
nsHtml5String url = nsHtml5String url =
@ -395,6 +397,8 @@ nsIContentHandle* nsHtml5TreeBuilder::createElement(
nsHtml5AttributeName::ATTR_REFERRERPOLICY); nsHtml5AttributeName::ATTR_REFERRERPOLICY);
nsHtml5String media = nsHtml5String media =
aAttributes->getValue(nsHtml5AttributeName::ATTR_MEDIA); aAttributes->getValue(nsHtml5AttributeName::ATTR_MEDIA);
nsHtml5String fetchPriority = aAttributes->getValue(
nsHtml5AttributeName::ATTR_FETCHPRIORITY);
// Note that respective speculative loaders for scripts and // Note that respective speculative loaders for scripts and
// styles check all additional attributes to be equal to use the // styles check all additional attributes to be equal to use the
@ -406,14 +410,6 @@ nsIContentHandle* nsHtml5TreeBuilder::createElement(
if (as.LowerCaseEqualsASCII("script")) { if (as.LowerCaseEqualsASCII("script")) {
nsHtml5String type = nsHtml5String type =
aAttributes->getValue(nsHtml5AttributeName::ATTR_TYPE); aAttributes->getValue(nsHtml5AttributeName::ATTR_TYPE);
// Bug 1839315: get the attribute's value instead.
// Use the empty string and rely on the
// "invalid value default" state being used later.
// Compared to using a non-empty string, this doesn't
// require calling `Release()` for the string.
nsHtml5String fetchPriority = nsHtml5String::EmptyString();
mSpeculativeLoadQueue.AppendElement()->InitScript( mSpeculativeLoadQueue.AppendElement()->InitScript(
url, charset, type, crossOrigin, media, nonce, url, charset, type, crossOrigin, media, nonce,
/* aFetchPriority */ fetchPriority, integrity, /* aFetchPriority */ fetchPriority, integrity,
@ -422,7 +418,7 @@ nsIContentHandle* nsHtml5TreeBuilder::createElement(
} else if (as.LowerCaseEqualsASCII("style")) { } else if (as.LowerCaseEqualsASCII("style")) {
mSpeculativeLoadQueue.AppendElement()->InitStyle( mSpeculativeLoadQueue.AppendElement()->InitStyle(
url, charset, crossOrigin, media, referrerPolicy, nonce, url, charset, crossOrigin, media, referrerPolicy, nonce,
integrity, true); integrity, true, fetchPriority);
} else if (as.LowerCaseEqualsASCII("image")) { } else if (as.LowerCaseEqualsASCII("image")) {
nsHtml5String srcset = aAttributes->getValue( nsHtml5String srcset = aAttributes->getValue(
nsHtml5AttributeName::ATTR_IMAGESRCSET); nsHtml5AttributeName::ATTR_IMAGESRCSET);

View file

@ -1233,7 +1233,8 @@ void nsHtml5TreeOpExecutor::PreloadStyle(
const nsAString& aURL, const nsAString& aCharset, const nsAString& aURL, const nsAString& aCharset,
const nsAString& aCrossOrigin, const nsAString& aMedia, const nsAString& aCrossOrigin, const nsAString& aMedia,
const nsAString& aReferrerPolicy, const nsAString& aNonce, const nsAString& aReferrerPolicy, const nsAString& aNonce,
const nsAString& aIntegrity, bool aLinkPreload) { const nsAString& aIntegrity, bool aLinkPreload,
const nsAString& aFetchPriority) {
nsCOMPtr<nsIURI> uri = ConvertIfNotPreloadedYetAndMediaApplies(aURL, aMedia); nsCOMPtr<nsIURI> uri = ConvertIfNotPreloadedYetAndMediaApplies(aURL, aMedia);
if (!uri) { if (!uri) {
return; return;
@ -1254,7 +1255,7 @@ void nsHtml5TreeOpExecutor::PreloadStyle(
GetPreloadReferrerPolicy(aReferrerPolicy), aNonce, aIntegrity, GetPreloadReferrerPolicy(aReferrerPolicy), aNonce, aIntegrity,
aLinkPreload ? css::StylePreloadKind::FromLinkRelPreloadElement aLinkPreload ? css::StylePreloadKind::FromLinkRelPreloadElement
: css::StylePreloadKind::FromParser, : css::StylePreloadKind::FromParser,
0); 0, aFetchPriority);
} }
void nsHtml5TreeOpExecutor::PreloadImage( void nsHtml5TreeOpExecutor::PreloadImage(

View file

@ -254,7 +254,8 @@ class nsHtml5TreeOpExecutor final
void PreloadStyle(const nsAString& aURL, const nsAString& aCharset, void PreloadStyle(const nsAString& aURL, const nsAString& aCharset,
const nsAString& aCrossOrigin, const nsAString& aMedia, const nsAString& aCrossOrigin, const nsAString& aMedia,
const nsAString& aReferrerPolicy, const nsAString& aNonce, const nsAString& aReferrerPolicy, const nsAString& aNonce,
const nsAString& aIntegrity, bool aLinkPreload); const nsAString& aIntegrity, bool aLinkPreload,
const nsAString& aFetchPriority);
void PreloadImage(const nsAString& aURL, const nsAString& aCrossOrigin, void PreloadImage(const nsAString& aURL, const nsAString& aCrossOrigin,
const nsAString& aMedia, const nsAString& aSrcset, const nsAString& aMedia, const nsAString& aSrcset,

View file

@ -1,9 +1,6 @@
[fetchpriority.h2.html] [fetchpriority.h2.html]
lsan-allowed: [mozilla::net::AddStaticElement, InitializeStaticHeaders, mozilla::net::nvFIFO::nvFIFO, mozilla::net::Http2BaseCompressor::Http2BaseCompressor] # https://bugzilla.mozilla.org/show_bug.cgi?id=1759310 lsan-allowed: [mozilla::net::AddStaticElement, InitializeStaticHeaders, mozilla::net::nvFIFO::nvFIFO, mozilla::net::Http2BaseCompressor::Http2BaseCompressor] # https://bugzilla.mozilla.org/show_bug.cgi?id=1759310
prefs: [network.fetchpriority.enabled:true] prefs: [network.fetchpriority.enabled:true]
[link-initial-load-stylesheet.h2.html: test different 'fetchpriority' values]
expected: FAIL
[link-initial-preload.h2.html: test different 'fetchpriority' values] [link-initial-preload.h2.html: test different 'fetchpriority' values]
expected: FAIL expected: FAIL
@ -22,14 +19,5 @@
[link-header.h2.html?pipe=header(Link,<dummy.js?1>; rel=modulepreload; fetchpriority=low,True)|header(Link,<dummy.js?2>; rel=modulepreload; fetchpriority=high,True)|header(Link,<dummy.js?3>; rel=modulepreload; fetchpriority=auto,True)|header(Link,<dummy.js?4>; rel=modulepreload,True): test different 'fetchpriority' values] [link-header.h2.html?pipe=header(Link,<dummy.js?1>; rel=modulepreload; fetchpriority=low,True)|header(Link,<dummy.js?2>; rel=modulepreload; fetchpriority=high,True)|header(Link,<dummy.js?3>; rel=modulepreload; fetchpriority=auto,True)|header(Link,<dummy.js?4>; rel=modulepreload,True): test different 'fetchpriority' values]
expected: FAIL expected: FAIL
[link-initial-preload-style.h2.html: test different 'fetchpriority' values]
expected: FAIL
[link-dynamic-preload-style.h2.html: test different 'fetchpriority' values]
expected: FAIL
[link-header.h2.html?pipe=header(Link,<dummy.txt?1>; rel=preload; as=fetch; fetchpriority=low,True)|header(Link,<dummy.txt?2>; rel=preload; as=fetch; fetchpriority=high,True)|header(Link,<dummy.txt?3>; rel=preload; as=fetch; fetchpriority=auto,True)|header(Link,<dummy.txt?4>; rel=preload; as=fetch,True)|header(Link,<dummy.font?1>; rel=preload; as=font; fetchpriority=low,True)|header(Link,<dummy.font?2>; rel=preload; as=font; fetchpriority=high,True)|header(Link,<dummy.font?3>; rel=preload; as=font; fetchpriority=auto,True)|header(Link,<dummy.font?4>; rel=preload; as=font,True)|header(Link,<dummy.image?1>; rel=preload; as=image; fetchpriority=low,True)|header(Link,<dummy.image?2>; rel=preload; as=image; fetchpriority=high,True)|header(Link,<dummy.image?3>; rel=preload; as=image; fetchpriority=auto,True)|header(Link,<dummy.image?4>; rel=preload; as=image,True)|header(Link,<dummy.script?1>; rel=preload; as=script; fetchpriority=low,True)|header(Link,<dummy.script?2>; rel=preload; as=script; fetchpriority=high,True)|header(Link,<dummy.script?3>; rel=preload; as=script; fetchpriority=auto,True)|header(Link,<dummy.script?4>; rel=preload; as=script,True): test different 'fetchpriority' values] [link-header.h2.html?pipe=header(Link,<dummy.txt?1>; rel=preload; as=fetch; fetchpriority=low,True)|header(Link,<dummy.txt?2>; rel=preload; as=fetch; fetchpriority=high,True)|header(Link,<dummy.txt?3>; rel=preload; as=fetch; fetchpriority=auto,True)|header(Link,<dummy.txt?4>; rel=preload; as=fetch,True)|header(Link,<dummy.font?1>; rel=preload; as=font; fetchpriority=low,True)|header(Link,<dummy.font?2>; rel=preload; as=font; fetchpriority=high,True)|header(Link,<dummy.font?3>; rel=preload; as=font; fetchpriority=auto,True)|header(Link,<dummy.font?4>; rel=preload; as=font,True)|header(Link,<dummy.image?1>; rel=preload; as=image; fetchpriority=low,True)|header(Link,<dummy.image?2>; rel=preload; as=image; fetchpriority=high,True)|header(Link,<dummy.image?3>; rel=preload; as=image; fetchpriority=auto,True)|header(Link,<dummy.image?4>; rel=preload; as=image,True)|header(Link,<dummy.script?1>; rel=preload; as=script; fetchpriority=low,True)|header(Link,<dummy.script?2>; rel=preload; as=script; fetchpriority=high,True)|header(Link,<dummy.script?3>; rel=preload; as=script; fetchpriority=auto,True)|header(Link,<dummy.script?4>; rel=preload; as=script,True): test different 'fetchpriority' values]
expected: FAIL expected: FAIL
[link-header.h2.html?pipe=header(Link,<dummy.css?1>; rel=preload; as=style; fetchpriority=low,True)|header(Link,<dummy.css?2>; rel=preload; as=style; fetchpriority=high,True)|header(Link,<dummy.css?3>; rel=preload; as=style; fetchpriority=auto,True)|header(Link,<dummy.css?4>; rel=preload; as=style,True): test different 'fetchpriority' values]
expected: FAIL

View file

@ -80,8 +80,7 @@ already_AddRefed<PreloaderBase> PreloadService::PreloadLinkElement(
aLinkElement->GetCrossOrigin(crossOrigin); aLinkElement->GetCrossOrigin(crossOrigin);
aLinkElement->GetIntegrity(integrity); aLinkElement->GetIntegrity(integrity);
aLinkElement->GetReferrerPolicy(referrerPolicy); aLinkElement->GetReferrerPolicy(referrerPolicy);
// Bug 1839315: get "fetchpriority"'s value from the link element instead, aLinkElement->GetFetchPriority(fetchPriority);
fetchPriority = NS_ConvertUTF8toUTF16(dom::kFetchPriorityAttributeValueAuto);
aLinkElement->GetRel(rel); aLinkElement->GetRel(rel);
nsAutoString nonce; nsAutoString nonce;
@ -117,18 +116,16 @@ void PreloadService::PreloadLinkHeader(
const nsAString& aAs, const nsAString& aType, const nsAString& aNonce, const nsAString& aAs, const nsAString& aType, const nsAString& aNonce,
const nsAString& aIntegrity, const nsAString& aSrcset, const nsAString& aIntegrity, const nsAString& aSrcset,
const nsAString& aSizes, const nsAString& aCORS, const nsAString& aSizes, const nsAString& aCORS,
const nsAString& aReferrerPolicy, uint64_t aEarlyHintPreloaderId) { const nsAString& aReferrerPolicy, uint64_t aEarlyHintPreloaderId,
const nsAString& aFetchPriority) {
if (aPolicyType == nsIContentPolicy::TYPE_INVALID) { if (aPolicyType == nsIContentPolicy::TYPE_INVALID) {
MOZ_ASSERT_UNREACHABLE("Caller should check"); MOZ_ASSERT_UNREACHABLE("Caller should check");
return; return;
} }
// Bug 1839315: which fetch priority to use here?
const nsAutoString fetchPriority =
NS_ConvertUTF8toUTF16(dom::kFetchPriorityAttributeValueAuto);
PreloadOrCoalesce(aURI, aURL, aPolicyType, aAs, aType, u""_ns, aSrcset, PreloadOrCoalesce(aURI, aURL, aPolicyType, aAs, aType, u""_ns, aSrcset,
aSizes, aNonce, aIntegrity, aCORS, aReferrerPolicy, aSizes, aNonce, aIntegrity, aCORS, aReferrerPolicy,
fetchPriority, aFetchPriority,
/* aFromHeader = */ true, aEarlyHintPreloaderId); /* aFromHeader = */ true, aEarlyHintPreloaderId);
} }
@ -187,7 +184,7 @@ PreloadService::PreloadOrCoalesceResult PreloadService::PreloadOrCoalesce(
PreloadReferrerPolicy(aReferrerPolicy), aNonce, aIntegrity, PreloadReferrerPolicy(aReferrerPolicy), aNonce, aIntegrity,
aFromHeader ? css::StylePreloadKind::FromLinkRelPreloadHeader aFromHeader ? css::StylePreloadKind::FromLinkRelPreloadHeader
: css::StylePreloadKind::FromLinkRelPreloadElement, : css::StylePreloadKind::FromLinkRelPreloadElement,
aEarlyHintPreloaderId); aEarlyHintPreloaderId, aFetchPriority);
switch (status) { switch (status) {
case dom::SheetPreloadStatus::AlreadyComplete: case dom::SheetPreloadStatus::AlreadyComplete:
return {nullptr, /* already_complete = */ true}; return {nullptr, /* already_complete = */ true};

View file

@ -78,7 +78,8 @@ class PreloadService {
const nsAString& aIntegrity, const nsAString& aSrcset, const nsAString& aIntegrity, const nsAString& aSrcset,
const nsAString& aSizes, const nsAString& aCORS, const nsAString& aSizes, const nsAString& aCORS,
const nsAString& aReferrerPolicy, const nsAString& aReferrerPolicy,
uint64_t aEarlyHintPreloaderId); uint64_t aEarlyHintPreloaderId,
const nsAString& aFetchPriority);
void PreloadScript(nsIURI* aURI, const nsAString& aType, void PreloadScript(nsIURI* aURI, const nsAString& aType,
const nsAString& aCharset, const nsAString& aCrossOrigin, const nsAString& aCharset, const nsAString& aCrossOrigin,