tor-browser

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

commit 92013428c4f8c2afd0cb7c77cb4bf3ba44749c50
parent 62795c77d763101812f1b32416342c95510077df
Author: Harveer Singh <hsingh@mozilla.com>
Date:   Mon,  3 Nov 2025 22:49:22 +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:
Mdom/serviceworkers/ServiceWorkerScriptCache.cpp | 9+++++----
Mdom/workers/loader/NetworkLoadHandler.cpp | 30+++++++++++++++++-------------
Mnetwerk/protocol/http/HttpBaseChannel.cpp | 10++++++++++
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 @@ -3037,6 +3037,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: