mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
libservo|compositor: Have scroll offset directionality match that of WebRender and the web (#37752)
Previously, our Servo-specific spatial tree scroll offsets were opposite to that of WebRender and also the web platform. This is due to the fact, likely, that `winit` wheel directionality is also flipped. This change has both the Servo spatial tree and the API take offsets that are consistent with the web. Any possible changes to the meaning of wheel directionality will be handled in a followup change. This is a breaking change to the Servo API. Testing: This change updates unit tests. Signed-off-by: Martin Robinson <mrobinson@igalia.com> Co-authored-by: Oriol Brufau <obrufau@igalia.com>
This commit is contained in:
parent
d33d057763
commit
89bfa26f00
14 changed files with 54 additions and 132 deletions
|
@ -130,11 +130,11 @@ impl ScrollableNodeInfo {
|
|||
let original_layer_scroll_offset = self.offset;
|
||||
|
||||
if scrollable_size.width > 0. && self.scroll_sensitivity.x.contains(context) {
|
||||
self.offset.x = new_offset.x.min(0.0).max(-scrollable_size.width);
|
||||
self.offset.x = new_offset.x.clamp(0.0, scrollable_size.width);
|
||||
}
|
||||
|
||||
if scrollable_size.height > 0. && self.scroll_sensitivity.y.contains(context) {
|
||||
self.offset.y = new_offset.y.min(0.0).max(-scrollable_size.height);
|
||||
self.offset.y = new_offset.y.clamp(0.0, scrollable_size.height);
|
||||
}
|
||||
|
||||
if self.offset != original_layer_scroll_offset {
|
||||
|
@ -158,7 +158,7 @@ impl ScrollableNodeInfo {
|
|||
let delta = match scroll_location {
|
||||
ScrollLocation::Delta(delta) => delta,
|
||||
ScrollLocation::Start => {
|
||||
if self.offset.y.round() >= 0.0 {
|
||||
if self.offset.y.round() <= 0.0 {
|
||||
// Nothing to do on this layer.
|
||||
return None;
|
||||
}
|
||||
|
@ -167,8 +167,8 @@ impl ScrollableNodeInfo {
|
|||
return Some(self.offset);
|
||||
},
|
||||
ScrollLocation::End => {
|
||||
let end_pos = -self.scrollable_size().height;
|
||||
if self.offset.y.round() <= end_pos {
|
||||
let end_pos = self.scrollable_size().height;
|
||||
if self.offset.y.round() >= end_pos {
|
||||
// Nothing to do on this layer.
|
||||
return None;
|
||||
}
|
||||
|
@ -231,20 +231,9 @@ impl ScrollTreeNode {
|
|||
|
||||
/// Set the offset for this node, returns false if this was a
|
||||
/// non-scrolling node for which you cannot set the offset.
|
||||
pub fn set_offset(&mut self, new_offset: LayoutVector2D) -> bool {
|
||||
match self.info {
|
||||
SpatialTreeNodeInfo::Scroll(ref mut info) => {
|
||||
let scrollable_size = info.scrollable_size();
|
||||
if scrollable_size.width > 0. {
|
||||
info.offset.x = (new_offset.x).min(0.0).max(-scrollable_size.width);
|
||||
}
|
||||
|
||||
if scrollable_size.height > 0. {
|
||||
info.offset.y = (new_offset.y).min(0.0).max(-scrollable_size.height);
|
||||
}
|
||||
true
|
||||
},
|
||||
_ => false,
|
||||
pub fn set_offset(&mut self, new_offset: LayoutVector2D) {
|
||||
if let SpatialTreeNodeInfo::Scroll(ref mut info) = self.info {
|
||||
info.scroll_to_offset(new_offset, ScrollType::Script);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -46,11 +46,11 @@ fn test_scroll_tree_simple_scroll() {
|
|||
let (scrolled_id, offset) = scroll_tree
|
||||
.scroll_node_or_ancestor(
|
||||
&id,
|
||||
ScrollLocation::Delta(LayoutVector2D::new(-20.0, -40.0)),
|
||||
ScrollLocation::Delta(LayoutVector2D::new(20.0, 40.0)),
|
||||
ScrollType::Script,
|
||||
)
|
||||
.unwrap();
|
||||
let expected_offset = LayoutVector2D::new(-20.0, -40.0);
|
||||
let expected_offset = LayoutVector2D::new(20.0, 40.0);
|
||||
assert_eq!(scrolled_id, ExternalScrollId(0, pipeline_id));
|
||||
assert_eq!(offset, expected_offset);
|
||||
assert_eq!(scroll_tree.get_node(&id).offset(), Some(expected_offset));
|
||||
|
@ -58,7 +58,7 @@ fn test_scroll_tree_simple_scroll() {
|
|||
let (scrolled_id, offset) = scroll_tree
|
||||
.scroll_node_or_ancestor(
|
||||
&id,
|
||||
ScrollLocation::Delta(LayoutVector2D::new(20.0, 40.0)),
|
||||
ScrollLocation::Delta(LayoutVector2D::new(-20.0, -40.0)),
|
||||
ScrollType::Script,
|
||||
)
|
||||
.unwrap();
|
||||
|
@ -67,10 +67,10 @@ fn test_scroll_tree_simple_scroll() {
|
|||
assert_eq!(offset, expected_offset);
|
||||
assert_eq!(scroll_tree.get_node(&id).offset(), Some(expected_offset));
|
||||
|
||||
// Scroll offsets must be negative.
|
||||
// Scroll offsets must be positive.
|
||||
let result = scroll_tree.scroll_node_or_ancestor(
|
||||
&id,
|
||||
ScrollLocation::Delta(LayoutVector2D::new(20.0, 40.0)),
|
||||
ScrollLocation::Delta(LayoutVector2D::new(-20.0, -40.0)),
|
||||
ScrollType::Script,
|
||||
);
|
||||
assert!(result.is_none());
|
||||
|
@ -99,11 +99,11 @@ fn test_scroll_tree_simple_scroll_chaining() {
|
|||
let (scrolled_id, offset) = scroll_tree
|
||||
.scroll_node_or_ancestor(
|
||||
&unscrollable_child_id,
|
||||
ScrollLocation::Delta(LayoutVector2D::new(-20.0, -40.0)),
|
||||
ScrollLocation::Delta(LayoutVector2D::new(20.0, 40.0)),
|
||||
ScrollType::Script,
|
||||
)
|
||||
.unwrap();
|
||||
let expected_offset = LayoutVector2D::new(-20.0, -40.0);
|
||||
let expected_offset = LayoutVector2D::new(20.0, 40.0);
|
||||
assert_eq!(scrolled_id, ExternalScrollId(0, pipeline_id));
|
||||
assert_eq!(offset, expected_offset);
|
||||
assert_eq!(
|
||||
|
@ -114,11 +114,11 @@ fn test_scroll_tree_simple_scroll_chaining() {
|
|||
let (scrolled_id, offset) = scroll_tree
|
||||
.scroll_node_or_ancestor(
|
||||
&unscrollable_child_id,
|
||||
ScrollLocation::Delta(LayoutVector2D::new(-10.0, -15.0)),
|
||||
ScrollLocation::Delta(LayoutVector2D::new(10.0, 15.0)),
|
||||
ScrollType::Script,
|
||||
)
|
||||
.unwrap();
|
||||
let expected_offset = LayoutVector2D::new(-30.0, -55.0);
|
||||
let expected_offset = LayoutVector2D::new(30.0, 55.0);
|
||||
assert_eq!(scrolled_id, ExternalScrollId(0, pipeline_id));
|
||||
assert_eq!(offset, expected_offset);
|
||||
assert_eq!(
|
||||
|
@ -140,7 +140,7 @@ fn test_scroll_tree_chain_when_at_extent() {
|
|||
.scroll_node_or_ancestor(&child_id, ScrollLocation::End, ScrollType::Script)
|
||||
.unwrap();
|
||||
|
||||
let expected_offset = LayoutVector2D::new(0.0, -100.0);
|
||||
let expected_offset = LayoutVector2D::new(0.0, 100.0);
|
||||
assert_eq!(scrolled_id, ExternalScrollId(1, pipeline_id));
|
||||
assert_eq!(offset, expected_offset);
|
||||
assert_eq!(
|
||||
|
@ -153,11 +153,11 @@ fn test_scroll_tree_chain_when_at_extent() {
|
|||
let (scrolled_id, offset) = scroll_tree
|
||||
.scroll_node_or_ancestor(
|
||||
&child_id,
|
||||
ScrollLocation::Delta(LayoutVector2D::new(0.0, -10.0)),
|
||||
ScrollLocation::Delta(LayoutVector2D::new(0.0, 10.0)),
|
||||
ScrollType::Script,
|
||||
)
|
||||
.unwrap();
|
||||
let expected_offset = LayoutVector2D::new(0.0, -10.0);
|
||||
let expected_offset = LayoutVector2D::new(0.0, 10.0);
|
||||
assert_eq!(scrolled_id, ExternalScrollId(0, pipeline_id));
|
||||
assert_eq!(offset, expected_offset);
|
||||
assert_eq!(
|
||||
|
@ -187,11 +187,11 @@ fn test_scroll_tree_chain_through_overflow_hidden() {
|
|||
let (scrolled_id, offset) = scroll_tree
|
||||
.scroll_node_or_ancestor(
|
||||
&overflow_hidden_id,
|
||||
ScrollLocation::Delta(LayoutVector2D::new(-20.0, -40.0)),
|
||||
ScrollLocation::Delta(LayoutVector2D::new(20.0, 40.0)),
|
||||
ScrollType::InputEvents,
|
||||
)
|
||||
.unwrap();
|
||||
let expected_offset = LayoutVector2D::new(-20.0, -40.0);
|
||||
let expected_offset = LayoutVector2D::new(20.0, 40.0);
|
||||
assert_eq!(scrolled_id, ExternalScrollId(0, pipeline_id));
|
||||
assert_eq!(offset, expected_offset);
|
||||
assert_eq!(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue