Bug 1668330 - Part 2: Modify the ScriptLoader to work with the API changes for import-assertions. r=yulia

Differential Revision: https://phabricator.services.mozilla.com/D109495
This commit is contained in:
Jonatan Klemets 2021-04-14 15:22:57 +00:00
Родитель a74b4f724b
Коммит c845650f07
4 изменённых файлов: 66 добавлений и 13 удалений

Просмотреть файл

@ -1016,12 +1016,12 @@ static LoadedScript* GetLoadedScriptOrNull(
return script;
}
// 8.1.3.8.1 HostResolveImportedModule(referencingModule, specifier)
// 8.1.3.8.1 HostResolveImportedModule(referencingModule, moduleRequest)
JSObject* HostResolveImportedModule(JSContext* aCx,
JS::Handle<JS::Value> aReferencingPrivate,
JS::Handle<JSString*> aSpecifier) {
JS::Handle<JSObject*> aModuleRequest) {
JS::Rooted<JSObject*> module(aCx);
ScriptLoader::ResolveImportedModule(aCx, aReferencingPrivate, aSpecifier,
ScriptLoader::ResolveImportedModule(aCx, aReferencingPrivate, aModuleRequest,
&module);
return module;
}
@ -1029,15 +1029,22 @@ JSObject* HostResolveImportedModule(JSContext* aCx,
/* static */
void ScriptLoader::ResolveImportedModule(
JSContext* aCx, JS::Handle<JS::Value> aReferencingPrivate,
JS::Handle<JSString*> aSpecifier, JS::MutableHandle<JSObject*> aModuleOut) {
JS::Handle<JSObject*> aModuleRequest,
JS::MutableHandle<JSObject*> aModuleOut) {
MOZ_ASSERT(!aModuleOut);
RefPtr<LoadedScript> script(GetLoadedScriptOrNull(aCx, aReferencingPrivate));
JS::Rooted<JSString*> specifierString(
aCx, JS::GetModuleRequestSpecifier(aCx, aModuleRequest));
if (!specifierString) {
return;
}
// Let url be the result of resolving a module specifier given referencing
// module script and specifier.
nsAutoJSString string;
if (!string.init(aCx, aSpecifier)) {
if (!string.init(aCx, specifierString)) {
return;
}
@ -1097,13 +1104,19 @@ bool HostPopulateImportMeta(JSContext* aCx,
bool HostImportModuleDynamically(JSContext* aCx,
JS::Handle<JS::Value> aReferencingPrivate,
JS::Handle<JSString*> aSpecifier,
JS::Handle<JSObject*> aModuleRequest,
JS::Handle<JSObject*> aPromise) {
RefPtr<LoadedScript> script(GetLoadedScriptOrNull(aCx, aReferencingPrivate));
JS::Rooted<JSString*> specifierString(
aCx, JS::GetModuleRequestSpecifier(aCx, aModuleRequest));
if (!specifierString) {
return false;
}
// Attempt to resolve the module specifier.
nsAutoJSString specifier;
if (!specifier.init(aCx, aSpecifier)) {
if (!specifier.init(aCx, specifierString)) {
return false;
}
@ -1159,7 +1172,8 @@ bool HostImportModuleDynamically(JSContext* aCx,
}
RefPtr<ModuleLoadRequest> request = ModuleLoadRequest::CreateDynamicImport(
uri, options, baseURL, loader, aReferencingPrivate, aSpecifier, aPromise);
uri, options, baseURL, loader, aReferencingPrivate, specifierString,
aPromise);
loader->StartDynamicImport(request);
return true;
@ -1220,8 +1234,14 @@ void ScriptLoader::FinishDynamicImport_NoTLA(JSContext* aCx,
JS::Rooted<JSString*> specifier(aCx, aRequest->mDynamicSpecifier);
JS::Rooted<JSObject*> promise(aCx, aRequest->mDynamicPromise);
JS::FinishDynamicModuleImport_NoTLA(aCx, status, referencingScript, specifier,
promise);
JS::Rooted<JSObject*> moduleRequest(aCx,
JS::CreateModuleRequest(aCx, specifier));
if (!moduleRequest) {
JS_ReportOutOfMemory(aCx);
}
JS::FinishDynamicModuleImport_NoTLA(aCx, status, referencingScript,
moduleRequest, promise);
// FinishDynamicModuleImport clears any pending exception.
MOZ_ASSERT(!JS_IsExceptionPending(aCx));
@ -1254,8 +1274,14 @@ void ScriptLoader::FinishDynamicImport(
JS::Rooted<JSString*> specifier(aCx, aRequest->mDynamicSpecifier);
JS::Rooted<JSObject*> promise(aCx, aRequest->mDynamicPromise);
JS::Rooted<JSObject*> moduleRequest(aCx,
JS::CreateModuleRequest(aCx, specifier));
if (!moduleRequest) {
JS_ReportOutOfMemory(aCx);
}
JS::FinishDynamicModuleImport(aCx, aEvaluationPromise, referencingScript,
specifier, promise);
moduleRequest, promise);
// FinishDynamicModuleImport clears any pending exception.
MOZ_ASSERT(!JS_IsExceptionPending(aCx));

Просмотреть файл

@ -403,12 +403,12 @@ class ScriptLoader final : public nsISupports {
*
* @param aReferencingPrivate A JS::Value which is either undefined
* or contains a LoadedScript private pointer.
* @param aSpecifier The module specifier.
* @param aModuleRequest A module request object.
* @param aModuleOut This is set to the module found.
*/
static void ResolveImportedModule(JSContext* aCx,
JS::Handle<JS::Value> aReferencingPrivate,
JS::Handle<JSString*> aSpecifier,
JS::Handle<JSObject*> aModuleRequest,
JS::MutableHandle<JSObject*> aModuleOut);
void StartDynamicImport(ModuleLoadRequest* aRequest);

Просмотреть файл

@ -211,6 +211,11 @@ extern JS_PUBLIC_API void GetRequestedModuleSourcePos(
*/
extern JS_PUBLIC_API JSScript* GetModuleScript(Handle<JSObject*> moduleRecord);
extern JS_PUBLIC_API JSObject* CreateModuleRequest(
JSContext* cx, Handle<JSString*> specifierArg);
extern JS_PUBLIC_API JSString* GetModuleRequestSpecifier(
JSContext* cx, Handle<JSObject*> moduleRequestArg);
} // namespace JS
#endif // js_Modules_h

Просмотреть файл

@ -195,3 +195,25 @@ JS_PUBLIC_API JSScript* JS::GetModuleScript(JS::HandleObject moduleRecord) {
return moduleRecord->as<ModuleObject>().script();
}
JS_PUBLIC_API JSObject* JS::CreateModuleRequest(
JSContext* cx, Handle<JSString*> specifierArg) {
AssertHeapIsIdle();
CHECK_THREAD(cx);
js::RootedAtom specifierAtom(cx, AtomizeString(cx, specifierArg));
if (!specifierAtom) {
return nullptr;
}
return js::ModuleRequestObject::create(cx, specifierAtom);
}
JS_PUBLIC_API JSString* JS::GetModuleRequestSpecifier(
JSContext* cx, Handle<JSObject*> moduleRequestArg) {
AssertHeapIsIdle();
CHECK_THREAD(cx);
cx->check(moduleRequestArg);
return moduleRequestArg->as<js::ModuleRequestObject>().specifier();
}