Bug 1247687 - Implement InitModuleLoader methods for WorkerScriptLoader and WorkerGlobalScope; r=jonco

This implements a method to initialize the moduleLoader for workers. This will initialize only once, for all worker types (module and classic).

Depends on D147324

Differential Revision: https://phabricator.services.mozilla.com/D147326
This commit is contained in:
Yulia Startsev 2022-12-14 14:55:35 +00:00
parent 5b3b7e0007
commit a40b702d6e
5 changed files with 47 additions and 4 deletions

View File

@ -411,8 +411,20 @@ WorkerScriptLoader::WorkerScriptLoader(
}
nsIGlobalObject* global = GetGlobal();
mController = global->GetController();
// Set up the module loader, if it has not been yet.
// TODO: Implement this for classic scripts when dynamic imports are added.
if (aWorkerPrivate->WorkerType() == WorkerType::Module) {
InitModuleLoader();
}
}
void WorkerScriptLoader::InitModuleLoader() {
mWorkerRef->Private()->AssertIsOnWorkerThread();
RefPtr<WorkerModuleLoader> moduleLoader =
new WorkerModuleLoader(this, GetGlobal(), mSyncLoopTarget.get());
static_cast<WorkerGlobalScopeBase*>(GetGlobal())
->InitModuleLoader(moduleLoader);
}
void WorkerScriptLoader::CreateScriptRequests(

View File

@ -12,6 +12,7 @@
#include "mozilla/dom/WorkerCommon.h"
#include "mozilla/dom/WorkerLoadContext.h"
#include "mozilla/dom/WorkerRef.h"
#include "mozilla/dom/workerinternals/WorkerModuleLoader.h"
#include "mozilla/Maybe.h"
#include "nsIContentPolicy.h"
#include "nsStringFwd.h"
@ -232,6 +233,8 @@ class WorkerScriptLoader : public JS::loader::ScriptLoaderInterface,
return NS_OK;
}
void InitModuleLoader();
void TryShutdown();
nsTArray<RefPtr<ThreadSafeRequestHandle>> GetLoadingList();

View File

@ -260,6 +260,15 @@ JSObject* WorkerGlobalScopeBase::GetGlobalJSObject() {
return GetWrapper();
}
void WorkerGlobalScopeBase::NoteTerminating() {
if (mModuleLoader) {
mModuleLoader->Shutdown();
mModuleLoader = nullptr;
}
StartDying();
}
JSObject* WorkerGlobalScopeBase::GetGlobalJSObjectPreserveColor() const {
AssertIsOnWorkerThread();
return GetWrapperPreserveColor();
@ -440,7 +449,7 @@ void WorkerGlobalScope::NoteTerminating() {
return;
}
StartDying();
WorkerGlobalScopeBase::NoteTerminating();
}
void WorkerGlobalScope::NoteShuttingDown() {

View File

@ -8,6 +8,7 @@
#define mozilla_dom_workerscope_h__
#include "js/TypeDecls.h"
#include "js/loader/ModuleLoaderBase.h"
#include "mozilla/Assertions.h"
#include "mozilla/Attributes.h"
#include "mozilla/DOMEventTargetHelper.h"
@ -158,8 +159,23 @@ class WorkerGlobalScopeBase : public DOMEventTargetHelper,
Console* GetConsoleIfExists() const { return mConsole; }
void InitModuleLoader(JS::loader::ModuleLoaderBase* aModuleLoader) {
if (!mModuleLoader) {
mModuleLoader = aModuleLoader;
}
}
// The nullptr here is not used, but is required to make the override method
// have the same signature as other GetModuleLoader methods on globals.
JS::loader::ModuleLoaderBase* GetModuleLoader(
JSContext* aCx = nullptr) override {
return mModuleLoader;
};
uint64_t WindowID() const;
virtual void NoteTerminating();
// Usually global scope dies earlier than the WorkerPrivate, but if we see
// it leak at least we can tell it to not carry away a dead pointer.
void NoteWorkerTerminated() { mWorkerPrivate = nullptr; }
@ -184,6 +200,7 @@ class WorkerGlobalScopeBase : public DOMEventTargetHelper,
private:
RefPtr<Console> mConsole;
RefPtr<JS::loader::ModuleLoaderBase> mModuleLoader;
const UniquePtr<ClientSource> mClientSource;
nsCOMPtr<nsISerialEventTarget> mSerialEventTarget;
bool mShouldResistFingerprinting;
@ -217,7 +234,7 @@ class WorkerGlobalScope : public WorkerGlobalScopeBase {
using WorkerGlobalScopeBase::WorkerGlobalScopeBase;
void NoteTerminating();
void NoteTerminating() override;
void NoteShuttingDown();

View File

@ -989,7 +989,9 @@ void ModuleLoaderBase::Shutdown() {
MOZ_ASSERT(mFetchingModules.IsEmpty());
for (const auto& entry : mFetchedModules) {
entry.GetData()->Shutdown();
if (entry.GetData()) {
entry.GetData()->Shutdown();
}
}
mFetchedModules.Clear();