LibWeb: Fire error event when script has an execution error

We now use the "report an exception" AO when a script has an execution
error. This has mostly replaced the older "report the exception" AO in
various specifications. Using this newer AO ensures that
`window.onerror` is invoked when a script has an execution error.
This commit is contained in:
Tim Ledbetter 2024-09-26 15:40:23 +01:00 committed by Tim Flynn
commit 579a289d3d
Notes: github-actions[bot] 2024-09-27 11:03:15 +00:00
6 changed files with 35 additions and 4 deletions

View file

@ -11,6 +11,7 @@
#include <LibWeb/HTML/Scripting/ClassicScript.h>
#include <LibWeb/HTML/Scripting/Environments.h>
#include <LibWeb/HTML/Scripting/ExceptionReporter.h>
#include <LibWeb/HTML/WindowOrWorkerGlobalScope.h>
#include <LibWeb/WebIDL/DOMException.h>
namespace Web::HTML {
@ -126,8 +127,10 @@ JS::Completion ClassicScript::run(RethrowErrors rethrow_errors, JS::GCPtr<JS::En
// 3. Otherwise, rethrow errors is false. Perform the following steps:
VERIFY(rethrow_errors == RethrowErrors::No);
// 1. Report the exception given by evaluationStatus.[[Value]] for script.
report_exception(evaluation_status, settings_object().realm());
// 1. Report an exception given by evaluationStatus.[[Value]] for script's settings object's global object.
auto* window_or_worker = dynamic_cast<WindowOrWorkerGlobalScopeMixin*>(&settings.global_object());
VERIFY(window_or_worker);
window_or_worker->report_an_exception(*evaluation_status.value());
// 2. Clean up after running script with settings.
settings.clean_up_after_running_script();

View file

@ -746,6 +746,13 @@ JS::NonnullGCPtr<JS::Object> WindowOrWorkerGlobalScopeMixin::supported_entry_typ
// https://html.spec.whatwg.org/multipage/webappapis.html#dom-reporterror
void WindowOrWorkerGlobalScopeMixin::report_error(JS::Value e)
{
// The reportError(e) method steps are to report an exception e for this.
report_an_exception(e);
}
// https://html.spec.whatwg.org/multipage/webappapis.html#report-an-exception
void WindowOrWorkerGlobalScopeMixin::report_an_exception(JS::Value const& e)
{
auto& target = static_cast<DOM::EventTarget&>(this_impl());
auto& realm = relevant_realm(target);

View file

@ -77,6 +77,7 @@ public:
JS::NonnullGCPtr<IndexedDB::IDBFactory> indexed_db();
void report_error(JS::Value e);
void report_an_exception(JS::Value const& e);
[[nodiscard]] JS::NonnullGCPtr<Crypto::Crypto> crypto();