aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_2020
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout_2020')
-rw-r--r--components/layout_2020/fragment_tree/fragment.rs9
-rw-r--r--components/layout_2020/fragment_tree/fragment_tree.rs46
-rw-r--r--components/layout_2020/query.rs23
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.