import from UXP: Issue #2229 Followup - Handle re-entrant module instantiation/evaluation during async module loads (6c67c6f6)

This commit is contained in:
2026-02-11 23:49:04 +08:00
parent 36bdb6efb5
commit 3ff47ae95f
2 changed files with 45 additions and 7 deletions
+19 -3
View File
@@ -1170,8 +1170,20 @@ public:
};
void ScriptLoader::RunScriptWhenSafe(ScriptLoadRequest* aRequest) {
auto runnable = new ScriptRequestProcessor(this, aRequest);
nsContentUtils::AddScriptRunner(runnable);
// Queue for processing through the normal script execution pipeline so that
// dynamic imports are blocked during sync XHR just like async scripts.
if (!aRequest->IsModuleRequest() ||
!aRequest->AsModuleRequest()->IsDynamicImport()) {
auto runnable = new ScriptRequestProcessor(this, aRequest);
nsContentUtils::AddScriptRunner(runnable);
return;
}
MOZ_ASSERT(!aRequest->isInList());
MOZ_ASSERT(!aRequest->mInAsyncList);
aRequest->mInAsyncList = true;
mLoadedAsyncRequests.AppendElement(aRequest);
ProcessPendingRequests();
}
void
@@ -2481,7 +2493,11 @@ ScriptLoader::ProcessPendingRequests()
while (ReadyToExecuteScripts() && !mLoadedAsyncRequests.isEmpty()) {
request = mLoadedAsyncRequests.StealFirst();
if (request->IsModuleRequest()) {
ProcessRequest(request);
if (request->AsModuleRequest()->IsDynamicImport()) {
ProcessDynamicImport(request->AsModuleRequest());
} else {
ProcessRequest(request);
}
} else {
CompileOffThreadOrProcessRequest(request);
}