From 4357c3229cc760a3800b61d932f631c638ed4b61 Mon Sep 17 00:00:00 2001 From: stelar7 Date: Thu, 7 Nov 2024 22:59:03 +0100 Subject: [PATCH] LibWeb: Implement legacyOutputDidListenersThrowFlag --- Libraries/LibWeb/DOM/EventDispatcher.cpp | 22 +++++++++++++------ Libraries/LibWeb/DOM/EventDispatcher.h | 5 +++-- .../LibWeb/IndexedDB/Internal/Algorithms.cpp | 2 +- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/Libraries/LibWeb/DOM/EventDispatcher.cpp b/Libraries/LibWeb/DOM/EventDispatcher.cpp index 0a73152ab7e..2a0673d772c 100644 --- a/Libraries/LibWeb/DOM/EventDispatcher.cpp +++ b/Libraries/LibWeb/DOM/EventDispatcher.cpp @@ -31,7 +31,7 @@ namespace Web::DOM { // https://dom.spec.whatwg.org/#concept-event-listener-inner-invoke -bool EventDispatcher::inner_invoke(Event& event, Vector>& listeners, Event::Phase phase, bool invocation_target_in_shadow_tree) +bool EventDispatcher::inner_invoke(Event& event, Vector>& listeners, Event::Phase phase, bool invocation_target_in_shadow_tree, bool& legacy_output_did_listeners_throw) { // 1. Let found be false. bool found = false; @@ -99,7 +99,8 @@ bool EventDispatcher::inner_invoke(Event& event, Vectorreport_an_exception(*result.release_error().value()); - // FIXME: 2. Set legacyOutputDidListenersThrowFlag if given. (Only used by IndexedDB currently) + // 2. Set legacyOutputDidListenersThrowFlag if given. (Only used by IndexedDB currently) + legacy_output_did_listeners_throw = true; } // 12. Unset event’s in passive listener flag. @@ -121,7 +122,7 @@ bool EventDispatcher::inner_invoke(Event& event, Vector target, Event& event, bool legacy_target_override) +{ + bool legacy_output_did_listeners_throw = false; + return dispatch(target, event, legacy_target_override, legacy_output_did_listeners_throw); +} + +// https://dom.spec.whatwg.org/#concept-event-dispatch +bool EventDispatcher::dispatch(GC::Ref target, Event& event, bool legacy_target_override, bool& legacy_output_did_listeners_throw) { // 1. Set event’s dispatch flag. event.set_dispatched(true); @@ -351,7 +359,7 @@ bool EventDispatcher::dispatch(GC::Ref target, Event& event, bool l event.set_phase(Event::Phase::CapturingPhase); // 3. Invoke with struct, event, "capturing", and legacyOutputDidListenersThrowFlag if given. - invoke(entry, event, Event::Phase::CapturingPhase); + invoke(entry, event, Event::Phase::CapturingPhase, legacy_output_did_listeners_throw); } // 14. For each struct in event’s path: @@ -371,7 +379,7 @@ bool EventDispatcher::dispatch(GC::Ref target, Event& event, bool l } // 3. Invoke with struct, event, "bubbling", and legacyOutputDidListenersThrowFlag if given. - invoke(entry, event, Event::Phase::BubblingPhase); + invoke(entry, event, Event::Phase::BubblingPhase, legacy_output_did_listeners_throw); } } diff --git a/Libraries/LibWeb/DOM/EventDispatcher.h b/Libraries/LibWeb/DOM/EventDispatcher.h index 8ff24f1fbee..6ed9c481e2a 100644 --- a/Libraries/LibWeb/DOM/EventDispatcher.h +++ b/Libraries/LibWeb/DOM/EventDispatcher.h @@ -15,10 +15,11 @@ namespace Web::DOM { class EventDispatcher { public: static bool dispatch(GC::Ref, Event&, bool legacy_target_override = false); + static bool dispatch(GC::Ref, Event&, bool legacy_target_override, bool& legacy_output_did_listeners_throw); private: - static void invoke(Event::PathEntry&, Event&, Event::Phase); - static bool inner_invoke(Event&, Vector>&, Event::Phase, bool); + static void invoke(Event::PathEntry&, Event&, Event::Phase, bool& legacy_output_did_listeners_throw); + static bool inner_invoke(Event&, Vector>&, Event::Phase, bool, bool&); }; } diff --git a/Libraries/LibWeb/IndexedDB/Internal/Algorithms.cpp b/Libraries/LibWeb/IndexedDB/Internal/Algorithms.cpp index e0a9a6352db..a4c56695af7 100644 --- a/Libraries/LibWeb/IndexedDB/Internal/Algorithms.cpp +++ b/Libraries/LibWeb/IndexedDB/Internal/Algorithms.cpp @@ -146,7 +146,7 @@ bool fire_a_version_change_event(JS::Realm& realm, FlyString const& event_name, auto legacy_output_did_listeners_throw_flag = false; // 7. Dispatch event at target with legacyOutputDidListenersThrowFlag. - DOM::EventDispatcher::dispatch(target, *event, legacy_output_did_listeners_throw_flag); + DOM::EventDispatcher::dispatch(target, *event, false, legacy_output_did_listeners_throw_flag); // 8. Return legacyOutputDidListenersThrowFlag. return legacy_output_did_listeners_throw_flag;