diff --git a/components/layout_2020/fragment_tree/fragment_tree.rs b/components/layout_2020/fragment_tree/fragment_tree.rs index 2957d3e2c36..6ea98204fb4 100644 --- a/components/layout_2020/fragment_tree/fragment_tree.rs +++ b/components/layout_2020/fragment_tree/fragment_tree.rs @@ -17,7 +17,7 @@ use super::{ContainingBlockManager, Fragment, Tag}; use crate::cell::ArcRefCell; use crate::display_list::StackingContext; use crate::flow::CanvasBackground; -use crate::geom::PhysicalRect; +use crate::geom::{physical_rect_to_au_rect, PhysicalRect}; #[derive(Serialize)] pub struct FragmentTree { @@ -97,9 +97,13 @@ impl FragmentTree { }); } - pub fn get_content_box_for_node(&self, requested_node: OpaqueNode) -> Option> { - let mut bounding_box = PhysicalRect::zero(); - let mut found_any_nodes = false; + /// Get the vector of rectangles that surrounds the fragments of the node with the given address. + /// This function answers the `getClientRects()` query and the union of the rectangles answers + /// the `getBoundingClientRect()` query. + /// + /// TODO: This function is supposed to handle scroll offsets, but that isn't happening at all. + pub fn get_content_boxes_for_node(&self, requested_node: OpaqueNode) -> Vec> { + let mut content_boxes = Vec::new(); let tag_to_find = Tag::new(requested_node); self.find(|fragment, _, containing_block| { if fragment.tag() != Some(tag_to_find) { @@ -121,27 +125,12 @@ impl FragmentTree { Fragment::IFrame(_) => return None, }; - found_any_nodes = true; - bounding_box = fragment_relative_rect - .translate(containing_block.origin.to_vector()) - .union(&bounding_box); + content_boxes.push(physical_rect_to_au_rect( + fragment_relative_rect.translate(containing_block.origin.to_vector()), + )); None::<()> }); - - if found_any_nodes { - Some(Rect::new( - Point2D::new( - Au::from_f32_px(bounding_box.origin.x.px()), - Au::from_f32_px(bounding_box.origin.y.px()), - ), - Size2D::new( - Au::from_f32_px(bounding_box.size.width.px()), - Au::from_f32_px(bounding_box.size.height.px()), - ), - )) - } else { - None - } + content_boxes } pub fn get_border_dimensions_for_node(&self, requested_node: OpaqueNode) -> Rect { diff --git a/components/layout_2020/geom.rs b/components/layout_2020/geom.rs index 6a57b3c997b..d0a94d93265 100644 --- a/components/layout_2020/geom.rs +++ b/components/layout_2020/geom.rs @@ -525,3 +525,17 @@ impl From> for LogicalRect { } } } + +/// Convert a `PhysicalRect` (one that uses CSSPixel as the unit) to an untyped `Rect`. +pub fn physical_rect_to_au_rect(rect: PhysicalRect) -> euclid::default::Rect { + euclid::default::Rect::new( + euclid::default::Point2D::new( + Au::from_f32_px(rect.origin.x.px()), + Au::from_f32_px(rect.origin.y.px()), + ), + euclid::default::Size2D::new( + Au::from_f32_px(rect.size.width.px()), + Au::from_f32_px(rect.size.height.px()), + ), + ) +} diff --git a/components/layout_2020/query.rs b/components/layout_2020/query.rs index c4cab2c0b13..99428cce814 100644 --- a/components/layout_2020/query.rs +++ b/components/layout_2020/query.rs @@ -179,11 +179,25 @@ pub fn process_content_box_request( requested_node: OpaqueNode, fragment_tree: Option>, ) -> Option> { - fragment_tree?.get_content_box_for_node(requested_node) + let rects = fragment_tree?.get_content_boxes_for_node(requested_node); + if rects.is_empty() { + return None; + } + + Some( + rects + .iter() + .fold(Rect::zero(), |unioned_rect, rect| rect.union(&unioned_rect)), + ) } -pub fn process_content_boxes_request(_requested_node: OpaqueNode) -> Vec> { - vec![] +pub fn process_content_boxes_request( + requested_node: OpaqueNode, + fragment_tree: Option>, +) -> Vec> { + fragment_tree + .map(|tree| tree.get_content_boxes_for_node(requested_node)) + .unwrap_or_default() } pub fn process_node_geometry_request( diff --git a/components/layout_thread_2020/lib.rs b/components/layout_thread_2020/lib.rs index 7c27b9a9212..78e6de51fec 100644 --- a/components/layout_thread_2020/lib.rs +++ b/components/layout_thread_2020/lib.rs @@ -857,7 +857,8 @@ impl LayoutThread { process_content_box_request(node, self.fragment_tree.borrow().clone()); }, &QueryMsg::ContentBoxesQuery(node) => { - rw_data.content_boxes_response = process_content_boxes_request(node); + rw_data.content_boxes_response = + process_content_boxes_request(node, self.fragment_tree.borrow().clone()); }, &QueryMsg::TextIndexQuery(node, point_in_node) => { let point_in_node = Point2D::new( diff --git a/tests/wpt/meta/css/cssom-view/cssom-getClientRects-002.html.ini b/tests/wpt/meta/css/cssom-view/cssom-getClientRects-002.html.ini deleted file mode 100644 index 74efcb92e11..00000000000 --- a/tests/wpt/meta/css/cssom-view/cssom-getClientRects-002.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[cssom-getClientRects-002.html] - [CSSOM View - GetClientRects().length is the same regardless source new lines] - expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/getClientRects-br-htb-ltr.html.ini b/tests/wpt/meta/css/cssom-view/getClientRects-br-htb-ltr.html.ini deleted file mode 100644 index 6f949207c22..00000000000 --- a/tests/wpt/meta/css/cssom-view/getClientRects-br-htb-ltr.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[getClientRects-br-htb-ltr.html] - [Position of the BR element] - expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/getClientRects-br-vlr-ltr.html.ini b/tests/wpt/meta/css/cssom-view/getClientRects-br-vlr-ltr.html.ini deleted file mode 100644 index 68fddca93a3..00000000000 --- a/tests/wpt/meta/css/cssom-view/getClientRects-br-vlr-ltr.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[getClientRects-br-vlr-ltr.html] - [Position of the BR element] - expected: FAIL - diff --git a/tests/wpt/meta/css/cssom-view/getClientRects-inline-atomic-child.html.ini b/tests/wpt/meta/css/cssom-view/getClientRects-inline-atomic-child.html.ini deleted file mode 100644 index 9edff2020cf..00000000000 --- a/tests/wpt/meta/css/cssom-view/getClientRects-inline-atomic-child.html.ini +++ /dev/null @@ -1,10 +0,0 @@ -[getClientRects-inline-atomic-child.html] - [getClientRects-inline-atomic-child] - expected: FAIL - - [getClientRects-inline-atomic-child 2] - expected: FAIL - - [getClientRects-inline-atomic-child 1] - expected: FAIL - diff --git a/tests/wpt/meta/css/cssom-view/getClientRects-inline.html.ini b/tests/wpt/meta/css/cssom-view/getClientRects-inline.html.ini deleted file mode 100644 index 68e4f894023..00000000000 --- a/tests/wpt/meta/css/cssom-view/getClientRects-inline.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[getClientRects-inline.html] - expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/getClientRects-zoom.html.ini b/tests/wpt/meta/css/cssom-view/getClientRects-zoom.html.ini index 15a80711aa8..54e56e8c577 100644 --- a/tests/wpt/meta/css/cssom-view/getClientRects-zoom.html.ini +++ b/tests/wpt/meta/css/cssom-view/getClientRects-zoom.html.ini @@ -1,7 +1,4 @@ [getClientRects-zoom.html] - [getBoundingClientRect for elements with css zoom 1] - expected: FAIL - [getBoundingClientRect for elements with css zoom 2] expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-navigation.html.ini b/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-navigation.html.ini index f4121525268..647c7fb29b2 100644 --- a/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-navigation.html.ini +++ b/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-navigation.html.ini @@ -4,3 +4,6 @@ [Make sure the page is ready for animation.] expected: FAIL + + [Smooth scrolling while doing history navigation.] + expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/ttwf-js-cssomview-getclientrects-length.html.ini b/tests/wpt/meta/css/cssom-view/ttwf-js-cssomview-getclientrects-length.html.ini deleted file mode 100644 index 1939d9b0831..00000000000 --- a/tests/wpt/meta/css/cssom-view/ttwf-js-cssomview-getclientrects-length.html.ini +++ /dev/null @@ -1,9 +0,0 @@ -[ttwf-js-cssomview-getclientrects-length.html] - [assert_length_of_getClientRects_from_Link] - expected: FAIL - - [assert_length_of_getClientRects_from_Parent] - expected: FAIL - - [assert_length_of_getClientRects_from_Button] - expected: FAIL diff --git a/tests/wpt/meta/css/geometry/DOMRectList.html.ini b/tests/wpt/meta/css/geometry/DOMRectList.html.ini index 46056dbbd0b..d5365a060cf 100644 --- a/tests/wpt/meta/css/geometry/DOMRectList.html.ini +++ b/tests/wpt/meta/css/geometry/DOMRectList.html.ini @@ -7,9 +7,3 @@ [DOMRectList item()] expected: FAIL - - [DOMRectList length] - expected: FAIL - - [DOMRectList indexed getter] - expected: FAIL diff --git a/tests/wpt/meta/css/geometry/structured-serialization.html.ini b/tests/wpt/meta/css/geometry/structured-serialization.html.ini index 6cabb582509..4c5e6ea2aa0 100644 --- a/tests/wpt/meta/css/geometry/structured-serialization.html.ini +++ b/tests/wpt/meta/css/geometry/structured-serialization.html.ini @@ -88,6 +88,3 @@ [DOMMatrix clone: non-initial values (3d)] expected: FAIL - - [DOMRectList clone] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-canvas-element/canvas-descendants-focusability-003.tentative.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-canvas-element/canvas-descendants-focusability-003.tentative.html.ini index 69914d123b1..e4a0bd079b9 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-canvas-element/canvas-descendants-focusability-003.tentative.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-canvas-element/canvas-descendants-focusability-003.tentative.html.ini @@ -1,5 +1,4 @@ [canvas-descendants-focusability-003.tentative.html] - expected: ERROR [
] expected: FAIL