diff --git a/Libraries/LibWeb/HTML/Navigable.cpp b/Libraries/LibWeb/HTML/Navigable.cpp index 987e52697a3..6a4c233eb1b 100644 --- a/Libraries/LibWeb/HTML/Navigable.cpp +++ b/Libraries/LibWeb/HTML/Navigable.cpp @@ -2152,13 +2152,14 @@ CSSPixelRect Navigable::to_top_level_rect(CSSPixelRect const& a_rect) CSSPixelPoint Navigable::to_top_level_position(CSSPixelPoint a_position) { auto position = a_position; - for (auto ancestor = parent(); ancestor; ancestor = ancestor->parent()) { + for (auto ancestor = this; ancestor; ancestor = ancestor->parent()) { if (is(*ancestor)) break; if (!ancestor->container()) return {}; if (!ancestor->container()->paintable()) return {}; + // FIXME: Handle CSS transforms that might affect the ancestor. position.translate_by(ancestor->container()->paintable()->box_type_agnostic_position()); } return position; diff --git a/Libraries/LibWeb/Page/EventHandler.cpp b/Libraries/LibWeb/Page/EventHandler.cpp index a7a1797678d..182c864c1f0 100644 --- a/Libraries/LibWeb/Page/EventHandler.cpp +++ b/Libraries/LibWeb/Page/EventHandler.cpp @@ -492,6 +492,7 @@ EventResult EventHandler::handle_mouseup(CSSPixelPoint viewport_position, CSSPix // // https://html.spec.whatwg.org/multipage/document-sequences.html#the-rules-for-choosing-a-navigable + auto top_level_viewport_position = m_navigable->to_top_level_position(viewport_position); if (GC::Ptr link = node->enclosing_link_element()) { GC::Ref document = *m_navigable->active_document(); auto href = link->href(); @@ -502,7 +503,7 @@ EventResult EventHandler::handle_mouseup(CSSPixelPoint viewport_position, CSSPix } else if (button == UIEvents::MouseButton::Middle) { m_navigable->page().client().page_did_middle_click_link(url, link->target().to_byte_string(), modifiers); } else if (button == UIEvents::MouseButton::Secondary) { - m_navigable->page().client().page_did_request_link_context_menu(viewport_position, url, link->target().to_byte_string(), modifiers); + m_navigable->page().client().page_did_request_link_context_menu(top_level_viewport_position, url, link->target().to_byte_string(), modifiers); } } else if (button == UIEvents::MouseButton::Secondary) { if (is(*node)) { @@ -512,7 +513,7 @@ EventResult EventHandler::handle_mouseup(CSSPixelPoint viewport_position, CSSPix if (image_element.immutable_bitmap()) bitmap = image_element.immutable_bitmap()->bitmap(); - m_navigable->page().client().page_did_request_image_context_menu(viewport_position, image_url, "", modifiers, bitmap); + m_navigable->page().client().page_did_request_image_context_menu(top_level_viewport_position, image_url, "", modifiers, bitmap); } else if (is(*node)) { auto& media_element = as(*node); @@ -525,9 +526,9 @@ EventResult EventHandler::handle_mouseup(CSSPixelPoint viewport_position, CSSPix .is_looping = media_element.has_attribute(HTML::AttributeNames::loop), }; - m_navigable->page().did_request_media_context_menu(media_element.unique_id(), viewport_position, "", modifiers, move(menu)); + m_navigable->page().did_request_media_context_menu(media_element.unique_id(), top_level_viewport_position, "", modifiers, move(menu)); } else { - m_navigable->page().client().page_did_request_context_menu(viewport_position); + m_navigable->page().client().page_did_request_context_menu(top_level_viewport_position); } } }