Bug 1988412 - Update the RemoteWorkerData on main thread. a=RyanVM

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

Differential Revision: https://phabricator.services.mozilla.com/D270489
This commit is contained in:
Eden Chuang
2025-10-29 23:25:42 +00:00
committed by rvandermeulen@mozilla.com
parent 8cc419a251
commit 6fd1decc16

View File

@@ -6,6 +6,7 @@
#include "SharedWorkerService.h" #include "SharedWorkerService.h"
#include "mozilla/dom/MessagePort.h" #include "mozilla/dom/MessagePort.h"
#include "mozilla/dom/RemoteWorkerManager.h" // RemoteWorkerManager::GetRemoteType
#include "mozilla/dom/RemoteWorkerTypes.h" #include "mozilla/dom/RemoteWorkerTypes.h"
#include "mozilla/dom/SharedWorkerManager.h" #include "mozilla/dom/SharedWorkerManager.h"
#include "mozilla/ipc/BackgroundParent.h" #include "mozilla/ipc/BackgroundParent.h"
@@ -171,8 +172,29 @@ void SharedWorkerService::GetOrCreateWorkerManagerOnMainThread(
MOZ_ASSERT(aBackgroundEventTarget); MOZ_ASSERT(aBackgroundEventTarget);
MOZ_ASSERT(aActor); 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 = auto partitionedPrincipalOrErr =
PrincipalInfoToPrincipal(aData.partitionedPrincipalInfo()); PrincipalInfoToPrincipal(copyData.partitionedPrincipalInfo());
if (NS_WARN_IF(partitionedPrincipalOrErr.isErr())) { if (NS_WARN_IF(partitionedPrincipalOrErr.isErr())) {
ErrorPropagationOnMainThread(aBackgroundEventTarget, aActor, ErrorPropagationOnMainThread(aBackgroundEventTarget, aActor,
partitionedPrincipalOrErr.unwrapErr()); partitionedPrincipalOrErr.unwrapErr());
@@ -180,7 +202,7 @@ void SharedWorkerService::GetOrCreateWorkerManagerOnMainThread(
} }
auto loadingPrincipalOrErr = auto loadingPrincipalOrErr =
PrincipalInfoToPrincipal(aData.loadingPrincipalInfo()); PrincipalInfoToPrincipal(copyData.loadingPrincipalInfo());
if (NS_WARN_IF(loadingPrincipalOrErr.isErr())) { if (NS_WARN_IF(loadingPrincipalOrErr.isErr())) {
ErrorPropagationOnMainThread(aBackgroundEventTarget, aActor, ErrorPropagationOnMainThread(aBackgroundEventTarget, aActor,
loadingPrincipalOrErr.unwrapErr()); loadingPrincipalOrErr.unwrapErr());
@@ -194,18 +216,18 @@ void SharedWorkerService::GetOrCreateWorkerManagerOnMainThread(
partitionedPrincipalOrErr.unwrap(); partitionedPrincipalOrErr.unwrap();
nsCOMPtr<nsIPrincipal> effectiveStoragePrincipal = partitionedPrincipal; nsCOMPtr<nsIPrincipal> effectiveStoragePrincipal = partitionedPrincipal;
if (aData.useRegularPrincipal()) { if (copyData.useRegularPrincipal()) {
effectiveStoragePrincipal = loadingPrincipal; effectiveStoragePrincipal = loadingPrincipal;
} }
// Let's see if there is already a SharedWorker to share. // Let's see if there is already a SharedWorker to share.
nsCOMPtr<nsIURI> resolvedScriptURL = nsCOMPtr<nsIURI> resolvedScriptURL =
DeserializeURI(aData.resolvedScriptURL()); DeserializeURI(copyData.resolvedScriptURL());
for (SharedWorkerManager* workerManager : mWorkerManagers) { for (SharedWorkerManager* workerManager : mWorkerManagers) {
bool matchNameButNotOptions = false; bool matchNameButNotOptions = false;
managerHolder = workerManager->MatchOnMainThread( managerHolder = workerManager->MatchOnMainThread(
this, aData, resolvedScriptURL, loadingPrincipal, this, copyData, resolvedScriptURL, loadingPrincipal,
BasePrincipal::Cast(effectiveStoragePrincipal)->OriginAttributesRef(), BasePrincipal::Cast(effectiveStoragePrincipal)->OriginAttributesRef(),
&matchNameButNotOptions); &matchNameButNotOptions);
if (managerHolder) { if (managerHolder) {
@@ -222,14 +244,14 @@ void SharedWorkerService::GetOrCreateWorkerManagerOnMainThread(
// Let's create a new one. // Let's create a new one.
if (!managerHolder) { if (!managerHolder) {
managerHolder = SharedWorkerManager::Create( managerHolder = SharedWorkerManager::Create(
this, aBackgroundEventTarget, aData, loadingPrincipal, this, aBackgroundEventTarget, copyData, loadingPrincipal,
BasePrincipal::Cast(effectiveStoragePrincipal)->OriginAttributesRef()); BasePrincipal::Cast(effectiveStoragePrincipal)->OriginAttributesRef());
mWorkerManagers.AppendElement(managerHolder->Manager()); mWorkerManagers.AppendElement(managerHolder->Manager());
} else { } else {
// We are attaching the actor to an existing one. // We are attaching the actor to an existing one.
if (managerHolder->Manager()->IsSecureContext() != if (managerHolder->Manager()->IsSecureContext() !=
aData.isSecureContext()) { copyData.isSecureContext()) {
ErrorPropagationOnMainThread(aBackgroundEventTarget, aActor, ErrorPropagationOnMainThread(aBackgroundEventTarget, aActor,
NS_ERROR_DOM_SECURITY_ERR); NS_ERROR_DOM_SECURITY_ERR);
return; return;
@@ -240,7 +262,7 @@ void SharedWorkerService::GetOrCreateWorkerManagerOnMainThread(
new SharedWorkerManagerWrapper(managerHolder.forget()); new SharedWorkerManagerWrapper(managerHolder.forget());
RefPtr<WorkerManagerCreatedRunnable> r = new WorkerManagerCreatedRunnable( RefPtr<WorkerManagerCreatedRunnable> r = new WorkerManagerCreatedRunnable(
wrapper.forget(), aActor, aData, aWindowID, aPortIdentifier); wrapper.forget(), aActor, copyData, aWindowID, aPortIdentifier);
aBackgroundEventTarget->Dispatch(r.forget(), NS_DISPATCH_NORMAL); aBackgroundEventTarget->Dispatch(r.forget(), NS_DISPATCH_NORMAL);
} }