mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 02:07:35 +00:00
LibJS: Propagate out-of-memory errors from HostImportModuleDynamically
This commit is contained in:
parent
f98d0acd27
commit
f6503577f6
4 changed files with 12 additions and 9 deletions
|
@ -3589,7 +3589,7 @@ Completion ImportCall::execute(Interpreter& interpreter) const
|
||||||
ModuleRequest request { specifier_string, assertions };
|
ModuleRequest request { specifier_string, assertions };
|
||||||
|
|
||||||
// 12. Perform HostImportModuleDynamically(referencingScriptOrModule, moduleRequest, promiseCapability).
|
// 12. Perform HostImportModuleDynamically(referencingScriptOrModule, moduleRequest, promiseCapability).
|
||||||
interpreter.vm().host_import_module_dynamically(referencing_script_or_module, move(request), promise_capability);
|
MUST_OR_THROW_OOM(interpreter.vm().host_import_module_dynamically(referencing_script_or_module, move(request), promise_capability));
|
||||||
|
|
||||||
// 13. Return promiseCapability.[[Promise]].
|
// 13. Return promiseCapability.[[Promise]].
|
||||||
return Value { promise_capability->promise() };
|
return Value { promise_capability->promise() };
|
||||||
|
|
|
@ -222,7 +222,7 @@ ThrowCompletionOr<Value> shadow_realm_import_value(VM& vm, DeprecatedString spec
|
||||||
TRY(vm.push_execution_context(eval_context, {}));
|
TRY(vm.push_execution_context(eval_context, {}));
|
||||||
|
|
||||||
// 6. Perform HostImportModuleDynamically(null, specifierString, innerCapability).
|
// 6. Perform HostImportModuleDynamically(null, specifierString, innerCapability).
|
||||||
vm.host_import_module_dynamically(Empty {}, ModuleRequest { move(specifier_string) }, inner_capability);
|
MUST_OR_THROW_OOM(vm.host_import_module_dynamically(Empty {}, ModuleRequest { move(specifier_string) }, inner_capability));
|
||||||
|
|
||||||
// 7. Suspend evalContext and remove it from the execution context stack.
|
// 7. Suspend evalContext and remove it from the execution context stack.
|
||||||
// NOTE: We don't support this concept yet.
|
// NOTE: We don't support this concept yet.
|
||||||
|
|
|
@ -81,7 +81,7 @@ VM::VM(OwnPtr<CustomData> custom_data)
|
||||||
return resolve_imported_module(move(referencing_script_or_module), specifier);
|
return resolve_imported_module(move(referencing_script_or_module), specifier);
|
||||||
};
|
};
|
||||||
|
|
||||||
host_import_module_dynamically = [&](ScriptOrModule, ModuleRequest const&, PromiseCapability const& promise_capability) {
|
host_import_module_dynamically = [&](ScriptOrModule, ModuleRequest const&, PromiseCapability const& promise_capability) -> ThrowCompletionOr<void> {
|
||||||
// By default, we throw on dynamic imports this is to prevent arbitrary file access by scripts.
|
// By default, we throw on dynamic imports this is to prevent arbitrary file access by scripts.
|
||||||
VERIFY(current_realm());
|
VERIFY(current_realm());
|
||||||
auto& realm = *current_realm();
|
auto& realm = *current_realm();
|
||||||
|
@ -90,7 +90,7 @@ VM::VM(OwnPtr<CustomData> custom_data)
|
||||||
// If you are here because you want to enable dynamic module importing make sure it won't be a security problem
|
// If you are here because you want to enable dynamic module importing make sure it won't be a security problem
|
||||||
// by checking the default implementation of HostImportModuleDynamically and creating your own hook or calling
|
// by checking the default implementation of HostImportModuleDynamically and creating your own hook or calling
|
||||||
// vm.enable_default_host_import_module_dynamically_hook().
|
// vm.enable_default_host_import_module_dynamically_hook().
|
||||||
promise->reject(Error::create(realm, ErrorType::DynamicImportNotAllowed.message()).release_allocated_value_but_fixme_should_propagate_errors());
|
promise->reject(MUST_OR_THROW_OOM(Error::create(realm, ErrorType::DynamicImportNotAllowed.message())));
|
||||||
|
|
||||||
promise->perform_then(
|
promise->perform_then(
|
||||||
NativeFunction::create(realm, "", [](auto&) -> ThrowCompletionOr<Value> {
|
NativeFunction::create(realm, "", [](auto&) -> ThrowCompletionOr<Value> {
|
||||||
|
@ -106,6 +106,8 @@ VM::VM(OwnPtr<CustomData> custom_data)
|
||||||
return js_undefined();
|
return js_undefined();
|
||||||
}),
|
}),
|
||||||
{});
|
{});
|
||||||
|
|
||||||
|
return {};
|
||||||
};
|
};
|
||||||
|
|
||||||
host_finish_dynamic_import = [&](ScriptOrModule referencing_script_or_module, ModuleRequest const& specifier, PromiseCapability const& promise_capability, Promise* promise) {
|
host_finish_dynamic_import = [&](ScriptOrModule referencing_script_or_module, ModuleRequest const& specifier, PromiseCapability const& promise_capability, Promise* promise) {
|
||||||
|
@ -971,7 +973,7 @@ ThrowCompletionOr<NonnullGCPtr<Module>> VM::resolve_imported_module(ScriptOrModu
|
||||||
}
|
}
|
||||||
|
|
||||||
// 16.2.1.8 HostImportModuleDynamically ( referencingScriptOrModule, specifier, promiseCapability ), https://tc39.es/ecma262/#sec-hostimportmoduledynamically
|
// 16.2.1.8 HostImportModuleDynamically ( referencingScriptOrModule, specifier, promiseCapability ), https://tc39.es/ecma262/#sec-hostimportmoduledynamically
|
||||||
void VM::import_module_dynamically(ScriptOrModule referencing_script_or_module, ModuleRequest module_request, PromiseCapability const& promise_capability)
|
ThrowCompletionOr<void> VM::import_module_dynamically(ScriptOrModule referencing_script_or_module, ModuleRequest module_request, PromiseCapability const& promise_capability)
|
||||||
{
|
{
|
||||||
auto& realm = *current_realm();
|
auto& realm = *current_realm();
|
||||||
|
|
||||||
|
@ -1001,8 +1003,8 @@ void VM::import_module_dynamically(ScriptOrModule referencing_script_or_module,
|
||||||
// If there is no ScriptOrModule in any of the execution contexts
|
// If there is no ScriptOrModule in any of the execution contexts
|
||||||
if (referencing_script_or_module.has<Empty>()) {
|
if (referencing_script_or_module.has<Empty>()) {
|
||||||
// Throw an error for now
|
// Throw an error for now
|
||||||
promise->reject(InternalError::create(realm, String::formatted(ErrorType::ModuleNotFoundNoReferencingScript.message(), module_request.module_specifier).release_value_but_fixme_should_propagate_errors()));
|
promise->reject(InternalError::create(realm, TRY_OR_THROW_OOM(*this, String::formatted(ErrorType::ModuleNotFoundNoReferencingScript.message(), module_request.module_specifier))));
|
||||||
return;
|
return {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1026,6 +1028,7 @@ void VM::import_module_dynamically(ScriptOrModule referencing_script_or_module,
|
||||||
|
|
||||||
// It must return unused.
|
// It must return unused.
|
||||||
// Note: Just return void always since the resulting value cannot be accessed by user code.
|
// Note: Just return void always since the resulting value cannot be accessed by user code.
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
// 16.2.1.9 FinishDynamicImport ( referencingScriptOrModule, specifier, promiseCapability, innerPromise ), https://tc39.es/ecma262/#sec-finishdynamicimport
|
// 16.2.1.9 FinishDynamicImport ( referencingScriptOrModule, specifier, promiseCapability, innerPromise ), https://tc39.es/ecma262/#sec-finishdynamicimport
|
||||||
|
|
|
@ -250,7 +250,7 @@ public:
|
||||||
ScriptOrModule get_active_script_or_module() const;
|
ScriptOrModule get_active_script_or_module() const;
|
||||||
|
|
||||||
Function<ThrowCompletionOr<NonnullGCPtr<Module>>(ScriptOrModule, ModuleRequest const&)> host_resolve_imported_module;
|
Function<ThrowCompletionOr<NonnullGCPtr<Module>>(ScriptOrModule, ModuleRequest const&)> host_resolve_imported_module;
|
||||||
Function<void(ScriptOrModule, ModuleRequest, PromiseCapability const&)> host_import_module_dynamically;
|
Function<ThrowCompletionOr<void>(ScriptOrModule, ModuleRequest, PromiseCapability const&)> host_import_module_dynamically;
|
||||||
Function<void(ScriptOrModule, ModuleRequest const&, PromiseCapability const&, Promise*)> host_finish_dynamic_import;
|
Function<void(ScriptOrModule, ModuleRequest const&, PromiseCapability const&, Promise*)> host_finish_dynamic_import;
|
||||||
|
|
||||||
Function<HashMap<PropertyKey, Value>(SourceTextModule const&)> host_get_import_meta_properties;
|
Function<HashMap<PropertyKey, Value>(SourceTextModule const&)> host_get_import_meta_properties;
|
||||||
|
@ -277,7 +277,7 @@ private:
|
||||||
ThrowCompletionOr<NonnullGCPtr<Module>> resolve_imported_module(ScriptOrModule referencing_script_or_module, ModuleRequest const& module_request);
|
ThrowCompletionOr<NonnullGCPtr<Module>> resolve_imported_module(ScriptOrModule referencing_script_or_module, ModuleRequest const& module_request);
|
||||||
ThrowCompletionOr<void> link_and_eval_module(Module& module);
|
ThrowCompletionOr<void> link_and_eval_module(Module& module);
|
||||||
|
|
||||||
void import_module_dynamically(ScriptOrModule referencing_script_or_module, ModuleRequest module_request, PromiseCapability const& promise_capability);
|
ThrowCompletionOr<void> import_module_dynamically(ScriptOrModule referencing_script_or_module, ModuleRequest module_request, PromiseCapability const& promise_capability);
|
||||||
void finish_dynamic_import(ScriptOrModule referencing_script_or_module, ModuleRequest module_request, PromiseCapability const& promise_capability, Promise* inner_promise);
|
void finish_dynamic_import(ScriptOrModule referencing_script_or_module, ModuleRequest module_request, PromiseCapability const& promise_capability, Promise* inner_promise);
|
||||||
|
|
||||||
HashMap<String, PrimitiveString*> m_string_cache;
|
HashMap<String, PrimitiveString*> m_string_cache;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue