diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 991d254dddc..a6e49a93639 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -1546,6 +1546,7 @@ impl Document { } } + /// pub(crate) fn handle_mouse_button_event( &self, event: MouseButtonEvent, @@ -1579,15 +1580,6 @@ impl Document { if el.is_actually_disabled() { return; } - - // For a node within a text input UA shadow DOM, delegate the focus target into its shadow host. - // TODO: This focus delegation should be done with shadow DOM delegateFocus attribute. - let target_el = el.find_focusable_shadow_host_if_necessary(); - - self.begin_focus_transaction(); - // Try to focus `el`. If it's not focusable, focus the document instead. - self.request_focus(None, FocusInitiator::Local, can_gc); - self.request_focus(target_el.as_deref(), FocusInitiator::Local, can_gc); } let dom_event = DomRoot::upcast::(MouseEvent::for_platform_mouse_event( @@ -1599,44 +1591,65 @@ impl Document { can_gc, )); - // https://html.spec.whatwg.org/multipage/#run-authentic-click-activation-steps let activatable = el.as_maybe_activatable(); match event.action { + // https://w3c.github.io/uievents/#handle-native-mouse-click MouseButtonAction::Click => { el.set_click_in_progress(true); - dom_event.fire(node.upcast(), can_gc); + dom_event.dispatch(node.upcast(), false, can_gc); el.set_click_in_progress(false); + + self.maybe_fire_dblclick(node, &hit_test_result, input_event, can_gc); }, + // https://w3c.github.io/uievents/#handle-native-mouse-down MouseButtonAction::Down => { + // (TODO) Step 6. Maybe send pointerdown event with `dom_event`. if let Some(a) = activatable { a.enter_formal_activation_state(); } - let target = node.upcast(); - dom_event.fire(target, can_gc); + // For a node within a text input UA shadow DOM, + // delegate the focus target into its shadow host. + // TODO: This focus delegation should be done + // with shadow DOM delegateFocus attribute. + let target_el = el.find_focusable_shadow_host_if_necessary(); + self.begin_focus_transaction(); + // Try to focus `el`. If it's not focusable, focus the document instead. + self.request_focus(None, FocusInitiator::Local, can_gc); + self.request_focus(target_el.as_deref(), FocusInitiator::Local, can_gc); + + // Step 7. Let result = dispatch event at target + let result = dom_event.dispatch(node.upcast(), false, can_gc); + + // Step 8. If result is true and target is a focusable area + // that is click focusable, then Run the focusing steps at target. + if result && self.focus_transaction.borrow().is_some() { + self.commit_focus_transaction(FocusInitiator::Local, can_gc); + } + + // Step 9. If mbutton is the secondary mouse button, then + // Maybe show context menu with native, target. + if let (MouseButtonAction::Down, MouseButton::Right) = (event.action, event.button) + { + self.maybe_show_context_menu( + node.upcast(), + &hit_test_result, + input_event, + can_gc, + ); + } }, + // https://w3c.github.io/uievents/#handle-native-mouse-up MouseButtonAction::Up => { if let Some(a) = activatable { a.exit_formal_activation_state(); } + // (TODO) Step 6. Maybe send pointerup event with `dom_event``. - let target = node.upcast(); - dom_event.fire(target, can_gc); + // Step 7. dispatch event at target. + dom_event.dispatch(node.upcast(), false, can_gc); }, } - - if let MouseButtonAction::Click = event.action { - if self.focus_transaction.borrow().is_some() { - self.commit_focus_transaction(FocusInitiator::Local, can_gc); - } - self.maybe_fire_dblclick(node, &hit_test_result, input_event, can_gc); - } - - // When the contextmenu event is triggered by right mouse button - // the contextmenu event MUST be dispatched after the mousedown event. - if let (MouseButtonAction::Down, MouseButton::Right) = (event.action, event.button) { - self.maybe_show_context_menu(node.upcast(), &hit_test_result, input_event, can_gc); - } } /// diff --git a/components/script/dom/mouseevent.rs b/components/script/dom/mouseevent.rs index d66209d6339..aff9c4118f7 100644 --- a/components/script/dom/mouseevent.rs +++ b/components/script/dom/mouseevent.rs @@ -222,6 +222,7 @@ impl MouseEvent { } /// Create a [MouseEvent] triggered by the embedder + /// pub(crate) fn for_platform_mouse_event( event: embedder_traits::MouseButtonEvent, pressed_mouse_buttons: u16, diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/navigate.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/navigate.py.ini index acaa6735208..7fc58215305 100644 --- a/tests/wpt/meta/webdriver/tests/classic/element_click/navigate.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/element_click/navigate.py.ini @@ -1,9 +1,17 @@ [navigate.py] - expected: TIMEOUT - [test_link_hash] + [test_link_from_toplevel_context_with_target[_blank\]] expected: FAIL - [test_link_from_toplevel_context_with_target[_blank\]] + [test_link_from_nested_context_with_target[]] + expected: FAIL + + [test_link_from_nested_context_with_target[_parent]] + expected: FAIL + + [test_link_from_nested_context_with_target[_self]] + expected: FAIL + + [test_link_from_nested_context_with_target[_top]] expected: FAIL [test_link_from_toplevel_context_with_target[_parent\]] diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/user_prompts.py.ini index f2e05aa91e7..52d8130f726 100644 --- a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/user_prompts.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/user_prompts.py.ini @@ -7,3 +7,9 @@ [test_dismiss[prompt-None\]] expected: FAIL + + [test_accept[alert-None\]] + expected: FAIL + + [test_dismiss[confirm-False\]] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/forward/forward.py.ini b/tests/wpt/meta/webdriver/tests/classic/forward/forward.py.ini index 3d3b4b913d4..13032a4e96e 100644 --- a/tests/wpt/meta/webdriver/tests/classic/forward/forward.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/forward/forward.py.ini @@ -10,3 +10,6 @@ [test_seen_nodes[https coop\]] expected: FAIL + + [test_removed_iframe] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/navigation.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/navigation.py.ini index 03e5ef00d58..08dd1964663 100644 --- a/tests/wpt/meta/webdriver/tests/classic/perform_actions/navigation.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/navigation.py.ini @@ -1,3 +1,4 @@ [navigation.py] + expected: TIMEOUT [test_pointer] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_modifier_click.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_modifier_click.py.ini new file mode 100644 index 00000000000..28c613a149c --- /dev/null +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_modifier_click.py.ini @@ -0,0 +1,3 @@ +[pointer_modifier_click.py] + [test_many_modifiers_click] + expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/set_window_rect/set.py.ini b/tests/wpt/meta/webdriver/tests/classic/set_window_rect/set.py.ini index 0e2c6199964..c9467a0ee07 100644 --- a/tests/wpt/meta/webdriver/tests/classic/set_window_rect/set.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/set_window_rect/set.py.ini @@ -4,3 +4,6 @@ [test_set_to_available_size] expected: FAIL + + [test_negative_x_y] + expected: FAIL