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(); 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();

View File

@@ -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)

View File

@@ -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 */

View File

@@ -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());
} }
} }

View File

@@ -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;