Skip to content

Commit f793f2b

Browse files
committed
Bug 1820594 - Part 22: Throw TypeError if the module type is unsupported. r=jonco
Differential Revision: https://phabricator.services.mozilla.com/D241812
1 parent 2c2abeb commit f793f2b

File tree

2 files changed

+59
-11
lines changed

2 files changed

+59
-11
lines changed

js/loader/ModuleLoaderBase.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
103148
bool 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.

js/src/vm/Modules.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -351,17 +351,6 @@ JS_PUBLIC_API JSString* JS::GetRequestedModuleSpecifier(
351351
return nullptr;
352352
}
353353

354-
// This implements step 7.1.5 in HostLoadImportedModule.
355-
// https://html.spec.whatwg.org/multipage/webappapis.html#validate-requested-module-specifiers
356-
//
357-
// If the result of running the module type allowed steps given moduleType and
358-
// settings is false.
359-
if (moduleRequest->moduleType() == JS::ModuleType::Unknown) {
360-
JS_ReportErrorNumberASCII(cx, js::GetErrorMessage, nullptr,
361-
JSMSG_BAD_MODULE_TYPE);
362-
return nullptr;
363-
}
364-
365354
return moduleRequest->specifier();
366355
}
367356

0 commit comments

Comments
 (0)