aboutsummaryrefslogtreecommitdiffstats
path: root/components/shared/script
diff options
context:
space:
mode:
authorMartin Robinson <mrobinson@igalia.com>2025-04-06 19:34:18 +0200
committerGitHub <noreply@github.com>2025-04-06 17:34:18 +0000
commit0caa271176d4670eb06bedd05cdffb24df08fc4f (patch)
tree9a0c3431dcf7ac31cfbdc1f801c9f4ef3dda6ae7 /components/shared/script
parente74a042efdf01ab2ff32e82e203bd1d954b599bd (diff)
downloadservo-0caa271176d4670eb06bedd05cdffb24df08fc4f.tar.gz
servo-0caa271176d4670eb06bedd05cdffb24df08fc4f.zip
`compositing`: Combine `webrender_traits` and `compositing_traits` (#36372)
These two traits both exposed different parts of the compositing API, but now that the compositor doesn't depend directly on `script` any longer and the `script_traits` crate has been split into the `constellation_traits` crate, this can be finally be cleaned up without causing circular dependencies. In addition, some unit tests for the `IOPCompositor`'s scroll node tree are also moved into `compositing_traits` as well. Testing: This just combines two crates, so no new tests are necessary. Fixes: #35984. Signed-off-by: Martin Robinson <mrobinson@igalia.com> Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Diffstat (limited to 'components/shared/script')
-rw-r--r--components/shared/script/Cargo.toml2
-rw-r--r--components/shared/script/lib.rs2
-rw-r--r--components/shared/script/tests/compositor.rs188
3 files changed, 2 insertions, 190 deletions
diff --git a/components/shared/script/Cargo.toml b/components/shared/script/Cargo.toml
index 49efbadc165..0d3690188fe 100644
--- a/components/shared/script/Cargo.toml
+++ b/components/shared/script/Cargo.toml
@@ -20,6 +20,7 @@ background_hang_monitor_api = { workspace = true }
base = { workspace = true }
bluetooth_traits = { workspace = true, optional = true }
canvas_traits = { workspace = true }
+compositing_traits = { workspace = true }
constellation_traits = { workspace = true }
crossbeam-channel = { workspace = true }
devtools_traits = { workspace = true }
@@ -42,5 +43,4 @@ stylo_atoms = { workspace = true }
stylo_traits = { workspace = true }
webgpu_traits = { workspace = true, optional = true }
webrender_api = { workspace = true }
-webrender_traits = { workspace = true }
webxr-api = { workspace = true, features = ["ipc"] }
diff --git a/components/shared/script/lib.rs b/components/shared/script/lib.rs
index 1a35f4f7486..5ee143b3cdd 100644
--- a/components/shared/script/lib.rs
+++ b/components/shared/script/lib.rs
@@ -18,6 +18,7 @@ use base::id::{BrowsingContextId, HistoryStateId, PipelineId, PipelineNamespaceI
#[cfg(feature = "bluetooth")]
use bluetooth_traits::BluetoothRequest;
use canvas_traits::webgl::WebGLPipeline;
+use compositing_traits::CrossProcessCompositorApi;
use constellation_traits::{
AnimationTickType, LoadData, NavigationHistoryBehavior, ScriptToConstellationChan, ScrollState,
StructuredSerializedData, WindowSizeType,
@@ -48,7 +49,6 @@ use stylo_atoms::Atom;
use webgpu_traits::WebGPUMsg;
use webrender_api::units::DevicePixel;
use webrender_api::{DocumentId, ImageKey};
-use webrender_traits::CrossProcessCompositorApi;
/// The initial data required to create a new layout attached to an existing script thread.
#[derive(Debug, Deserialize, Serialize)]
diff --git a/components/shared/script/tests/compositor.rs b/components/shared/script/tests/compositor.rs
deleted file mode 100644
index fb8410cb282..00000000000
--- a/components/shared/script/tests/compositor.rs
+++ /dev/null
@@ -1,188 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-
-use base::id::ScrollTreeNodeId;
-use euclid::Size2D;
-use webrender_api::units::LayoutVector2D;
-use webrender_api::{ExternalScrollId, PipelineId, ScrollLocation, SpatialId};
-use webrender_traits::display_list::{
- AxesScrollSensitivity, ScrollSensitivity, ScrollTree, ScrollableNodeInfo,
-};
-
-fn add_mock_scroll_node(tree: &mut ScrollTree) -> ScrollTreeNodeId {
- let pipeline_id = PipelineId(0, 0);
- let num_nodes = tree.nodes.len();
- let parent = if num_nodes > 0 {
- Some(ScrollTreeNodeId {
- index: num_nodes - 1,
- spatial_id: SpatialId::new(num_nodes - 1, pipeline_id),
- })
- } else {
- None
- };
-
- tree.add_scroll_tree_node(
- parent.as_ref(),
- SpatialId::new(num_nodes, pipeline_id),
- Some(ScrollableNodeInfo {
- external_id: ExternalScrollId(num_nodes as u64, pipeline_id),
- scrollable_size: Size2D::new(100.0, 100.0),
- scroll_sensitivity: AxesScrollSensitivity {
- x: ScrollSensitivity::ScriptAndInputEvents,
- y: ScrollSensitivity::ScriptAndInputEvents,
- },
- offset: LayoutVector2D::zero(),
- }),
- )
-}
-
-#[test]
-fn test_scroll_tree_simple_scroll() {
- let mut scroll_tree = ScrollTree::default();
- let pipeline_id = PipelineId(0, 0);
- let id = add_mock_scroll_node(&mut scroll_tree);
-
- let (scrolled_id, offset) = scroll_tree
- .scroll_node_or_ancestor(
- &id,
- ScrollLocation::Delta(LayoutVector2D::new(-20.0, -40.0)),
- )
- .unwrap();
- 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));
-
- let (scrolled_id, offset) = scroll_tree
- .scroll_node_or_ancestor(&id, ScrollLocation::Delta(LayoutVector2D::new(20.0, 40.0)))
- .unwrap();
- let expected_offset = LayoutVector2D::new(0.0, 0.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));
-
- // Scroll offsets must be negative.
- let result = scroll_tree
- .scroll_node_or_ancestor(&id, ScrollLocation::Delta(LayoutVector2D::new(20.0, 40.0)));
- assert!(result.is_none());
- assert_eq!(
- scroll_tree.get_node(&id).offset(),
- Some(LayoutVector2D::new(0.0, 0.0))
- );
-}
-
-#[test]
-fn test_scroll_tree_simple_scroll_chaining() {
- let mut scroll_tree = ScrollTree::default();
-
- let pipeline_id = PipelineId(0, 0);
- let parent_id = add_mock_scroll_node(&mut scroll_tree);
- let unscrollable_child_id =
- scroll_tree.add_scroll_tree_node(Some(&parent_id), SpatialId::new(1, pipeline_id), None);
-
- let (scrolled_id, offset) = scroll_tree
- .scroll_node_or_ancestor(
- &unscrollable_child_id,
- ScrollLocation::Delta(LayoutVector2D::new(-20.0, -40.0)),
- )
- .unwrap();
- 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(&parent_id).offset(),
- Some(expected_offset)
- );
-
- let (scrolled_id, offset) = scroll_tree
- .scroll_node_or_ancestor(
- &unscrollable_child_id,
- ScrollLocation::Delta(LayoutVector2D::new(-10.0, -15.0)),
- )
- .unwrap();
- let expected_offset = LayoutVector2D::new(-30.0, -55.0);
- assert_eq!(scrolled_id, ExternalScrollId(0, pipeline_id));
- assert_eq!(offset, expected_offset);
- assert_eq!(
- scroll_tree.get_node(&parent_id).offset(),
- Some(expected_offset)
- );
- assert_eq!(scroll_tree.get_node(&unscrollable_child_id).offset(), None);
-}
-
-#[test]
-fn test_scroll_tree_chain_when_at_extent() {
- let mut scroll_tree = ScrollTree::default();
-
- let pipeline_id = PipelineId(0, 0);
- let parent_id = add_mock_scroll_node(&mut scroll_tree);
- let child_id = add_mock_scroll_node(&mut scroll_tree);
-
- let (scrolled_id, offset) = scroll_tree
- .scroll_node_or_ancestor(&child_id, ScrollLocation::End)
- .unwrap();
-
- let expected_offset = LayoutVector2D::new(0.0, -100.0);
- assert_eq!(scrolled_id, ExternalScrollId(1, pipeline_id));
- assert_eq!(offset, expected_offset);
- assert_eq!(
- scroll_tree.get_node(&child_id).offset(),
- Some(expected_offset)
- );
-
- // The parent will have scrolled because the child is already at the extent
- // of its scroll area in the y axis.
- let (scrolled_id, offset) = scroll_tree
- .scroll_node_or_ancestor(
- &child_id,
- ScrollLocation::Delta(LayoutVector2D::new(0.0, -10.0)),
- )
- .unwrap();
- let expected_offset = LayoutVector2D::new(0.0, -10.0);
- assert_eq!(scrolled_id, ExternalScrollId(0, pipeline_id));
- assert_eq!(offset, expected_offset);
- assert_eq!(
- scroll_tree.get_node(&parent_id).offset(),
- Some(expected_offset)
- );
-}
-
-#[test]
-fn test_scroll_tree_chain_through_overflow_hidden() {
- let mut scroll_tree = ScrollTree::default();
-
- // Create a tree with a scrollable leaf, but make its `scroll_sensitivity`
- // reflect `overflow: hidden` ie not responsive to non-script scroll events.
- let pipeline_id = PipelineId(0, 0);
- let parent_id = add_mock_scroll_node(&mut scroll_tree);
- let overflow_hidden_id = add_mock_scroll_node(&mut scroll_tree);
- scroll_tree
- .get_node_mut(&overflow_hidden_id)
- .scroll_info
- .as_mut()
- .map(|info| {
- info.scroll_sensitivity = AxesScrollSensitivity {
- x: ScrollSensitivity::Script,
- y: ScrollSensitivity::Script,
- };
- });
-
- let (scrolled_id, offset) = scroll_tree
- .scroll_node_or_ancestor(
- &overflow_hidden_id,
- ScrollLocation::Delta(LayoutVector2D::new(-20.0, -40.0)),
- )
- .unwrap();
- 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(&parent_id).offset(),
- Some(expected_offset)
- );
- assert_eq!(
- scroll_tree.get_node(&overflow_hidden_id).offset(),
- Some(LayoutVector2D::new(0.0, 0.0))
- );
-}