diff options
Diffstat (limited to 'components/shared/script_layout')
-rw-r--r-- | components/shared/script_layout/lib.rs | 172 | ||||
-rw-r--r-- | components/shared/script_layout/message.rs | 188 |
2 files changed, 164 insertions, 196 deletions
diff --git a/components/shared/script_layout/lib.rs b/components/shared/script_layout/lib.rs index b36c0c4ef56..e6d91ee86a0 100644 --- a/components/shared/script_layout/lib.rs +++ b/components/shared/script_layout/lib.rs @@ -8,7 +8,6 @@ #![deny(unsafe_code)] -pub mod message; pub mod wrapper_traits; use std::any::Any; @@ -19,6 +18,7 @@ use std::sync::Arc; use app_units::Au; use atomic_refcell::AtomicRefCell; use canvas_traits::canvas::{CanvasId, CanvasMsg}; +use crossbeam_channel::Sender; use euclid::default::{Point2D, Rect}; use euclid::Size2D; use gfx::font_cache_thread::FontCacheThread; @@ -26,25 +26,28 @@ use gfx_traits::Epoch; use ipc_channel::ipc::IpcSender; use libc::c_void; use malloc_size_of_derive::MallocSizeOf; -use message::NodesFromPointQueryType; use metrics::PaintTimeMetrics; use msg::constellation_msg::{BrowsingContextId, PipelineId}; use net_traits::image_cache::{ImageCache, PendingImageId}; +use profile_traits::mem::ReportsChan; use profile_traits::time; use script_traits::{ - ConstellationControlMsg, InitialScriptState, LayoutControlMsg, LayoutMsg, LoadData, - UntrustedNodeAddress, WebrenderIpcSender, WindowSizeData, + ConstellationControlMsg, InitialScriptState, LayoutControlMsg, LayoutMsg, LoadData, Painter, + ScrollState, UntrustedNodeAddress, WebrenderIpcSender, WindowSizeData, }; use servo_arc::Arc as ServoArc; use servo_url::{ImmutableOrigin, ServoUrl}; use style::animation::DocumentAnimationSet; +use style::context::QuirksMode; use style::data::ElementData; use style::dom::OpaqueNode; +use style::invalidation::element::restyle_hints::RestyleHint; use style::media_queries::Device; use style::properties::style_structs::Font; use style::properties::PropertyId; -use style::selector_parser::PseudoElement; +use style::selector_parser::{PseudoElement, RestyleDamage, Snapshot}; use style::stylesheets::Stylesheet; +use style::Atom; use style_traits::CSSPixel; use webrender_api::ImageKey; @@ -171,9 +174,6 @@ pub trait LayoutFactory: Send + Sync { } pub trait Layout { - /// Process a single message from script. - fn process(&mut self, msg: message::Msg); - /// Handle a single message from the Constellation. fn handle_constellation_msg(&mut self, msg: LayoutControlMsg); @@ -203,9 +203,30 @@ pub trait Layout { before_stylsheet: Option<ServoArc<Stylesheet>>, ); + /// Inform the layout that its ScriptThread is about to exit. + fn exit_now(&mut self); + + /// Requests that layout measure its memory usage. The resulting reports are sent back + /// via the supplied channel. + fn collect_reports(&self, reports_chan: ReportsChan); + + /// Sets quirks mode for the document, causing the quirks mode stylesheet to be used. + fn set_quirks_mode(&mut self, quirks_mode: QuirksMode); + /// Removes a stylesheet from the Layout. fn remove_stylesheet(&mut self, stylesheet: ServoArc<Stylesheet>); + /// Requests a reflow. + fn reflow(&mut self, script_reflow: ScriptReflow); + + /// Tells layout that script has added some paint worklet modules. + fn register_paint_worklet_modules( + &mut self, + name: Atom, + properties: Vec<Atom>, + painter: Box<dyn Painter>, + ); + fn query_content_box(&self, node: OpaqueNode) -> Option<Rect<Au>>; fn query_content_boxes(&self, node: OpaqueNode) -> Vec<Rect<Au>>; fn query_client_rect(&self, node: OpaqueNode) -> Rect<i32>; @@ -257,3 +278,138 @@ pub struct OffsetParentResponse { pub node_address: Option<UntrustedNodeAddress>, pub rect: Rect<Au>, } + +#[derive(Debug, PartialEq)] +pub enum NodesFromPointQueryType { + All, + Topmost, +} + +#[derive(Debug, PartialEq)] +pub enum QueryMsg { + ContentBox, + ContentBoxes, + ClientRectQuery, + ScrollingAreaQuery, + OffsetParentQuery, + TextIndexQuery, + NodesFromPointQuery, + ResolvedStyleQuery, + StyleQuery, + ElementInnerTextQuery, + ResolvedFontStyleQuery, + InnerWindowDimensionsQuery, +} + +/// Any query to perform with this reflow. +#[derive(Debug, PartialEq)] +pub enum ReflowGoal { + Full, + TickAnimations, + LayoutQuery(QueryMsg, u64), + + /// Tells layout about a single new scrolling offset from the script. The rest will + /// remain untouched and layout won't forward this back to script. + UpdateScrollNode(ScrollState), +} + +impl ReflowGoal { + /// Returns true if the given ReflowQuery needs a full, up-to-date display list to + /// be present or false if it only needs stacking-relative positions. + pub fn needs_display_list(&self) -> bool { + match *self { + ReflowGoal::Full | ReflowGoal::TickAnimations | ReflowGoal::UpdateScrollNode(_) => true, + ReflowGoal::LayoutQuery(ref querymsg, _) => match *querymsg { + QueryMsg::ElementInnerTextQuery | + QueryMsg::InnerWindowDimensionsQuery | + QueryMsg::NodesFromPointQuery | + QueryMsg::ResolvedStyleQuery | + QueryMsg::TextIndexQuery => true, + QueryMsg::ClientRectQuery | + QueryMsg::ContentBox | + QueryMsg::ContentBoxes | + QueryMsg::OffsetParentQuery | + QueryMsg::ResolvedFontStyleQuery | + QueryMsg::ScrollingAreaQuery | + QueryMsg::StyleQuery => false, + }, + } + } + + /// Returns true if the given ReflowQuery needs its display list send to WebRender or + /// false if a layout_thread display list is sufficient. + pub fn needs_display(&self) -> bool { + match *self { + ReflowGoal::Full | ReflowGoal::TickAnimations | ReflowGoal::UpdateScrollNode(_) => true, + ReflowGoal::LayoutQuery(ref querymsg, _) => match *querymsg { + QueryMsg::NodesFromPointQuery | + QueryMsg::TextIndexQuery | + QueryMsg::ElementInnerTextQuery => true, + QueryMsg::ContentBox | + QueryMsg::ContentBoxes | + QueryMsg::ClientRectQuery | + QueryMsg::ScrollingAreaQuery | + QueryMsg::ResolvedStyleQuery | + QueryMsg::ResolvedFontStyleQuery | + QueryMsg::OffsetParentQuery | + QueryMsg::InnerWindowDimensionsQuery | + QueryMsg::StyleQuery => false, + }, + } + } +} + +/// Information needed for a reflow. +pub struct Reflow { + /// A clipping rectangle for the page, an enlarged rectangle containing the viewport. + pub page_clip_rect: Rect<Au>, +} + +/// Information derived from a layout pass that needs to be returned to the script thread. +#[derive(Default)] +pub struct ReflowComplete { + /// The list of images that were encountered that are in progress. + pub pending_images: Vec<PendingImage>, +} + +/// Information needed for a script-initiated reflow. +pub struct ScriptReflow { + /// General reflow data. + pub reflow_info: Reflow, + /// The document node. + pub document: TrustedNodeAddress, + /// The dirty root from which to restyle. + pub dirty_root: Option<TrustedNodeAddress>, + /// Whether the document's stylesheets have changed since the last script reflow. + pub stylesheets_changed: bool, + /// The current window size. + pub window_size: WindowSizeData, + /// The channel that we send a notification to. + pub script_join_chan: Sender<ReflowComplete>, + /// The goal of this reflow. + pub reflow_goal: ReflowGoal, + /// The number of objects in the dom #10110 + pub dom_count: u32, + /// The current window origin + pub origin: ImmutableOrigin, + /// Restyle snapshot map. + pub pending_restyles: Vec<(TrustedNodeAddress, PendingRestyle)>, + /// The current animation timeline value. + pub animation_timeline_value: f64, + /// The set of animations for this document. + pub animations: DocumentAnimationSet, +} + +/// A pending restyle. +#[derive(Debug, Default, MallocSizeOf)] +pub struct PendingRestyle { + /// If this element had a state or attribute change since the last restyle, track + /// the original condition of the element. + pub snapshot: Option<Snapshot>, + + /// Any explicit restyles hints that have been accumulated for this element. + pub hint: RestyleHint, + + /// Any explicit restyles damage that have been accumulated for this element. + pub damage: RestyleDamage, +} diff --git a/components/shared/script_layout/message.rs b/components/shared/script_layout/message.rs deleted file mode 100644 index 018e554e893..00000000000 --- a/components/shared/script_layout/message.rs +++ /dev/null @@ -1,188 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -use app_units::Au; -use crossbeam_channel::Sender; -use euclid::default::Rect; -use malloc_size_of_derive::MallocSizeOf; -use profile_traits::mem::ReportsChan; -use script_traits::{Painter, ScrollState, WindowSizeData}; -use servo_atoms::Atom; -use servo_url::ImmutableOrigin; -use style::animation::DocumentAnimationSet; -use style::context::QuirksMode; -use style::invalidation::element::restyle_hints::RestyleHint; -use style::selector_parser::{RestyleDamage, Snapshot}; - -use crate::{PendingImage, TrustedNodeAddress}; - -/// Asynchronous messages that script can send to layout. -pub enum Msg { - /// Change the quirks mode. - SetQuirksMode(QuirksMode), - - /// Requests a reflow. - Reflow(ScriptReflow), - - /// Requests that layout measure its memory usage. The resulting reports are sent back - /// via the supplied channel. - CollectReports(ReportsChan), - - /// Requests that layout immediately shut down. There must be no more nodes left after - /// this, or layout will crash. - ExitNow, - - /// Tells layout about the new scrolling offsets of each scrollable stacking context. - SetScrollStates(Vec<ScrollState>), - - /// Tells layout that script has added some paint worklet modules. - RegisterPaint(Atom, Vec<Atom>, Box<dyn Painter>), -} - -#[derive(Debug, PartialEq)] -pub enum NodesFromPointQueryType { - All, - Topmost, -} - -#[derive(Debug, PartialEq)] -pub enum QueryMsg { - ContentBox, - ContentBoxes, - ClientRectQuery, - ScrollingAreaQuery, - OffsetParentQuery, - TextIndexQuery, - NodesFromPointQuery, - ResolvedStyleQuery, - StyleQuery, - ElementInnerTextQuery, - ResolvedFontStyleQuery, - InnerWindowDimensionsQuery, -} - -/// Any query to perform with this reflow. -#[derive(Debug, PartialEq)] -pub enum ReflowGoal { - Full, - TickAnimations, - LayoutQuery(QueryMsg, u64), - - /// Tells layout about a single new scrolling offset from the script. The rest will - /// remain untouched and layout won't forward this back to script. - UpdateScrollNode(ScrollState), -} - -impl ReflowGoal { - /// Returns true if the given ReflowQuery needs a full, up-to-date display list to - /// be present or false if it only needs stacking-relative positions. - pub fn needs_display_list(&self) -> bool { - match *self { - ReflowGoal::Full | ReflowGoal::TickAnimations | ReflowGoal::UpdateScrollNode(_) => true, - ReflowGoal::LayoutQuery(ref querymsg, _) => match *querymsg { - QueryMsg::ElementInnerTextQuery | - QueryMsg::InnerWindowDimensionsQuery | - QueryMsg::NodesFromPointQuery | - QueryMsg::ResolvedStyleQuery | - QueryMsg::TextIndexQuery => true, - QueryMsg::ClientRectQuery | - QueryMsg::ContentBox | - QueryMsg::ContentBoxes | - QueryMsg::OffsetParentQuery | - QueryMsg::ResolvedFontStyleQuery | - QueryMsg::ScrollingAreaQuery | - QueryMsg::StyleQuery => false, - }, - } - } - - /// Returns true if the given ReflowQuery needs its display list send to WebRender or - /// false if a layout_thread display list is sufficient. - pub fn needs_display(&self) -> bool { - match *self { - ReflowGoal::Full | ReflowGoal::TickAnimations | ReflowGoal::UpdateScrollNode(_) => true, - ReflowGoal::LayoutQuery(ref querymsg, _) => match *querymsg { - QueryMsg::NodesFromPointQuery | - QueryMsg::TextIndexQuery | - QueryMsg::ElementInnerTextQuery => true, - QueryMsg::ContentBox | - QueryMsg::ContentBoxes | - QueryMsg::ClientRectQuery | - QueryMsg::ScrollingAreaQuery | - QueryMsg::ResolvedStyleQuery | - QueryMsg::ResolvedFontStyleQuery | - QueryMsg::OffsetParentQuery | - QueryMsg::InnerWindowDimensionsQuery | - QueryMsg::StyleQuery => false, - }, - } - } -} - -/// Information needed for a reflow. -pub struct Reflow { - /// A clipping rectangle for the page, an enlarged rectangle containing the viewport. - pub page_clip_rect: Rect<Au>, -} - -/// Information derived from a layout pass that needs to be returned to the script thread. -#[derive(Default)] -pub struct ReflowComplete { - /// The list of images that were encountered that are in progress. - pub pending_images: Vec<PendingImage>, -} - -/// Information needed for a script-initiated reflow. -pub struct ScriptReflow { - /// General reflow data. - pub reflow_info: Reflow, - /// The document node. - pub document: TrustedNodeAddress, - /// The dirty root from which to restyle. - pub dirty_root: Option<TrustedNodeAddress>, - /// Whether the document's stylesheets have changed since the last script reflow. - pub stylesheets_changed: bool, - /// The current window size. - pub window_size: WindowSizeData, - /// The channel that we send a notification to. - pub script_join_chan: Sender<ReflowComplete>, - /// The goal of this reflow. - pub reflow_goal: ReflowGoal, - /// The number of objects in the dom #10110 - pub dom_count: u32, - /// The current window origin - pub origin: ImmutableOrigin, - /// Restyle snapshot map. - pub pending_restyles: Vec<(TrustedNodeAddress, PendingRestyle)>, - /// The current animation timeline value. - pub animation_timeline_value: f64, - /// The set of animations for this document. - pub animations: DocumentAnimationSet, -} - -/// A pending restyle. -#[derive(Debug, MallocSizeOf)] -pub struct PendingRestyle { - /// If this element had a state or attribute change since the last restyle, track - /// the original condition of the element. - pub snapshot: Option<Snapshot>, - - /// Any explicit restyles hints that have been accumulated for this element. - pub hint: RestyleHint, - - /// Any explicit restyles damage that have been accumulated for this element. - pub damage: RestyleDamage, -} - -impl Default for PendingRestyle { - /// Creates a new empty pending restyle. - #[inline] - fn default() -> Self { - Self { - snapshot: None, - hint: RestyleHint::empty(), - damage: RestyleDamage::empty(), - } - } -} |