diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 8123c2b86e2..381369012be 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -693,28 +693,26 @@ impl IOCompositor { ); }, - CompositorMsg::WebDriverWheelScrollEvent( - webview_id, - x, - y, - delta_x, - delta_y, - message_id, - ) => { + CompositorMsg::WebDriverWheelScrollEvent(webview_id, x, y, dx, dy, message_id) => { let Some(webview_renderer) = self.webview_renderers.get_mut(webview_id) else { warn!("Handling input event for unknown webview: {webview_id}"); return; }; + // The sign of wheel delta value definition in uievent + // is inverted compared to `winit`s wheel delta. Hence, + // here we invert the sign to mimic wheel scroll + // implementation in `headed_window.rs`. + let dx = -dx; + let dy = -dy; let delta = WheelDelta { - x: delta_x, - y: delta_y, + x: dx, + y: dy, 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)); + let scroll_delta = dppx.transform_vector(Vector2D::new(dx as f32, dy as f32)); webview_renderer.dispatch_point_input_event( InputEvent::Wheel(WheelEvent::new(delta, point)) .with_webdriver_message_id(message_id), diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index f015bd1be2a..17f6f4ba6e4 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -2246,9 +2246,13 @@ impl Document { EventCancelable::Cancelable, Some(&self.window), 0i32, - Finite::wrap(event.delta.x), - Finite::wrap(event.delta.y), - Finite::wrap(event.delta.z), + // winit defines positive wheel delta values as revealing more content left/up. + // https://docs.rs/winit-gtk/latest/winit/event/enum.MouseScrollDelta.html + // This is the opposite of wheel delta in uievents + // https://w3c.github.io/uievents/#dom-wheeleventinit-deltaz + Finite::wrap(-event.delta.x), + Finite::wrap(-event.delta.y), + Finite::wrap(-event.delta.z), event.delta.mode as u32, can_gc, );