diff options
Diffstat (limited to 'components/layout_2020')
-rw-r--r-- | components/layout_2020/fragment_tree/fragment.rs | 9 | ||||
-rw-r--r-- | components/layout_2020/fragment_tree/fragment_tree.rs | 46 | ||||
-rw-r--r-- | components/layout_2020/query.rs | 23 |
3 files changed, 41 insertions, 37 deletions
diff --git a/components/layout_2020/fragment_tree/fragment.rs b/components/layout_2020/fragment_tree/fragment.rs index 77b575a9d42..fda4636e9e7 100644 --- a/components/layout_2020/fragment_tree/fragment.rs +++ b/components/layout_2020/fragment_tree/fragment.rs @@ -167,6 +167,15 @@ impl Fragment { } } + pub fn scrolling_area(&self, containing_block: &PhysicalRect<Length>) -> PhysicalRect<Length> { + match self { + Fragment::Box(fragment) | Fragment::Float(fragment) => fragment + .scrollable_overflow(containing_block) + .translate(containing_block.origin.to_vector()), + _ => self.scrollable_overflow(containing_block), + } + } + pub fn scrollable_overflow( &self, containing_block: &PhysicalRect<Length>, diff --git a/components/layout_2020/fragment_tree/fragment_tree.rs b/components/layout_2020/fragment_tree/fragment_tree.rs index 023344a1b6c..f797f5644c6 100644 --- a/components/layout_2020/fragment_tree/fragment_tree.rs +++ b/components/layout_2020/fragment_tree/fragment_tree.rs @@ -172,36 +172,26 @@ impl FragmentTree { .unwrap_or_else(Rect::zero) } - pub fn get_scroll_area_for_node(&self, requested_node: OpaqueNode) -> Rect<i32> { - let mut scroll_area: PhysicalRect<Length> = PhysicalRect::zero(); + pub fn get_scrolling_area_for_viewport(&self) -> PhysicalRect<Length> { + let mut scroll_area = self.initial_containing_block; + for fragment in self.root_fragments.iter() { + scroll_area = fragment + .borrow() + .scrolling_area(&self.initial_containing_block) + .union(&scroll_area); + } + scroll_area + } + + pub fn get_scrolling_area_for_node(&self, requested_node: OpaqueNode) -> PhysicalRect<Length> { let tag_to_find = Tag::new(requested_node); - self.find(|fragment, _, containing_block| { - if fragment.tag() != Some(tag_to_find) { - return None::<()>; + let scroll_area = self.find(|fragment, _, containing_block| { + if fragment.tag() == Some(tag_to_find) { + Some(fragment.scrolling_area(&containing_block)) + } else { + None } - - scroll_area = match fragment { - Fragment::Box(fragment) | Fragment::Float(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, - ), - ) + scroll_area.unwrap_or_else(PhysicalRect::<Length>::zero) } } diff --git a/components/layout_2020/query.rs b/components/layout_2020/query.rs index e71b5df20ee..3ea4003cd0a 100644 --- a/components/layout_2020/query.rs +++ b/components/layout_2020/query.rs @@ -56,7 +56,7 @@ pub struct LayoutThreadData { pub scroll_id_response: Option<ExternalScrollId>, /// A queued response for the scroll {top, left, width, height} of a node in pixels. - pub scroll_area_response: Rect<i32>, + pub scrolling_area_response: Rect<i32>, /// A queued response for the resolved style property of an element. pub resolved_style_response: String, @@ -115,9 +115,9 @@ impl LayoutRPC for LayoutRPCImpl { } } - fn node_scroll_area(&self) -> NodeGeometryResponse { + fn scrolling_area(&self) -> NodeGeometryResponse { NodeGeometryResponse { - client_rect: self.0.lock().unwrap().scroll_area_response, + client_rect: self.0.lock().unwrap().scrolling_area_response, } } @@ -201,14 +201,19 @@ 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, + requested_node: Option<OpaqueNode>, fragment_tree: Option<Arc<FragmentTree>>, ) -> Rect<i32> { - if let Some(fragment_tree) = fragment_tree { - fragment_tree.get_scroll_area_for_node(requested_node) - } else { - Rect::zero() - } + let rect = match (fragment_tree, requested_node) { + (Some(tree), Some(node)) => tree.get_scrolling_area_for_node(node), + (Some(tree), None) => tree.get_scrolling_area_for_viewport(), + _ => return Rect::zero(), + }; + + Rect::new( + Point2D::new(rect.origin.x.px() as i32, rect.origin.y.px() as i32), + Size2D::new(rect.size.width.px() as i32, rect.size.height.px() as i32), + ) } /// Return the resolved value of property for a given (pseudo)element. |