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:
committed by
rvandermeulen@mozilla.com
parent
8cc419a251
commit
6fd1decc16
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user