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:
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);
}