From 3e6aaa3520168a93927b0df38b50653803c85810 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 6 Feb 2022 19:28:09 +0100 Subject: [PATCH] LibWeb: Update focus target when handling mousedown events If the mousedown event hits something with is_focusable()==true, we now update the document's focused element *instead* of placing the text cursor at the focusable element. This allows you to begin editing input elements by clicking them. This feels very hackish and we'll need to come up with something nicer. --- .../Libraries/LibWeb/Page/EventHandler.cpp | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/Userland/Libraries/LibWeb/Page/EventHandler.cpp b/Userland/Libraries/LibWeb/Page/EventHandler.cpp index f0b13d8424..fe9301f2c6 100644 --- a/Userland/Libraries/LibWeb/Page/EventHandler.cpp +++ b/Userland/Libraries/LibWeb/Page/EventHandler.cpp @@ -266,9 +266,24 @@ bool EventHandler::handle_mousedown(const Gfx::IntPoint& position, unsigned butt if (button == GUI::MouseButton::Primary) { auto result = layout_root()->hit_test(position, Layout::HitTestType::TextCursor); if (result.layout_node && result.layout_node->dom_node()) { - m_browsing_context.set_cursor_position(DOM::Position(*result.layout_node->dom_node(), result.index_in_node)); - layout_root()->set_selection({ { result.layout_node, result.index_in_node }, {} }); - m_in_mouse_selection = true; + + // See if we want to focus something. + bool did_focus_something = false; + for (auto candidate = node; candidate; candidate = candidate->parent()) { + if (candidate->is_focusable()) { + document->set_focused_element(verify_cast(candidate.ptr())); + did_focus_something = true; + break; + } + } + + // If we didn't focus anything, place the document text cursor at the mouse position. + // FIXME: This is all rather strange. Find a better solution. + if (!did_focus_something) { + m_browsing_context.set_cursor_position(DOM::Position(*result.layout_node->dom_node(), result.index_in_node)); + layout_root()->set_selection({ { result.layout_node, result.index_in_node }, {} }); + m_in_mouse_selection = true; + } } } else if (button == GUI::MouseButton::Secondary) { if (auto* page = m_browsing_context.page())