aboutsummaryrefslogtreecommitdiffstats
path: root/components/shared/script_layout
diff options
context:
space:
mode:
Diffstat (limited to 'components/shared/script_layout')
-rw-r--r--components/shared/script_layout/lib.rs172
-rw-r--r--components/shared/script_layout/message.rs188
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(),
- }
- }
-}