diff --git a/components/layout/display_list/stacking_context.rs b/components/layout/display_list/stacking_context.rs index 823d0710267..4b34bd2d885 100644 --- a/components/layout/display_list/stacking_context.rs +++ b/components/layout/display_list/stacking_context.rs @@ -1009,6 +1009,7 @@ impl BoxFragment { // > If a transform function causes the current transformation matrix of an object // > to be non-invertible, the object and its content do not get displayed. if !reference_frame_data.transform.is_invertible() { + self.clear_spatial_tree_node_including_descendants(); return; } @@ -1705,6 +1706,29 @@ impl BoxFragment { Perspective::None => None, } } + + fn clear_spatial_tree_node_including_descendants(&self) { + fn assign_spatial_tree_node_on_fragments(fragments: &[Fragment]) { + for fragment in fragments.iter() { + match fragment { + Fragment::Box(box_fragment) | Fragment::Float(box_fragment) => { + box_fragment + .borrow() + .clear_spatial_tree_node_including_descendants(); + }, + Fragment::Positioning(positioning_fragment) => { + assign_spatial_tree_node_on_fragments( + &positioning_fragment.borrow().children, + ); + }, + _ => {}, + } + } + } + + *self.spatial_tree_node.borrow_mut() = None; + assign_spatial_tree_node_on_fragments(&self.children); + } } impl PositioningFragment { diff --git a/components/layout/query.rs b/components/layout/query.rs index 75060db01de..aef2691177b 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -60,10 +60,8 @@ fn root_transform_for_layout_node( .first() .and_then(Fragment::retrieve_box_fragment)? .borrow(); - let scroll_tree_node_id = box_fragment - .spatial_tree_node - .borrow() - .expect("Should always have a scroll tree node when querying bounding box."); + let scroll_tree_node_id = box_fragment.spatial_tree_node.borrow(); + let scroll_tree_node_id = (*scroll_tree_node_id)?; Some(scroll_tree.cumulative_node_to_root_transform(&scroll_tree_node_id)) } @@ -87,7 +85,7 @@ pub(crate) fn process_box_area_request( let Some(transform) = root_transform_for_layout_node(&stacking_context_tree.compositor_info.scroll_tree, node) else { - return Some(rect_union); + return Some(Rect::new(rect_union.origin, Size2D::zero())); }; transform_au_rectangle(rect_union, transform) @@ -107,7 +105,9 @@ pub(crate) fn process_box_areas_request( let Some(transform) = root_transform_for_layout_node(&stacking_context_tree.compositor_info.scroll_tree, node) else { - return box_areas.collect(); + return box_areas + .map(|rect| Rect::new(rect.origin, Size2D::zero())) + .collect(); }; box_areas diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index c13f56d6d51..88d67ba6bff 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -5819,6 +5819,13 @@ {} ] ], + "uninvertible-transform-and-script-queries.html": [ + "8a3c88fcb8ade4038ba47a347cf3a5375d521bd4", + [ + null, + {} + ] + ], "w-crossing-zero-001.html": [ "64ba0e85f24d501e4115d7e697052acb3a84f27a", [ diff --git a/tests/wpt/tests/css/css-transforms/crashtests/uninvertible-transform-and-script-queries.html b/tests/wpt/tests/css/css-transforms/crashtests/uninvertible-transform-and-script-queries.html new file mode 100644 index 00000000000..8a3c88fcb8a --- /dev/null +++ b/tests/wpt/tests/css/css-transforms/crashtests/uninvertible-transform-and-script-queries.html @@ -0,0 +1,16 @@ + + + + +