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:
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.