aboutsummaryrefslogtreecommitdiffstats
path: root/components/compositing
diff options
context:
space:
mode:
Diffstat (limited to 'components/compositing')
-rw-r--r--components/compositing/compositor.rs24
-rw-r--r--components/compositing/tracing.rs1
-rw-r--r--components/compositing/webview_renderer.rs16
3 files changed, 39 insertions, 2 deletions
diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs
index 41286a2760a..b1669277ba1 100644
--- a/components/compositing/compositor.rs
+++ b/components/compositing/compositor.rs
@@ -26,9 +26,9 @@ use crossbeam_channel::{Receiver, Sender};
use dpi::PhysicalSize;
use embedder_traits::{
CompositorHitTestResult, Cursor, InputEvent, MouseButtonEvent, MouseMoveEvent, ShutdownState,
- TouchEventType, UntrustedNodeAddress, ViewportDetails,
+ TouchEventType, UntrustedNodeAddress, ViewportDetails, WheelDelta, WheelEvent, WheelMode,
};
-use euclid::{Point2D, Rect, Scale, Size2D, Transform3D};
+use euclid::{Point2D, Rect, Scale, Size2D, Transform3D, Vector2D};
use fnv::FnvHashMap;
use ipc_channel::ipc::{self, IpcSharedMemory};
use libc::c_void;
@@ -646,6 +646,26 @@ impl IOCompositor {
.dispatch_input_event(InputEvent::MouseMove(MouseMoveEvent { point }));
},
+ CompositorMsg::WebDriverWheelScrollEvent(webview_id, x, y, delta_x, delta_y) => {
+ let Some(webview_renderer) = self.webview_renderers.get_mut(webview_id) else {
+ warn!("Handling input event for unknown webview: {webview_id}");
+ return;
+ };
+ let delta = WheelDelta {
+ x: delta_x,
+ y: delta_y,
+ z: 0.0,
+ mode: WheelMode::DeltaPixel,
+ };
+ let dppx = webview_renderer.device_pixels_per_page_pixel();
+ let point = dppx.transform_point(Point2D::new(x, y));
+ let scroll_delta =
+ dppx.transform_vector(Vector2D::new(delta_x as f32, delta_y as f32));
+ webview_renderer
+ .dispatch_input_event(InputEvent::Wheel(WheelEvent { delta, point }));
+ webview_renderer.on_webdriver_wheel_action(scroll_delta, point);
+ },
+
CompositorMsg::SendInitialTransaction(pipeline) => {
let mut txn = Transaction::new();
txn.set_display_list(WebRenderEpoch(0), (pipeline, Default::default()));
diff --git a/components/compositing/tracing.rs b/components/compositing/tracing.rs
index ae7338106d0..a8bb8b42bb8 100644
--- a/components/compositing/tracing.rs
+++ b/components/compositing/tracing.rs
@@ -42,6 +42,7 @@ mod from_constellation {
Self::LoadComplete(..) => target!("LoadComplete"),
Self::WebDriverMouseButtonEvent(..) => target!("WebDriverMouseButtonEvent"),
Self::WebDriverMouseMoveEvent(..) => target!("WebDriverMouseMoveEvent"),
+ Self::WebDriverWheelScrollEvent(..) => target!("WebDriverWheelScrollEvent"),
Self::SendInitialTransaction(..) => target!("SendInitialTransaction"),
Self::SendScrollNode(..) => target!("SendScrollNode"),
Self::SendDisplayList { .. } => target!("SendDisplayList"),
diff --git a/components/compositing/webview_renderer.rs b/components/compositing/webview_renderer.rs
index 614ef0ff4c3..f76dc68013d 100644
--- a/components/compositing/webview_renderer.rs
+++ b/components/compositing/webview_renderer.rs
@@ -726,6 +726,22 @@ impl WebViewRenderer {
}));
}
+ /// Push scroll pending event when receiving wheel action from webdriver
+ pub(crate) fn on_webdriver_wheel_action(
+ &mut self,
+ scroll_delta: Vector2D<f32, DevicePixel>,
+ point: Point2D<f32, DevicePixel>,
+ ) {
+ if self.global.borrow().shutdown_state() != ShutdownState::NotShuttingDown {
+ return;
+ }
+
+ let scroll_location =
+ ScrollLocation::Delta(LayoutVector2D::from_untyped(scroll_delta.to_untyped()));
+ let cursor = DeviceIntPoint::new(point.x as i32, point.y as i32);
+ self.on_scroll_window_event(scroll_location, cursor)
+ }
+
pub(crate) fn process_pending_scroll_events(&mut self, compositor: &mut IOCompositor) {
if self.pending_scroll_zoom_events.is_empty() {
return;