mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
constellation: Stop assuming that the viewport is shared by all WebViews (#36312)
The `Constellation` previously held a `window_size` member, but this assumes that all `WebView`s have the same size. This change removes that assumption as well as making sure that all `WebView`s pass their size and HiDIP scaling to the `Constellation` when they are created. In addition - `WindowSizeData` is renamed to `ViewportDetails`, as it was holding more than just the size and it didn't necessarily correspond to a "window." It's used for tracking viewport data, whether for an `<iframe>` or the main `WebView` viewport. - `ViewportDetails` is stored more consistently so that conceptually an `<iframe>` can also have its own HiDPI scaling. This isn't something we necessarily want, but it makes everything conceptually simpler. The goal with this change is to work toward allowing per-`WebView` HiDPI scaling and sizing. There are still some corresponding changes in the compositor to make that happen, but they will in a subsequent change. Testing: This is covered by existing tests. There should be no behavior changes. Fixes: This is part of #36232. Signed-off-by: Martin Robinson <mrobinson@igalia.com> Signed-off-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
parent
7c89e24f34
commit
fb344ba4e9
26 changed files with 272 additions and 256 deletions
|
@ -17,7 +17,8 @@ use std::sync::{Arc, LazyLock};
|
|||
use app_units::Au;
|
||||
use base::Epoch;
|
||||
use base::id::{PipelineId, WebViewId};
|
||||
use constellation_traits::{ScrollState, UntrustedNodeAddress, WindowSizeData};
|
||||
use constellation_traits::{ScrollState, UntrustedNodeAddress};
|
||||
use embedder_traits::ViewportDetails;
|
||||
use embedder_traits::resources::{self, Resource};
|
||||
use euclid::default::{Point2D as UntypedPoint2D, Rect as UntypedRect, Size2D as UntypedSize2D};
|
||||
use euclid::{Point2D, Scale, Size2D, Vector2D};
|
||||
|
@ -473,8 +474,8 @@ impl LayoutThread {
|
|||
let device = Device::new(
|
||||
MediaType::screen(),
|
||||
QuirksMode::NoQuirks,
|
||||
config.window_size.initial_viewport,
|
||||
Scale::new(config.window_size.device_pixel_ratio.get()),
|
||||
config.viewport_details.size,
|
||||
Scale::new(config.viewport_details.hidpi_scale_factor.get()),
|
||||
Box::new(LayoutFontMetricsProvider(config.font_context.clone())),
|
||||
ComputedValues::initial_values_with_font_override(font),
|
||||
// TODO: obtain preferred color scheme from embedder
|
||||
|
@ -497,8 +498,8 @@ impl LayoutThread {
|
|||
// Epoch starts at 1 because of the initial display list for epoch 0 that we send to WR
|
||||
epoch: Cell::new(Epoch(1)),
|
||||
viewport_size: Size2D::new(
|
||||
Au::from_f32_px(config.window_size.initial_viewport.width),
|
||||
Au::from_f32_px(config.window_size.initial_viewport.height),
|
||||
Au::from_f32_px(config.viewport_details.size.width),
|
||||
Au::from_f32_px(config.viewport_details.size.height),
|
||||
),
|
||||
compositor_api: config.compositor_api,
|
||||
scroll_offsets: Default::default(),
|
||||
|
@ -618,11 +619,15 @@ impl LayoutThread {
|
|||
};
|
||||
|
||||
let had_used_viewport_units = self.stylist.device().used_viewport_units();
|
||||
let viewport_size_changed = self.viewport_did_change(reflow_request.window_size);
|
||||
let viewport_size_changed = self.viewport_did_change(reflow_request.viewport_details);
|
||||
let theme_changed = self.theme_did_change(reflow_request.theme);
|
||||
|
||||
if viewport_size_changed || theme_changed {
|
||||
self.update_device(reflow_request.window_size, reflow_request.theme, &guards);
|
||||
self.update_device(
|
||||
reflow_request.viewport_details,
|
||||
reflow_request.theme,
|
||||
&guards,
|
||||
);
|
||||
}
|
||||
|
||||
if viewport_size_changed && had_used_viewport_units {
|
||||
|
@ -951,11 +956,11 @@ impl LayoutThread {
|
|||
}
|
||||
}
|
||||
|
||||
fn viewport_did_change(&mut self, window_size_data: WindowSizeData) -> bool {
|
||||
let new_pixel_ratio = window_size_data.device_pixel_ratio.get();
|
||||
fn viewport_did_change(&mut self, viewport_details: ViewportDetails) -> bool {
|
||||
let new_pixel_ratio = viewport_details.hidpi_scale_factor.get();
|
||||
let new_viewport_size = Size2D::new(
|
||||
Au::from_f32_px(window_size_data.initial_viewport.width),
|
||||
Au::from_f32_px(window_size_data.initial_viewport.height),
|
||||
Au::from_f32_px(viewport_details.size.width),
|
||||
Au::from_f32_px(viewport_details.size.height),
|
||||
);
|
||||
|
||||
// TODO: eliminate self.viewport_size in favour of using self.device.au_viewport_size()
|
||||
|
@ -975,15 +980,15 @@ impl LayoutThread {
|
|||
/// Update layout given a new viewport. Returns true if the viewport changed or false if it didn't.
|
||||
fn update_device(
|
||||
&mut self,
|
||||
window_size_data: WindowSizeData,
|
||||
viewport_details: ViewportDetails,
|
||||
theme: PrefersColorScheme,
|
||||
guards: &StylesheetGuards,
|
||||
) {
|
||||
let device = Device::new(
|
||||
MediaType::screen(),
|
||||
self.stylist.quirks_mode(),
|
||||
window_size_data.initial_viewport,
|
||||
Scale::new(window_size_data.device_pixel_ratio.get()),
|
||||
viewport_details.size,
|
||||
Scale::new(viewport_details.hidpi_scale_factor.get()),
|
||||
Box::new(LayoutFontMetricsProvider(self.font_context.clone())),
|
||||
self.stylist.device().default_computed_values().to_arc(),
|
||||
theme,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue