servoshell: Use DeviceIndependentPixel for WebDriver Rect related requests (#37893)

[Spec](https://w3c.github.io/webdriver/#set-window-rect) expects CSS
pixel for input and output. Previously, we use Device Pixel for them
instead.

Testing: Tested manually with different screen DPR and compared with
other browsers.
Fixes: Task 4 of https://github.com/servo/servo/issues/37804

---------

Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
This commit is contained in:
Euclid Ye 2025-07-09 11:56:27 +08:00 committed by GitHub
parent 0db02702e7
commit 3526b7e86e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 66 additions and 269 deletions

View file

@ -20,9 +20,11 @@ use log::{info, trace, warn};
use net::protocols::ProtocolRegistry;
use servo::config::opts::Opts;
use servo::config::prefs::Preferences;
use servo::servo_geometry::DeviceIndependentIntSize;
use servo::servo_url::ServoUrl;
use servo::user_content_manager::{UserContentManager, UserScript};
use servo::webrender_api::ScrollLocation;
use servo::webrender_api::units::DeviceIntSize;
use servo::{
EventLoopWaker, InputEvent, KeyboardEvent, MouseButtonEvent, MouseMoveEvent,
WebDriverCommandMsg, WheelDelta, WheelEvent, WheelMode,
@ -403,13 +405,31 @@ impl App {
.values()
.next()
.expect("Should have at least one window in servoshell");
let scale = window.hidpi_scale_factor().get() as f64;
// TODO: Find a universal way to convert.
// See https://github.com/servo/servo/issues/37937
let requested_physical_size = DeviceIntSize::new(
(requested_size.width as f64 * scale).round() as i32,
(requested_size.height as f64 * scale).round() as i32,
);
// When None is returned, it means that the request went to the display system,
// and the actual size will be delivered later with the WindowEvent::Resized.
let returned_size = window.request_resize(&webview, requested_size);
let returned_size = window.request_resize(&webview, requested_physical_size);
// TODO: Handle None case. For now, we assume always succeed.
// In reality, the request may exceed available screen size.
if let Err(error) = size_sender.send(returned_size.unwrap_or(requested_size)) {
// TODO: Find a universal way to convert.
// See https://github.com/servo/servo/issues/37937
if let Err(error) = size_sender.send(
returned_size
.map(|size| {
DeviceIndependentIntSize::new(
(size.width as f64 / scale).round() as i32,
(size.height as f64 / scale).round() as i32,
)
})
.unwrap_or(requested_size),
) {
warn!("Failed to send window size: {error}");
}
},