script: Reverse wheel event delta sign to match specification-defined behavior (#37461)

Fix wheel event, either dispatched from window or webdriver:
- Positive deltaY means scrolling down, negative deltaY means scrolling
up
- Positive deltaX means scrolling right, negative deltaX means scrolling
left

Tests: Many scrolling interaction test will depend on this.

Signed-off-by: PotatoCP <kenzieradityatirtarahardja18@gmail.com>
This commit is contained in:
Kenzie Raditya Tirtarahardja 2025-06-19 15:45:10 +08:00 committed by GitHub
parent 07ecf34e64
commit 55730e99df
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 17 additions and 15 deletions

View file

@ -693,28 +693,26 @@ impl IOCompositor {
); );
}, },
CompositorMsg::WebDriverWheelScrollEvent( CompositorMsg::WebDriverWheelScrollEvent(webview_id, x, y, dx, dy, message_id) => {
webview_id,
x,
y,
delta_x,
delta_y,
message_id,
) => {
let Some(webview_renderer) = self.webview_renderers.get_mut(webview_id) else { let Some(webview_renderer) = self.webview_renderers.get_mut(webview_id) else {
warn!("Handling input event for unknown webview: {webview_id}"); warn!("Handling input event for unknown webview: {webview_id}");
return; 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 { let delta = WheelDelta {
x: delta_x, x: dx,
y: delta_y, y: dy,
z: 0.0, z: 0.0,
mode: WheelMode::DeltaPixel, mode: WheelMode::DeltaPixel,
}; };
let dppx = webview_renderer.device_pixels_per_page_pixel(); let dppx = webview_renderer.device_pixels_per_page_pixel();
let point = dppx.transform_point(Point2D::new(x, y)); let point = dppx.transform_point(Point2D::new(x, y));
let scroll_delta = let scroll_delta = dppx.transform_vector(Vector2D::new(dx as f32, dy as f32));
dppx.transform_vector(Vector2D::new(delta_x as f32, delta_y as f32));
webview_renderer.dispatch_point_input_event( webview_renderer.dispatch_point_input_event(
InputEvent::Wheel(WheelEvent::new(delta, point)) InputEvent::Wheel(WheelEvent::new(delta, point))
.with_webdriver_message_id(message_id), .with_webdriver_message_id(message_id),

View file

@ -2246,9 +2246,13 @@ impl Document {
EventCancelable::Cancelable, EventCancelable::Cancelable,
Some(&self.window), Some(&self.window),
0i32, 0i32,
Finite::wrap(event.delta.x), // winit defines positive wheel delta values as revealing more content left/up.
Finite::wrap(event.delta.y), // https://docs.rs/winit-gtk/latest/winit/event/enum.MouseScrollDelta.html
Finite::wrap(event.delta.z), // 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, event.delta.mode as u32,
can_gc, can_gc,
); );