mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
servoshell: Allow overriding screen resolution with a command-line argument (#34038)
There is a command-line argument to override the default window size, but not one for overriding the default screen resolution. This is important for testing pages that use screen size to have different behavior. In addition to adding the new option this change: - Renames the `--resolution` command-line argument to `--window-size` to remove ambiguity with the `--screen-size` argument. - Passes the screen size as device independent (device pixels scaled by HiDPI factor) to Servo internals. Not only it make it simpler to pass the `--window-size` override, it makes more sense. Different screens can have different HiDPI factors and these can be different from the scale of the window. This makes the screen HiDPI factor totally independent of the one that Servo uses for the window. Signed-off-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
parent
d877962ee8
commit
850e59f98e
14 changed files with 181 additions and 115 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -8304,6 +8304,7 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
"serde",
|
"serde",
|
||||||
|
"servo_geometry",
|
||||||
"surfman",
|
"surfman",
|
||||||
"webrender_api",
|
"webrender_api",
|
||||||
]
|
]
|
||||||
|
|
|
@ -17,7 +17,7 @@ use script_traits::{
|
||||||
GamepadEvent, MediaSessionActionType, MouseButton, TouchEventType, TouchId, TraversalDirection,
|
GamepadEvent, MediaSessionActionType, MouseButton, TouchEventType, TouchId, TraversalDirection,
|
||||||
WheelDelta,
|
WheelDelta,
|
||||||
};
|
};
|
||||||
use servo_geometry::DeviceIndependentPixel;
|
use servo_geometry::{DeviceIndependentIntRect, DeviceIndependentIntSize, DeviceIndependentPixel};
|
||||||
use servo_url::ServoUrl;
|
use servo_url::ServoUrl;
|
||||||
use style_traits::DevicePixel;
|
use style_traits::DevicePixel;
|
||||||
use webrender_api::units::{DeviceIntPoint, DeviceIntRect, DeviceIntSize, DevicePoint, DeviceRect};
|
use webrender_api::units::{DeviceIntPoint, DeviceIntRect, DeviceIntSize, DevicePoint, DeviceRect};
|
||||||
|
@ -241,11 +241,11 @@ pub struct EmbedderCoordinates {
|
||||||
/// The pixel density of the display.
|
/// The pixel density of the display.
|
||||||
pub hidpi_factor: Scale<f32, DeviceIndependentPixel, DevicePixel>,
|
pub hidpi_factor: Scale<f32, DeviceIndependentPixel, DevicePixel>,
|
||||||
/// Size of the screen.
|
/// Size of the screen.
|
||||||
pub screen_size: DeviceIntSize,
|
pub screen_size: DeviceIndependentIntSize,
|
||||||
/// Size of the available screen space (screen without toolbars and docks).
|
/// Size of the available screen space (screen without toolbars and docks).
|
||||||
pub available_screen_size: DeviceIntSize,
|
pub available_screen_size: DeviceIndependentIntSize,
|
||||||
/// Position and size of the native window.
|
/// Position and size of the native window.
|
||||||
pub window_rect: DeviceIntRect,
|
pub window_rect: DeviceIndependentIntRect,
|
||||||
/// Size of the GL buffer in the window.
|
/// Size of the GL buffer in the window.
|
||||||
pub framebuffer: DeviceIntSize,
|
pub framebuffer: DeviceIntSize,
|
||||||
/// Coordinates of the document within the framebuffer.
|
/// Coordinates of the document within the framebuffer.
|
||||||
|
@ -278,23 +278,23 @@ impl EmbedderCoordinates {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use euclid::{Point2D, Scale, Size2D};
|
use euclid::{Box2D, Point2D, Scale, Size2D};
|
||||||
use webrender_api::units::DeviceIntRect;
|
use webrender_api::units::DeviceIntRect;
|
||||||
|
|
||||||
use super::EmbedderCoordinates;
|
use super::EmbedderCoordinates;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test() {
|
fn test() {
|
||||||
let pos = Point2D::zero();
|
let screen_size = Size2D::new(1080, 720);
|
||||||
let viewport = Size2D::new(800, 600);
|
let viewport = Box2D::from_origin_and_size(Point2D::zero(), Size2D::new(800, 600));
|
||||||
let screen = Size2D::new(1080, 720);
|
let window_rect = Box2D::from_origin_and_size(Point2D::zero(), Size2D::new(800, 600));
|
||||||
let coordinates = EmbedderCoordinates {
|
let coordinates = EmbedderCoordinates {
|
||||||
hidpi_factor: Scale::new(1.),
|
hidpi_factor: Scale::new(1.),
|
||||||
screen_size: screen,
|
screen_size,
|
||||||
available_screen_size: screen,
|
available_screen_size: screen_size,
|
||||||
window_rect: DeviceIntRect::from_origin_and_size(pos, viewport),
|
window_rect,
|
||||||
framebuffer: viewport,
|
framebuffer: viewport.size(),
|
||||||
viewport: DeviceIntRect::from_origin_and_size(pos, viewport),
|
viewport,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Check if viewport conversion is correct.
|
// Check if viewport conversion is correct.
|
||||||
|
|
|
@ -83,6 +83,10 @@ pub struct Opts {
|
||||||
/// The initial requested size of the window.
|
/// The initial requested size of the window.
|
||||||
pub initial_window_size: Size2D<u32, DeviceIndependentPixel>,
|
pub initial_window_size: Size2D<u32, DeviceIndependentPixel>,
|
||||||
|
|
||||||
|
/// An override for the screen resolution. This is useful for testing behavior on different screen sizes,
|
||||||
|
/// such as the screen of a mobile device.
|
||||||
|
pub screen_size_override: Option<Size2D<u32, DeviceIndependentPixel>>,
|
||||||
|
|
||||||
/// Whether we're running in multiprocess mode.
|
/// Whether we're running in multiprocess mode.
|
||||||
pub multiprocess: bool,
|
pub multiprocess: bool,
|
||||||
|
|
||||||
|
@ -410,6 +414,7 @@ pub fn default_opts() -> Opts {
|
||||||
devtools_server_enabled: false,
|
devtools_server_enabled: false,
|
||||||
webdriver_port: None,
|
webdriver_port: None,
|
||||||
initial_window_size: Size2D::new(1024, 740),
|
initial_window_size: Size2D::new(1024, 740),
|
||||||
|
screen_size_override: None,
|
||||||
multiprocess: false,
|
multiprocess: false,
|
||||||
background_hang_monitor: false,
|
background_hang_monitor: false,
|
||||||
random_pipeline_closure_probability: None,
|
random_pipeline_closure_probability: None,
|
||||||
|
@ -503,7 +508,18 @@ pub fn from_cmdline_args(mut opts: Options, args: &[String]) -> ArgumentParsingR
|
||||||
"Start remote WebDriver server on port",
|
"Start remote WebDriver server on port",
|
||||||
"7000",
|
"7000",
|
||||||
);
|
);
|
||||||
opts.optopt("", "resolution", "Set window resolution.", "1024x740");
|
opts.optopt(
|
||||||
|
"",
|
||||||
|
"window-size",
|
||||||
|
"Set the initial window size in logical (device independenrt) pixels",
|
||||||
|
"1024x740",
|
||||||
|
);
|
||||||
|
opts.optopt(
|
||||||
|
"",
|
||||||
|
"screen-size",
|
||||||
|
"Override the screen resolution in logical (device independent) pixels",
|
||||||
|
"1024x768",
|
||||||
|
);
|
||||||
opts.optflag("M", "multiprocess", "Run in multiprocess mode");
|
opts.optflag("M", "multiprocess", "Run in multiprocess mode");
|
||||||
opts.optflag("B", "bhm", "Background Hang Monitor enabled");
|
opts.optflag("B", "bhm", "Background Hang Monitor enabled");
|
||||||
opts.optflag("S", "sandbox", "Run in a sandbox if multiprocess");
|
opts.optflag("S", "sandbox", "Run in a sandbox if multiprocess");
|
||||||
|
@ -694,21 +710,33 @@ pub fn from_cmdline_args(mut opts: Options, args: &[String]) -> ArgumentParsingR
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
let initial_window_size = match opt_match.opt_str("resolution") {
|
let parse_resolution_string = |string: String| {
|
||||||
Some(res_string) => {
|
let components: Vec<u32> = string
|
||||||
let res: Vec<u32> = res_string
|
|
||||||
.split('x')
|
.split('x')
|
||||||
.map(|r| {
|
.map(|component| {
|
||||||
r.parse().unwrap_or_else(|err| {
|
component.parse().unwrap_or_else(|error| {
|
||||||
args_fail(&format!("Error parsing option: --resolution ({})", err))
|
args_fail(&format!("Error parsing resolution '{string}': {error}"));
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
Size2D::new(res[0], res[1])
|
Size2D::new(components[0], components[1])
|
||||||
},
|
|
||||||
None => Size2D::new(1024, 740),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let screen_size_override = opt_match
|
||||||
|
.opt_str("screen-size")
|
||||||
|
.map(parse_resolution_string);
|
||||||
|
|
||||||
|
// Make sure the default window size is not larger than any provided screen size.
|
||||||
|
let default_window_size = Size2D::new(1024, 740);
|
||||||
|
let default_window_size = screen_size_override
|
||||||
|
.map_or(default_window_size, |screen_size_override| {
|
||||||
|
default_window_size.min(screen_size_override)
|
||||||
|
});
|
||||||
|
|
||||||
|
let initial_window_size = opt_match
|
||||||
|
.opt_str("window-size")
|
||||||
|
.map_or(default_window_size, parse_resolution_string);
|
||||||
|
|
||||||
if opt_match.opt_present("M") {
|
if opt_match.opt_present("M") {
|
||||||
MULTIPROCESS.store(true, Ordering::SeqCst)
|
MULTIPROCESS.store(true, Ordering::SeqCst)
|
||||||
}
|
}
|
||||||
|
@ -753,6 +781,7 @@ pub fn from_cmdline_args(mut opts: Options, args: &[String]) -> ArgumentParsingR
|
||||||
devtools_server_enabled,
|
devtools_server_enabled,
|
||||||
webdriver_port,
|
webdriver_port,
|
||||||
initial_window_size,
|
initial_window_size,
|
||||||
|
screen_size_override,
|
||||||
multiprocess: opt_match.opt_present("M"),
|
multiprocess: opt_match.opt_present("M"),
|
||||||
background_hang_monitor: opt_match.opt_present("B"),
|
background_hang_monitor: opt_match.opt_present("B"),
|
||||||
sandbox: opt_match.opt_present("S"),
|
sandbox: opt_match.opt_present("S"),
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
use std::f32;
|
use std::f32;
|
||||||
|
|
||||||
use app_units::{Au, MAX_AU, MIN_AU};
|
use app_units::{Au, MAX_AU, MIN_AU};
|
||||||
use euclid::default::{Point2D, Rect, Size2D};
|
use euclid::default::{Point2D as UntypedPoint2D, Rect as UntypedRect, Size2D as UntypedSize2D};
|
||||||
use euclid::Length;
|
use euclid::{Box2D, Length, Point2D, SideOffsets2D, Size2D, Vector2D};
|
||||||
use malloc_size_of_derive::MallocSizeOf;
|
use malloc_size_of_derive::MallocSizeOf;
|
||||||
use webrender_api::units::{FramebufferPixel, LayoutPoint, LayoutRect, LayoutSize};
|
use webrender_api::units::{FramebufferPixel, LayoutPoint, LayoutRect, LayoutSize};
|
||||||
|
|
||||||
|
@ -30,6 +30,19 @@ pub type FramebufferUintLength = Length<u32, FramebufferPixel>;
|
||||||
#[derive(Clone, Copy, Debug, MallocSizeOf)]
|
#[derive(Clone, Copy, Debug, MallocSizeOf)]
|
||||||
pub enum DeviceIndependentPixel {}
|
pub enum DeviceIndependentPixel {}
|
||||||
|
|
||||||
|
pub type DeviceIndependentIntRect = Box2D<i32, DeviceIndependentPixel>;
|
||||||
|
pub type DeviceIndependentIntPoint = Point2D<i32, DeviceIndependentPixel>;
|
||||||
|
pub type DeviceIndependentIntSize = Size2D<i32, DeviceIndependentPixel>;
|
||||||
|
pub type DeviceIndependentIntLength = Length<i32, DeviceIndependentPixel>;
|
||||||
|
pub type DeviceIndependentIntSideOffsets = SideOffsets2D<i32, DeviceIndependentPixel>;
|
||||||
|
pub type DeviceIndependentIntVector2D = Vector2D<i32, DeviceIndependentPixel>;
|
||||||
|
|
||||||
|
pub type DeviceIndependentRect = Box2D<f32, DeviceIndependentPixel>;
|
||||||
|
pub type DeviceIndependentBox2D = Box2D<f32, DeviceIndependentPixel>;
|
||||||
|
pub type DeviceIndependentPoint = Point2D<f32, DeviceIndependentPixel>;
|
||||||
|
pub type DeviceIndependentVector2D = Vector2D<f32, DeviceIndependentPixel>;
|
||||||
|
pub type DeviceIndependentSize = Size2D<f32, DeviceIndependentPixel>;
|
||||||
|
|
||||||
// An Au is an "App Unit" and represents 1/60th of a CSS pixel. It was
|
// An Au is an "App Unit" and represents 1/60th of a CSS pixel. It was
|
||||||
// originally proposed in 2002 as a standard unit of measure in Gecko.
|
// originally proposed in 2002 as a standard unit of measure in Gecko.
|
||||||
// See https://bugzilla.mozilla.org/show_bug.cgi?id=177805 for more info.
|
// See https://bugzilla.mozilla.org/show_bug.cgi?id=177805 for more info.
|
||||||
|
@ -38,20 +51,20 @@ pub trait MaxRect {
|
||||||
fn max_rect() -> Self;
|
fn max_rect() -> Self;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MaxRect for Rect<Au> {
|
impl MaxRect for UntypedRect<Au> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn max_rect() -> Rect<Au> {
|
fn max_rect() -> Self {
|
||||||
Rect::new(
|
Self::new(
|
||||||
Point2D::new(MIN_AU / 2, MIN_AU / 2),
|
UntypedPoint2D::new(MIN_AU / 2, MIN_AU / 2),
|
||||||
Size2D::new(MAX_AU, MAX_AU),
|
UntypedSize2D::new(MAX_AU, MAX_AU),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MaxRect for LayoutRect {
|
impl MaxRect for LayoutRect {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn max_rect() -> LayoutRect {
|
fn max_rect() -> Self {
|
||||||
LayoutRect::from_origin_and_size(
|
Self::from_origin_and_size(
|
||||||
LayoutPoint::new(f32::MIN / 2.0, f32::MIN / 2.0),
|
LayoutPoint::new(f32::MIN / 2.0, f32::MIN / 2.0),
|
||||||
LayoutSize::new(f32::MAX, f32::MAX),
|
LayoutSize::new(f32::MAX, f32::MAX),
|
||||||
)
|
)
|
||||||
|
@ -59,8 +72,8 @@ impl MaxRect for LayoutRect {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A helper function to convert a rect of `f32` pixels to a rect of app units.
|
/// A helper function to convert a rect of `f32` pixels to a rect of app units.
|
||||||
pub fn f32_rect_to_au_rect(rect: Rect<f32>) -> Rect<Au> {
|
pub fn f32_rect_to_au_rect(rect: UntypedRect<f32>) -> UntypedRect<Au> {
|
||||||
Rect::new(
|
UntypedRect::new(
|
||||||
Point2D::new(
|
Point2D::new(
|
||||||
Au::from_f32_px(rect.origin.x),
|
Au::from_f32_px(rect.origin.x),
|
||||||
Au::from_f32_px(rect.origin.y),
|
Au::from_f32_px(rect.origin.y),
|
||||||
|
@ -73,8 +86,8 @@ pub fn f32_rect_to_au_rect(rect: Rect<f32>) -> Rect<Au> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A helper function to convert a rect of `Au` pixels to a rect of f32 units.
|
/// A helper function to convert a rect of `Au` pixels to a rect of f32 units.
|
||||||
pub fn au_rect_to_f32_rect(rect: Rect<Au>) -> Rect<f32> {
|
pub fn au_rect_to_f32_rect(rect: UntypedRect<Au>) -> UntypedRect<f32> {
|
||||||
Rect::new(
|
UntypedRect::new(
|
||||||
Point2D::new(rect.origin.x.to_f32_px(), rect.origin.y.to_f32_px()),
|
Point2D::new(rect.origin.x.to_f32_px(), rect.origin.y.to_f32_px()),
|
||||||
Size2D::new(rect.size.width.to_f32_px(), rect.size.height.to_f32_px()),
|
Size2D::new(rect.size.width.to_f32_px(), rect.size.height.to_f32_px()),
|
||||||
)
|
)
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
use euclid::Size2D;
|
use euclid::Size2D;
|
||||||
use profile_traits::ipc;
|
use profile_traits::ipc;
|
||||||
|
use servo_geometry::DeviceIndependentIntSize;
|
||||||
use style_traits::CSSPixel;
|
use style_traits::CSSPixel;
|
||||||
use webrender_api::units::DeviceIntSize;
|
|
||||||
use webrender_traits::CrossProcessCompositorMessage;
|
use webrender_traits::CrossProcessCompositorMessage;
|
||||||
|
|
||||||
use crate::dom::bindings::codegen::Bindings::ScreenBinding::ScreenMethods;
|
use crate::dom::bindings::codegen::Bindings::ScreenBinding::ScreenMethods;
|
||||||
|
@ -35,28 +35,28 @@ impl Screen {
|
||||||
|
|
||||||
fn screen_size(&self) -> Size2D<u32, CSSPixel> {
|
fn screen_size(&self) -> Size2D<u32, CSSPixel> {
|
||||||
let (send, recv) =
|
let (send, recv) =
|
||||||
ipc::channel::<DeviceIntSize>(self.global().time_profiler_chan().clone()).unwrap();
|
ipc::channel::<DeviceIndependentIntSize>(self.global().time_profiler_chan().clone())
|
||||||
|
.unwrap();
|
||||||
self.window
|
self.window
|
||||||
.compositor_api()
|
.compositor_api()
|
||||||
.sender()
|
.sender()
|
||||||
.send(CrossProcessCompositorMessage::GetScreenSize(send))
|
.send(CrossProcessCompositorMessage::GetScreenSize(send))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let dpr = self.window.device_pixel_ratio();
|
let size = recv.recv().unwrap_or(Size2D::zero()).to_u32();
|
||||||
let screen = recv.recv().unwrap_or(Size2D::zero());
|
Size2D::new(size.width, size.height)
|
||||||
(screen.to_f32() / dpr).to_u32()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn screen_avail_size(&self) -> Size2D<u32, CSSPixel> {
|
fn screen_avail_size(&self) -> Size2D<u32, CSSPixel> {
|
||||||
let (send, recv) =
|
let (send, recv) =
|
||||||
ipc::channel::<DeviceIntSize>(self.global().time_profiler_chan().clone()).unwrap();
|
ipc::channel::<DeviceIndependentIntSize>(self.global().time_profiler_chan().clone())
|
||||||
|
.unwrap();
|
||||||
self.window
|
self.window
|
||||||
.compositor_api()
|
.compositor_api()
|
||||||
.sender()
|
.sender()
|
||||||
.send(CrossProcessCompositorMessage::GetAvailableScreenSize(send))
|
.send(CrossProcessCompositorMessage::GetAvailableScreenSize(send))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let dpr = self.window.device_pixel_ratio();
|
let size = recv.recv().unwrap_or(Size2D::zero()).to_u32();
|
||||||
let screen = recv.recv().unwrap_or(Size2D::zero());
|
Size2D::new(size.width, size.height)
|
||||||
(screen.to_f32() / dpr).to_u32()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ use selectors::attr::CaseSensitivity;
|
||||||
use servo_arc::Arc as ServoArc;
|
use servo_arc::Arc as ServoArc;
|
||||||
use servo_atoms::Atom;
|
use servo_atoms::Atom;
|
||||||
use servo_config::pref;
|
use servo_config::pref;
|
||||||
use servo_geometry::{f32_rect_to_au_rect, MaxRect};
|
use servo_geometry::{f32_rect_to_au_rect, DeviceIndependentIntRect, MaxRect};
|
||||||
use servo_url::{ImmutableOrigin, MutableOrigin, ServoUrl};
|
use servo_url::{ImmutableOrigin, MutableOrigin, ServoUrl};
|
||||||
use style::dom::OpaqueNode;
|
use style::dom::OpaqueNode;
|
||||||
use style::error_reporting::{ContextualParseError, ParseErrorReporter};
|
use style::error_reporting::{ContextualParseError, ParseErrorReporter};
|
||||||
|
@ -76,7 +76,7 @@ use style::str::HTML_SPACE_CHARACTERS;
|
||||||
use style::stylesheets::{CssRuleType, Origin, UrlExtraData};
|
use style::stylesheets::{CssRuleType, Origin, UrlExtraData};
|
||||||
use style_traits::{CSSPixel, DevicePixel, ParsingMode};
|
use style_traits::{CSSPixel, DevicePixel, ParsingMode};
|
||||||
use url::Position;
|
use url::Position;
|
||||||
use webrender_api::units::{DeviceIntRect, LayoutPixel};
|
use webrender_api::units::LayoutPixel;
|
||||||
use webrender_api::{DocumentId, ExternalScrollId};
|
use webrender_api::{DocumentId, ExternalScrollId};
|
||||||
use webrender_traits::CrossProcessCompositorApi;
|
use webrender_traits::CrossProcessCompositorApi;
|
||||||
|
|
||||||
|
@ -1782,16 +1782,16 @@ impl Window {
|
||||||
|
|
||||||
fn client_window(&self) -> (Size2D<u32, CSSPixel>, Point2D<i32, CSSPixel>) {
|
fn client_window(&self) -> (Size2D<u32, CSSPixel>, Point2D<i32, CSSPixel>) {
|
||||||
let timer_profile_chan = self.global().time_profiler_chan().clone();
|
let timer_profile_chan = self.global().time_profiler_chan().clone();
|
||||||
let (send, recv) = ProfiledIpc::channel::<DeviceIntRect>(timer_profile_chan).unwrap();
|
let (send, recv) =
|
||||||
|
ProfiledIpc::channel::<DeviceIndependentIntRect>(timer_profile_chan).unwrap();
|
||||||
let _ = self
|
let _ = self
|
||||||
.compositor_api
|
.compositor_api
|
||||||
.sender()
|
.sender()
|
||||||
.send(webrender_traits::CrossProcessCompositorMessage::GetClientWindowRect(send));
|
.send(webrender_traits::CrossProcessCompositorMessage::GetClientWindowRect(send));
|
||||||
let rect = recv.recv().unwrap_or_default();
|
let rect = recv.recv().unwrap_or_default().to_u32();
|
||||||
let dpr = self.device_pixel_ratio();
|
|
||||||
(
|
(
|
||||||
(rect.size().to_f32() / dpr).to_u32(),
|
Size2D::new(rect.size().width, rect.size().height),
|
||||||
(rect.min.to_f32() / dpr).to_i32(),
|
Point2D::new(rect.min.x as i32, rect.min.y as i32),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,5 +21,6 @@ log = { workspace = true }
|
||||||
libc = { workspace = true }
|
libc = { workspace = true }
|
||||||
webrender_api = { workspace = true }
|
webrender_api = { workspace = true }
|
||||||
serde = { workspace = true }
|
serde = { workspace = true }
|
||||||
|
servo_geometry = { path = "../../geometry" }
|
||||||
surfman = { workspace = true }
|
surfman = { workspace = true }
|
||||||
|
|
||||||
|
|
|
@ -14,12 +14,13 @@ use std::sync::{Arc, Mutex};
|
||||||
use base::id::PipelineId;
|
use base::id::PipelineId;
|
||||||
use display_list::{CompositorDisplayListInfo, ScrollTreeNodeId};
|
use display_list::{CompositorDisplayListInfo, ScrollTreeNodeId};
|
||||||
use embedder_traits::Cursor;
|
use embedder_traits::Cursor;
|
||||||
use euclid::default::Size2D;
|
use euclid::default::Size2D as UntypedSize2D;
|
||||||
use ipc_channel::ipc::{self, IpcSender, IpcSharedMemory};
|
use ipc_channel::ipc::{self, IpcSender, IpcSharedMemory};
|
||||||
use libc::c_void;
|
use libc::c_void;
|
||||||
use log::warn;
|
use log::warn;
|
||||||
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||||
use webrender_api::units::{DeviceIntRect, DeviceIntSize, DevicePoint, LayoutPoint, TexelRect};
|
use servo_geometry::{DeviceIndependentIntRect, DeviceIndependentIntSize};
|
||||||
|
use webrender_api::units::{DevicePoint, LayoutPoint, TexelRect};
|
||||||
use webrender_api::{
|
use webrender_api::{
|
||||||
BuiltDisplayList, BuiltDisplayListDescriptor, ExternalImage, ExternalImageData,
|
BuiltDisplayList, BuiltDisplayListDescriptor, ExternalImage, ExternalImageData,
|
||||||
ExternalImageHandler, ExternalImageId, ExternalImageSource, ExternalScrollId,
|
ExternalImageHandler, ExternalImageId, ExternalImageSource, ExternalScrollId,
|
||||||
|
@ -77,12 +78,12 @@ pub enum CrossProcessCompositorMessage {
|
||||||
RemoveFonts(Vec<FontKey>, Vec<FontInstanceKey>),
|
RemoveFonts(Vec<FontKey>, Vec<FontInstanceKey>),
|
||||||
|
|
||||||
/// Get the client window size and position.
|
/// Get the client window size and position.
|
||||||
GetClientWindowRect(IpcSender<DeviceIntRect>),
|
GetClientWindowRect(IpcSender<DeviceIndependentIntRect>),
|
||||||
/// Get the size of the screen that the client window inhabits.
|
/// Get the size of the screen that the client window inhabits.
|
||||||
GetScreenSize(IpcSender<DeviceIntSize>),
|
GetScreenSize(IpcSender<DeviceIndependentIntSize>),
|
||||||
/// Get the available screen size (without toolbars and docks) for the screen
|
/// Get the available screen size (without toolbars and docks) for the screen
|
||||||
/// the client window inhabits.
|
/// the client window inhabits.
|
||||||
GetAvailableScreenSize(IpcSender<DeviceIntSize>),
|
GetAvailableScreenSize(IpcSender<DeviceIndependentIntSize>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Debug for CrossProcessCompositorMessage {
|
impl fmt::Debug for CrossProcessCompositorMessage {
|
||||||
|
@ -291,7 +292,7 @@ impl CrossProcessCompositorApi {
|
||||||
/// This trait is used to notify lock/unlock messages and get the
|
/// This trait is used to notify lock/unlock messages and get the
|
||||||
/// required info that WR needs.
|
/// required info that WR needs.
|
||||||
pub trait WebrenderExternalImageApi {
|
pub trait WebrenderExternalImageApi {
|
||||||
fn lock(&mut self, id: u64) -> (WebrenderImageSource, Size2D<i32>);
|
fn lock(&mut self, id: u64) -> (WebrenderImageSource, UntypedSize2D<i32>);
|
||||||
fn unlock(&mut self, id: u64);
|
fn unlock(&mut self, id: u64);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ import subprocess
|
||||||
def start_servo(port, resolution):
|
def start_servo(port, resolution):
|
||||||
|
|
||||||
# Use the below command if you are running this script on windows
|
# Use the below command if you are running this script on windows
|
||||||
# cmds = 'mach.bat run --webdriver ' + port + ' --resolution ' + resolution
|
# cmds = 'mach.bat run --webdriver ' + port + ' --window-size ' + resolution
|
||||||
cmds = './mach run --webdriver=' + port + ' --resolution ' + resolution
|
cmds = './mach run --webdriver=' + port + ' --window-size ' + resolution
|
||||||
process = subprocess.Popen(cmds, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
process = subprocess.Popen(cmds, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
return process
|
return process
|
||||||
|
|
|
@ -38,12 +38,12 @@ use super::window_trait::{WindowPortsMethods, LINE_HEIGHT};
|
||||||
pub struct Window {
|
pub struct Window {
|
||||||
winit_window: winit::window::Window,
|
winit_window: winit::window::Window,
|
||||||
rendering_context: RenderingContext,
|
rendering_context: RenderingContext,
|
||||||
screen_size: Size2D<u32, DevicePixel>,
|
screen_size: Size2D<u32, DeviceIndependentPixel>,
|
||||||
inner_size: Cell<Size2D<u32, DevicePixel>>,
|
inner_size: Cell<PhysicalSize<u32>>,
|
||||||
toolbar_height: Cell<Length<f32, DeviceIndependentPixel>>,
|
toolbar_height: Cell<Length<f32, DeviceIndependentPixel>>,
|
||||||
mouse_down_button: Cell<Option<winit::event::MouseButton>>,
|
mouse_down_button: Cell<Option<winit::event::MouseButton>>,
|
||||||
mouse_down_point: Cell<Point2D<i32, DevicePixel>>,
|
mouse_down_point: Cell<Point2D<i32, DevicePixel>>,
|
||||||
primary_monitor: winit::monitor::MonitorHandle,
|
monitor: winit::monitor::MonitorHandle,
|
||||||
event_queue: RefCell<Vec<EmbedderEvent>>,
|
event_queue: RefCell<Vec<EmbedderEvent>>,
|
||||||
mouse_pos: Cell<Point2D<i32, DevicePixel>>,
|
mouse_pos: Cell<Point2D<i32, DevicePixel>>,
|
||||||
last_pressed: Cell<Option<(KeyboardEvent, Option<LogicalKey>)>>,
|
last_pressed: Cell<Option<(KeyboardEvent, Option<LogicalKey>)>>,
|
||||||
|
@ -59,7 +59,7 @@ pub struct Window {
|
||||||
|
|
||||||
impl Window {
|
impl Window {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
win_size: Size2D<u32, DeviceIndependentPixel>,
|
window_size: Size2D<u32, DeviceIndependentPixel>,
|
||||||
event_loop: &winit::event_loop::EventLoop<WakerEvent>,
|
event_loop: &winit::event_loop::EventLoop<WakerEvent>,
|
||||||
no_native_titlebar: bool,
|
no_native_titlebar: bool,
|
||||||
device_pixel_ratio_override: Option<f32>,
|
device_pixel_ratio_override: Option<f32>,
|
||||||
|
@ -76,7 +76,7 @@ impl Window {
|
||||||
.with_title("Servo".to_string())
|
.with_title("Servo".to_string())
|
||||||
.with_decorations(!no_native_titlebar)
|
.with_decorations(!no_native_titlebar)
|
||||||
.with_transparent(no_native_titlebar)
|
.with_transparent(no_native_titlebar)
|
||||||
.with_inner_size(LogicalSize::new(win_size.width, win_size.height))
|
.with_inner_size(LogicalSize::new(window_size.width, window_size.height))
|
||||||
.with_visible(visible);
|
.with_visible(visible);
|
||||||
|
|
||||||
#[allow(deprecated)]
|
#[allow(deprecated)]
|
||||||
|
@ -90,13 +90,18 @@ impl Window {
|
||||||
winit_window.set_window_icon(Some(load_icon(icon_bytes)));
|
winit_window.set_window_icon(Some(load_icon(icon_bytes)));
|
||||||
}
|
}
|
||||||
|
|
||||||
let primary_monitor = winit_window
|
let monitor = winit_window
|
||||||
.available_monitors()
|
.current_monitor()
|
||||||
.nth(0)
|
.or_else(|| winit_window.available_monitors().nth(0))
|
||||||
.expect("No monitor detected");
|
.expect("No monitor detected");
|
||||||
|
|
||||||
let screen_size = winit_size_to_euclid_size(primary_monitor.size());
|
let (screen_size, screen_scale) = opts.screen_size_override.map_or_else(
|
||||||
let inner_size = winit_size_to_euclid_size(winit_window.inner_size());
|
|| (monitor.size(), monitor.scale_factor()),
|
||||||
|
|size| (PhysicalSize::new(size.width, size.height), 1.0),
|
||||||
|
);
|
||||||
|
let screen_scale: Scale<f64, DevicePixel, DeviceIndependentPixel> =
|
||||||
|
Scale::new(screen_scale);
|
||||||
|
let screen_size = (winit_size_to_euclid_size(screen_size).to_f64() * screen_scale).to_u32();
|
||||||
|
|
||||||
// Initialize surfman
|
// Initialize surfman
|
||||||
let display_handle = winit_window
|
let display_handle = winit_window
|
||||||
|
@ -110,12 +115,15 @@ impl Window {
|
||||||
let window_handle = winit_window
|
let window_handle = winit_window
|
||||||
.window_handle()
|
.window_handle()
|
||||||
.expect("could not get window handle from window");
|
.expect("could not get window handle from window");
|
||||||
|
|
||||||
|
let inner_size = winit_window.inner_size();
|
||||||
let native_widget = connection
|
let native_widget = connection
|
||||||
.create_native_widget_from_window_handle(
|
.create_native_widget_from_window_handle(
|
||||||
window_handle,
|
window_handle,
|
||||||
inner_size.to_i32().to_untyped(),
|
winit_size_to_euclid_size(inner_size).to_i32().to_untyped(),
|
||||||
)
|
)
|
||||||
.expect("Failed to create native widget");
|
.expect("Failed to create native widget");
|
||||||
|
|
||||||
let surface_type = SurfaceType::Widget { native_widget };
|
let surface_type = SurfaceType::Widget { native_widget };
|
||||||
let rendering_context = RenderingContext::create(&connection, &adapter, surface_type)
|
let rendering_context = RenderingContext::create(&connection, &adapter, surface_type)
|
||||||
.expect("Failed to create WR surfman");
|
.expect("Failed to create WR surfman");
|
||||||
|
@ -133,7 +141,7 @@ impl Window {
|
||||||
animation_state: Cell::new(AnimationState::Idle),
|
animation_state: Cell::new(AnimationState::Idle),
|
||||||
fullscreen: Cell::new(false),
|
fullscreen: Cell::new(false),
|
||||||
inner_size: Cell::new(inner_size),
|
inner_size: Cell::new(inner_size),
|
||||||
primary_monitor,
|
monitor,
|
||||||
screen_size,
|
screen_size,
|
||||||
device_pixel_ratio_override,
|
device_pixel_ratio_override,
|
||||||
xr_window_poses: RefCell::new(vec![]),
|
xr_window_poses: RefCell::new(vec![]),
|
||||||
|
@ -321,7 +329,7 @@ impl WindowPortsMethods for Window {
|
||||||
if self.fullscreen.get() != state {
|
if self.fullscreen.get() != state {
|
||||||
self.winit_window.set_fullscreen(if state {
|
self.winit_window.set_fullscreen(if state {
|
||||||
Some(winit::window::Fullscreen::Borderless(Some(
|
Some(winit::window::Fullscreen::Borderless(Some(
|
||||||
self.primary_monitor.clone(),
|
self.monitor.clone(),
|
||||||
)))
|
)))
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
|
@ -469,13 +477,10 @@ impl WindowPortsMethods for Window {
|
||||||
winit::event::WindowEvent::CloseRequested => {
|
winit::event::WindowEvent::CloseRequested => {
|
||||||
self.event_queue.borrow_mut().push(EmbedderEvent::Quit);
|
self.event_queue.borrow_mut().push(EmbedderEvent::Quit);
|
||||||
},
|
},
|
||||||
winit::event::WindowEvent::Resized(physical_size) => {
|
winit::event::WindowEvent::Resized(new_size) => {
|
||||||
let (width, height) = physical_size.into();
|
|
||||||
let new_size = Size2D::new(width, height);
|
|
||||||
if self.inner_size.get() != new_size {
|
if self.inner_size.get() != new_size {
|
||||||
let physical_size = Size2D::new(physical_size.width, physical_size.height);
|
|
||||||
self.rendering_context
|
self.rendering_context
|
||||||
.resize(physical_size.to_i32())
|
.resize(Size2D::new(new_size.width, new_size.height).to_i32())
|
||||||
.expect("Failed to resize");
|
.expect("Failed to resize");
|
||||||
self.inner_size.set(new_size);
|
self.inner_size.set(new_size);
|
||||||
self.event_queue
|
self.event_queue
|
||||||
|
@ -528,6 +533,11 @@ impl WindowMethods for Window {
|
||||||
let window_size = winit_size_to_euclid_size(self.winit_window.outer_size()).to_i32();
|
let window_size = winit_size_to_euclid_size(self.winit_window.outer_size()).to_i32();
|
||||||
let window_origin = self.winit_window.outer_position().unwrap_or_default();
|
let window_origin = self.winit_window.outer_position().unwrap_or_default();
|
||||||
let window_origin = winit_position_to_euclid_point(window_origin).to_i32();
|
let window_origin = winit_position_to_euclid_point(window_origin).to_i32();
|
||||||
|
let window_rect = DeviceIntRect::from_origin_and_size(window_origin, window_size);
|
||||||
|
let window_scale: Scale<f64, DevicePixel, DeviceIndependentPixel> =
|
||||||
|
Scale::new(self.winit_window.scale_factor());
|
||||||
|
let window_rect = (window_rect.to_f64() * window_scale).to_i32();
|
||||||
|
|
||||||
let viewport_origin = DeviceIntPoint::zero(); // bottom left
|
let viewport_origin = DeviceIntPoint::zero(); // bottom left
|
||||||
let viewport_size = winit_size_to_euclid_size(self.winit_window.inner_size()).to_f32();
|
let viewport_size = winit_size_to_euclid_size(self.winit_window.inner_size()).to_f32();
|
||||||
let viewport = DeviceIntRect::from_origin_and_size(viewport_origin, viewport_size.to_i32());
|
let viewport = DeviceIntRect::from_origin_and_size(viewport_origin, viewport_size.to_i32());
|
||||||
|
@ -536,7 +546,7 @@ impl WindowMethods for Window {
|
||||||
EmbedderCoordinates {
|
EmbedderCoordinates {
|
||||||
viewport,
|
viewport,
|
||||||
framebuffer: viewport.size(),
|
framebuffer: viewport.size(),
|
||||||
window_rect: DeviceIntRect::from_origin_and_size(window_origin, window_size),
|
window_rect,
|
||||||
screen_size,
|
screen_size,
|
||||||
// FIXME: Winit doesn't have API for available size. Fallback to screen size
|
// FIXME: Winit doesn't have API for available size. Fallback to screen size
|
||||||
available_screen_size: screen_size,
|
available_screen_size: screen_size,
|
||||||
|
|
|
@ -9,14 +9,15 @@ use std::rc::Rc;
|
||||||
use std::sync::RwLock;
|
use std::sync::RwLock;
|
||||||
|
|
||||||
use euclid::num::Zero;
|
use euclid::num::Zero;
|
||||||
use euclid::{Length, Point2D, Rotation3D, Scale, Size2D, UnknownUnit, Vector3D};
|
use euclid::{Box2D, Length, Point2D, Rotation3D, Scale, Size2D, UnknownUnit, Vector3D};
|
||||||
use log::warn;
|
use log::warn;
|
||||||
use servo::compositing::windowing::{
|
use servo::compositing::windowing::{
|
||||||
AnimationState, EmbedderCoordinates, EmbedderEvent, WindowMethods,
|
AnimationState, EmbedderCoordinates, EmbedderEvent, WindowMethods,
|
||||||
};
|
};
|
||||||
|
use servo::config::opts;
|
||||||
use servo::servo_geometry::DeviceIndependentPixel;
|
use servo::servo_geometry::DeviceIndependentPixel;
|
||||||
use servo::style_traits::DevicePixel;
|
use servo::style_traits::DevicePixel;
|
||||||
use servo::webrender_api::units::{DeviceIntRect, DeviceIntSize};
|
use servo::webrender_api::units::DeviceIntSize;
|
||||||
use servo::webrender_traits::RenderingContext;
|
use servo::webrender_traits::RenderingContext;
|
||||||
use surfman::{Connection, Context, Device, SurfaceType};
|
use surfman::{Connection, Context, Device, SurfaceType};
|
||||||
|
|
||||||
|
@ -26,8 +27,10 @@ pub struct Window {
|
||||||
rendering_context: RenderingContext,
|
rendering_context: RenderingContext,
|
||||||
animation_state: Cell<AnimationState>,
|
animation_state: Cell<AnimationState>,
|
||||||
fullscreen: Cell<bool>,
|
fullscreen: Cell<bool>,
|
||||||
device_pixel_ratio_override: Option<f32>,
|
device_pixel_ratio_override: Option<Scale<f32, DeviceIndependentPixel, DevicePixel>>,
|
||||||
inner_size: Cell<Size2D<i32, UnknownUnit>>,
|
inner_size: Cell<DeviceIntSize>,
|
||||||
|
screen_size: Size2D<i32, DeviceIndependentPixel>,
|
||||||
|
window_rect: Box2D<i32, DeviceIndependentPixel>,
|
||||||
event_queue: RwLock<Vec<EmbedderEvent>>,
|
event_queue: RwLock<Vec<EmbedderEvent>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,17 +45,33 @@ impl Window {
|
||||||
let adapter = connection
|
let adapter = connection
|
||||||
.create_software_adapter()
|
.create_software_adapter()
|
||||||
.expect("Failed to create adapter");
|
.expect("Failed to create adapter");
|
||||||
let size = size.to_untyped().to_i32();
|
let surface_type = SurfaceType::Generic {
|
||||||
let surface_type = SurfaceType::Generic { size };
|
size: size.to_untyped().to_i32(),
|
||||||
|
};
|
||||||
let rendering_context = RenderingContext::create(&connection, &adapter, surface_type)
|
let rendering_context = RenderingContext::create(&connection, &adapter, surface_type)
|
||||||
.expect("Failed to create WR surfman");
|
.expect("Failed to create WR surfman");
|
||||||
|
|
||||||
|
let device_pixel_ratio_override: Option<Scale<f32, DeviceIndependentPixel, DevicePixel>> =
|
||||||
|
device_pixel_ratio_override.map(Scale::new);
|
||||||
|
let hidpi_factor = device_pixel_ratio_override.unwrap_or_else(Scale::identity);
|
||||||
|
|
||||||
|
let size = size.to_i32();
|
||||||
|
let inner_size = Cell::new((size.to_f32() * hidpi_factor).to_i32());
|
||||||
|
let window_rect = Box2D::from_origin_and_size(Point2D::zero(), size);
|
||||||
|
|
||||||
|
let screen_size = opts::get().screen_size_override.map_or_else(
|
||||||
|
|| window_rect.size(),
|
||||||
|
|screen_size_override| screen_size_override.to_i32(),
|
||||||
|
);
|
||||||
|
|
||||||
let window = Window {
|
let window = Window {
|
||||||
rendering_context,
|
rendering_context,
|
||||||
animation_state: Cell::new(AnimationState::Idle),
|
animation_state: Cell::new(AnimationState::Idle),
|
||||||
fullscreen: Cell::new(false),
|
fullscreen: Cell::new(false),
|
||||||
device_pixel_ratio_override,
|
device_pixel_ratio_override,
|
||||||
inner_size: Cell::new(size.to_i32()),
|
inner_size,
|
||||||
|
screen_size,
|
||||||
|
window_rect,
|
||||||
event_queue: RwLock::new(Vec::new()),
|
event_queue: RwLock::new(Vec::new()),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -73,17 +92,15 @@ impl WindowPortsMethods for Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn request_inner_size(&self, size: DeviceIntSize) -> Option<DeviceIntSize> {
|
fn request_inner_size(&self, size: DeviceIntSize) -> Option<DeviceIntSize> {
|
||||||
let (width, height) = size.into();
|
|
||||||
|
|
||||||
// Surfman doesn't support zero-sized surfaces.
|
// Surfman doesn't support zero-sized surfaces.
|
||||||
let new_size = DeviceIntSize::new(width.max(1), height.max(1));
|
let new_size = DeviceIntSize::new(size.width.max(1), size.height.max(1));
|
||||||
if self.inner_size.get() == new_size.to_untyped() {
|
if self.inner_size.get() == new_size {
|
||||||
return Some(new_size);
|
return Some(new_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
match self.rendering_context.resize(new_size.to_untyped()) {
|
match self.rendering_context.resize(new_size.to_untyped()) {
|
||||||
Ok(()) => {
|
Ok(()) => {
|
||||||
self.inner_size.set(new_size.to_untyped());
|
self.inner_size.set(new_size);
|
||||||
if let Ok(ref mut queue) = self.event_queue.write() {
|
if let Ok(ref mut queue) = self.event_queue.write() {
|
||||||
queue.push(EmbedderEvent::WindowResize);
|
queue.push(EmbedderEvent::WindowResize);
|
||||||
}
|
}
|
||||||
|
@ -103,7 +120,7 @@ impl WindowPortsMethods for Window {
|
||||||
fn device_pixel_ratio_override(
|
fn device_pixel_ratio_override(
|
||||||
&self,
|
&self,
|
||||||
) -> Option<Scale<f32, DeviceIndependentPixel, DevicePixel>> {
|
) -> Option<Scale<f32, DeviceIndependentPixel, DevicePixel>> {
|
||||||
self.device_pixel_ratio_override.map(Scale::new)
|
self.device_pixel_ratio_override
|
||||||
}
|
}
|
||||||
|
|
||||||
fn page_height(&self) -> f32 {
|
fn page_height(&self) -> f32 {
|
||||||
|
@ -155,21 +172,14 @@ impl WindowPortsMethods for Window {
|
||||||
|
|
||||||
impl WindowMethods for Window {
|
impl WindowMethods for Window {
|
||||||
fn get_coordinates(&self) -> EmbedderCoordinates {
|
fn get_coordinates(&self) -> EmbedderCoordinates {
|
||||||
let dpr = self.hidpi_factor();
|
let inner_size = self.inner_size.get();
|
||||||
let size = self
|
|
||||||
.rendering_context
|
|
||||||
.context_surface_info()
|
|
||||||
.unwrap_or(None)
|
|
||||||
.map(|info| Size2D::from_untyped(info.size))
|
|
||||||
.unwrap_or(Size2D::new(0, 0));
|
|
||||||
let viewport = DeviceIntRect::from_origin_and_size(Point2D::zero(), size);
|
|
||||||
EmbedderCoordinates {
|
EmbedderCoordinates {
|
||||||
viewport,
|
viewport: Box2D::from_origin_and_size(Point2D::zero(), inner_size),
|
||||||
framebuffer: size,
|
framebuffer: inner_size,
|
||||||
window_rect: DeviceIntRect::from_origin_and_size(Point2D::zero(), size),
|
window_rect: self.window_rect,
|
||||||
screen_size: size,
|
screen_size: self.screen_size,
|
||||||
available_screen_size: size,
|
available_screen_size: self.screen_size,
|
||||||
hidpi_factor: dpr,
|
hidpi_factor: self.hidpi_factor(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ use servo::embedder_traits::{
|
||||||
ContextMenuResult, EmbedderMsg, EmbedderProxy, EventLoopWaker, MediaSessionEvent,
|
ContextMenuResult, EmbedderMsg, EmbedderProxy, EventLoopWaker, MediaSessionEvent,
|
||||||
PermissionPrompt, PermissionRequest, PromptDefinition, PromptOrigin, PromptResult,
|
PermissionPrompt, PermissionRequest, PromptDefinition, PromptOrigin, PromptResult,
|
||||||
};
|
};
|
||||||
use servo::euclid::{Point2D, Rect, Scale, Size2D, Vector2D};
|
use servo::euclid::{Box2D, Point2D, Rect, Scale, Size2D, Vector2D};
|
||||||
use servo::keyboard_types::{Key, KeyState, KeyboardEvent};
|
use servo::keyboard_types::{Key, KeyState, KeyboardEvent};
|
||||||
use servo::script_traits::{
|
use servo::script_traits::{
|
||||||
MediaSessionActionType, MouseButton, TouchEventType, TouchId, TraversalDirection,
|
MediaSessionActionType, MouseButton, TouchEventType, TouchId, TraversalDirection,
|
||||||
|
@ -691,12 +691,13 @@ impl EmbedderMethods for ServoEmbedderCallbacks {
|
||||||
impl WindowMethods for ServoWindowCallbacks {
|
impl WindowMethods for ServoWindowCallbacks {
|
||||||
fn get_coordinates(&self) -> EmbedderCoordinates {
|
fn get_coordinates(&self) -> EmbedderCoordinates {
|
||||||
let coords = self.coordinates.borrow();
|
let coords = self.coordinates.borrow();
|
||||||
|
let screen_size = (coords.viewport.size.to_f32() * Scale::new(self.density)).to_i32();
|
||||||
EmbedderCoordinates {
|
EmbedderCoordinates {
|
||||||
viewport: coords.viewport.to_box2d(),
|
viewport: coords.viewport.to_box2d(),
|
||||||
framebuffer: coords.framebuffer,
|
framebuffer: coords.framebuffer,
|
||||||
window_rect: DeviceIntRect::from_origin_and_size(Point2D::zero(), coords.viewport.size),
|
window_rect: Box2D::from_origin_and_size(Point2D::zero(), screen_size),
|
||||||
screen_size: coords.viewport.size,
|
screen_size,
|
||||||
available_screen_size: coords.viewport.size,
|
available_screen_size: screen_size,
|
||||||
hidpi_factor: Scale::new(self.density),
|
hidpi_factor: Scale::new(self.density),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
2
tests/wpt/meta/MANIFEST.json
vendored
2
tests/wpt/meta/MANIFEST.json
vendored
|
@ -496873,7 +496873,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"executorservo.py": [
|
"executorservo.py": [
|
||||||
"d8bb47be5f9259f793902a3157ae96a8954f8fb6",
|
"1d96ffa41da33c9b3c2650ee68c27174bf3081a6",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"executorservodriver.py": [
|
"executorservodriver.py": [
|
||||||
|
|
|
@ -230,7 +230,7 @@ class ServoRefTestExecutor(ServoExecutor):
|
||||||
with TempFilename(self.tempdir) as output_path:
|
with TempFilename(self.tempdir) as output_path:
|
||||||
extra_args = ["--exit",
|
extra_args = ["--exit",
|
||||||
"--output=%s" % output_path,
|
"--output=%s" % output_path,
|
||||||
"--resolution", viewport_size or "800x600"]
|
"--window-size", viewport_size or "800x600"]
|
||||||
debug_opts = "disable-text-aa,load-webfonts-synchronously,replace-surrogates"
|
debug_opts = "disable-text-aa,load-webfonts-synchronously,replace-surrogates"
|
||||||
|
|
||||||
if dpi:
|
if dpi:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue