mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-19 15:51:33 +00:00
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:
parent
5b3b7e0007
commit
a40b702d6e
@ -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(
|
||||
|
@ -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();
|
||||
|
@ -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() {
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user