@@ -98,6 +98,51 @@ void ModuleLoaderBase::EnsureModuleHooksInitialized() {
9898 HostReleaseTopLevelScript);
9999}
100100
101+ static bool ModuleTypeAllowed (JS::ModuleType aModuleType) {
102+ return aModuleType != JS::ModuleType::Unknown;
103+ }
104+
105+ static bool CreateBadModuleTypeError (JSContext* aCx, LoadedScript* aScript,
106+ nsIURI* aURI,
107+ JS::MutableHandle<JS::Value> aErrorOut) {
108+ JS::Rooted<JSString*> filename (aCx);
109+ if (aScript) {
110+ nsAutoCString url;
111+ aScript->BaseURL ()->GetAsciiSpec (url);
112+ filename = JS_NewStringCopyZ (aCx, url.get ());
113+ } else {
114+ filename = JS_NewStringCopyZ (aCx, " (unknown)" );
115+ }
116+
117+ if (!filename) {
118+ return false ;
119+ }
120+
121+ MOZ_ASSERT (aURI);
122+ nsAutoCString url;
123+ aURI->GetSpec (url);
124+
125+ JS::Rooted<JSString*> uri (aCx, JS_NewStringCopyZ (aCx, url.get ()));
126+ if (!uri) {
127+ return false ;
128+ }
129+
130+ JS::Rooted<JSString*> msg (aCx,
131+ JS_NewStringCopyZ (aCx, " : invalid module type" ));
132+ if (!msg) {
133+ return false ;
134+ }
135+
136+ JS::Rooted<JSString*> errMsg (aCx, JS_ConcatStrings (aCx, uri, msg));
137+ if (!errMsg) {
138+ return false ;
139+ }
140+
141+ return JS::CreateError (aCx, JSEXN_TYPEERR, nullptr , filename, 0 ,
142+ JS::ColumnNumberOneOrigin (), nullptr , errMsg,
143+ JS::NothingHandleValue, aErrorOut);
144+ }
145+
101146// https://html.spec.whatwg.org/#hostloadimportedmodule
102147// static
103148bool ModuleLoaderBase::HostLoadImportedModule (
@@ -189,6 +234,20 @@ bool ModuleLoaderBase::HostLoadImportedModule(
189234 " (%p)" ,
190235 loader.get (), uri->GetSpecOrDefault ().get (), aReferrer.get ()));
191236
237+ JS::ModuleType moduleType = JS::GetModuleRequestType (aCx, aModuleRequest);
238+ if (!ModuleTypeAllowed (moduleType)) {
239+ LOG ((" ModuleLoaderBase::HostLoadImportedModule uri %s, bad module type" ,
240+ uri->GetSpecOrDefault ().get ()));
241+ JS::Rooted<JS::Value> error (aCx);
242+ if (!CreateBadModuleTypeError (aCx, script, uri, &error)) {
243+ JS_ReportOutOfMemory (aCx);
244+ return false ;
245+ }
246+ JS::FinishLoadingImportedModuleFailed (aCx, aStatePrivate, aPromise,
247+ error);
248+ return true ;
249+ }
250+
192251 // TODO: Bug 1968895 : Unify the fetching for static/dynamic import
193252 if (aPromise) {
194253 // This is a dynamic import.
0 commit comments