diff options
author | Moonchild <moonchild@palemoon.org> | 2020-08-24 11:11:17 +0000 |
---|---|---|
committer | Moonchild <moonchild@palemoon.org> | 2020-08-24 11:13:16 +0000 |
commit | e20ec03e2d5147207a8d06cda2da81b14f68ae21 (patch) | |
tree | 4a4b062e0185ea5cfd1a64d25188f9a9b4e056cd /dom/script | |
parent | f796cea3904df1c261125ade7253eedb8d379af6 (diff) | |
download | aura-central-e20ec03e2d5147207a8d06cda2da81b14f68ae21.tar.gz |
Issue mcp-graveyard/UXP%618 - (async, preload) Correctly pass info about async/defer to parser.
This makes sure we don't block body-referred sub-resources by head-referenced
defer and async scripts. This is important for all script loads, not just
modules, but is added here because it was run into while implementing modules.
Diffstat (limited to 'dom/script')
-rw-r--r-- | dom/script/ScriptLoader.cpp | 12 | ||||
-rw-r--r-- | dom/script/ScriptLoader.h | 6 |
2 files changed, 15 insertions, 3 deletions
diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp index 58f0c0bbe..9216be835 100644 --- a/dom/script/ScriptLoader.cpp +++ b/dom/script/ScriptLoader.cpp @@ -1050,15 +1050,17 @@ ScriptLoader::StartLoad(ScriptLoadRequest *aRequest, const nsAString &aType, NS_ENSURE_SUCCESS(rv, rv); nsIScriptElement *script = aRequest->mElement; + bool async = script ? script->GetScriptAsync() : aRequest->mPreloadAsAsync; + bool defer = script ? script->GetScriptDeferred() : aRequest->mPreloadAsDefer; + nsCOMPtr<nsIClassOfService> cos(do_QueryInterface(channel)); if (cos) { - if (aScriptFromHead && - !(script && (script->GetScriptAsync() || script->GetScriptDeferred()))) { + if (aScriptFromHead && !async && !defer) { // synchronous head scripts block lading of most other non js/css // content such as images cos->AddClassFlags(nsIClassOfService::Leader); - } else if (!(script && script->GetScriptDeferred())) { + } else if (!defer) { // other scripts are neither blocked nor prioritized unless marked deferred cos->AddClassFlags(nsIClassOfService::Unblocked); } @@ -2571,6 +2573,8 @@ ScriptLoader::PreloadURI(nsIURI *aURI, const nsAString &aCharset, const nsAString &aCrossOrigin, const nsAString& aIntegrity, bool aScriptFromHead, + bool aAsync, + bool aDefer, const mozilla::net::ReferrerPolicy aReferrerPolicy) { NS_ENSURE_TRUE_VOID(mDocument); @@ -2601,6 +2605,8 @@ ScriptLoader::PreloadURI(nsIURI *aURI, const nsAString &aCharset, Element::StringToCORSMode(aCrossOrigin), sriMetadata, aReferrerPolicy); request->mIsInline = false; + request->mPreloadAsAsync = aAsync; + request->mPreloadAsDefer = aDefer; nsresult rv = StartLoad(request, aType, aScriptFromHead); if (NS_FAILED(rv)) { diff --git a/dom/script/ScriptLoader.h b/dom/script/ScriptLoader.h index 61680a3ee..b7e20c7ee 100644 --- a/dom/script/ScriptLoader.h +++ b/dom/script/ScriptLoader.h @@ -76,6 +76,8 @@ public: mHasSourceMapURL(false), mInDeferList(false), mInAsyncList(false), + mPreloadAsAsync(false), + mPreloadAsDefer(false), mIsNonAsyncScriptInserted(false), mIsXSLT(false), mIsCanceled(false), @@ -161,6 +163,8 @@ public: bool mHasSourceMapURL; // Does the HTTP header have a source map url? bool mInDeferList; // True if we live in mDeferRequests. bool mInAsyncList; // True if we live in mLoadingAsyncRequests or mLoadedAsyncRequests. + bool mPreloadAsAsync; // True if this is a preload request and the script is async + bool mPreloadAsDefer; // True if this is a preload request and the script is defer bool mIsNonAsyncScriptInserted; // True if we live in mNonAsyncExternalScriptInsertedRequests bool mIsXSLT; // True if we live in mXSLTRequests. bool mIsCanceled; // True if we have been explicitly canceled. @@ -459,6 +463,8 @@ public: const nsAString &aCrossOrigin, const nsAString& aIntegrity, bool aScriptFromHead, + bool aAsync, + bool aDefer, const mozilla::net::ReferrerPolicy aReferrerPolicy); /** |