From 372e5eae59de3d013a7a64ae2b3475fb00f9a3bf Mon Sep 17 00:00:00 2001 From: Euclid Ye Date: Fri, 1 Aug 2025 15:08:28 +0800 Subject: [PATCH] webdriver: Fix "element in view" by correctly computing resolved `PointerEvents` style (#38383) Testing: `element_click/interactability.py`. For some other tests in headed window, even tho the target is in view it falsely claim not in view previously. --------- Signed-off-by: Euclid Ye --- components/script/webdriver_handlers.rs | 12 +++++++++++- .../element_click/interactability.py.ini | 9 --------- .../tests/classic/element_click/select.py.ini | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index edfda2cb513..b9476371dc4 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -1898,7 +1898,17 @@ pub(crate) fn handle_element_click( /// fn is_element_in_view(element: &Element, document: &Document, can_gc: CanGc) -> bool { - element.enabled_state() && + use style::computed_values::pointer_events::T as PointerEvents; + // https://w3c.github.io/webdriver/#dfn-pointer-events-are-not-disabled + // An element is said to have pointer events disabled + // if the resolved value of its "pointer-events" style property is "none". + let pointer_events_enabled = element + .style(can_gc) + .is_none_or(|style| style.get_inherited_ui().pointer_events != PointerEvents::None); + + // An element is in view if it is a member of its own pointer-interactable paint tree, + // given the pretense that its pointer events are not disabled. + pointer_events_enabled && get_element_pointer_interactable_paint_tree(element, document, can_gc) .contains(&DomRoot::from_ref(element)) } diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/interactability.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/interactability.py.ini index 0d3da94d025..2d42abf4e44 100644 --- a/tests/wpt/meta/webdriver/tests/classic/element_click/interactability.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/element_click/interactability.py.ini @@ -4,12 +4,3 @@ [test_element_intercepted_no_pointer_events] expected: FAIL - - [test_disabled] - expected: FAIL - - [test_element_interactable_css_transform[translate(100px, 100px)\]] - expected: FAIL - - [test_element_interactable_css_transform[rotate(50deg)\]] - expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/select.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/select.py.ini index 2bf7e5abac4..ccc623a19cd 100644 --- a/tests/wpt/meta/webdriver/tests/classic/element_click/select.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/element_click/select.py.ini @@ -13,3 +13,21 @@ [test_out_of_view_dropdown] expected: FAIL + + [test_click_multiple_option] + expected: FAIL + + [test_click_preselected_multiple_option] + expected: FAIL + + [test_click_multiple_does_not_deselect_others] + expected: FAIL + + [test_click_selected_multiple_option] + expected: FAIL + + [test_out_of_view_multiple] + expected: FAIL + + [test_option_disabled] + expected: FAIL