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())