mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
layout: Store scroll offsets in the ScrollTree
(#37428)
There are currently five places that scroll offsets are stored: - DOM: A set of scroll offsets used for script. - Layout: An array of scroll offsets that is used for tracking layout-side scroll offsets. - Layout: The scroll offsets stored in the `ScrollTree`. These are currently unset and unused. - Compositor: The scroll offsets stored in the `ScrollTree` mirrored from layout. - WebRender: The scrolled offsets stored in the WebRender spatial tree. This change is the first step in combining the first three into the layout `ScrollTree`. It eliminates the extra array of scroll offsets stored in layout in favor of the storing them in the `ScrollTree`. A followup change will eliminate the ones stored in the DOM. - In addition the `ScrollState` data structure is eliminated as these are now stored in a `HashMap` everywhere when passing them via IPC. - The offsests stored in layout can now never scroll past the boundaries of the scrolled content. Testing: This should not change behavior and is thus covered by existing WPT tests. Signed-off-by: Martin Robinson <mrobinson@igalia.com> Co-authored-by: stevennovaryo <steven.novaryo@gmail.com>
This commit is contained in:
parent
6cac782fb1
commit
f451dccd0b
11 changed files with 182 additions and 122 deletions
|
@ -4,6 +4,8 @@
|
|||
|
||||
//! Defines data structures which are consumed by the Compositor.
|
||||
|
||||
use std::collections::HashMap;
|
||||
|
||||
use base::id::ScrollTreeNodeId;
|
||||
use bitflags::bitflags;
|
||||
use embedder_traits::Cursor;
|
||||
|
@ -338,7 +340,7 @@ impl ScrollTree {
|
|||
|
||||
/// Given an [`ExternalScrollId`] and an offset, update the scroll offset of the scroll node
|
||||
/// with the given id.
|
||||
pub fn set_scroll_offsets_for_node_with_external_scroll_id(
|
||||
pub fn set_scroll_offset_for_node_with_external_scroll_id(
|
||||
&mut self,
|
||||
external_scroll_id: ExternalScrollId,
|
||||
offset: LayoutVector2D,
|
||||
|
@ -353,6 +355,29 @@ impl ScrollTree {
|
|||
_ => None,
|
||||
})
|
||||
}
|
||||
|
||||
/// Given a set of all scroll offsets coming from the Servo renderer, update all of the offsets
|
||||
/// for nodes that actually exist in this tree.
|
||||
pub fn set_all_scroll_offsets(&mut self, offsets: &HashMap<ExternalScrollId, LayoutVector2D>) {
|
||||
for node in self.nodes.iter_mut() {
|
||||
if let SpatialTreeNodeInfo::Scroll(ref mut scroll_info) = node.info {
|
||||
if let Some(offset) = offsets.get(&scroll_info.external_id) {
|
||||
scroll_info.offset = *offset;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Collect all of the scroll offsets of the scrolling nodes of this tree into a
|
||||
/// [`HashMap`] which can be applied to another tree.
|
||||
pub fn scroll_offsets(&self) -> HashMap<ExternalScrollId, LayoutVector2D> {
|
||||
HashMap::from_iter(self.nodes.iter().filter_map(|node| match node.info {
|
||||
SpatialTreeNodeInfo::Scroll(ref scroll_info) => {
|
||||
Some((scroll_info.external_id, scroll_info.offset))
|
||||
},
|
||||
_ => None,
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
/// A data structure which stores compositor-side information about
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue