diff options
author | Josh Matthews <josh@joshmatthews.net> | 2020-01-15 11:09:37 -0500 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2020-01-15 11:09:37 -0500 |
commit | c385953c97d5f1eb0190487c314274c02904b7f7 (patch) | |
tree | 5f651d733950a07d2ff44a1a5f99f56bc6baabc0 /components | |
parent | 9a518cf7979b79b34611135d09c1dd0a96945255 (diff) | |
download | servo-jdm-revert4.tar.gz servo-jdm-revert4.zip |
Revert "Auto merge of #24677 - jdm:iframe-sizing-cleanup, r=asajeffrey"jdm-revert4
This reverts commit 9a518cf7979b79b34611135d09c1dd0a96945255, reversing
changes made to a33d493a4ff6f8a629a9b82202c49c41ecbefa49.
Diffstat (limited to 'components')
-rw-r--r-- | components/compositing/compositor.rs | 21 | ||||
-rw-r--r-- | components/constellation/constellation.rs | 40 | ||||
-rw-r--r-- | components/constellation/pipeline.rs | 26 | ||||
-rw-r--r-- | components/constellation/session_history.rs | 5 | ||||
-rw-r--r-- | components/layout/display_list/builder.rs | 19 | ||||
-rw-r--r-- | components/layout/query.rs | 12 | ||||
-rw-r--r-- | components/layout_2020/query.rs | 11 | ||||
-rw-r--r-- | components/layout_thread/lib.rs | 42 | ||||
-rw-r--r-- | components/layout_thread_2020/lib.rs | 37 | ||||
-rw-r--r-- | components/layout_traits/lib.rs | 7 | ||||
-rw-r--r-- | components/script/dom/htmliframeelement.rs | 18 | ||||
-rw-r--r-- | components/script/dom/window.rs | 13 | ||||
-rw-r--r-- | components/script/script_thread.rs | 10 | ||||
-rw-r--r-- | components/script_layout_interface/Cargo.toml | 1 | ||||
-rw-r--r-- | components/script_layout_interface/message.rs | 6 | ||||
-rw-r--r-- | components/script_layout_interface/rpc.rs | 4 | ||||
-rw-r--r-- | components/script_traits/lib.rs | 4 | ||||
-rw-r--r-- | components/servo/lib.rs | 37 |
18 files changed, 150 insertions, 163 deletions
diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 3df7e1a8a0c..94f578d48f1 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -209,6 +209,9 @@ pub struct IOCompositor<Window: WindowMethods + ?Sized> { /// True to translate mouse input into touch events. convert_mouse_to_touch: bool, + + /// Ratio of device pixels per px at the default scale. + device_pixels_per_px: Option<f32>, } #[derive(Clone, Copy)] @@ -281,6 +284,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> { is_running_problem_test: bool, exit_after_load: bool, convert_mouse_to_touch: bool, + device_pixels_per_px: Option<f32>, ) -> Self { let composite_target = match output_file { Some(_) => CompositeTarget::PngFile, @@ -323,6 +327,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> { is_running_problem_test, exit_after_load, convert_mouse_to_touch, + device_pixels_per_px, } } @@ -333,6 +338,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> { is_running_problem_test: bool, exit_after_load: bool, convert_mouse_to_touch: bool, + device_pixels_per_px: Option<f32>, ) -> Self { let mut compositor = IOCompositor::new( window, @@ -341,11 +347,15 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> { is_running_problem_test, exit_after_load, convert_mouse_to_touch, + device_pixels_per_px, ); // Set the size of the root layer. compositor.update_zoom_transform(); + // Tell the constellation about the initial window size. + compositor.send_window_size(WindowSizeType::Initial); + compositor } @@ -635,6 +645,8 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> { self.create_pipeline_details_for_frame_tree(&frame_tree); + self.send_window_size(WindowSizeType::Initial); + self.frame_tree_id.next(); } @@ -1069,10 +1081,13 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> { } fn hidpi_factor(&self) -> Scale<f32, DeviceIndependentPixel, DevicePixel> { - if self.output_file.is_some() { - return Scale::new(1.0); + match self.device_pixels_per_px { + Some(device_pixels_per_px) => Scale::new(device_pixels_per_px), + None => match self.output_file { + Some(_) => Scale::new(1.0), + None => self.embedder_coordinates.hidpi_factor, + }, } - self.embedder_coordinates.hidpi_factor } fn device_pixels_per_page_px(&self) -> Scale<f32, CSSPixel, DevicePixel> { diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index 807495ff3f1..685f620f6b5 100644 --- a/components/constellation/constellation.rs +++ b/components/constellation/constellation.rs @@ -112,7 +112,7 @@ use compositing::SendableFrameTree; use crossbeam_channel::{after, never, unbounded, Receiver, Sender}; use devtools_traits::{ChromeToDevtoolsControlMsg, DevtoolsControlMsg}; use embedder_traits::{Cursor, EmbedderMsg, EmbedderProxy, EventLoopWaker}; -use euclid::{default::Size2D as UntypedSize2D, Size2D}; +use euclid::{default::Size2D as UntypedSize2D, Scale, Size2D}; use gfx::font_cache_thread::FontCacheThread; use gfx_traits::Epoch; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; @@ -157,6 +157,7 @@ use script_traits::{MessagePortMsg, PortMessageTask, StructuredSerializedData}; use script_traits::{SWManagerMsg, ScopeThings, UpdatePipelineIdReason, WebDriverCommandMsg}; use serde::{Deserialize, Serialize}; use servo_config::{opts, pref}; +use servo_geometry::DeviceIndependentPixel; use servo_rand::{random, Rng, ServoRng, SliceRandom}; use servo_remutex::ReentrantMutex; use servo_url::{Host, ImmutableOrigin, ServoUrl}; @@ -462,6 +463,10 @@ pub struct Constellation<Message, LTF, STF> { /// Mechanism to force the compositor to process events. event_loop_waker: Option<Box<dyn EventLoopWaker>>, + + /// The ratio of device pixels per px at the default scale. If unspecified, will use the + /// platform default setting. + device_pixels_per_px: Option<f32>, } /// State needed to construct a constellation. @@ -518,6 +523,10 @@ pub struct InitialConstellationState { /// Mechanism to force the compositor to process events. pub event_loop_waker: Option<Box<dyn EventLoopWaker>>, + + /// The ratio of device pixels per px at the default scale. If unspecified, will use the + /// platform default setting. + pub device_pixels_per_px: Option<f32>, } /// Data needed for webdriver @@ -693,7 +702,8 @@ where /// Create a new constellation thread. pub fn start( state: InitialConstellationState, - initial_window_size: WindowSizeData, + initial_window_size: Size2D<u32, DeviceIndependentPixel>, + device_pixels_per_px: Option<f32>, random_pipeline_closure_probability: Option<f32>, random_pipeline_closure_seed: Option<usize>, is_running_problem_test: bool, @@ -801,7 +811,10 @@ where next_pipeline_namespace_id: PipelineNamespaceId(2), time_profiler_chan: state.time_profiler_chan, mem_profiler_chan: state.mem_profiler_chan, - window_size: initial_window_size, + window_size: WindowSizeData { + initial_viewport: initial_window_size.to_f32() * Scale::new(1.0), + device_pixel_ratio: Scale::new(device_pixels_per_px.unwrap_or(1.0)), + }, phantom: PhantomData, webdriver: WebDriverData::new(), timer_scheduler: TimerScheduler::new(), @@ -831,6 +844,7 @@ where glplayer_threads: state.glplayer_threads, player_context: state.player_context, event_loop_waker: state.event_loop_waker, + device_pixels_per_px, }; constellation.run(); @@ -1060,12 +1074,10 @@ where resource_threads, time_profiler_chan: self.time_profiler_chan.clone(), mem_profiler_chan: self.mem_profiler_chan.clone(), - window_size: WindowSizeData { - initial_viewport: initial_window_size, - device_pixel_ratio: self.window_size.device_pixel_ratio, - }, + window_size: initial_window_size, event_loop, load_data, + device_pixel_ratio: self.window_size.device_pixel_ratio, prev_visibility: is_visible, webrender_api_sender: self.webrender_api_sender.clone(), webrender_document: self.webrender_document, @@ -1077,6 +1089,7 @@ where webxr_registry: self.webxr_registry.clone(), player_context: self.player_context.clone(), event_loop_waker: self.event_loop_waker.as_ref().map(|w| (*w).clone_box()), + device_pixels_per_px: self.device_pixels_per_px, }); let pipeline = match result { @@ -2216,7 +2229,6 @@ where new_pipeline_id: new_pipeline_id, replace: None, new_browsing_context_info: None, - window_size, }); } @@ -2361,7 +2373,6 @@ where is_private: is_private, is_visible: is_visible, }), - window_size, }); } @@ -2533,10 +2544,6 @@ where // https://github.com/rust-lang/rust/issues/59159 let browsing_context_size = browsing_context.size; let browsing_context_is_visible = browsing_context.is_visible; - debug_assert_eq!( - browsing_context_size, - load_info.window_size.initial_viewport - ); // Create the new pipeline, attached to the parent and push to pending changes self.new_pipeline( @@ -2558,7 +2565,6 @@ where replace: replace, // Browsing context for iframe already exists. new_browsing_context_info: None, - window_size: load_info.window_size.initial_viewport, }); } @@ -2617,7 +2623,6 @@ where is_private: is_private, is_visible: is_parent_visible, }), - window_size: load_info.window_size.initial_viewport, }); } @@ -2706,7 +2711,6 @@ where is_private: is_opener_private, is_visible: is_opener_visible, }), - window_size: self.window_size.initial_viewport, }); } @@ -2910,7 +2914,6 @@ where replace, // `load_url` is always invoked on an existing browsing context. new_browsing_context_info: None, - window_size, }); Some(new_pipeline_id) }, @@ -3230,7 +3233,6 @@ where replace: Some(NeedsToReload::Yes(pipeline_id, load_data)), // Browsing context must exist at this point. new_browsing_context_info: None, - window_size, }); return; }, @@ -3988,7 +3990,7 @@ where change.top_level_browsing_context_id, change.new_pipeline_id, new_context_info.parent_pipeline_id, - change.window_size, + self.window_size.initial_viewport, //XXXjdm is this valid? new_context_info.is_private, new_context_info.is_visible, ); diff --git a/components/constellation/pipeline.rs b/components/constellation/pipeline.rs index 3ac5ded15ed..2579343f3fe 100644 --- a/components/constellation/pipeline.rs +++ b/components/constellation/pipeline.rs @@ -12,6 +12,7 @@ use compositing::CompositorProxy; use crossbeam_channel::{unbounded, Sender}; use devtools_traits::{DevtoolsControlMsg, ScriptToDevtoolsControlMsg}; use embedder_traits::EventLoopWaker; +use euclid::{Scale, Size2D}; use gfx::font_cache_thread::FontCacheThread; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; use ipc_channel::router::ROUTER; @@ -46,6 +47,8 @@ use std::process; use std::rc::Rc; use std::sync::atomic::AtomicBool; use std::sync::Arc; +use style_traits::CSSPixel; +use style_traits::DevicePixel; use webvr_traits::WebVRMsg; /// A `Pipeline` is the constellation's view of a `Document`. Each pipeline has an @@ -162,7 +165,10 @@ pub struct InitialPipelineState { pub mem_profiler_chan: profile_mem::ProfilerChan, /// Information about the initial window size. - pub window_size: WindowSizeData, + pub window_size: Size2D<f32, CSSPixel>, + + /// Information about the device pixel ratio. + pub device_pixel_ratio: Scale<f32, CSSPixel, DevicePixel>, /// The ID of the pipeline namespace for this script thread. pub pipeline_namespace_id: PipelineNamespaceId, @@ -199,6 +205,10 @@ pub struct InitialPipelineState { /// Mechanism to force the compositor to process events. pub event_loop_waker: Option<Box<dyn EventLoopWaker>>, + + /// The ratio of device pixels per px at the default scale. If unspecified, will use the + /// platform default setting. + pub device_pixels_per_px: Option<f32>, } pub struct NewPipeline { @@ -218,6 +228,11 @@ impl Pipeline { // probably requires a general low-memory strategy. let (pipeline_chan, pipeline_port) = ipc::channel().expect("Pipeline main chan"); + let window_size = WindowSizeData { + initial_viewport: state.window_size, + device_pixel_ratio: state.device_pixel_ratio, + }; + let (script_chan, sampler_chan) = match state.event_loop { Some(script_chan) => { let new_layout_info = NewLayoutInfo { @@ -227,7 +242,7 @@ impl Pipeline { top_level_browsing_context_id: state.top_level_browsing_context_id, opener: state.opener, load_data: state.load_data.clone(), - window_size: state.window_size, + window_size: window_size, pipeline_port: pipeline_port, }; @@ -286,7 +301,7 @@ impl Pipeline { resource_threads: state.resource_threads, time_profiler_chan: state.time_profiler_chan, mem_profiler_chan: state.mem_profiler_chan, - window_size: state.window_size, + window_size: window_size, layout_to_constellation_chan: state.layout_to_constellation_chan, script_chan: script_chan.clone(), load_data: state.load_data.clone(), @@ -301,6 +316,7 @@ impl Pipeline { webvr_chan: state.webvr_chan, webxr_registry: state.webxr_registry, player_context: state.player_context, + device_pixels_per_px: state.device_pixels_per_px, }; // Spawn the child process. @@ -507,6 +523,7 @@ pub struct UnprivilegedPipelineContent { webvr_chan: Option<IpcSender<WebVRMsg>>, webxr_registry: webxr_api::Registry, player_context: WindowGLContext, + device_pixels_per_px: Option<f32>, } impl UnprivilegedPipelineContent { @@ -597,7 +614,8 @@ impl UnprivilegedPipelineContent { paint_time_metrics, layout_thread_busy_flag.clone(), self.opts.load_webfonts_synchronously, - self.window_size, + self.opts.initial_window_size, + self.device_pixels_per_px, self.opts.dump_display_list, self.opts.dump_display_list_json, self.opts.dump_style_tree, diff --git a/components/constellation/session_history.rs b/components/constellation/session_history.rs index 3e15591215e..0fdcd129baa 100644 --- a/components/constellation/session_history.rs +++ b/components/constellation/session_history.rs @@ -3,7 +3,6 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::browsingcontext::NewBrowsingContextInfo; -use euclid::Size2D; use msg::constellation_msg::{ BrowsingContextId, HistoryStateId, PipelineId, TopLevelBrowsingContextId, }; @@ -11,7 +10,6 @@ use script_traits::LoadData; use servo_url::ServoUrl; use std::cmp::PartialEq; use std::{fmt, mem}; -use style_traits::CSSPixel; /// Represents the joint session history /// https://html.spec.whatwg.org/multipage/#joint-session-history @@ -124,9 +122,6 @@ pub struct SessionHistoryChange { /// Holds data for not-yet constructed browsing contexts that are not /// easily available when they need to be constructed. pub new_browsing_context_info: Option<NewBrowsingContextInfo>, - - /// The size of the viewport for the browsing context. - pub window_size: Size2D<f32, CSSPixel>, } /// Represents a pipeline or discarded pipeline in a history entry. diff --git a/components/layout/display_list/builder.rs b/components/layout/display_list/builder.rs index c44324d43a1..f951bd3f8f2 100644 --- a/components/layout/display_list/builder.rs +++ b/components/layout/display_list/builder.rs @@ -1800,9 +1800,18 @@ impl Fragment { Some(browsing_context_id) => browsing_context_id, None => return warn!("No browsing context id for iframe."), }; + let pipeline_id = match fragment_info.pipeline_id { + Some(pipeline_id) => pipeline_id, + None => return warn!("No pipeline id for iframe {}.", browsing_context_id), + }; let base = create_base_display_item(state); let bounds = stacking_relative_content_box.to_layout(); + let item = DisplayItem::Iframe(Box::new(IframeDisplayItem { + base, + bounds, + iframe: pipeline_id, + })); // XXXjdm: This sleight-of-hand to convert LayoutRect -> Size2D<CSSPixel> // looks bogus. @@ -1811,16 +1820,6 @@ impl Fragment { size: euclid::Size2D::new(bounds.size.width, bounds.size.height), }); - let pipeline_id = match fragment_info.pipeline_id { - Some(pipeline_id) => pipeline_id, - None => return warn!("No pipeline id for iframe {}.", browsing_context_id), - }; - - let item = DisplayItem::Iframe(Box::new(IframeDisplayItem { - base, - bounds, - iframe: pipeline_id, - })); state.add_display_item(item); } }, diff --git a/components/layout/query.rs b/components/layout/query.rs index 4850b75009c..8dfd1bab795 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -16,7 +16,6 @@ use crate::sequential; use crate::wrapper::LayoutNodeLayoutData; use app_units::Au; use euclid::default::{Point2D, Rect, Size2D, Vector2D}; -use euclid::Size2D as TypedSize2D; use ipc_channel::ipc::IpcSender; use msg::constellation_msg::PipelineId; use script_layout_interface::rpc::TextIndexResponse; @@ -41,7 +40,7 @@ use style::dom::TElement; use style::logical_geometry::{BlockFlowDirection, InlineBaseDirection, WritingMode}; use style::properties::{style_structs, LonghandId, PropertyDeclarationId, PropertyId}; use style::selector_parser::PseudoElement; -use style_traits::{CSSPixel, ToCss}; +use style_traits::ToCss; use webrender_api::ExternalScrollId; /// Mutable data belonging to the LayoutThread. @@ -91,9 +90,6 @@ pub struct LayoutThreadData { /// A queued response for the inner text of a given element. pub element_inner_text_response: String, - - /// A queued response for the viewport dimensions for a given browsing context. - pub inner_window_dimensions_response: Option<TypedSize2D<f32, CSSPixel>>, } pub struct LayoutRPCImpl(pub Arc<Mutex<LayoutThreadData>>); @@ -197,12 +193,6 @@ impl LayoutRPC for LayoutRPCImpl { let rw_data = rw_data.lock().unwrap(); rw_data.element_inner_text_response.clone() } - - fn inner_window_dimensions(&self) -> Option<TypedSize2D<f32, CSSPixel>> { - let &LayoutRPCImpl(ref rw_data) = self; - let rw_data = rw_data.lock().unwrap(); - rw_data.inner_window_dimensions_response.clone() - } } struct UnioningFragmentBorderBoxIterator { diff --git a/components/layout_2020/query.rs b/components/layout_2020/query.rs index 1317759b33b..23816521c70 100644 --- a/components/layout_2020/query.rs +++ b/components/layout_2020/query.rs @@ -7,7 +7,6 @@ use crate::context::LayoutContext; use app_units::Au; use euclid::default::{Point2D, Rect}; -use euclid::Size2D; use euclid::Vector2D; use ipc_channel::ipc::IpcSender; use msg::constellation_msg::PipelineId; @@ -23,7 +22,6 @@ use std::sync::{Arc, Mutex}; use style::dom::OpaqueNode; use style::properties::PropertyId; use style::selector_parser::PseudoElement; -use style_traits::CSSPixel; use webrender_api::units::LayoutPixel; use webrender_api::ExternalScrollId; @@ -72,9 +70,6 @@ pub struct LayoutThreadData { /// A queued response for the inner text of a given element. pub element_inner_text_response: String, - - /// A queued response for the viewport dimensions for a given browsing context. - pub inner_window_dimensions_response: Option<Size2D<f32, CSSPixel>>, } pub struct LayoutRPCImpl(pub Arc<Mutex<LayoutThreadData>>); @@ -155,12 +150,6 @@ impl LayoutRPC for LayoutRPCImpl { let rw_data = rw_data.lock().unwrap(); rw_data.element_inner_text_response.clone() } - - fn inner_window_dimensions(&self) -> Option<Size2D<f32, CSSPixel>> { - let &LayoutRPCImpl(ref rw_data) = self; - let rw_data = rw_data.lock().unwrap(); - rw_data.inner_window_dimensions_response.clone() - } } pub fn process_content_box_request(_requested_node: OpaqueNode) -> Option<Rect<Au>> { diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs index 48b7591c242..84ace1c1efe 100644 --- a/components/layout_thread/lib.rs +++ b/components/layout_thread/lib.rs @@ -86,13 +86,13 @@ use script_layout_interface::wrapper_traits::LayoutNode; use script_traits::Painter; use script_traits::{ConstellationControlMsg, LayoutControlMsg, LayoutMsg as ConstellationMsg}; use script_traits::{DrawAPaintImageResult, IFrameSizeMsg, PaintWorkletError, WindowSizeType}; -use script_traits::{ScrollState, UntrustedNodeAddress, WindowSizeData}; +use script_traits::{ScrollState, UntrustedNodeAddress}; use selectors::Element; use servo_arc::Arc as ServoArc; use servo_atoms::Atom; use servo_config::opts; use servo_config::pref; -use servo_geometry::MaxRect; +use servo_geometry::{DeviceIndependentPixel, MaxRect}; use servo_url::ServoUrl; use std::borrow::ToOwned; use std::cell::{Cell, RefCell}; @@ -254,6 +254,13 @@ pub struct LayoutThread { /// Load web fonts synchronously to avoid non-deterministic network-driven reflows. load_webfonts_synchronously: bool, + /// The initial request size of the window + initial_window_size: Size2D<u32, DeviceIndependentPixel>, + + /// The ratio of device pixels per px at the default scale. + /// If unspecified, will use the platform default setting. + device_pixels_per_px: Option<f32>, + /// Dumps the display list form after a layout. dump_display_list: bool, @@ -304,7 +311,8 @@ impl LayoutThreadFactory for LayoutThread { paint_time_metrics: PaintTimeMetrics, busy: Arc<AtomicBool>, load_webfonts_synchronously: bool, - window_size: WindowSizeData, + initial_window_size: Size2D<u32, DeviceIndependentPixel>, + device_pixels_per_px: Option<f32>, dump_display_list: bool, dump_display_list_json: bool, dump_style_tree: bool, @@ -352,7 +360,8 @@ impl LayoutThreadFactory for LayoutThread { paint_time_metrics, busy, load_webfonts_synchronously, - window_size, + initial_window_size, + device_pixels_per_px, dump_display_list, dump_display_list_json, dump_style_tree, @@ -522,7 +531,8 @@ impl LayoutThread { paint_time_metrics: PaintTimeMetrics, busy: Arc<AtomicBool>, load_webfonts_synchronously: bool, - window_size: WindowSizeData, + initial_window_size: Size2D<u32, DeviceIndependentPixel>, + device_pixels_per_px: Option<f32>, dump_display_list: bool, dump_display_list_json: bool, dump_style_tree: bool, @@ -532,10 +542,12 @@ impl LayoutThread { trace_layout: bool, dump_flow_tree: bool, ) -> LayoutThread { + // The device pixel ratio is incorrect (it does not have the hidpi value), + // but it will be set correctly when the initial reflow takes place. let device = Device::new( MediaType::screen(), - window_size.initial_viewport, - window_size.device_pixel_ratio, + initial_window_size.to_f32() * Scale::new(1.0), + Scale::new(device_pixels_per_px.unwrap_or(1.0)), ); // Create the channel on which new animations can be sent. @@ -597,7 +609,6 @@ impl LayoutThread { text_index_response: TextIndexResponse(None), nodes_from_point_response: vec![], element_inner_text_response: String::new(), - inner_window_dimensions_response: None, })), webrender_image_cache: Arc::new(RwLock::new(FnvHashMap::default())), timer: if pref!(layout.animations.test.enabled) { @@ -610,6 +621,8 @@ impl LayoutThread { last_iframe_sizes: Default::default(), busy, load_webfonts_synchronously, + initial_window_size, + device_pixels_per_px, dump_display_list, dump_display_list_json, dump_style_tree, @@ -940,7 +953,8 @@ impl LayoutThread { info.paint_time_metrics, info.layout_is_busy, self.load_webfonts_synchronously, - info.window_size, + self.initial_window_size, + self.device_pixels_per_px, self.dump_display_list, self.dump_display_list_json, self.dump_style_tree, @@ -1319,9 +1333,6 @@ impl LayoutThread { &QueryMsg::ElementInnerTextQuery(_) => { rw_data.element_inner_text_response = String::new(); }, - &QueryMsg::InnerWindowDimensionsQuery(_) => { - rw_data.inner_window_dimensions_response = None; - }, }, ReflowGoal::Full | ReflowGoal::TickAnimations => {}, } @@ -1674,13 +1685,6 @@ impl LayoutThread { rw_data.element_inner_text_response = process_element_inner_text_query(node, &rw_data.indexable_text); }, - &QueryMsg::InnerWindowDimensionsQuery(browsing_context_id) => { - rw_data.inner_window_dimensions_response = self - .last_iframe_sizes - .borrow() - .get(&browsing_context_id) - .cloned(); - }, }, ReflowGoal::Full | ReflowGoal::TickAnimations => {}, } diff --git a/components/layout_thread_2020/lib.rs b/components/layout_thread_2020/lib.rs index 106dace088b..13cf35975ee 100644 --- a/components/layout_thread_2020/lib.rs +++ b/components/layout_thread_2020/lib.rs @@ -67,12 +67,13 @@ use script_layout_interface::rpc::{LayoutRPC, OffsetParentResponse, StyleRespons use script_traits::Painter; use script_traits::{ConstellationControlMsg, LayoutControlMsg, LayoutMsg as ConstellationMsg}; use script_traits::{DrawAPaintImageResult, PaintWorkletError}; -use script_traits::{ScrollState, UntrustedNodeAddress, WindowSizeData}; +use script_traits::{ScrollState, UntrustedNodeAddress}; use selectors::Element; use servo_arc::Arc as ServoArc; use servo_atoms::Atom; use servo_config::opts; use servo_config::pref; +use servo_geometry::DeviceIndependentPixel; use servo_url::ServoUrl; use std::cell::{Cell, RefCell}; use std::collections::HashMap; @@ -211,6 +212,13 @@ pub struct LayoutThread { /// Load web fonts synchronously to avoid non-deterministic network-driven reflows. load_webfonts_synchronously: bool, + /// The initial request size of the window + initial_window_size: Size2D<u32, DeviceIndependentPixel>, + + /// The ratio of device pixels per px at the default scale. + /// If unspecified, will use the platform default setting. + device_pixels_per_px: Option<f32>, + /// Emits notifications when there is a relayout. relayout_event: bool, } @@ -238,7 +246,8 @@ impl LayoutThreadFactory for LayoutThread { paint_time_metrics: PaintTimeMetrics, busy: Arc<AtomicBool>, load_webfonts_synchronously: bool, - window_size: WindowSizeData, + initial_window_size: Size2D<u32, DeviceIndependentPixel>, + device_pixels_per_px: Option<f32>, _dump_display_list: bool, _dump_display_list_json: bool, _dump_style_tree: bool, @@ -285,7 +294,8 @@ impl LayoutThreadFactory for LayoutThread { paint_time_metrics, busy, load_webfonts_synchronously, - window_size, + initial_window_size, + device_pixels_per_px, relayout_event, ); @@ -447,15 +457,16 @@ impl LayoutThread { paint_time_metrics: PaintTimeMetrics, busy: Arc<AtomicBool>, load_webfonts_synchronously: bool, - window_size: WindowSizeData, + initial_window_size: Size2D<u32, DeviceIndependentPixel>, + device_pixels_per_px: Option<f32>, relayout_event: bool, ) -> LayoutThread { // The device pixel ratio is incorrect (it does not have the hidpi value), // but it will be set correctly when the initial reflow takes place. let device = Device::new( MediaType::screen(), - window_size.initial_viewport, - window_size.device_pixel_ratio, + initial_window_size.to_f32() * Scale::new(1.0), + Scale::new(device_pixels_per_px.unwrap_or(1.0)), ); // Create the channel on which new animations can be sent. @@ -512,7 +523,6 @@ impl LayoutThread { text_index_response: TextIndexResponse(None), nodes_from_point_response: vec![], element_inner_text_response: String::new(), - inner_window_dimensions_response: None, })), timer: if pref!(layout.animations.test.enabled) { Timer::test_mode() @@ -522,6 +532,8 @@ impl LayoutThread { paint_time_metrics: paint_time_metrics, busy, load_webfonts_synchronously, + initial_window_size, + device_pixels_per_px, relayout_event, } } @@ -807,7 +819,8 @@ impl LayoutThread { info.paint_time_metrics, info.layout_is_busy, self.load_webfonts_synchronously, - info.window_size, + self.initial_window_size, + self.device_pixels_per_px, false, // dump_display_list false, // dump_display_list_json false, // dump_style_tree @@ -924,9 +937,6 @@ impl LayoutThread { &QueryMsg::ElementInnerTextQuery(_) => { rw_data.element_inner_text_response = String::new(); }, - &QueryMsg::InnerWindowDimensionsQuery(_) => { - rw_data.inner_window_dimensions_response = None; - }, }, ReflowGoal::Full | ReflowGoal::TickAnimations => {}, } @@ -1179,11 +1189,6 @@ impl LayoutThread { let node = unsafe { ServoLayoutNode::new(&node) }; rw_data.element_inner_text_response = process_element_inner_text_query(node); }, - &QueryMsg::InnerWindowDimensionsQuery(_browsing_context_id) => { - // TODO(jdm): port the iframe sizing code from layout2013's display - // builder in order to support query iframe sizing. - rw_data.inner_window_dimensions_response = None; - }, }, ReflowGoal::Full | ReflowGoal::TickAnimations => {}, } diff --git a/components/layout_traits/lib.rs b/components/layout_traits/lib.rs index b499bef85c6..cfb824f6c98 100644 --- a/components/layout_traits/lib.rs +++ b/components/layout_traits/lib.rs @@ -10,6 +10,7 @@ // that these modules won't have to depend on layout. use crossbeam_channel::{Receiver, Sender}; +use euclid::Size2D; use gfx::font_cache_thread::FontCacheThread; use ipc_channel::ipc::{IpcReceiver, IpcSender}; use metrics::PaintTimeMetrics; @@ -18,7 +19,8 @@ use msg::constellation_msg::{BackgroundHangMonitorRegister, PipelineId}; use net_traits::image_cache::ImageCache; use profile_traits::{mem, time}; use script_traits::LayoutMsg as ConstellationMsg; -use script_traits::{ConstellationControlMsg, LayoutControlMsg, WindowSizeData}; +use script_traits::{ConstellationControlMsg, LayoutControlMsg}; +use servo_geometry::DeviceIndependentPixel; use servo_url::ServoUrl; use std::sync::atomic::AtomicBool; use std::sync::Arc; @@ -46,7 +48,8 @@ pub trait LayoutThreadFactory { paint_time_metrics: PaintTimeMetrics, busy: Arc<AtomicBool>, load_webfonts_synchronously: bool, - window_size: WindowSizeData, + initial_window_size: Size2D<u32, DeviceIndependentPixel>, + device_pixels_per_px: Option<f32>, dump_display_list: bool, dump_display_list_json: bool, dump_style_tree: bool, diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs index e58e65ea5bb..f5a820458c2 100644 --- a/components/script/dom/htmliframeelement.rs +++ b/components/script/dom/htmliframeelement.rs @@ -28,6 +28,7 @@ use crate::dom::windowproxy::WindowProxy; use crate::script_thread::ScriptThread; use crate::task_source::TaskSource; use dom_struct::dom_struct; +use euclid::Size2D; use html5ever::{LocalName, Prefix}; use ipc_channel::ipc; use msg::constellation_msg::{BrowsingContextId, PipelineId, TopLevelBrowsingContextId}; @@ -172,13 +173,6 @@ impl HTMLIFrameElement { replace: replace, }; - let window_size = WindowSizeData { - initial_viewport: window - .inner_window_dimensions_query(browsing_context_id) - .unwrap_or_default(), - device_pixel_ratio: window.device_pixel_ratio(), - }; - match nav_type { NavigationType::InitialAboutBlank => { let (pipeline_sender, pipeline_receiver) = ipc::channel().unwrap(); @@ -190,7 +184,6 @@ impl HTMLIFrameElement { load_data: load_data.clone(), old_pipeline_id: old_pipeline_id, sandbox: sandboxed, - window_size, }; global_scope .script_to_constellation_chan() @@ -205,7 +198,13 @@ impl HTMLIFrameElement { opener: None, load_data: load_data, pipeline_port: pipeline_receiver, - window_size, + window_size: WindowSizeData { + initial_viewport: { + let rect = self.upcast::<Node>().bounding_content_box_or_zero(); + Size2D::new(rect.size.width.to_f32_px(), rect.size.height.to_f32_px()) + }, + device_pixel_ratio: window.device_pixel_ratio(), + }, }; self.pipeline_id.set(Some(new_pipeline_id)); @@ -217,7 +216,6 @@ impl HTMLIFrameElement { load_data: load_data, old_pipeline_id: old_pipeline_id, sandbox: sandboxed, - window_size, }; global_scope .script_to_constellation_chan() diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 95326b46352..70099ee5866 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -89,7 +89,7 @@ use js::jsval::{JSVal, NullValue}; use js::rust::wrappers::JS_DefineProperty; use js::rust::{CustomAutoRooter, CustomAutoRooterGuard, HandleValue}; use media::WindowGLContext; -use msg::constellation_msg::{BrowsingContextId, PipelineId}; +use msg::constellation_msg::PipelineId; use net_traits::image_cache::{ImageCache, ImageResponder, ImageResponse}; use net_traits::image_cache::{PendingImageId, PendingImageResponse}; use net_traits::storage_thread::StorageType; @@ -1829,16 +1829,6 @@ impl Window { DOMString::from(resolved) } - pub fn inner_window_dimensions_query( - &self, - browsing_context: BrowsingContextId, - ) -> Option<Size2D<f32, CSSPixel>> { - if !self.layout_reflow(QueryMsg::InnerWindowDimensionsQuery(browsing_context)) { - return None; - } - self.layout_rpc.inner_window_dimensions() - } - #[allow(unsafe_code)] pub fn offset_parent_query(&self, node: &Node) -> (Option<DomRoot<Element>>, UntypedRect<Au>) { if !self.layout_reflow(QueryMsg::OffsetParentQuery(node.to_opaque())) { @@ -2369,7 +2359,6 @@ fn debug_reflow_events(id: PipelineId, reflow_goal: &ReflowGoal, reason: &Reflow &QueryMsg::StyleQuery(_n) => "\tStyleQuery", &QueryMsg::TextIndexQuery(..) => "\tTextIndexQuery", &QueryMsg::ElementInnerTextQuery(_) => "\tElementInnerTextQuery", - &QueryMsg::InnerWindowDimensionsQuery(_) => "\tInnerWindowDimensionsQuery", }, }); diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 191df335ec5..6a7a69651e7 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -2392,7 +2392,6 @@ impl ScriptThread { load_data.url.clone(), ), layout_is_busy: layout_is_busy.clone(), - window_size, }); // Pick a layout thread, any layout thread @@ -3697,15 +3696,6 @@ impl ScriptThread { }; let window = document.window(); - if window.window_size() == new_size { - return; - } - debug!( - "resizing pipeline {:?} from {:?} to {:?}", - pipeline_id, - window.window_size(), - new_size - ); window.set_window_size(new_size); window.force_reflow(ReflowGoal::Full, ReflowReason::WindowResize); diff --git a/components/script_layout_interface/Cargo.toml b/components/script_layout_interface/Cargo.toml index 2e436761dc8..8ad33fc7d43 100644 --- a/components/script_layout_interface/Cargo.toml +++ b/components/script_layout_interface/Cargo.toml @@ -33,5 +33,4 @@ servo_arc = {path = "../servo_arc"} servo_atoms = {path = "../atoms"} servo_url = {path = "../url"} style = {path = "../style", features = ["servo"]} -style_traits = {path = "../style_traits", features = ["servo"]} webrender_api = {git = "https://github.com/servo/webrender", features = ["ipc"]} diff --git a/components/script_layout_interface/message.rs b/components/script_layout_interface/message.rs index fb2bac65d07..01a589d53cb 100644 --- a/components/script_layout_interface/message.rs +++ b/components/script_layout_interface/message.rs @@ -10,7 +10,7 @@ use euclid::default::{Point2D, Rect}; use gfx_traits::Epoch; use ipc_channel::ipc::{IpcReceiver, IpcSender}; use metrics::PaintTimeMetrics; -use msg::constellation_msg::{BackgroundHangMonitorRegister, BrowsingContextId, PipelineId}; +use msg::constellation_msg::{BackgroundHangMonitorRegister, PipelineId}; use net_traits::image_cache::ImageCache; use profile_traits::mem::ReportsChan; use script_traits::Painter; @@ -128,7 +128,6 @@ pub enum QueryMsg { ResolvedStyleQuery(TrustedNodeAddress, Option<PseudoElement>, PropertyId), StyleQuery(TrustedNodeAddress), ElementInnerTextQuery(TrustedNodeAddress), - InnerWindowDimensionsQuery(BrowsingContextId), } /// Any query to perform with this reflow. @@ -148,7 +147,6 @@ impl ReflowGoal { ReflowGoal::LayoutQuery(ref querymsg, _) => match *querymsg { QueryMsg::NodesFromPointQuery(..) | QueryMsg::TextIndexQuery(..) | - QueryMsg::InnerWindowDimensionsQuery(_) | QueryMsg::ElementInnerTextQuery(_) => true, QueryMsg::ContentBoxQuery(_) | QueryMsg::ContentBoxesQuery(_) | @@ -178,7 +176,6 @@ impl ReflowGoal { QueryMsg::NodeScrollIdQuery(_) | QueryMsg::ResolvedStyleQuery(..) | QueryMsg::OffsetParentQuery(_) | - QueryMsg::InnerWindowDimensionsQuery(_) | QueryMsg::StyleQuery(_) => false, }, } @@ -230,5 +227,4 @@ pub struct LayoutThreadInit { pub image_cache: Arc<dyn ImageCache>, pub paint_time_metrics: PaintTimeMetrics, pub layout_is_busy: Arc<AtomicBool>, - pub window_size: WindowSizeData, } diff --git a/components/script_layout_interface/rpc.rs b/components/script_layout_interface/rpc.rs index 19da8fa6afc..95d25082ed8 100644 --- a/components/script_layout_interface/rpc.rs +++ b/components/script_layout_interface/rpc.rs @@ -4,11 +4,9 @@ use app_units::Au; use euclid::default::Rect; -use euclid::Size2D; use script_traits::UntrustedNodeAddress; use servo_arc::Arc; use style::properties::ComputedValues; -use style_traits::CSSPixel; use webrender_api::ExternalScrollId; /// Synchronous messages that script can send to layout. @@ -41,8 +39,6 @@ pub trait LayoutRPC { fn nodes_from_point_response(&self) -> Vec<UntrustedNodeAddress>; /// Query layout to get the inner text for a given element. fn element_inner_text(&self) -> String; - /// Get the dimensions of an iframe's inner window. - fn inner_window_dimensions(&self) -> Option<Size2D<f32, CSSPixel>>; } pub struct ContentBoxResponse(pub Option<Rect<Au>>); diff --git a/components/script_traits/lib.rs b/components/script_traits/lib.rs index 468cfb19fb3..9dd0ba04134 100644 --- a/components/script_traits/lib.rs +++ b/components/script_traits/lib.rs @@ -739,8 +739,6 @@ pub struct IFrameLoadInfoWithData { pub old_pipeline_id: Option<PipelineId>, /// Sandbox type of this iframe pub sandbox: IFrameSandboxState, - /// The initial viewport size for this iframe. - pub window_size: WindowSizeData, } /// Specifies whether the script or layout thread needs to be ticked for animation. @@ -762,7 +760,7 @@ pub struct ScrollState { } /// Data about the window size. -#[derive(Clone, Copy, Debug, Deserialize, MallocSizeOf, PartialEq, Serialize)] +#[derive(Clone, Copy, Debug, Deserialize, MallocSizeOf, Serialize)] pub struct WindowSizeData { /// The size of the initial layout viewport, before parsing an /// <http://www.w3.org/TR/css-device-adapt/#initial-viewport> diff --git a/components/servo/lib.rs b/components/servo/lib.rs index 9a39856c762..71430b3f6f4 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -84,7 +84,7 @@ use constellation::{FromCompositorLogger, FromScriptLogger}; use crossbeam_channel::{unbounded, Sender}; use embedder_traits::{EmbedderMsg, EmbedderProxy, EmbedderReceiver, EventLoopWaker}; use env_logger::Builder as EnvLoggerBuilder; -use euclid::{Scale, Size2D}; +use euclid::Size2D; #[cfg(all( not(target_os = "windows"), not(target_os = "ios"), @@ -104,9 +104,7 @@ use profile::mem as profile_mem; use profile::time as profile_time; use profile_traits::mem; use profile_traits::time; -use script_traits::{ - ConstellationMsg, SWManagerSenders, ScriptToConstellationChan, WindowSizeData, -}; +use script_traits::{ConstellationMsg, SWManagerSenders, ScriptToConstellationChan}; use servo_config::opts; use servo_config::{pref, prefs}; use servo_media::player::context::GlContext; @@ -315,7 +313,11 @@ impl<Window> Servo<Window> where Window: WindowMethods + 'static + ?Sized, { - pub fn new(mut embedder: Box<dyn EmbedderMethods>, window: Rc<Window>) -> Servo<Window> { + pub fn new( + mut embedder: Box<dyn EmbedderMethods>, + window: Rc<Window>, + device_pixels_per_px: Option<f32>, + ) -> Servo<Window> { // Global configuration options, parsed from the command line. let opts = opts::get(); @@ -356,8 +358,6 @@ where let devtools_chan = opts.devtools_port.map(|port| devtools::start_server(port)); let coordinates = window.get_coordinates(); - let device_pixel_ratio = coordinates.hidpi_factor.get(); - let viewport_size = coordinates.viewport.size.to_f32() / device_pixel_ratio; let (mut webrender, webrender_api_sender) = { let renderer_kind = if opts::get().should_use_osmesa() { @@ -380,7 +380,12 @@ where let render_notifier = Box::new(RenderNotifier::new(compositor_proxy.clone())); // Cast from `DeviceIndependentPixel` to `DevicePixel` - let window_size = Size2D::from_untyped(viewport_size.to_i32().to_untyped()); + let device_pixel_ratio = coordinates.hidpi_factor.get(); + let window_size = Size2D::from_untyped( + (opts.initial_window_size.to_f32() / device_pixel_ratio) + .to_i32() + .to_untyped(), + ); webrender::Renderer::new( window.gl(), @@ -487,13 +492,6 @@ where let event_loop_waker = None; - // The division by 1 represents the page's default zoom of 100%, - // and gives us the appropriate CSSPixel type for the viewport. - let window_size = WindowSizeData { - initial_viewport: viewport_size / Scale::new(1.0), - device_pixel_ratio: Scale::new(device_pixel_ratio), - }; - // Create the constellation, which maintains the engine // pipelines, including the script and layout threads, as well // as the navigation context. @@ -515,7 +513,7 @@ where webvr_constellation_sender, glplayer_threads, event_loop_waker, - window_size, + device_pixels_per_px, ); // Send the constellation's swmanager sender to service worker manager thread @@ -547,6 +545,7 @@ where opts.is_running_problem_test, opts.exit_after_load, opts.convert_mouse_to_touch, + device_pixels_per_px, ); Servo { @@ -829,7 +828,7 @@ fn create_constellation( webvr_constellation_sender: Option<Sender<Sender<ConstellationMsg>>>, glplayer_threads: Option<GLPlayerThreads>, event_loop_waker: Option<Box<dyn EventLoopWaker>>, - initial_window_size: WindowSizeData, + device_pixels_per_px: Option<f32>, ) -> (Sender<ConstellationMsg>, SWManagerSenders) { // Global configuration options, parsed from the command line. let opts = opts::get(); @@ -872,6 +871,7 @@ fn create_constellation( glplayer_threads, player_context, event_loop_waker, + device_pixels_per_px, }; let (constellation_chan, from_swmanager_sender) = Constellation::< script_layout_interface::message::Msg, @@ -879,7 +879,8 @@ fn create_constellation( script::script_thread::ScriptThread, >::start( initial_state, - initial_window_size, + opts.initial_window_size, + device_pixels_per_px, opts.random_pipeline_closure_probability, opts.random_pipeline_closure_seed, opts.is_running_problem_test, |