diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 120d9c18e77..e1d5f37eedc 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -56,6 +56,7 @@ use crate::dom::bindings::reflector::{DomGlobal, DomObject}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::document::Document; +use crate::dom::domrect::DOMRect; use crate::dom::element::Element; use crate::dom::eventtarget::EventTarget; use crate::dom::globalscope::GlobalScope; @@ -1340,6 +1341,33 @@ pub(crate) fn handle_get_title( .unwrap(); } +/// +fn calculate_absolute_position( + documents: &DocumentCollection, + pipeline: &PipelineId, + rect: &DOMRect, +) -> Result<(f64, f64), ErrorStatus> { + // Step 1 + // We already pass the rectangle here, see `handle_get_rect`. + + // Step 2 + let document = match documents.find_document(*pipeline) { + Some(document) => document, + None => return Err(ErrorStatus::UnknownError), + }; + let win = match document.GetDefaultView() { + Some(win) => win, + None => return Err(ErrorStatus::UnknownError), + }; + + // Step 3 - 5 + let x = win.ScrollX() as f64 + rect.X(); + let y = win.ScrollY() as f64 + rect.Y(); + + Ok((x, y)) +} + +/// pub(crate) fn handle_get_rect( documents: &DocumentCollection, pipeline: PipelineId, @@ -1350,37 +1378,17 @@ pub(crate) fn handle_get_rect( reply .send( get_known_element(documents, pipeline, element_id).and_then(|element| { - // https://w3c.github.io/webdriver/webdriver-spec.html#dfn-calculate-the-absolute-position - match element.downcast::() { - Some(html_element) => { - // Step 1 - let mut x = 0; - let mut y = 0; + // Step 4-5 + // We pass the rect instead of element so we don't have to + // call `GetBoundingClientRect` twice. + let rect = element.GetBoundingClientRect(can_gc); + let (x, y) = calculate_absolute_position(documents, &pipeline, &rect)?; - let mut offset_parent = html_element.GetOffsetParent(can_gc); - - // Step 2 - while let Some(element) = offset_parent { - offset_parent = match element.downcast::() { - Some(elem) => { - x += elem.OffsetLeft(can_gc); - y += elem.OffsetTop(can_gc); - elem.GetOffsetParent(can_gc) - }, - None => None, - }; - } - // Step 3 - Ok(Rect::new( - Point2D::new(x as f64, y as f64), - Size2D::new( - html_element.OffsetWidth(can_gc) as f64, - html_element.OffsetHeight(can_gc) as f64, - ), - )) - }, - None => Err(ErrorStatus::UnknownError), - } + // Step 6-7 + Ok(Rect::new( + Point2D::new(x, y), + Size2D::new(rect.Width(), rect.Height()), + )) }), ) .unwrap(); diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_rect/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_rect/get.py.ini index 2ac20123491..bb9de0071f4 100644 --- a/tests/wpt/meta/webdriver/tests/classic/get_element_rect/get.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/get_element_rect/get.py.ini @@ -1,6 +1,3 @@ [get.py] [test_no_browsing_context] expected: FAIL - - [test_basic] - expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse_drag.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse_drag.py.ini index 3fa735ac7ea..157fc76b5a5 100644 --- a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse_drag.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse_drag.py.ini @@ -1,58 +1,4 @@ [pointer_mouse_drag.py] - [test_drag_and_drop[20-0-0\]] - expected: FAIL - - [test_drag_and_drop[20-0-300\]] - expected: FAIL - - [test_drag_and_drop[20-0-800\]] - expected: FAIL - - [test_drag_and_drop[0-15-0\]] - expected: FAIL - - [test_drag_and_drop[0-15-300\]] - expected: FAIL - - [test_drag_and_drop[0-15-800\]] - expected: FAIL - - [test_drag_and_drop[10-15-0\]] - expected: FAIL - - [test_drag_and_drop[10-15-300\]] - expected: FAIL - - [test_drag_and_drop[10-15-800\]] - expected: FAIL - - [test_drag_and_drop[-20-0-0\]] - expected: FAIL - - [test_drag_and_drop[-20-0-300\]] - expected: FAIL - - [test_drag_and_drop[-20-0-800\]] - expected: FAIL - - [test_drag_and_drop[10--15-0\]] - expected: FAIL - - [test_drag_and_drop[10--15-300\]] - expected: FAIL - - [test_drag_and_drop[10--15-800\]] - expected: FAIL - - [test_drag_and_drop[-10--15-0\]] - expected: FAIL - - [test_drag_and_drop[-10--15-300\]] - expected: FAIL - - [test_drag_and_drop[-10--15-800\]] - expected: FAIL - [test_drag_and_drop_with_draggable_element[0\]] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_origin.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_origin.py.ini index 4018e8e3e5b..33bfbdb7f2b 100644 --- a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_origin.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_origin.py.ini @@ -5,8 +5,5 @@ [test_element_center_point_with_offset] expected: FAIL - [test_element_in_view_center_point_partly_visible] - expected: FAIL - [test_element_larger_than_viewport] expected: FAIL diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pause_dblclick.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pause_dblclick.py.ini index 106650cb70e..f9a47f02139 100644 --- a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pause_dblclick.py.ini +++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pause_dblclick.py.ini @@ -1,6 +1,3 @@ [pointer_pause_dblclick.py] [test_dblclick_with_pause_after_second_pointerdown] expected: FAIL - - [test_no_dblclick] - expected: FAIL