|
36 | 36 | using mozilla::AutoSlowOperation; |
37 | 37 | using mozilla::CycleCollectedJSContext; |
38 | 38 | using mozilla::Err; |
| 39 | +using mozilla::MakeUnique; |
39 | 40 | using mozilla::MicroTaskRunnable; |
40 | 41 | using mozilla::Preferences; |
41 | 42 | using mozilla::UniquePtr; |
42 | | -using mozilla::WrapNotNull; |
43 | 43 | using mozilla::dom::AutoJSAPI; |
44 | 44 | using mozilla::dom::ReferrerPolicy; |
45 | 45 |
|
@@ -210,9 +210,20 @@ bool ModuleLoaderBase::HostLoadImportedModule( |
210 | 210 | } |
211 | 211 |
|
212 | 212 | MOZ_ASSERT(result.isOk()); |
213 | | - nsCOMPtr<nsIURI> uri = result.unwrap(); |
| 213 | + auto record = result.unwrap(); |
| 214 | + nsCOMPtr<nsIURI> uri = record->Result(); |
214 | 215 | MOZ_ASSERT(uri, "Failed to resolve module specifier"); |
215 | 216 |
|
| 217 | + if (ImportMap::IsMultipleImportMapsSupported()) { |
| 218 | + // This implements the 'Add module to resolved module set' part defined in |
| 219 | + // 'resolve a module specifier'. This is done here because we need to |
| 220 | + // process the resolved specifiers differently for preloading module |
| 221 | + // scripts. |
| 222 | + // |
| 223 | + // See https://html.spec.whatwg.org/#resolve-a-module-specifier |
| 224 | + loader->AddToResolvedModuleSet(std::move(record), script, aHostDefined); |
| 225 | + } |
| 226 | + |
216 | 227 | ModuleType moduleType = GetModuleRequestType(aCx, aModuleRequest); |
217 | 228 | if (!loader->IsModuleTypeAllowed(moduleType)) { |
218 | 229 | LOG(("ModuleLoaderBase::HostLoadImportedModule uri %s, bad module type", |
@@ -398,7 +409,16 @@ JSString* ModuleLoaderBase::ImportMetaResolveImpl( |
398 | 409 | return nullptr; |
399 | 410 | } |
400 | 411 |
|
401 | | - nsCOMPtr<nsIURI> uri = result.unwrap(); |
| 412 | + MOZ_ASSERT(result.isOk()); |
| 413 | + auto record = result.unwrap(); |
| 414 | + |
| 415 | + nsCOMPtr<nsIURI> uri = record->Result(); |
| 416 | + if (ImportMap::IsMultipleImportMapsSupported()) { |
| 417 | + // This implements the 'Add module to resolved module set' part defined in |
| 418 | + // 'resolve a module specifier'. |
| 419 | + loader->AddToResolvedModuleSet(std::move(record)); |
| 420 | + } |
| 421 | + |
402 | 422 | nsAutoCString url; |
403 | 423 | MOZ_ALWAYS_SUCCEEDS(uri->GetAsciiSpec(url)); |
404 | 424 |
|
@@ -1101,6 +1121,44 @@ ResolveResult ModuleLoaderBase::ResolveModuleSpecifier( |
1101 | 1121 | aSpecifier); |
1102 | 1122 | } |
1103 | 1123 |
|
| 1124 | +ResolvedModuleSet* ModuleLoaderBase::GetResolvedModuleSet() { |
| 1125 | + MOZ_ASSERT(ImportMap::IsMultipleImportMapsSupported()); |
| 1126 | + if (!mResolvedModuleSet) { |
| 1127 | + mResolvedModuleSet = MakeUnique<ResolvedModuleSet>(); |
| 1128 | + } |
| 1129 | + |
| 1130 | + return mResolvedModuleSet.get(); |
| 1131 | +} |
| 1132 | + |
| 1133 | +static void AddToResolvedSet(ResolvedModuleSet* aSet, |
| 1134 | + UniquePtr<SpecifierResolutionRecord> aRecord) { |
| 1135 | + MOZ_ASSERT(ImportMap::IsMultipleImportMapsSupported()); |
| 1136 | + auto ptr = aSet->lookupForAdd(aRecord); |
| 1137 | + if (ptr) { |
| 1138 | + return; |
| 1139 | + } |
| 1140 | + |
| 1141 | + MOZ_ALWAYS_TRUE(aSet->add(ptr, std::move(aRecord))); |
| 1142 | +} |
| 1143 | + |
| 1144 | +void ModuleLoaderBase::AddToGlobalResolvedSet( |
| 1145 | + UniquePtr<SpecifierResolutionRecord> aRecord) { |
| 1146 | + AddToResolvedSet(GetResolvedModuleSet(), std::move(aRecord)); |
| 1147 | +} |
| 1148 | + |
| 1149 | +void ModuleLoaderBase::AddToResolvedModuleSet( |
| 1150 | + UniquePtr<SpecifierResolutionRecord> aRecord, LoadedScript* aScript, |
| 1151 | + Handle<Value> aHostDefined) { |
| 1152 | + // 2. If global does not implement Window, then return. |
| 1153 | + if (!mLoader->IsImportMapSupported()) { |
| 1154 | + return; |
| 1155 | + } |
| 1156 | + |
| 1157 | + // release the mResult from the record as it is not needed. |
| 1158 | + nsCOMPtr<nsIURI> _ = aRecord->TakeResult(); |
| 1159 | + AddToGlobalResolvedSet(std::move(aRecord)); |
| 1160 | +} |
| 1161 | + |
1104 | 1162 | void ModuleLoaderBase::StartFetchingModuleDependencies( |
1105 | 1163 | ModuleLoadRequest* aRequest) { |
1106 | 1164 | if (aRequest->IsCanceled()) { |
|
0 commit comments