mirror of
https://github.com/servo/servo.git
synced 2025-08-09 07:25:35 +01:00
webdriver: Implement maximize window for both headless&headed window (#38271)
- Implement [Maximize Window](https://w3c.github.io/webdriver/#maximize-window) - Previously, headless window screen size is same as inner size if not specified in preference. We make it double as required by the test to not have max window initially. - Some other random cleanup. Testing: webdriver Stress test for maximize window (headed + headless). --------- Signed-off-by: Euclid Ye <euclid.ye@huawei.com>
This commit is contained in:
parent
9ef4d0c9d7
commit
a3de3ffa75
11 changed files with 76 additions and 91 deletions
|
@ -392,6 +392,22 @@ impl App {
|
|||
warn!("Failed to send response of GetWindowSize: {error}");
|
||||
}
|
||||
},
|
||||
WebDriverCommandMsg::MaximizeWebView(webview_id, response_sender) => {
|
||||
let window = self
|
||||
.windows
|
||||
.values()
|
||||
.next()
|
||||
.expect("Should have at least one window in servoshell");
|
||||
window.maximize(
|
||||
&running_state
|
||||
.webview_by_id(webview_id)
|
||||
.expect("Webview must exists as we just verified"),
|
||||
);
|
||||
|
||||
if let Err(error) = response_sender.send(window.window_rect()) {
|
||||
warn!("Failed to send response of GetWindowSize: {error}");
|
||||
}
|
||||
},
|
||||
WebDriverCommandMsg::SetWindowRect(webview_id, requested_rect, size_sender) => {
|
||||
let Some(webview) = running_state.webview_by_id(webview_id) else {
|
||||
continue;
|
||||
|
|
|
@ -767,10 +767,7 @@ impl WindowPortsMethods for Window {
|
|||
// this prevents a crash in the compositor due to invalid surface size
|
||||
self.winit_window.set_min_inner_size(Some(PhysicalSize::new(
|
||||
MIN_INNER_WIDTH,
|
||||
i32::max(
|
||||
MIN_INNER_HEIGHT,
|
||||
(self.toolbar_height() * self.hidpi_scale_factor()).0 as i32,
|
||||
),
|
||||
MIN_INNER_HEIGHT.max((self.toolbar_height() * self.hidpi_scale_factor()).0 as i32),
|
||||
)));
|
||||
}
|
||||
|
||||
|
@ -808,6 +805,10 @@ impl WindowPortsMethods for Window {
|
|||
Some(winit::window::Theme::Light) | None => servo::Theme::Light,
|
||||
}
|
||||
}
|
||||
|
||||
fn maximize(&self, _webview: &WebView) {
|
||||
self.winit_window.set_maximized(true);
|
||||
}
|
||||
}
|
||||
|
||||
fn winit_phase_to_touch_event_type(phase: TouchPhase) -> TouchEventType {
|
||||
|
|
|
@ -13,7 +13,7 @@ use servo::servo_geometry::{
|
|||
DeviceIndependentIntRect, DeviceIndependentPixel, convert_rect_to_css_pixel,
|
||||
};
|
||||
use servo::webrender_api::units::{DeviceIntPoint, DeviceIntRect, DeviceIntSize, DevicePixel};
|
||||
use servo::{RenderingContext, ScreenGeometry, SoftwareRenderingContext};
|
||||
use servo::{RenderingContext, ScreenGeometry, SoftwareRenderingContext, WebView};
|
||||
use winit::dpi::PhysicalSize;
|
||||
|
||||
use super::app_state::RunningAppState;
|
||||
|
@ -47,7 +47,7 @@ impl Window {
|
|||
|
||||
let screen_size = servoshell_preferences
|
||||
.screen_size_override
|
||||
.map_or(inner_size, |screen_size_override| {
|
||||
.map_or(inner_size * 2, |screen_size_override| {
|
||||
(screen_size_override.to_f32() * hidpi_factor).to_i32()
|
||||
});
|
||||
|
||||
|
@ -86,7 +86,7 @@ impl WindowPortsMethods for Window {
|
|||
|
||||
fn request_resize(
|
||||
&self,
|
||||
webview: &::servo::WebView,
|
||||
webview: &WebView,
|
||||
outer_size: DeviceIntSize,
|
||||
) -> Option<DeviceIntSize> {
|
||||
let new_size = DeviceIntSize::new(
|
||||
|
@ -167,4 +167,17 @@ impl WindowPortsMethods for Window {
|
|||
fn rendering_context(&self) -> Rc<dyn RenderingContext> {
|
||||
self.rendering_context.clone()
|
||||
}
|
||||
|
||||
fn maximize(&self, webview: &WebView) {
|
||||
self.window_position.set(Point2D::zero());
|
||||
self.inner_size.set(self.screen_size);
|
||||
// Because we are managing the rendering surface ourselves, there will be no other
|
||||
// notification (such as from the display manager) that it has changed size, so we
|
||||
// must notify the compositor here.
|
||||
webview.move_resize(self.screen_size.to_f32().into());
|
||||
webview.resize(PhysicalSize::new(
|
||||
self.screen_size.width as u32,
|
||||
self.screen_size.height as u32,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -65,4 +65,5 @@ pub trait WindowPortsMethods {
|
|||
servo::Theme::Light
|
||||
}
|
||||
fn window_rect(&self) -> DeviceIndependentIntRect;
|
||||
fn maximize(&self, webview: &WebView);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue