mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
layout: Implement overflow scroll support for different axes (#35414)
* layout: Add AxesScrollSensitivity to enable control of scroll in axis Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com> * layout_2013: Be compatible with AxesScrollSensitivity Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com> * layout: update struct AxesScrollSensitivity to euclid::Vector2D Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com> * display_list: implement From<Overflow> for ScrollSensitivity Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com> * layout: simplify and reuse scroll related logic Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com> * layout_2013: simplify and reuse scroll related logic Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com> * layout, layout_2013: revert AxesScrollSensitivity to pair struct Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com> * layout: Reimport ComputedOverflow as #35103 depends on it Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com> * layout: Add AxesOverflow to replace PhysicalVec Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com> * layout: implement scroll of viewport for different axes Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com> * layout: explicitly handle overflow match Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com> * Update components/shared/webrender/Cargo.toml Co-authored-by: Martin Robinson <mrobinson@igalia.com> Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com> --------- Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com> Co-authored-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
parent
9b3e23633d
commit
03fc54e682
12 changed files with 111 additions and 63 deletions
|
@ -13,7 +13,7 @@ use style::dom::OpaqueNode;
|
|||
use style::properties::ComputedValues;
|
||||
use style::values::computed::Overflow;
|
||||
use style_traits::CSSPixel;
|
||||
use webrender_traits::display_list::ScrollSensitivity;
|
||||
use webrender_traits::display_list::AxesScrollSensitivity;
|
||||
|
||||
use crate::cell::ArcRefCell;
|
||||
use crate::context::LayoutContext;
|
||||
|
@ -40,8 +40,8 @@ pub struct BoxTree {
|
|||
/// <https://drafts.csswg.org/css-backgrounds/#special-backgrounds>
|
||||
canvas_background: CanvasBackground,
|
||||
|
||||
/// Whether or not the root element should be sensitive to scrolling input events.
|
||||
sensitive_to_scroll_input: bool,
|
||||
/// Whether or not the viewport should be sensitive to scrolling input events in two axes
|
||||
scroll_sensitivity: AxesScrollSensitivity,
|
||||
}
|
||||
|
||||
impl BoxTree {
|
||||
|
@ -54,7 +54,7 @@ impl BoxTree {
|
|||
// Zero box for `:root { display: none }`, one for the root element otherwise.
|
||||
assert!(boxes.len() <= 1);
|
||||
|
||||
// From https://drafts.csswg.org/css-overflow/#propdef-overflow:
|
||||
// From https://drafts.csswg.org/css-overflow/#overflow-propagation:
|
||||
// > UAs must apply the overflow-* values set on the root element to the viewport when the
|
||||
// > root element’s display value is not none. However, when the root element is an [HTML]
|
||||
// > html element (including XML syntax for HTML) whose overflow value is visible (in both
|
||||
|
@ -62,12 +62,13 @@ impl BoxTree {
|
|||
// > none, user agents must instead apply the overflow-* values of the first such child
|
||||
// > element to the viewport. The element from which the value is propagated must then have a
|
||||
// > used overflow value of visible.
|
||||
//
|
||||
// TODO: This should handle when different overflow is set multiple axes, which requires the
|
||||
// compositor scroll tree to allow setting a value per axis.
|
||||
let root_style = root_element.style(context);
|
||||
let mut root_overflow = root_style.effective_overflow().y;
|
||||
if root_overflow == Overflow::Visible && !root_style.get_box().display.is_none() {
|
||||
let root_overflow = root_style.effective_overflow();
|
||||
let mut viewport_overflow = root_overflow;
|
||||
if root_overflow.x == Overflow::Visible &&
|
||||
root_overflow.y == Overflow::Visible &&
|
||||
!root_style.get_box().display.is_none()
|
||||
{
|
||||
for child in iter_child_nodes(root_element) {
|
||||
if !child
|
||||
.to_threadsafe()
|
||||
|
@ -79,7 +80,7 @@ impl BoxTree {
|
|||
|
||||
let style = child.style(context);
|
||||
if !style.get_box().display.is_none() {
|
||||
root_overflow = style.effective_overflow().y;
|
||||
viewport_overflow = style.effective_overflow();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -93,7 +94,10 @@ impl BoxTree {
|
|||
contains_floats,
|
||||
},
|
||||
canvas_background: CanvasBackground::for_root_element(context, root_element),
|
||||
sensitive_to_scroll_input: root_overflow != Overflow::Hidden,
|
||||
scroll_sensitivity: AxesScrollSensitivity {
|
||||
x: viewport_overflow.x.to_scrollable().into(),
|
||||
y: viewport_overflow.y.to_scrollable().into(),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -392,18 +396,12 @@ impl BoxTree {
|
|||
acc.union(&child_overflow)
|
||||
});
|
||||
|
||||
let root_scroll_sensitivity = if self.sensitive_to_scroll_input {
|
||||
ScrollSensitivity::ScriptAndInputEvents
|
||||
} else {
|
||||
ScrollSensitivity::Script
|
||||
};
|
||||
|
||||
FragmentTree {
|
||||
root_fragments,
|
||||
scrollable_overflow,
|
||||
initial_containing_block: physical_containing_block,
|
||||
canvas_background: self.canvas_background.clone(),
|
||||
root_scroll_sensitivity,
|
||||
root_scroll_sensitivity: self.scroll_sensitivity,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue