commit 04a9348e2e941256fb9da68a766b08b5a00c52f8
parent 12f477dc65dc07abd9709963e7ed9f7d58fe818b
Author: Harveer Singh <hsingh@mozilla.com>
Date: Fri, 14 Nov 2025 15:53:26 +0000
Bug 1990925: Module service workers should be able to load json modules.r=edenchuang,dom-worker-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D266935
Diffstat:
3 files changed, 32 insertions(+), 17 deletions(-)
diff --git a/dom/serviceworkers/ServiceWorkerScriptCache.cpp b/dom/serviceworkers/ServiceWorkerScriptCache.cpp
@@ -1080,13 +1080,14 @@ CompareNetwork::OnStreamComplete(nsIStreamLoader* aLoader,
return rv;
}
- if (mimeType.IsEmpty() ||
- !nsContentUtils::IsJavascriptMIMEType(NS_ConvertUTF8toUTF16(mimeType))) {
+ auto mimeTypeUTF16 = NS_ConvertUTF8toUTF16(mimeType);
+ if (mimeTypeUTF16.IsEmpty() ||
+ !(nsContentUtils::IsJavascriptMIMEType(mimeTypeUTF16) ||
+ nsContentUtils::IsJsonMimeType(mimeTypeUTF16))) {
ServiceWorkerManager::LocalizeAndReportToAllClients(
mRegistration->Scope(), "ServiceWorkerRegisterMimeTypeError2",
nsTArray<nsString>{NS_ConvertUTF8toUTF16(mRegistration->Scope()),
- NS_ConvertUTF8toUTF16(mimeType),
- NS_ConvertUTF8toUTF16(mURL)});
+ mimeTypeUTF16, NS_ConvertUTF8toUTF16(mURL)});
rv = NS_ERROR_DOM_SECURITY_ERR;
return rv;
}
diff --git a/dom/workers/loader/NetworkLoadHandler.cpp b/dom/workers/loader/NetworkLoadHandler.cpp
@@ -309,19 +309,23 @@ nsresult NetworkLoadHandler::PrepareForRequest(nsIRequest* aRequest) {
nsAutoCString mimeType;
channel->GetContentType(mimeType);
- if (!nsContentUtils::IsJavascriptMIMEType(
- NS_ConvertUTF8toUTF16(mimeType))) {
- const nsCString& scope = mWorkerRef->Private()
- ->GetServiceWorkerRegistrationDescriptor()
- .Scope();
-
- ServiceWorkerManager::LocalizeAndReportToAllClients(
- scope, "ServiceWorkerRegisterMimeTypeError2",
- nsTArray<nsString>{
- NS_ConvertUTF8toUTF16(scope), NS_ConvertUTF8toUTF16(mimeType),
- NS_ConvertUTF8toUTF16(loadContext->mRequest->mURL)});
-
- return NS_ERROR_DOM_NETWORK_ERR;
+ auto mimeTypeUTF16 = NS_ConvertUTF8toUTF16(mimeType);
+ if (!nsContentUtils::IsJavascriptMIMEType(mimeTypeUTF16)) {
+ // JSON is allowed as a non-toplevel.
+ if (loadContext->IsTopLevel() ||
+ !nsContentUtils::IsJsonMimeType(mimeTypeUTF16)) {
+ const nsCString& scope = mWorkerRef->Private()
+ ->GetServiceWorkerRegistrationDescriptor()
+ .Scope();
+
+ ServiceWorkerManager::LocalizeAndReportToAllClients(
+ scope, "ServiceWorkerRegisterMimeTypeError2",
+ nsTArray<nsString>{
+ NS_ConvertUTF8toUTF16(scope), NS_ConvertUTF8toUTF16(mimeType),
+ NS_ConvertUTF8toUTF16(loadContext->mRequest->mURL)});
+
+ return NS_ERROR_DOM_NETWORK_ERR;
+ }
}
}
diff --git a/netwerk/protocol/http/HttpBaseChannel.cpp b/netwerk/protocol/http/HttpBaseChannel.cpp
@@ -3045,6 +3045,16 @@ nsresult EnsureMIMEOfScript(HttpBaseChannel* aChannel, nsIURI* aURI,
return NS_OK;
}
+ const auto internalPolicyType = aLoadInfo->InternalContentPolicyType();
+ if (internalPolicyType == nsIContentPolicy::TYPE_INTERNAL_WORKER_STATIC_MODULE &&
+ nsContentUtils::IsJsonMimeType(typeString)) {
+ // script and json are both allowed
+ glean::http::script_block_incorrect_mime
+ .EnumGet(glean::http::ScriptBlockIncorrectMimeLabel::eTextJson)
+ .Add();
+ return NS_OK;
+ }
+
switch (aLoadInfo->InternalContentPolicyType()) {
case nsIContentPolicy::TYPE_SCRIPT:
case nsIContentPolicy::TYPE_INTERNAL_SCRIPT: