tor-browser

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

commit c57ef8e8b040455709986701e46f22ce3b32e33e
parent b90fe8819ab6472e96a9a64e16bcc03f129070c4
Author: Eden Chuang <echuang@mozilla.com>
Date:   Sat, 18 Oct 2025 18:03:18 +0000

Bug 1988412 - Update the RemoteWorkerData on main thread. r=asuth

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

Diffstat:
Mdom/workers/sharedworkers/SharedWorkerService.cpp | 37+++++++++++++++++++++++++++++--------
1 file changed, 29 insertions(+), 8 deletions(-)

diff --git a/dom/workers/sharedworkers/SharedWorkerService.cpp b/dom/workers/sharedworkers/SharedWorkerService.cpp @@ -172,8 +172,29 @@ void SharedWorkerService::GetOrCreateWorkerManagerOnMainThread( MOZ_ASSERT(aBackgroundEventTarget); MOZ_ASSERT(aActor); + RemoteWorkerData copyData = aData; + auto principalOrErr = PrincipalInfoToPrincipal(copyData.principalInfo()); + if (NS_WARN_IF(principalOrErr.isErr())) { + ErrorPropagationOnMainThread(aBackgroundEventTarget, aActor, + principalOrErr.unwrapErr()); + return; + } + + nsCOMPtr<nsIPrincipal> principal = principalOrErr.unwrap(); + auto remoteType = RemoteWorkerManager::GetRemoteType( + principal, WorkerKind::WorkerKindShared); + if (NS_WARN_IF(remoteType.isErr())) { + ErrorPropagationOnMainThread(aBackgroundEventTarget, aActor, + remoteType.unwrapErr()); + return; + } + + if (!remoteType.unwrap().Equals(copyData.remoteType())) { + copyData.remoteType() = remoteType.unwrap(); + } + auto partitionedPrincipalOrErr = - PrincipalInfoToPrincipal(aData.partitionedPrincipalInfo()); + PrincipalInfoToPrincipal(copyData.partitionedPrincipalInfo()); if (NS_WARN_IF(partitionedPrincipalOrErr.isErr())) { ErrorPropagationOnMainThread(aBackgroundEventTarget, aActor, partitionedPrincipalOrErr.unwrapErr()); @@ -181,7 +202,7 @@ void SharedWorkerService::GetOrCreateWorkerManagerOnMainThread( } auto loadingPrincipalOrErr = - PrincipalInfoToPrincipal(aData.loadingPrincipalInfo()); + PrincipalInfoToPrincipal(copyData.loadingPrincipalInfo()); if (NS_WARN_IF(loadingPrincipalOrErr.isErr())) { ErrorPropagationOnMainThread(aBackgroundEventTarget, aActor, loadingPrincipalOrErr.unwrapErr()); @@ -195,18 +216,18 @@ void SharedWorkerService::GetOrCreateWorkerManagerOnMainThread( partitionedPrincipalOrErr.unwrap(); nsCOMPtr<nsIPrincipal> effectiveStoragePrincipal = partitionedPrincipal; - if (aData.useRegularPrincipal()) { + if (copyData.useRegularPrincipal()) { effectiveStoragePrincipal = loadingPrincipal; } // Let's see if there is already a SharedWorker to share. nsCOMPtr<nsIURI> resolvedScriptURL = - DeserializeURI(aData.resolvedScriptURL()); + DeserializeURI(copyData.resolvedScriptURL()); for (SharedWorkerManager* workerManager : mWorkerManagers) { bool matchNameButNotOptions = false; managerHolder = workerManager->MatchOnMainThread( - this, aData, resolvedScriptURL, loadingPrincipal, + this, copyData, resolvedScriptURL, loadingPrincipal, BasePrincipal::Cast(effectiveStoragePrincipal)->OriginAttributesRef(), &matchNameButNotOptions); if (managerHolder) { @@ -223,14 +244,14 @@ void SharedWorkerService::GetOrCreateWorkerManagerOnMainThread( // Let's create a new one. if (!managerHolder) { managerHolder = SharedWorkerManager::Create( - this, aBackgroundEventTarget, aData, loadingPrincipal, + this, aBackgroundEventTarget, copyData, loadingPrincipal, BasePrincipal::Cast(effectiveStoragePrincipal)->OriginAttributesRef()); mWorkerManagers.AppendElement(managerHolder->Manager()); } else { // We are attaching the actor to an existing one. if (managerHolder->Manager()->IsSecureContext() != - aData.isSecureContext()) { + copyData.isSecureContext()) { ErrorPropagationOnMainThread(aBackgroundEventTarget, aActor, NS_ERROR_DOM_SECURITY_ERR); return; @@ -241,7 +262,7 @@ void SharedWorkerService::GetOrCreateWorkerManagerOnMainThread( new SharedWorkerManagerWrapper(managerHolder.forget()); RefPtr<WorkerManagerCreatedRunnable> r = new WorkerManagerCreatedRunnable( - wrapper.forget(), aActor, aData, aWindowID, aPortIdentifier); + wrapper.forget(), aActor, copyData, aWindowID, aPortIdentifier); aBackgroundEventTarget->Dispatch(r.forget(), NS_DISPATCH_NORMAL); }