Skip to content

Commit f10f564

Browse files
committed
Bug 1916277 - Part 11: Add preloaded specifiers into global's resolved set. r=jonco
When the preloaded request is reused during parsing, merge the preloaded resolved module set into the global resolved module set to ensure consistency. Differential Revision: https://phabricator.services.mozilla.com/D275178
1 parent 8377cfe commit f10f564

3 files changed

Lines changed: 65 additions & 0 deletions

File tree

dom/script/ScriptLoader.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1868,6 +1868,15 @@ ScriptLoadRequest* ScriptLoader::LookupPreloadRequest(
18681868
return nullptr;
18691869
}
18701870

1871+
if (StaticPrefs::dom_multiple_import_maps_enabled()) {
1872+
// During preload, the resolved module specifiers are stored in the module
1873+
// script. Now the preload request is reused, so adding the resolved
1874+
// specifiers into the global's resolved module set.
1875+
if (request->IsModuleRequest()) {
1876+
mModuleLoader->MovePreloadedSetToResolvedSet(request->AsModuleRequest());
1877+
}
1878+
}
1879+
18711880
// Report any errors that we skipped while preloading.
18721881
ReportPreloadErrorsToConsole(request);
18731882

js/loader/ModuleLoaderBase.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,6 +1188,58 @@ void ModuleLoaderBase::AddToResolvedModuleSet(
11881188
AddToGlobalResolvedSet(std::move(aRecord));
11891189
}
11901190

1191+
// This just flip the preload flag in the module script and ModuleObject.
1192+
void ModuleLoaderBase::ResetPreloadFlag(nsIURI* aURI) {
1193+
MOZ_ASSERT(aURI);
1194+
ModuleMapKey key(aURI, ModuleType::JavaScript);
1195+
if (!IsModuleFetched(key)) {
1196+
return;
1197+
}
1198+
1199+
RefPtr<ModuleScript> ms;
1200+
MOZ_ALWAYS_TRUE(mFetchedModules.Get(key, getter_AddRefs(ms)));
1201+
1202+
// This function is called from a preloaded module graph, but it may have a
1203+
// module script from another preloaded module graph which has been turned
1204+
// into a normal load, so we don't assert the module script is a preloaded
1205+
// one.
1206+
ms->SetForPreload(false);
1207+
}
1208+
1209+
// This is called when a preloaded module request is reused, so we need to move
1210+
// the resolved set into the global's set.
1211+
// Also, we need to flip the preload flag in the module script.
1212+
void ModuleLoaderBase::MovePreloadedSetToResolvedSet(
1213+
ModuleLoadRequest* aRootRequest) {
1214+
LOG(("ScriptLoadRequest (%p): MovePreloadedSetToResolvedSet", aRootRequest));
1215+
MOZ_ASSERT(ImportMap::IsMultipleImportMapsSupported());
1216+
MOZ_ASSERT(aRootRequest);
1217+
1218+
// ScriptLoader has flipped the preload flag to false.
1219+
MOZ_ASSERT(!aRootRequest->mLoadContext->IsPreload());
1220+
1221+
ModuleScript* ms = aRootRequest->mModuleScript;
1222+
if (!ms) {
1223+
return;
1224+
}
1225+
1226+
ms->SetForPreload(false);
1227+
if (!ms->HasPreloadedResolvedSet()) {
1228+
return;
1229+
}
1230+
1231+
ResolvedModuleSet* set = ms->GetPreloadedResolvedSet();
1232+
for (auto iter = set->modIter(); !iter.done(); iter.next()) {
1233+
auto record = std::move(iter.getMutable());
1234+
nsCOMPtr<nsIURI> uri = record->TakeResult();
1235+
ResetPreloadFlag(uri);
1236+
AddToGlobalResolvedSet(std::move(record));
1237+
}
1238+
1239+
set->clear();
1240+
ms->ReleasePreloadedResolvedSet();
1241+
}
1242+
11911243
void ModuleLoaderBase::StartFetchingModuleDependencies(
11921244
ModuleLoadRequest* aRequest) {
11931245
if (aRequest->IsCanceled()) {

js/loader/ModuleLoaderBase.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,8 @@ class ModuleLoaderBase : public nsISupports {
452452

453453
ResolvedModuleSet* GetResolvedModuleSet();
454454

455+
void MovePreloadedSetToResolvedSet(ModuleLoadRequest* aRootRequest);
456+
455457
// Returns true if the module for given module key is already fetched.
456458
bool IsModuleFetched(const ModuleMapKey& key) const;
457459

@@ -549,6 +551,8 @@ class ModuleLoaderBase : public nsISupports {
549551
LoadedScript* aScript = nullptr,
550552
Handle<Value> aHostDefined = UndefinedHandleValue);
551553

554+
void ResetPreloadFlag(nsIURI* aURI);
555+
552556
protected:
553557
void SetModuleFetchStarted(ModuleLoadRequest* aRequest);
554558

0 commit comments

Comments
 (0)