tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit dd8530cb712421183ae28572cad60551445be0bb
parent b4a4f94096c14d0602a2c4007046e84559e169cb
Author: Tooru Fujisawa <arai_a@mac.com>
Date:   Wed, 22 Oct 2025 04:35:33 +0000

Bug 1991607 - Part 2: Let ScriptLoader::CheckContentPolicy receive LoadedScript-related parameters separately. r=bthrall

In the same way as Part 1, CheckContentPolicy can be called before LoadedScript
is created, and it should receive related parameters separately in addition to
ScriptLoadRequest.

Differential Revision: https://phabricator.services.mozilla.com/D267350

Diffstat:
Mdom/script/ScriptLoader.cpp | 26++++++++++++++++----------
Mdom/script/ScriptLoader.h | 3++-
2 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp @@ -463,21 +463,25 @@ nsContentPolicyType ScriptLoadRequestToContentPolicyType( } RequestMode ComputeRequestModeForContentPolicy( - const ScriptLoadRequest* aRequest) { + const ScriptLoadRequest* aRequest, ScriptFetchOptions* aFetchOptions) { auto corsMapping = aRequest->IsModuleRequest() ? nsContentSecurityManager::REQUIRE_CORS_CHECKS : nsContentSecurityManager::CORS_NONE_MAPS_TO_DISABLED_CORS_CHECKS; return nsContentSecurityManager::SecurityModeToRequestMode( nsContentSecurityManager::ComputeSecurityMode( - nsContentSecurityManager::ComputeSecurityFlags(aRequest->CORSMode(), - corsMapping))); + nsContentSecurityManager::ComputeSecurityFlags( + aFetchOptions->mCORSMode, corsMapping))); } nsresult ScriptLoader::CheckContentPolicy(nsIScriptElement* aElement, const nsAString& aNonce, - ScriptLoadRequest* aRequest) { + ScriptLoadRequest* aRequest, + ScriptFetchOptions* aFetchOptions, + nsIURI* aURI) { MOZ_ASSERT(aRequest); + MOZ_ASSERT(aFetchOptions); + MOZ_ASSERT(aURI); nsContentPolicyType contentPolicyType = ScriptLoadRequestToContentPolicyType(aRequest); @@ -495,7 +499,7 @@ nsresult ScriptLoader::CheckContentPolicy(nsIScriptElement* aElement, aElement->GetParserCreated() != mozilla::dom::NOT_FROM_PARSER); Maybe<RequestMode> requestMode = - Some(ComputeRequestModeForContentPolicy(aRequest)); + Some(ComputeRequestModeForContentPolicy(aRequest, aFetchOptions)); secCheckLoadInfo->SetRequestMode(requestMode); // Use nonce of the current element, instead of the preload, because those // are allowed to differ. @@ -504,9 +508,8 @@ nsresult ScriptLoader::CheckContentPolicy(nsIScriptElement* aElement, aRequest->mIntegrity.GetIntegrityString()); int16_t shouldLoad = nsIContentPolicy::ACCEPT; - nsresult rv = - NS_CheckContentLoadPolicy(aRequest->mURI, secCheckLoadInfo, &shouldLoad, - nsContentUtils::GetContentPolicy()); + nsresult rv = NS_CheckContentLoadPolicy(aURI, secCheckLoadInfo, &shouldLoad, + nsContentUtils::GetContentPolicy()); if (NS_FAILED(rv) || NS_CP_REJECTED(shouldLoad)) { if (NS_FAILED(rv) || shouldLoad != nsIContentPolicy::REJECT_TYPE) { return NS_ERROR_CONTENT_BLOCKED; @@ -1186,7 +1189,9 @@ void ScriptLoader::TryUseCache(ScriptLoadRequest* aRequest, if (aRequestType == ScriptLoadRequestType::External) { // NOTE: The preload case checks the same after the // LookupPreloadRequest call. - if (NS_FAILED(CheckContentPolicy(aElement, aNonce, aRequest))) { + if (NS_FAILED(CheckContentPolicy(aElement, aNonce, aRequest, + aRequest->mFetchOptions, + aRequest->mURI))) { aRequest->NoCacheEntryFound(); LOG( ("ScriptLoader (%p): Created LoadedScript (%p) for " @@ -1346,7 +1351,8 @@ bool ScriptLoader::ProcessExternalScript(nsIScriptElement* aElement, RefPtr<ScriptLoadRequest> request = LookupPreloadRequest(aElement, aScriptKind, sriMetadata); if (request) { - if (NS_FAILED(CheckContentPolicy(aElement, nonce, request))) { + if (NS_FAILED(CheckContentPolicy(aElement, nonce, request, + request->mFetchOptions, request->mURI))) { LOG(("ScriptLoader (%p): content policy check failed for preload", this)); // Probably plans have changed; even though the preload was allowed seems diff --git a/dom/script/ScriptLoader.h b/dom/script/ScriptLoader.h @@ -547,7 +547,8 @@ class ScriptLoader final : public JS::loader::ScriptLoaderInterface { */ nsresult CheckContentPolicy(nsIScriptElement* aElement, const nsAString& aNonce, - ScriptLoadRequest* aRequest); + ScriptLoadRequest* aRequest, + ScriptFetchOptions* aFetchOptions, nsIURI* aURI); /** * Helper function to determine whether an about: page loads a chrome: URI.