tor-browser

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

commit dc6f670880a7ea777e9a1287c8926165299808ee
parent bd63d6b6d089285c01836514ca9a4066dd0d3468
Author: Harveer Singh <hsingh@mozilla.com>
Date:   Sun,  2 Nov 2025 14:13:47 +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 | 11++++++++++-
3 files changed, 32 insertions(+), 18 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,14 @@ nsresult EnsureMIMEOfScript(HttpBaseChannel* aChannel, nsIURI* aURI, return NS_OK; } + if (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: @@ -3256,7 +3264,8 @@ void WarnWrongMIMEOfScript(HttpBaseChannel* aChannel, nsIURI* aURI, aResponseHead->ContentType(contentType); NS_ConvertUTF8toUTF16 typeString(contentType); - if (nsContentUtils::IsJavascriptMIMEType(typeString)) { + if (nsContentUtils::IsJavascriptMIMEType(typeString) || + nsContentUtils::IsJsonMimeType(typeString)) { return; }