Bug 1761938 - Part 1: Call into the module loader via the module load request object r=yulia

The script loader will need to deal with requests from more than one module
loader so this adds methods to the request which dispatch to the correct
loader.

Differential Revision: https://phabricator.services.mozilla.com/D142828
This commit is contained in:
Jon Coppeard
2022-04-11 15:35:28 +00:00
parent c146088a27
commit 94bff9357d
5 changed files with 75 additions and 33 deletions

View File

@@ -462,8 +462,7 @@ class ScriptRequestProcessor : public Runnable {
NS_IMETHOD Run() override {
if (mRequest->IsModuleRequest() &&
mRequest->AsModuleRequest()->IsDynamicImport()) {
mLoader->GetModuleLoader()->ProcessDynamicImport(
mRequest->AsModuleRequest());
mRequest->AsModuleRequest()->ProcessDynamicImport();
return NS_OK;
}
@@ -490,7 +489,7 @@ nsresult ScriptLoader::RestartLoad(ScriptLoadRequest* aRequest) {
aRequest->mFetchSourceOnly = true;
nsresult rv;
if (aRequest->IsModuleRequest()) {
rv = mModuleLoader->RestartModuleLoad(aRequest->AsModuleRequest());
rv = aRequest->AsModuleRequest()->RestartModuleLoad();
} else {
rv = StartLoad(aRequest);
}
@@ -505,7 +504,7 @@ nsresult ScriptLoader::RestartLoad(ScriptLoadRequest* aRequest) {
nsresult ScriptLoader::StartLoad(ScriptLoadRequest* aRequest) {
if (aRequest->IsModuleRequest()) {
return mModuleLoader->StartModuleLoad(aRequest->AsModuleRequest());
return aRequest->AsModuleRequest()->StartModuleLoad();
}
return StartClassicLoad(aRequest);
@@ -1117,7 +1116,7 @@ bool ScriptLoader::ProcessInlineScript(nsIScriptElement* aElement,
mozilla::nsAutoMicroTask mt;
}
nsresult rv = mModuleLoader->ProcessFetchedModuleSource(modReq);
nsresult rv = modReq->ProcessFetchedModuleSource();
if (NS_FAILED(rv)) {
ReportErrorToConsole(modReq, rv);
HandleLoadError(modReq, rv);
@@ -1352,7 +1351,7 @@ nsresult ScriptLoader::ProcessOffThreadRequest(ScriptLoadRequest* aRequest) {
if (aRequest->IsModuleRequest()) {
MOZ_ASSERT(aRequest->GetLoadContext()->mOffThreadToken);
ModuleLoadRequest* request = aRequest->AsModuleRequest();
return mModuleLoader->ProcessFetchedModuleSource(request);
return request->ProcessFetchedModuleSource();
}
// Element may not be ready yet if speculatively compiling, so process the
@@ -1674,7 +1673,7 @@ nsresult ScriptLoader::ProcessRequest(ScriptLoadRequest* aRequest) {
if (aRequest->IsModuleRequest()) {
ModuleLoadRequest* request = aRequest->AsModuleRequest();
if (request->mModuleScript) {
if (!mModuleLoader->InstantiateModuleTree(request)) {
if (!request->InstantiateModuleTree()) {
request->mModuleScript = nullptr;
}
}
@@ -2076,7 +2075,7 @@ nsresult ScriptLoader::EvaluateScriptElement(ScriptLoadRequest* aRequest) {
}
if (aRequest->IsModuleRequest()) {
return mModuleLoader->EvaluateModule(globalObject, aRequest);
return aRequest->AsModuleRequest()->EvaluateModule(globalObject);
}
return EvaluateScript(globalObject, aRequest);
}
@@ -2963,8 +2962,7 @@ void ScriptLoader::HandleLoadError(ScriptLoadRequest* aRequest,
if (aRequest->IsModuleRequest() && !aRequest->GetLoadContext()->mIsInline) {
auto* request = aRequest->AsModuleRequest();
mModuleLoader->SetModuleFetchFinishedAndResumeWaitingRequests(request,
aResult);
request->SetModuleFetchFinishedAndResumeWaitingRequests(aResult);
}
if (aRequest->GetLoadContext()->mInDeferList) {
@@ -3007,7 +3005,7 @@ void ScriptLoader::HandleLoadError(ScriptLoadRequest* aRequest,
if (modReq->IsDynamicImport()) {
MOZ_ASSERT(modReq->IsTopLevel());
if (aRequest->isInList()) {
mModuleLoader->CancelDynamicImport(modReq, aResult);
modReq->CancelDynamicImport(aResult);
}
} else {
MOZ_ASSERT(!modReq->IsTopLevel());
@@ -3242,13 +3240,12 @@ nsresult ScriptLoader::PrepareLoadedRequest(ScriptLoadRequest* aRequest,
// inserting the request in the array. However it's an unlikely case
// so if you see this assertion it is likely something else that is
// wrong, especially if you see it more than once.
NS_ASSERTION(
mDeferRequests.Contains(aRequest) ||
NS_ASSERTION(mDeferRequests.Contains(aRequest) ||
mLoadingAsyncRequests.Contains(aRequest) ||
mNonAsyncExternalScriptInsertedRequests.Contains(aRequest) ||
mXSLTRequests.Contains(aRequest) ||
(aRequest->IsModuleRequest() &&
(mModuleLoader->HasDynamicImport(aRequest->AsModuleRequest()) ||
(aRequest->AsModuleRequest()->IsRegisteredDynamicImport() ||
!aRequest->AsModuleRequest()->IsTopLevel())) ||
mPreloads.Contains(aRequest, PreloadRequestComparator()) ||
mParserBlockingRequest == aRequest,
@@ -3287,7 +3284,7 @@ nsresult ScriptLoader::PrepareLoadedRequest(ScriptLoadRequest* aRequest,
}
// Otherwise compile it right away and start fetching descendents.
return mModuleLoader->ProcessFetchedModuleSource(request);
return request->ProcessFetchedModuleSource();
}
// The script is now loaded and ready to run.

View File

@@ -64,7 +64,9 @@ ModuleLoadRequest::ModuleLoadRequest(
mIsDynamicImport(aIsDynamicImport),
mLoader(aLoader),
mRootModule(aRootModule),
mVisitedSet(aVisitedSet) {}
mVisitedSet(aVisitedSet) {
MOZ_ASSERT(mLoader);
}
void ModuleLoadRequest::Cancel() {
ScriptLoadRequest::Cancel();
@@ -185,8 +187,6 @@ void ModuleLoadRequest::LoadFinished() {
}
mLoader->ProcessLoadedModuleTree(request);
mLoader = nullptr;
}
void ModuleLoadRequest::ClearDynamicImport() {

View File

@@ -86,6 +86,32 @@ class ModuleLoadRequest final : public ScriptLoadRequest {
mIsMarkedForBytecodeEncoding = true;
}
// Convenience methods to call into the module loader for this request.
void CancelDynamicImport(nsresult aResult) {
MOZ_ASSERT(IsDynamicImport());
mLoader->CancelDynamicImport(this, aResult);
}
#ifdef DEBUG
bool IsRegisteredDynamicImport() const {
return IsDynamicImport() && mLoader->HasDynamicImport(this);
}
#endif
nsresult StartModuleLoad() { return mLoader->StartModuleLoad(this); }
nsresult RestartModuleLoad() { return mLoader->RestartModuleLoad(this); }
void SetModuleFetchFinishedAndResumeWaitingRequests(nsresult aResult) {
mLoader->SetModuleFetchFinishedAndResumeWaitingRequests(this, aResult);
}
nsresult ProcessFetchedModuleSource() {
return mLoader->ProcessFetchedModuleSource(this);
}
bool InstantiateModuleTree() { return mLoader->InstantiateModuleTree(this); }
nsresult EvaluateModule(nsIGlobalObject* aGlobalObject) {
return mLoader->EvaluateModule(aGlobalObject, this);
}
void StartDynamicImport() { mLoader->StartDynamicImport(this); }
void ProcessDynamicImport() { mLoader->ProcessDynamicImport(this); }
private:
void LoadFinished();
void CancelImports();

View File

@@ -353,7 +353,9 @@ nsresult ModuleLoaderBase::RestartModuleLoad(ModuleLoadRequest* aRequest) {
nsresult ModuleLoaderBase::StartOrRestartModuleLoad(ModuleLoadRequest* aRequest,
RestartRequest aRestart) {
MOZ_ASSERT(aRequest->mLoader == this);
MOZ_ASSERT(aRequest->IsFetching());
aRequest->SetUnknownDataType();
// If we're restarting the request, the module should already be in the
@@ -430,6 +432,8 @@ void ModuleLoaderBase::SetModuleFetchFinishedAndResumeWaitingRequests(
// will have ModuleLoaded or LoadFailed on them when the promise is
// resolved/rejected. This is set up in StartLoad.
MOZ_ASSERT(aRequest->mLoader == this);
LOG(
("ScriptLoadRequest (%p): Module fetch finished (script == %p, result == "
"%u)",
@@ -500,6 +504,7 @@ ModuleScript* ModuleLoaderBase::GetFetchedModule(
nsresult ModuleLoaderBase::ProcessFetchedModuleSource(
ModuleLoadRequest* aRequest) {
MOZ_ASSERT(aRequest->mLoader == this);
MOZ_ASSERT(!aRequest->mModuleScript);
nsresult rv = CreateModuleScript(aRequest);
@@ -846,6 +851,8 @@ ModuleLoaderBase::StartFetchingModuleAndDependencies(ModuleLoadRequest* aParent,
}
void ModuleLoaderBase::StartDynamicImport(ModuleLoadRequest* aRequest) {
MOZ_ASSERT(aRequest->mLoader == this);
LOG(("ScriptLoadRequest (%p): Start dynamic import", aRequest));
mDynamicImportRequests.AppendElement(aRequest);
@@ -919,6 +926,8 @@ bool ModuleLoaderBase::HasPendingDynamicImports() const {
void ModuleLoaderBase::CancelDynamicImport(ModuleLoadRequest* aRequest,
nsresult aResult) {
MOZ_ASSERT(aRequest->mLoader == this);
RefPtr<ScriptLoadRequest> req = mDynamicImportRequests.Steal(aRequest);
aRequest->Cancel();
// FinishDynamicImport must happen exactly once for each dynamic import
@@ -933,8 +942,11 @@ void ModuleLoaderBase::RemoveDynamicImport(ModuleLoadRequest* aRequest) {
}
#ifdef DEBUG
bool ModuleLoaderBase::HasDynamicImport(ModuleLoadRequest* aRequest) const {
return mDynamicImportRequests.Contains(aRequest);
bool ModuleLoaderBase::HasDynamicImport(
const ModuleLoadRequest* aRequest) const {
MOZ_ASSERT(aRequest->mLoader == this);
return mDynamicImportRequests.Contains(
const_cast<ModuleLoadRequest*>(aRequest));
}
#endif
@@ -962,6 +974,7 @@ bool ModuleLoaderBase::InstantiateModuleTree(ModuleLoadRequest* aRequest) {
// Instantiate a top-level module and record any error.
MOZ_ASSERT(aRequest);
MOZ_ASSERT(aRequest->mLoader == this);
MOZ_ASSERT(aRequest->IsTopLevel());
LOG(("ScriptLoadRequest (%p): Instantiate module tree", aRequest));
@@ -1035,6 +1048,8 @@ nsresult ModuleLoaderBase::InitDebuggerDataForModuleTree(
}
void ModuleLoaderBase::ProcessDynamicImport(ModuleLoadRequest* aRequest) {
MOZ_ASSERT(aRequest->mLoader == this);
if (aRequest->mModuleScript) {
if (!InstantiateModuleTree(aRequest)) {
aRequest->mModuleScript = nullptr;
@@ -1052,7 +1067,9 @@ void ModuleLoaderBase::ProcessDynamicImport(ModuleLoadRequest* aRequest) {
}
nsresult ModuleLoaderBase::EvaluateModule(nsIGlobalObject* aGlobalObject,
ScriptLoadRequest* aRequest) {
ModuleLoadRequest* aRequest) {
MOZ_ASSERT(aRequest->mLoader == this);
AUTO_PROFILER_LABEL("ModuleLoaderBase::EvaluateModule", JS);
mozilla::nsAutoMicroTask mt;
@@ -1145,7 +1162,7 @@ nsresult ModuleLoaderBase::EvaluateModule(nsIGlobalObject* aGlobalObject,
return rv;
}
nsresult ModuleLoaderBase::EvaluateModule(ScriptLoadRequest* aRequest) {
nsresult ModuleLoaderBase::EvaluateModule(ModuleLoadRequest* aRequest) {
nsCOMPtr<nsIGlobalObject> globalObject =
mLoader->GetGlobalForRequest(aRequest);
if (!globalObject) {

View File

@@ -142,10 +142,12 @@ class ModuleLoaderBase : public nsISupports {
// Public API methods.
public:
ScriptLoaderInterface* GetScriptLoaderInterface() const { return mLoader; }
bool HasPendingDynamicImports() const;
void CancelDynamicImport(ModuleLoadRequest* aRequest, nsresult aResult);
#ifdef DEBUG
bool HasDynamicImport(ModuleLoadRequest* aRequest) const;
bool HasDynamicImport(const ModuleLoadRequest* aRequest) const;
#endif
// Start a load for a module script URI. Returns immediately if the module is
@@ -161,7 +163,7 @@ class ModuleLoaderBase : public nsISupports {
// Implements https://html.spec.whatwg.org/#run-a-module-script
nsresult EvaluateModule(nsIGlobalObject* aGlobalObject,
ScriptLoadRequest* aRequest);
ModuleLoadRequest* aRequest);
void StartDynamicImport(ModuleLoadRequest* aRequest);
void ProcessDynamicImport(ModuleLoadRequest* aRequest);
@@ -215,7 +217,7 @@ class ModuleLoaderBase : public nsISupports {
ModuleScript* GetFetchedModule(nsIURI* aURL, nsIGlobalObject* aGlobal) const;
// Helper function to set up the global correctly for dynamic imports.
nsresult EvaluateModule(ScriptLoadRequest* aRequest);
nsresult EvaluateModule(ModuleLoadRequest* aRequest);
JS::Value FindFirstParseError(ModuleLoadRequest* aRequest);
static nsresult InitDebuggerDataForModuleTree(JSContext* aCx,