diff options
Diffstat (limited to 'components/script_layout_interface')
-rw-r--r-- | components/script_layout_interface/Cargo.toml | 3 | ||||
-rw-r--r-- | components/script_layout_interface/lib.rs | 4 | ||||
-rw-r--r-- | components/script_layout_interface/message.rs | 148 |
3 files changed, 155 insertions, 0 deletions
diff --git a/components/script_layout_interface/Cargo.toml b/components/script_layout_interface/Cargo.toml index a4ace11ae26..226df50f386 100644 --- a/components/script_layout_interface/Cargo.toml +++ b/components/script_layout_interface/Cargo.toml @@ -19,6 +19,8 @@ heapsize_plugin = "0.1.2" ipc-channel = {git = "https://github.com/servo/ipc-channel"} libc = "0.2" msg = {path = "../msg"} +net_traits = {path = "../net_traits"} +profile_traits = {path = "../profile_traits"} plugins = {path = "../plugins"} range = {path = "../range"} script_traits = {path = "../script_traits"} @@ -26,3 +28,4 @@ selectors = {version = "0.6", features = ["heap_size"]} string_cache = {version = "0.2.20", features = ["heap_size"]} style = {path = "../style"} url = {version = "1.0.0", features = ["heap_size"]} +util = {path = "../util"} diff --git a/components/script_layout_interface/lib.rs b/components/script_layout_interface/lib.rs index 33d6696b782..929730f3909 100644 --- a/components/script_layout_interface/lib.rs +++ b/components/script_layout_interface/lib.rs @@ -26,6 +26,8 @@ extern crate heapsize; extern crate ipc_channel; extern crate libc; extern crate msg; +extern crate net_traits; +extern crate profile_traits; extern crate range; extern crate script_traits; extern crate selectors; @@ -33,7 +35,9 @@ extern crate selectors; extern crate string_cache; extern crate style; extern crate url; +extern crate util; +pub mod message; pub mod restyle_damage; pub mod rpc; pub mod wrapper_traits; diff --git a/components/script_layout_interface/message.rs b/components/script_layout_interface/message.rs new file mode 100644 index 00000000000..e3c8a14e4c3 --- /dev/null +++ b/components/script_layout_interface/message.rs @@ -0,0 +1,148 @@ +/* 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 http://mozilla.org/MPL/2.0/. */ + +use app_units::Au; +use euclid::point::Point2D; +use euclid::rect::Rect; +use gfx_traits::{Epoch, LayerId}; +use ipc_channel::ipc::{IpcReceiver, IpcSender}; +use msg::constellation_msg::{PanicMsg, PipelineId, WindowSizeData}; +use net_traits::image_cache_thread::ImageCacheThread; +use profile_traits::mem::ReportsChan; +use rpc::LayoutRPC; +use script_traits::{ConstellationControlMsg, LayoutControlMsg}; +use script_traits::{LayoutMsg as ConstellationMsg, StackingContextScrollState}; +use std::sync::Arc; +use std::sync::mpsc::{Receiver, Sender}; +use string_cache::Atom; +use style::context::ReflowGoal; +use style::selector_impl::PseudoElement; +use style::servo::Stylesheet; +use url::Url; +use util::ipc::OptionalOpaqueIpcSender; +use {OpaqueStyleAndLayoutData, TrustedNodeAddress}; + +/// Asynchronous messages that script can send to layout. +pub enum Msg { + /// Adds the given stylesheet to the document. + AddStylesheet(Arc<Stylesheet>), + + /// Puts a document into quirks mode, causing the quirks mode stylesheet to be loaded. + SetQuirksMode, + + /// Requests a reflow. + Reflow(ScriptReflow), + + /// Get an RPC interface. + GetRPC(Sender<Box<LayoutRPC + Send>>), + + /// Requests that the layout thread render the next frame of all animations. + TickAnimations, + + /// Requests that the layout thread reflow with a newly-loaded Web font. + ReflowWithNewlyLoadedWebFont, + + /// Updates the layout visible rects, affecting the area that display lists will be constructed + /// for. + SetVisibleRects(Vec<(LayerId, Rect<Au>)>), + + /// Destroys layout data associated with a DOM node. + /// + /// TODO(pcwalton): Maybe think about batching to avoid message traffic. + ReapStyleAndLayoutData(OpaqueStyleAndLayoutData), + + /// Requests that the layout thread measure its memory usage. The resulting reports are sent back + /// via the supplied channel. + CollectReports(ReportsChan), + + /// Requests that the layout thread enter a quiescent state in which no more messages are + /// accepted except `ExitMsg`. A response message will be sent on the supplied channel when + /// this happens. + PrepareToExit(Sender<()>), + + /// Requests that the layout thread immediately shut down. There must be no more nodes left after + /// this, or layout will crash. + ExitNow, + + /// Get the last epoch counter for this layout thread. + GetCurrentEpoch(IpcSender<Epoch>), + + /// Asks the layout thread whether any Web fonts have yet to load (if true, loads are pending; + /// false otherwise). + GetWebFontLoadState(IpcSender<bool>), + + /// Creates a new layout thread. + /// + /// This basically exists to keep the script-layout dependency one-way. + CreateLayoutThread(NewLayoutThreadInfo), + + /// Set the final Url. + SetFinalUrl(Url), + + /// Tells layout about the new scrolling offsets of each scrollable stacking context. + SetStackingContextScrollStates(Vec<StackingContextScrollState>), +} + + +/// Any query to perform with this reflow. +#[derive(PartialEq)] +pub enum ReflowQueryType { + NoQuery, + ContentBoxQuery(TrustedNodeAddress), + ContentBoxesQuery(TrustedNodeAddress), + NodeOverflowQuery(TrustedNodeAddress), + HitTestQuery(Point2D<f32>, bool), + NodeGeometryQuery(TrustedNodeAddress), + NodeLayerIdQuery(TrustedNodeAddress), + NodeScrollGeometryQuery(TrustedNodeAddress), + ResolvedStyleQuery(TrustedNodeAddress, Option<PseudoElement>, Atom), + OffsetParentQuery(TrustedNodeAddress), + MarginStyleQuery(TrustedNodeAddress), +} + +/// Information needed for a reflow. +pub struct Reflow { + /// The goal of reflow: either to render to the screen or to flush layout info for script. + pub goal: ReflowGoal, + /// A clipping rectangle for the page, an enlarged rectangle containing the viewport. + pub page_clip_rect: Rect<Au>, +} + +/// Information needed for a script-initiated reflow. +pub struct ScriptReflow { + /// General reflow data. + pub reflow_info: Reflow, + /// The document node. + pub document: TrustedNodeAddress, + /// The document's list of stylesheets. + pub document_stylesheets: Vec<Arc<Stylesheet>>, + /// 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<()>, + /// The type of query if any to perform during this reflow. + pub query_type: ReflowQueryType, +} + +impl Drop for ScriptReflow { + fn drop(&mut self) { + self.script_join_chan.send(()).unwrap(); + } +} + +pub struct NewLayoutThreadInfo { + pub id: PipelineId, + pub url: Url, + pub is_parent: bool, + pub layout_pair: (Sender<Msg>, Receiver<Msg>), + pub pipeline_port: IpcReceiver<LayoutControlMsg>, + pub constellation_chan: IpcSender<ConstellationMsg>, + pub panic_chan: IpcSender<PanicMsg>, + pub script_chan: IpcSender<ConstellationControlMsg>, + pub image_cache_thread: ImageCacheThread, + pub paint_chan: OptionalOpaqueIpcSender, + pub content_process_shutdown_chan: IpcSender<()>, +} |