/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
class WorkerManagerCreatedRunnable final : public Runnable { public:
WorkerManagerCreatedRunnable(
already_AddRefed<SharedWorkerManagerWrapper> aManagerWrapper,
SharedWorkerParent* aActor, const RemoteWorkerData& aData,
uint64_t aWindowID, UniqueMessagePortId& aPortIdentifier)
: Runnable("WorkerManagerCreatedRunnable"),
mManagerWrapper(aManagerWrapper),
mActor(aActor),
mData(aData),
mWindowID(aWindowID),
mPortIdentifier(std::move(aPortIdentifier)) {}
NS_IMETHOD
Run() {
AssertIsOnBackgroundThread();
if (NS_WARN_IF(
!mActor->CanSend() ||
!mManagerWrapper->Manager()->MaybeCreateRemoteWorker(
mData, mWindowID, mPortIdentifier, mActor->OtherPid()))) { // If we cannot send, the error won't arrive, but we may log something.
mActor->ErrorPropagation(NS_ERROR_FAILURE); return NS_OK;
}
if (!sSharedWorkerService) {
sSharedWorkerService = new SharedWorkerService(); // ClearOnShutdown can only be called on main thread
nsresult rv = SchedulerGroup::Dispatch(NS_NewRunnableFunction( "RegisterSharedWorkerServiceClearOnShutdown", []() {
StaticMutexAutoLock lock(sSharedWorkerMutex);
MOZ_ASSERT(sSharedWorkerService);
ClearOnShutdown(&sSharedWorkerService);
}));
Unused << NS_WARN_IF(NS_FAILED(rv));
}
// The real check happens on main-thread.
RefPtr<GetOrCreateWorkerManagerRunnable> r = new GetOrCreateWorkerManagerRunnable(this, aActor, aData, aWindowID,
aPortIdentifier);
// Let's see if there is already a SharedWorker to share.
nsCOMPtr<nsIURI> resolvedScriptURL =
DeserializeURI(aData.resolvedScriptURL()); for (SharedWorkerManager* workerManager : mWorkerManagers) { bool matchNameButNotOptions = false;
if (matchNameButNotOptions) {
MismatchOptionsErrorPropagationOnMainThread(aBackgroundEventTarget,
aActor); return;
}
}
// Let's create a new one. if (!managerHolder) {
managerHolder = SharedWorkerManager::Create( this, aBackgroundEventTarget, aData, 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()) {
ErrorPropagationOnMainThread(aBackgroundEventTarget, aActor,
NS_ERROR_DOM_SECURITY_ERR); return;
}
}
RefPtr<SharedWorkerManagerWrapper> wrapper = new SharedWorkerManagerWrapper(managerHolder.forget());
RefPtr<WorkerManagerCreatedRunnable> r = new WorkerManagerCreatedRunnable(
wrapper.forget(), aActor, aData, aWindowID, aPortIdentifier);
aBackgroundEventTarget->Dispatch(r.forget(), NS_DISPATCH_NORMAL);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.