Browse Source

LibWeb: Skip anchor activation behavior if the click event was cancelled

Igor Pissolati 3 years ago
parent
commit
a2bc97a9c2
1 changed files with 49 additions and 46 deletions
  1. 49 46
      Userland/Libraries/LibWeb/Page/EventHandler.cpp

+ 49 - 46
Userland/Libraries/LibWeb/Page/EventHandler.cpp

@@ -194,57 +194,60 @@ bool EventHandler::handle_mouseup(Gfx::IntPoint const& position, unsigned button
             node->dispatch_event(UIEvents::MouseEvent::create(UIEvents::EventNames::mouseup, offset.x(), offset.y(), position.x(), position.y()));
             handled_event = true;
 
-            // FIXME: This is ad-hoc and incorrect. The reason this exists is
-            //        because we are missing browsing context navigation:
-            //
-            //        https://html.spec.whatwg.org/multipage/browsing-the-web.html#navigate
-            //
-            //        Additionally, we currently cannot spawn a new top-level
-            //        browsing context for new tab operations, because the new
-            //        top-level browsing context would be in another process. To
-            //        fix this, there needs to be some way to be able to
-            //        communicate with browsing contexts in remote WebContent
-            //        processes, and then step 8 of this algorithm needs to be
-            //        implemented in BrowsingContext::choose_a_browsing_context:
-            //
-            //        https://html.spec.whatwg.org/multipage/browsers.html#the-rules-for-choosing-a-browsing-context-given-a-browsing-context-name
-            if (RefPtr<HTML::HTMLAnchorElement> link = node->enclosing_link_element()) {
-                NonnullRefPtr document = *m_browsing_context.active_document();
-                auto href = link->href();
-                auto url = document->parse_url(href);
-                dbgln("Web::EventHandler: Clicking on a link to {}", url);
-                if (button == GUI::MouseButton::Primary) {
-                    if (href.starts_with("javascript:")) {
-                        document->run_javascript(href.substring_view(11, href.length() - 11));
-                    } else if (!url.fragment().is_null() && url.equals(document->url(), AK::URL::ExcludeFragment::Yes)) {
-                        m_browsing_context.scroll_to_anchor(url.fragment());
-                    } else {
-                        if (m_browsing_context.is_top_level()) {
-                            if (auto* page = m_browsing_context.page())
-                                page->client().page_did_click_link(url, link->target(), modifiers);
+            bool run_activation_behavior = true;
+            if (node.ptr() == m_mousedown_target && button == GUI::MouseButton::Primary) {
+                run_activation_behavior = node->dispatch_event(UIEvents::MouseEvent::create(UIEvents::EventNames::click, offset.x(), offset.y(), position.x(), position.y()));
+            }
+
+            if (run_activation_behavior) {
+                // FIXME: This is ad-hoc and incorrect. The reason this exists is
+                //        because we are missing browsing context navigation:
+                //
+                //        https://html.spec.whatwg.org/multipage/browsing-the-web.html#navigate
+                //
+                //        Additionally, we currently cannot spawn a new top-level
+                //        browsing context for new tab operations, because the new
+                //        top-level browsing context would be in another process. To
+                //        fix this, there needs to be some way to be able to
+                //        communicate with browsing contexts in remote WebContent
+                //        processes, and then step 8 of this algorithm needs to be
+                //        implemented in BrowsingContext::choose_a_browsing_context:
+                //
+                //        https://html.spec.whatwg.org/multipage/browsers.html#the-rules-for-choosing-a-browsing-context-given-a-browsing-context-name
+                if (RefPtr<HTML::HTMLAnchorElement> link = node->enclosing_link_element()) {
+                    NonnullRefPtr document = *m_browsing_context.active_document();
+                    auto href = link->href();
+                    auto url = document->parse_url(href);
+                    dbgln("Web::EventHandler: Clicking on a link to {}", url);
+                    if (button == GUI::MouseButton::Primary) {
+                        if (href.starts_with("javascript:")) {
+                            document->run_javascript(href.substring_view(11, href.length() - 11));
+                        } else if (!url.fragment().is_null() && url.equals(document->url(), AK::URL::ExcludeFragment::Yes)) {
+                            m_browsing_context.scroll_to_anchor(url.fragment());
+                        } else {
+                            if (m_browsing_context.is_top_level()) {
+                                if (auto* page = m_browsing_context.page())
+                                    page->client().page_did_click_link(url, link->target(), modifiers);
+                            }
                         }
+                    } else if (button == GUI::MouseButton::Middle) {
+                        if (auto* page = m_browsing_context.page())
+                            page->client().page_did_middle_click_link(url, link->target(), modifiers);
+                    } else if (button == GUI::MouseButton::Secondary) {
+                        if (auto* page = m_browsing_context.page())
+                            page->client().page_did_request_link_context_menu(m_browsing_context.to_top_level_position(position), url, link->target(), modifiers);
                     }
-                } else if (button == GUI::MouseButton::Middle) {
-                    if (auto* page = m_browsing_context.page())
-                        page->client().page_did_middle_click_link(url, link->target(), modifiers);
                 } else if (button == GUI::MouseButton::Secondary) {
-                    if (auto* page = m_browsing_context.page())
-                        page->client().page_did_request_link_context_menu(m_browsing_context.to_top_level_position(position), url, link->target(), modifiers);
-                }
-            } else if (button == GUI::MouseButton::Secondary) {
-                if (is<HTML::HTMLImageElement>(*node)) {
-                    auto& image_element = verify_cast<HTML::HTMLImageElement>(*node);
-                    auto image_url = image_element.document().parse_url(image_element.src());
-                    if (auto* page = m_browsing_context.page())
-                        page->client().page_did_request_image_context_menu(m_browsing_context.to_top_level_position(position), image_url, "", modifiers, image_element.bitmap());
-                } else if (auto* page = m_browsing_context.page()) {
-                    page->client().page_did_request_context_menu(m_browsing_context.to_top_level_position(position));
+                    if (is<HTML::HTMLImageElement>(*node)) {
+                        auto& image_element = verify_cast<HTML::HTMLImageElement>(*node);
+                        auto image_url = image_element.document().parse_url(image_element.src());
+                        if (auto* page = m_browsing_context.page())
+                            page->client().page_did_request_image_context_menu(m_browsing_context.to_top_level_position(position), image_url, "", modifiers, image_element.bitmap());
+                    } else if (auto* page = m_browsing_context.page()) {
+                        page->client().page_did_request_context_menu(m_browsing_context.to_top_level_position(position));
+                    }
                 }
             }
-
-            if (node.ptr() == m_mousedown_target && button == GUI::MouseButton::Primary) {
-                node->dispatch_event(UIEvents::MouseEvent::create(UIEvents::EventNames::click, offset.x(), offset.y(), position.x(), position.y()));
-            }
         }
     }