Bug 1540913 - Part 5: Track ScriptLoaders on WorkerLoadContext; r=jonco

As mentioned in the previous patch, this patch introduces tracking and shutdown of scriptloaders in
the case that we have multiple scriptloaders involved in module loading.

Differential Revision: https://phabricator.services.mozilla.com/D171686
This commit is contained in:
Yulia
2023-03-14 18:16:32 +00:00
parent cd357db31b
commit f2ff7f8dfc
5 changed files with 26 additions and 13 deletions

View File

@@ -601,7 +601,7 @@ already_AddRefed<ScriptLoadRequest> WorkerScriptLoader::CreateScriptLoadRequest(
Maybe<ClientInfo> clientInfo = GetGlobal()->GetClientInfo();
RefPtr<WorkerLoadContext> loadContext =
new WorkerLoadContext(kind, clientInfo);
new WorkerLoadContext(kind, clientInfo, this);
// Create ScriptLoadRequests for this WorkerScriptLoader
ReferrerPolicy referrerPolicy = mWorkerRef->Private()->GetReferrerPolicy();

View File

@@ -11,11 +11,13 @@
namespace mozilla {
namespace dom {
WorkerLoadContext::WorkerLoadContext(Kind aKind,
const Maybe<ClientInfo>& aClientInfo)
WorkerLoadContext::WorkerLoadContext(
Kind aKind, const Maybe<ClientInfo>& aClientInfo,
workerinternals::loader::WorkerScriptLoader* aScriptLoader)
: JS::loader::LoadContextBase(JS::loader::ContextKind::Worker),
mKind(aKind),
mClientInfo(aClientInfo){};
mClientInfo(aClientInfo),
mScriptLoader(aScriptLoader){};
ThreadSafeRequestHandle::ThreadSafeRequestHandle(
JS::loader::ScriptLoadRequest* aRequest, nsISerialEventTarget* aSyncTarget)

View File

@@ -27,6 +27,7 @@ class WorkerPrivate;
namespace workerinternals::loader {
class CacheCreator;
class ScriptLoaderRunnable;
class WorkerScriptLoader;
} // namespace workerinternals::loader
/*
@@ -95,7 +96,8 @@ class WorkerLoadContext : public JS::loader::LoadContextBase {
DebuggerScript
};
explicit WorkerLoadContext(Kind aKind, const Maybe<ClientInfo>& aClientInfo);
WorkerLoadContext(Kind aKind, const Maybe<ClientInfo>& aClientInfo,
workerinternals::loader::WorkerScriptLoader* aScriptLoader);
// Used to detect if the `is top-level` bit is set on a given module.
bool IsTopLevel() {
@@ -120,6 +122,7 @@ class WorkerLoadContext : public JS::loader::LoadContextBase {
Kind mKind;
Maybe<ClientInfo> mClientInfo;
nsCOMPtr<nsIChannel> mChannel;
RefPtr<workerinternals::loader::WorkerScriptLoader> mScriptLoader;
/* These fields are only used by service workers */
/* TODO: Split out a ServiceWorkerLoadContext */

View File

@@ -50,7 +50,8 @@ already_AddRefed<ModuleLoadRequest> WorkerModuleLoader::CreateStaticImport(
Maybe<ClientInfo> clientInfo = GetGlobalObject()->GetClientInfo();
RefPtr<WorkerLoadContext> loadContext =
new WorkerLoadContext(WorkerLoadContext::Kind::StaticImport, clientInfo);
new WorkerLoadContext(WorkerLoadContext::Kind::StaticImport, clientInfo,
aParent->GetWorkerLoadContext()->mScriptLoader);
RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest(
aURI, aParent->mFetchOptions, SRIMetadata(), aParent->mURI, loadContext,
false, /* is top level */
@@ -67,8 +68,8 @@ void WorkerModuleLoader::CreateDynamicImportLoader() {
ErrorResult rv;
SetScriptLoader(new loader::WorkerScriptLoader(
workerPrivate, nullptr, nullptr, GetScriptLoader()->GetWorkerScriptType(),
rv));
workerPrivate, nullptr, nullptr,
GetCurrentScriptLoader()->GetWorkerScriptType(), rv));
SetEventTarget(GetCurrentSerialEventTarget());
}
@@ -87,7 +88,7 @@ bool WorkerModuleLoader::CanStartLoad(ModuleLoadRequest* aRequest,
}
nsresult WorkerModuleLoader::StartFetch(ModuleLoadRequest* aRequest) {
if (!GetScriptLoader()->DispatchLoadScript(aRequest)) {
if (!GetScriptLoaderFor(aRequest)->DispatchLoadScript(aRequest)) {
return NS_ERROR_FAILURE;
}
return NS_OK;
@@ -121,18 +122,23 @@ nsresult WorkerModuleLoader::CompileFetchedModule(
return NS_OK;
}
WorkerScriptLoader* WorkerModuleLoader::GetScriptLoader() {
WorkerScriptLoader* WorkerModuleLoader::GetCurrentScriptLoader() {
return static_cast<WorkerScriptLoader*>(mLoader.get());
}
WorkerScriptLoader* WorkerModuleLoader::GetScriptLoaderFor(
ModuleLoadRequest* aRequest) {
return aRequest->GetWorkerLoadContext()->mScriptLoader;
}
void WorkerModuleLoader::OnModuleLoadComplete(ModuleLoadRequest* aRequest) {
if (aRequest->IsTopLevel()) {
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(GetGlobalObject()))) {
return;
}
GetScriptLoader()->MaybeMoveToLoadedList(aRequest);
GetScriptLoader()->ProcessPendingRequests(jsapi.cx());
GetScriptLoaderFor(aRequest)->MaybeMoveToLoadedList(aRequest);
GetScriptLoaderFor(aRequest)->ProcessPendingRequests(jsapi.cx());
}
}

View File

@@ -52,7 +52,9 @@ class WorkerModuleLoader : public JS::loader::ModuleLoaderBase {
mEventTarget = aEventTarget;
}
WorkerScriptLoader* GetScriptLoader();
WorkerScriptLoader* GetCurrentScriptLoader();
WorkerScriptLoader* GetScriptLoaderFor(ModuleLoadRequest* aRequest);
nsIURI* GetBaseURI() const override;