aboutsummaryrefslogtreecommitdiffstats
path: root/components/shared/script_layout/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/shared/script_layout/lib.rs')
-rw-r--r--components/shared/script_layout/lib.rs172
1 files changed, 164 insertions, 8 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,
+}