From 3e85b7bf531e366a4e7b6b3564245a417f980a59 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Wed, 9 Oct 2024 07:39:08 -0400 Subject: [PATCH] LibWeb: Fire keydown and keypress events sooner Fire the events before handling any close requests or selection changes. Pages must have an opportunity to cancel the events. (cherry picked from commit 3925317c118e23a9b87b65ca792c5d94a92c98a7) --- .../expected/UIEvents/KeyEvent-cancelled.txt | 10 ++++ .../input/UIEvents/KeyEvent-cancelled.html | 46 +++++++++++++++++++ .../Libraries/LibWeb/Page/EventHandler.cpp | 16 ++++--- 3 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/UIEvents/KeyEvent-cancelled.txt create mode 100644 Tests/LibWeb/Text/input/UIEvents/KeyEvent-cancelled.html diff --git a/Tests/LibWeb/Text/expected/UIEvents/KeyEvent-cancelled.txt b/Tests/LibWeb/Text/expected/UIEvents/KeyEvent-cancelled.txt new file mode 100644 index 00000000000..e202783e1fb --- /dev/null +++ b/Tests/LibWeb/Text/expected/UIEvents/KeyEvent-cancelled.txt @@ -0,0 +1,10 @@ +keydown A +cancel keydown +You can't change me! +keydown B +keypress B +cancel keypress +You can't change me! +keydown C +keypress C +C diff --git a/Tests/LibWeb/Text/input/UIEvents/KeyEvent-cancelled.html b/Tests/LibWeb/Text/input/UIEvents/KeyEvent-cancelled.html new file mode 100644 index 00000000000..4d6ca512a60 --- /dev/null +++ b/Tests/LibWeb/Text/input/UIEvents/KeyEvent-cancelled.html @@ -0,0 +1,46 @@ + + + diff --git a/Userland/Libraries/LibWeb/Page/EventHandler.cpp b/Userland/Libraries/LibWeb/Page/EventHandler.cpp index 06c8d5b4442..c4dd1e2672b 100644 --- a/Userland/Libraries/LibWeb/Page/EventHandler.cpp +++ b/Userland/Libraries/LibWeb/Page/EventHandler.cpp @@ -847,6 +847,15 @@ EventResult EventHandler::handle_keydown(UIEvents::KeyCode key, u32 modifiers, u if (!m_navigable->active_document()->is_fully_active()) return EventResult::Dropped; + auto dispatch_result = fire_keyboard_event(UIEvents::EventNames::keydown, m_navigable, key, modifiers, code_point); + if (dispatch_result != EventResult::Accepted) + return dispatch_result; + + // FIXME: Work out and implement the difference between this and keydown. + dispatch_result = fire_keyboard_event(UIEvents::EventNames::keypress, m_navigable, key, modifiers, code_point); + if (dispatch_result != EventResult::Accepted) + return dispatch_result; + JS::NonnullGCPtr document = *m_navigable->active_document(); if (!document->layout_node()) return EventResult::Dropped; @@ -911,10 +920,6 @@ EventResult EventHandler::handle_keydown(UIEvents::KeyCode key, u32 modifiers, u return EventResult::Handled; } - auto dispatch_result = fire_keyboard_event(UIEvents::EventNames::keydown, m_navigable, key, modifiers, code_point); - if (dispatch_result != EventResult::Accepted) - return dispatch_result; - if (document->cursor_position()) { auto& node = *document->cursor_position()->node(); @@ -1079,8 +1084,7 @@ EventResult EventHandler::handle_keydown(UIEvents::KeyCode key, u32 modifiers, u break; } - // FIXME: Work out and implement the difference between this and keydown. - return fire_keyboard_event(UIEvents::EventNames::keypress, m_navigable, key, modifiers, code_point); + return EventResult::Accepted; } EventResult EventHandler::handle_keyup(UIEvents::KeyCode key, u32 modifiers, u32 code_point)