From 404ee8b98468970f0108d1e011f44b694975acb7 Mon Sep 17 00:00:00 2001 From: Martin Robinson Date: Tue, 25 Apr 2023 09:11:28 +0200 Subject: [PATCH] Fix scrolling from script in Layout 2020 Script will only scroll if it detects that an element has a scrolling box, so this change adds an implementation of the scroll area query to Layout 2020. This allows some scrolling tests to start passing. This change also updates all expected results in css-backgrounds and cssom-view. --- components/layout_2020/flow/root.rs | 33 +++++++++++ components/layout_2020/query.rs | 11 +++- components/layout_thread_2020/lib.rs | 3 +- .../attachment-local-positioning-2.html.ini | 2 - .../attachment-scroll-positioning-1.html.ini | 2 - ...tioned-multiple-background-images.html.ini | 2 - ...ntaining-block-change-scrollframe.html.ini | 2 - ...r-non-containing-stacking-context.html.ini | 2 + ...-absolute-scrollable-overflow-001.html.ini | 12 ---- ...sition-sticky-escape-scroller-001.html.ini | 2 - ...sition-sticky-escape-scroller-003.html.ini | 2 - ...position-sticky-fractional-offset.html.ini | 2 - .../position-sticky-overflow-padding.html.ini | 3 - ...on-sticky-scrolled-remove-sibling.html.ini | 6 -- .../position-sticky-table-td-top.html.ini | 2 + ...ryList-addListener-removeListener.html.ini | 6 ++ ...chment-fixed-during-smooth-scroll.html.ini | 2 - ...round-change-during-smooth-scroll.html.ini | 4 -- .../cssom-view/dom-element-scroll.html.ini | 6 -- .../elementFromPoint-float-in-table.html.ini | 3 - .../css/cssom-view/elementScroll-002.html.ini | 12 ---- .../css/cssom-view/elementScroll.html.ini | 21 ------- .../elementsFromPoint-iframes.html.ini | 3 - .../elementsFromPoint-inline-vlr-ltr.html.ini | 4 -- .../css/cssom-view/pt-to-px-width.html.ini | 3 - .../scroll-behavior-default-css.html.ini | 3 - .../scroll-behavior-element.html.ini | 45 --------------- .../scroll-behavior-smooth-positions.html.ini | 55 ------------------- .../css/cssom-view/scrollWidthHeight.xht.ini | 12 ---- ...scrollWidthHeightWhenNotScrollable.xht.ini | 18 ------ .../scrolling-quirks-vs-nonquirks.html.ini | 27 ++++++--- 31 files changed, 72 insertions(+), 238 deletions(-) delete mode 100644 tests/wpt/metadata-layout-2020/css/css-backgrounds/background-attachment-local/attachment-local-positioning-2.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/css-backgrounds/background-attachment-local/attachment-scroll-positioning-1.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/css-backgrounds/scroll-positioned-multiple-background-images.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/css-position/containing-block-change-scrollframe.html.ini create mode 100644 tests/wpt/metadata-layout-2020/css/css-position/position-absolute-under-non-containing-stacking-context.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-escape-scroller-001.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-escape-scroller-003.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-fractional-offset.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-scrolled-remove-sibling.html.ini create mode 100644 tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-table-td-top.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/cssom-view/add-background-attachment-fixed-during-smooth-scroll.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/cssom-view/background-change-during-smooth-scroll.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/cssom-view/dom-element-scroll.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPoint-float-in-table.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/cssom-view/elementScroll-002.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-inline-vlr-ltr.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/cssom-view/pt-to-px-width.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/cssom-view/scrollWidthHeightWhenNotScrollable.xht.ini diff --git a/components/layout_2020/flow/root.rs b/components/layout_2020/flow/root.rs index 80a42c70701..fb05049f4a8 100644 --- a/components/layout_2020/flow/root.rs +++ b/components/layout_2020/flow/root.rs @@ -538,6 +538,39 @@ impl FragmentTree { }) .unwrap_or_else(Rect::zero) } + + pub fn get_scroll_area_for_node(&self, requested_node: OpaqueNode) -> Rect { + let mut scroll_area: PhysicalRect = PhysicalRect::zero(); + let tag_to_find = Tag::Node(requested_node); + self.find(|fragment, _, containing_block| { + if fragment.tag() != Some(tag_to_find) { + return None::<()>; + } + + scroll_area = match fragment { + Fragment::Box(fragment) => fragment + .scrollable_overflow(&containing_block) + .translate(containing_block.origin.to_vector()), + Fragment::Text(_) | + Fragment::AbsoluteOrFixedPositioned(_) | + Fragment::Image(_) | + Fragment::IFrame(_) | + Fragment::Anonymous(_) => return None, + }; + None::<()> + }); + + Rect::new( + Point2D::new( + scroll_area.origin.x.px() as i32, + scroll_area.origin.y.px() as i32, + ), + Size2D::new( + scroll_area.size.width.px() as i32, + scroll_area.size.height.px() as i32, + ), + ) + } } /// https://drafts.csswg.org/css-backgrounds/#root-background diff --git a/components/layout_2020/query.rs b/components/layout_2020/query.rs index 0e99ec88fac..f59163a3a7c 100644 --- a/components/layout_2020/query.rs +++ b/components/layout_2020/query.rs @@ -201,8 +201,15 @@ pub fn process_node_scroll_id_request<'dom>( } /// https://drafts.csswg.org/cssom-view/#scrolling-area -pub fn process_node_scroll_area_request(_requested_node: OpaqueNode) -> Rect { - Rect::zero() +pub fn process_node_scroll_area_request( + requested_node: OpaqueNode, + fragment_tree: Option>, +) -> Rect { + if let Some(fragment_tree) = fragment_tree { + fragment_tree.get_scroll_area_for_node(requested_node) + } else { + Rect::zero() + } } /// Return the resolved value of property for a given (pseudo)element. diff --git a/components/layout_thread_2020/lib.rs b/components/layout_thread_2020/lib.rs index 0a1dff2d284..18851ef905c 100644 --- a/components/layout_thread_2020/lib.rs +++ b/components/layout_thread_2020/lib.rs @@ -1184,7 +1184,8 @@ impl LayoutThread { process_node_geometry_request(node, self.fragment_tree.borrow().clone()); }, &QueryMsg::NodeScrollGeometryQuery(node) => { - rw_data.scroll_area_response = process_node_scroll_area_request(node); + rw_data.scroll_area_response = + process_node_scroll_area_request(node, self.fragment_tree.borrow().clone()); }, &QueryMsg::NodeScrollIdQuery(node) => { let node = unsafe { ServoLayoutNode::new(&node) }; diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-attachment-local/attachment-local-positioning-2.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-attachment-local/attachment-local-positioning-2.html.ini deleted file mode 100644 index c2c7efbdb1e..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-attachment-local/attachment-local-positioning-2.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[attachment-local-positioning-2.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-attachment-local/attachment-scroll-positioning-1.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-attachment-local/attachment-scroll-positioning-1.html.ini deleted file mode 100644 index 56dea1c6b86..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-attachment-local/attachment-scroll-positioning-1.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[attachment-scroll-positioning-1.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/scroll-positioned-multiple-background-images.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/scroll-positioned-multiple-background-images.html.ini deleted file mode 100644 index b5ff1f789a7..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-backgrounds/scroll-positioned-multiple-background-images.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[scroll-positioned-multiple-background-images.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-position/containing-block-change-scrollframe.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/containing-block-change-scrollframe.html.ini deleted file mode 100644 index 242f79c08a9..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-position/containing-block-change-scrollframe.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[containing-block-change-scrollframe.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-under-non-containing-stacking-context.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-under-non-containing-stacking-context.html.ini new file mode 100644 index 00000000000..ac4f8b57db3 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-under-non-containing-stacking-context.html.ini @@ -0,0 +1,2 @@ +[position-absolute-under-non-containing-stacking-context.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-position/positon-absolute-scrollable-overflow-001.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/positon-absolute-scrollable-overflow-001.html.ini index 9293d969cdb..85b4aad53ef 100644 --- a/tests/wpt/metadata-layout-2020/css/css-position/positon-absolute-scrollable-overflow-001.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-position/positon-absolute-scrollable-overflow-001.html.ini @@ -28,15 +28,3 @@ [.containing-block 14] expected: FAIL - - [.containing-block 5] - expected: FAIL - - [.containing-block 6] - expected: FAIL - - [.containing-block 12] - expected: FAIL - - [.containing-block 13] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-escape-scroller-001.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-escape-scroller-001.html.ini deleted file mode 100644 index 3018d79f1af..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-escape-scroller-001.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[position-sticky-escape-scroller-001.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-escape-scroller-003.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-escape-scroller-003.html.ini deleted file mode 100644 index 990a7ae58c6..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-escape-scroller-003.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[position-sticky-escape-scroller-003.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-fractional-offset.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-fractional-offset.html.ini deleted file mode 100644 index 396d46a2f2b..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-fractional-offset.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[position-sticky-fractional-offset.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-overflow-padding.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-overflow-padding.html.ini index 7fb4bc0467c..c36358f4f58 100644 --- a/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-overflow-padding.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-overflow-padding.html.ini @@ -1,6 +1,3 @@ [position-sticky-overflow-padding.html] [Ancestor overflow padding does not allow a sticky element to escape its container] expected: FAIL - - [A sticky element should be offset by ancestor padding even when stuck] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-scrolled-remove-sibling.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-scrolled-remove-sibling.html.ini deleted file mode 100644 index 7272a91e0af..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-scrolled-remove-sibling.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[position-sticky-scrolled-remove-sibling.html] - [Sticky position and its overflow contribution in the vertical axis] - expected: FAIL - - [Sticky position and its overflow contribution in the horizontal axis] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-table-td-top.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-table-td-top.html.ini new file mode 100644 index 00000000000..c1aa4f40983 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-position/sticky/position-sticky-table-td-top.html.ini @@ -0,0 +1,2 @@ +[position-sticky-table-td-top.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini index 314dca9c1f5..153b135b9a9 100644 --- a/tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini +++ b/tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini @@ -1,3 +1,9 @@ [MediaQueryList-addListener-removeListener.html] [listeners are called when