diff --git a/dom/script/ModuleLoader.cpp b/dom/script/ModuleLoader.cpp index d7dd2fb547f6..0043f670b0c3 100644 --- a/dom/script/ModuleLoader.cpp +++ b/dom/script/ModuleLoader.cpp @@ -107,7 +107,8 @@ nsresult ModuleLoader::StartFetch(ModuleLoadRequest* aRequest) { securityFlags |= nsILoadInfo::SEC_ALLOW_CHROME; // Delegate Shared Behavior to base ScriptLoader - nsresult rv = GetScriptLoader()->StartLoadInternal(aRequest, securityFlags); + nsresult rv = + GetScriptLoader()->StartLoadInternal(aRequest, securityFlags, 0); NS_ENSURE_SUCCESS(rv, rv); // https://html.spec.whatwg.org/multipage/webappapis.html#fetch-an-import()-module-script-graph diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp index a1069c911eeb..8f2462c8ff45 100644 --- a/dom/script/ScriptLoader.cpp +++ b/dom/script/ScriptLoader.cpp @@ -9,6 +9,7 @@ #include "ScriptTrace.h" #include "ModuleLoader.h" +#include "nsIChildChannel.h" #include "zlib.h" #include "prsystem.h" @@ -519,7 +520,7 @@ nsresult ScriptLoader::RestartLoad(ScriptLoadRequest* aRequest) { if (aRequest->IsModuleRequest()) { rv = aRequest->AsModuleRequest()->RestartModuleLoad(); } else { - rv = StartLoad(aRequest); + rv = StartLoad(aRequest, 0); } if (NS_FAILED(rv)) { return rv; @@ -530,15 +531,17 @@ nsresult ScriptLoader::RestartLoad(ScriptLoadRequest* aRequest) { return NS_BINDING_RETARGETED; } -nsresult ScriptLoader::StartLoad(ScriptLoadRequest* aRequest) { +nsresult ScriptLoader::StartLoad(ScriptLoadRequest* aRequest, + uint64_t aEarlyHintPreloaderId) { if (aRequest->IsModuleRequest()) { return aRequest->AsModuleRequest()->StartModuleLoad(); } - return StartClassicLoad(aRequest); + return StartClassicLoad(aRequest, aEarlyHintPreloaderId); } -nsresult ScriptLoader::StartClassicLoad(ScriptLoadRequest* aRequest) { +nsresult ScriptLoader::StartClassicLoad(ScriptLoadRequest* aRequest, + uint64_t aEarlyHintPreloaderId) { MOZ_ASSERT(aRequest->IsFetching()); NS_ENSURE_TRUE(mDocument, NS_ERROR_NULL_POINTER); aRequest->SetUnknownDataType(); @@ -562,7 +565,8 @@ nsresult ScriptLoader::StartClassicLoad(ScriptLoadRequest* aRequest) { securityFlags |= nsILoadInfo::SEC_ALLOW_CHROME; - nsresult rv = StartLoadInternal(aRequest, securityFlags); + nsresult rv = + StartLoadInternal(aRequest, securityFlags, aEarlyHintPreloaderId); NS_ENSURE_SUCCESS(rv, rv); @@ -580,7 +584,8 @@ static bool IsWebExtensionRequest(ScriptLoadRequest* aRequest) { } nsresult ScriptLoader::StartLoadInternal(ScriptLoadRequest* aRequest, - nsSecurityFlags securityFlags) { + nsSecurityFlags securityFlags, + uint64_t aEarlyHintPreloaderId) { nsContentPolicyType contentPolicyType = ScriptLoadRequestToContentPolicyType(aRequest); nsCOMPtr context; @@ -606,6 +611,15 @@ nsresult ScriptLoader::StartLoadInternal(ScriptLoadRequest* aRequest, NS_ENSURE_SUCCESS(rv, rv); + if (aEarlyHintPreloaderId) { + nsCOMPtr channelInternal = + do_QueryInterface(channel); + NS_ENSURE_TRUE(channelInternal != nullptr, NS_ERROR_FAILURE); + + rv = channelInternal->SetEarlyHintPreloaderId(aEarlyHintPreloaderId); + NS_ENSURE_SUCCESS(rv, rv); + } + // snapshot the nonce at load start time for performing CSP checks if (contentPolicyType == nsIContentPolicy::TYPE_INTERNAL_SCRIPT || contentPolicyType == nsIContentPolicy::TYPE_INTERNAL_MODULE) { @@ -727,7 +741,9 @@ nsresult ScriptLoader::StartLoadInternal(ScriptLoadRequest* aRequest, // Set the initiator type nsCOMPtr timedChannel(do_QueryInterface(httpChannel)); if (timedChannel) { - if (aRequest->GetScriptLoadContext()->IsLinkPreloadScript()) { + if (aEarlyHintPreloaderId) { + timedChannel->SetInitiatorType(u"early-hints"_ns); + } else if (aRequest->GetScriptLoadContext()->IsLinkPreloadScript()) { timedChannel->SetInitiatorType(u"link"_ns); } else { timedChannel->SetInitiatorType(u"script"_ns); @@ -757,6 +773,14 @@ nsresult ScriptLoader::StartLoadInternal(ScriptLoadRequest* aRequest, key, channel, mDocument, aRequest->GetScriptLoadContext()->IsLinkPreloadScript()); + if (aEarlyHintPreloaderId) { + nsCOMPtr channelInternal = + do_QueryInterface(channel); + NS_ENSURE_TRUE(channelInternal != nullptr, NS_ERROR_FAILURE); + + rv = channelInternal->SetEarlyHintPreloaderId(aEarlyHintPreloaderId); + NS_ENSURE_SUCCESS(rv, rv); + } rv = channel->AsyncOpen(loader); if (NS_FAILED(rv)) { @@ -1002,7 +1026,7 @@ bool ScriptLoader::ProcessExternalScript(nsIScriptElement* aElement, LOG(("ScriptLoadRequest (%p): Created request for external script", request.get())); - nsresult rv = StartLoad(request); + nsresult rv = StartLoad(request, 0); if (NS_FAILED(rv)) { ReportErrorToConsole(request, rv); @@ -3536,7 +3560,8 @@ void ScriptLoader::PreloadURI(nsIURI* aURI, const nsAString& aCharset, const nsAString& aIntegrity, bool aScriptFromHead, bool aAsync, bool aDefer, bool aNoModule, bool aLinkPreload, - const ReferrerPolicy aReferrerPolicy) { + const ReferrerPolicy aReferrerPolicy, + uint64_t aEarlyHintPreloaderId) { NS_ENSURE_TRUE_VOID(mDocument); // Check to see if scripts has been turned off. if (!mEnabled || !mDocument->IsScriptEnabled()) { @@ -3584,7 +3609,7 @@ void ScriptLoader::PreloadURI(nsIURI* aURI, const nsAString& aCharset, request.get(), url.get())); } - nsresult rv = StartLoad(request); + nsresult rv = StartLoad(request, aEarlyHintPreloaderId); if (NS_FAILED(rv)) { return; } diff --git a/dom/script/ScriptLoader.h b/dom/script/ScriptLoader.h index 180649504b8a..8960afa7a0c1 100644 --- a/dom/script/ScriptLoader.h +++ b/dom/script/ScriptLoader.h @@ -392,7 +392,8 @@ class ScriptLoader final : public JS::loader::ScriptLoaderInterface { const nsAString& aIntegrity, bool aScriptFromHead, bool aAsync, bool aDefer, bool aNoModule, bool aLinkPreload, - const ReferrerPolicy aReferrerPolicy); + const ReferrerPolicy aReferrerPolicy, + uint64_t aEarlyHintPreloaderId); /** * Process a request that was deferred so that the script could be compiled @@ -490,18 +491,21 @@ class ScriptLoader final : public JS::loader::ScriptLoaderInterface { /** * Start a load for aRequest's URI. */ - nsresult StartLoad(ScriptLoadRequest* aRequest); + nsresult StartLoad(ScriptLoadRequest* aRequest, + uint64_t aEarlyHintPreloaderId); /** * Start a load for a classic script URI. * Sets up the necessary security flags before calling StartLoadInternal. */ - nsresult StartClassicLoad(ScriptLoadRequest* aRequest); + nsresult StartClassicLoad(ScriptLoadRequest* aRequest, + uint64_t aEarlyHintPreloaderId); /** * Start a load for a module script URI. */ nsresult StartLoadInternal(ScriptLoadRequest* aRequest, - nsSecurityFlags securityFlags); + nsSecurityFlags securityFlags, + uint64_t aEarlyHintPreloaderId); /** * Abort the current stream, and re-start with a new load request from scratch diff --git a/parser/html/nsHtml5TreeOpExecutor.cpp b/parser/html/nsHtml5TreeOpExecutor.cpp index 9cf6af3de53a..9744d01e85d6 100644 --- a/parser/html/nsHtml5TreeOpExecutor.cpp +++ b/parser/html/nsHtml5TreeOpExecutor.cpp @@ -1218,7 +1218,7 @@ void nsHtml5TreeOpExecutor::PreloadScript( mDocument->ScriptLoader()->PreloadURI( uri, aCharset, aType, aCrossOrigin, aIntegrity, aScriptFromHead, aAsync, aDefer, aNoModule, aLinkPreload, - GetPreloadReferrerPolicy(aReferrerPolicy)); + GetPreloadReferrerPolicy(aReferrerPolicy), 0); } void nsHtml5TreeOpExecutor::PreloadStyle(const nsAString& aURL, diff --git a/uriloader/preload/PreloadService.cpp b/uriloader/preload/PreloadService.cpp index 3fc87a56a3f7..ead44301586d 100644 --- a/uriloader/preload/PreloadService.cpp +++ b/uriloader/preload/PreloadService.cpp @@ -198,7 +198,8 @@ void PreloadService::PreloadScript(nsIURI* aURI, const nsAString& aType, uint64_t aEarlyHintPreloaderId) { mDocument->ScriptLoader()->PreloadURI( aURI, aCharset, aType, aCrossOrigin, aIntegrity, aScriptFromHead, false, - false, false, true, PreloadReferrerPolicy(aReferrerPolicy)); + false, false, true, PreloadReferrerPolicy(aReferrerPolicy), + aEarlyHintPreloaderId); } void PreloadService::PreloadImage(nsIURI* aURI, const nsAString& aCrossOrigin,