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();
|
Maybe<ClientInfo> clientInfo = GetGlobal()->GetClientInfo();
|
||||||
|
|
||||||
RefPtr<WorkerLoadContext> loadContext =
|
RefPtr<WorkerLoadContext> loadContext =
|
||||||
new WorkerLoadContext(kind, clientInfo);
|
new WorkerLoadContext(kind, clientInfo, this);
|
||||||
|
|
||||||
// Create ScriptLoadRequests for this WorkerScriptLoader
|
// Create ScriptLoadRequests for this WorkerScriptLoader
|
||||||
ReferrerPolicy referrerPolicy = mWorkerRef->Private()->GetReferrerPolicy();
|
ReferrerPolicy referrerPolicy = mWorkerRef->Private()->GetReferrerPolicy();
|
||||||
|
|||||||
@@ -11,11 +11,13 @@
|
|||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace dom {
|
namespace dom {
|
||||||
|
|
||||||
WorkerLoadContext::WorkerLoadContext(Kind aKind,
|
WorkerLoadContext::WorkerLoadContext(
|
||||||
const Maybe<ClientInfo>& aClientInfo)
|
Kind aKind, const Maybe<ClientInfo>& aClientInfo,
|
||||||
|
workerinternals::loader::WorkerScriptLoader* aScriptLoader)
|
||||||
: JS::loader::LoadContextBase(JS::loader::ContextKind::Worker),
|
: JS::loader::LoadContextBase(JS::loader::ContextKind::Worker),
|
||||||
mKind(aKind),
|
mKind(aKind),
|
||||||
mClientInfo(aClientInfo){};
|
mClientInfo(aClientInfo),
|
||||||
|
mScriptLoader(aScriptLoader){};
|
||||||
|
|
||||||
ThreadSafeRequestHandle::ThreadSafeRequestHandle(
|
ThreadSafeRequestHandle::ThreadSafeRequestHandle(
|
||||||
JS::loader::ScriptLoadRequest* aRequest, nsISerialEventTarget* aSyncTarget)
|
JS::loader::ScriptLoadRequest* aRequest, nsISerialEventTarget* aSyncTarget)
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ class WorkerPrivate;
|
|||||||
namespace workerinternals::loader {
|
namespace workerinternals::loader {
|
||||||
class CacheCreator;
|
class CacheCreator;
|
||||||
class ScriptLoaderRunnable;
|
class ScriptLoaderRunnable;
|
||||||
|
class WorkerScriptLoader;
|
||||||
} // namespace workerinternals::loader
|
} // namespace workerinternals::loader
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -95,7 +96,8 @@ class WorkerLoadContext : public JS::loader::LoadContextBase {
|
|||||||
DebuggerScript
|
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.
|
// Used to detect if the `is top-level` bit is set on a given module.
|
||||||
bool IsTopLevel() {
|
bool IsTopLevel() {
|
||||||
@@ -120,6 +122,7 @@ class WorkerLoadContext : public JS::loader::LoadContextBase {
|
|||||||
Kind mKind;
|
Kind mKind;
|
||||||
Maybe<ClientInfo> mClientInfo;
|
Maybe<ClientInfo> mClientInfo;
|
||||||
nsCOMPtr<nsIChannel> mChannel;
|
nsCOMPtr<nsIChannel> mChannel;
|
||||||
|
RefPtr<workerinternals::loader::WorkerScriptLoader> mScriptLoader;
|
||||||
|
|
||||||
/* These fields are only used by service workers */
|
/* These fields are only used by service workers */
|
||||||
/* TODO: Split out a ServiceWorkerLoadContext */
|
/* TODO: Split out a ServiceWorkerLoadContext */
|
||||||
|
|||||||
@@ -50,7 +50,8 @@ already_AddRefed<ModuleLoadRequest> WorkerModuleLoader::CreateStaticImport(
|
|||||||
Maybe<ClientInfo> clientInfo = GetGlobalObject()->GetClientInfo();
|
Maybe<ClientInfo> clientInfo = GetGlobalObject()->GetClientInfo();
|
||||||
|
|
||||||
RefPtr<WorkerLoadContext> loadContext =
|
RefPtr<WorkerLoadContext> loadContext =
|
||||||
new WorkerLoadContext(WorkerLoadContext::Kind::StaticImport, clientInfo);
|
new WorkerLoadContext(WorkerLoadContext::Kind::StaticImport, clientInfo,
|
||||||
|
aParent->GetWorkerLoadContext()->mScriptLoader);
|
||||||
RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest(
|
RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest(
|
||||||
aURI, aParent->mFetchOptions, SRIMetadata(), aParent->mURI, loadContext,
|
aURI, aParent->mFetchOptions, SRIMetadata(), aParent->mURI, loadContext,
|
||||||
false, /* is top level */
|
false, /* is top level */
|
||||||
@@ -67,8 +68,8 @@ void WorkerModuleLoader::CreateDynamicImportLoader() {
|
|||||||
|
|
||||||
ErrorResult rv;
|
ErrorResult rv;
|
||||||
SetScriptLoader(new loader::WorkerScriptLoader(
|
SetScriptLoader(new loader::WorkerScriptLoader(
|
||||||
workerPrivate, nullptr, nullptr, GetScriptLoader()->GetWorkerScriptType(),
|
workerPrivate, nullptr, nullptr,
|
||||||
rv));
|
GetCurrentScriptLoader()->GetWorkerScriptType(), rv));
|
||||||
|
|
||||||
SetEventTarget(GetCurrentSerialEventTarget());
|
SetEventTarget(GetCurrentSerialEventTarget());
|
||||||
}
|
}
|
||||||
@@ -87,7 +88,7 @@ bool WorkerModuleLoader::CanStartLoad(ModuleLoadRequest* aRequest,
|
|||||||
}
|
}
|
||||||
|
|
||||||
nsresult WorkerModuleLoader::StartFetch(ModuleLoadRequest* aRequest) {
|
nsresult WorkerModuleLoader::StartFetch(ModuleLoadRequest* aRequest) {
|
||||||
if (!GetScriptLoader()->DispatchLoadScript(aRequest)) {
|
if (!GetScriptLoaderFor(aRequest)->DispatchLoadScript(aRequest)) {
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
@@ -121,18 +122,23 @@ nsresult WorkerModuleLoader::CompileFetchedModule(
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
WorkerScriptLoader* WorkerModuleLoader::GetScriptLoader() {
|
WorkerScriptLoader* WorkerModuleLoader::GetCurrentScriptLoader() {
|
||||||
return static_cast<WorkerScriptLoader*>(mLoader.get());
|
return static_cast<WorkerScriptLoader*>(mLoader.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WorkerScriptLoader* WorkerModuleLoader::GetScriptLoaderFor(
|
||||||
|
ModuleLoadRequest* aRequest) {
|
||||||
|
return aRequest->GetWorkerLoadContext()->mScriptLoader;
|
||||||
|
}
|
||||||
|
|
||||||
void WorkerModuleLoader::OnModuleLoadComplete(ModuleLoadRequest* aRequest) {
|
void WorkerModuleLoader::OnModuleLoadComplete(ModuleLoadRequest* aRequest) {
|
||||||
if (aRequest->IsTopLevel()) {
|
if (aRequest->IsTopLevel()) {
|
||||||
AutoJSAPI jsapi;
|
AutoJSAPI jsapi;
|
||||||
if (NS_WARN_IF(!jsapi.Init(GetGlobalObject()))) {
|
if (NS_WARN_IF(!jsapi.Init(GetGlobalObject()))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
GetScriptLoader()->MaybeMoveToLoadedList(aRequest);
|
GetScriptLoaderFor(aRequest)->MaybeMoveToLoadedList(aRequest);
|
||||||
GetScriptLoader()->ProcessPendingRequests(jsapi.cx());
|
GetScriptLoaderFor(aRequest)->ProcessPendingRequests(jsapi.cx());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,9 @@ class WorkerModuleLoader : public JS::loader::ModuleLoaderBase {
|
|||||||
mEventTarget = aEventTarget;
|
mEventTarget = aEventTarget;
|
||||||
}
|
}
|
||||||
|
|
||||||
WorkerScriptLoader* GetScriptLoader();
|
WorkerScriptLoader* GetCurrentScriptLoader();
|
||||||
|
|
||||||
|
WorkerScriptLoader* GetScriptLoaderFor(ModuleLoadRequest* aRequest);
|
||||||
|
|
||||||
nsIURI* GetBaseURI() const override;
|
nsIURI* GetBaseURI() const override;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user