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:
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -52,7 +52,9 @@ class WorkerModuleLoader : public JS::loader::ModuleLoaderBase {
|
||||
mEventTarget = aEventTarget;
|
||||
}
|
||||
|
||||
WorkerScriptLoader* GetScriptLoader();
|
||||
WorkerScriptLoader* GetCurrentScriptLoader();
|
||||
|
||||
WorkerScriptLoader* GetScriptLoaderFor(ModuleLoadRequest* aRequest);
|
||||
|
||||
nsIURI* GetBaseURI() const override;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user