diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-06-20 17:00:13 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-06-20 17:00:13 -0500 |
commit | a94d3ee744fd0ff87bfe0548ba96927e64ce4b54 (patch) | |
tree | 38754e1eede95c8512b9a1102f9bea0dc8da76d1 /components | |
parent | 09a39af1c18e4319165576cce1490e99845a2b9f (diff) | |
parent | 6528bee84f7da21cfdad8c499b3404357f2fd36b (diff) | |
download | servo-a94d3ee744fd0ff87bfe0548ba96927e64ce4b54.tar.gz servo-a94d3ee744fd0ff87bfe0548ba96927e64ce4b54.zip |
Auto merge of #11804 - Ms2ger:layout-thread-crate, r=jdm
Introduce a layout_thread crate; drop the dependency of layout on script.
<!-- Reviewable:start -->
This change is [<img src="https://reviewable.io/review_button.svg" height="35" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/11804)
<!-- Reviewable:end -->
Diffstat (limited to 'components')
-rw-r--r-- | components/layout/Cargo.toml | 3 | ||||
-rw-r--r-- | components/layout/block.rs | 4 | ||||
-rw-r--r-- | components/layout/lib.rs | 33 | ||||
-rw-r--r-- | components/layout/query.rs | 51 | ||||
-rw-r--r-- | components/layout_thread/Cargo.toml | 36 | ||||
-rw-r--r-- | components/layout_thread/lib.rs (renamed from components/layout/layout_thread.rs) | 125 | ||||
-rw-r--r-- | components/servo/Cargo.lock | 35 | ||||
-rw-r--r-- | components/servo/Cargo.toml | 1 | ||||
-rw-r--r-- | components/servo/lib.rs | 6 |
9 files changed, 191 insertions, 103 deletions
diff --git a/components/layout/Cargo.toml b/components/layout/Cargo.toml index c6b1727d1d5..9800610d6bb 100644 --- a/components/layout/Cargo.toml +++ b/components/layout/Cargo.toml @@ -21,7 +21,6 @@ gfx_traits = {path = "../gfx_traits"} heapsize = "0.3.0" heapsize_plugin = "0.1.2" ipc-channel = {git = "https://github.com/servo/ipc-channel"} -layout_traits = {path = "../layout_traits"} libc = "0.2" log = "0.3.5" msg = {path = "../msg"} @@ -30,11 +29,9 @@ plugins = {path = "../plugins"} profile_traits = {path = "../profile_traits"} range = {path = "../range"} rustc-serialize = "0.3" -script = {path = "../script"} script_layout_interface = {path = "../script_layout_interface"} script_traits = {path = "../script_traits"} selectors = {version = "0.6", features = ["heap_size"]} -serde_json = "0.7" serde_macros = "0.7" smallvec = "0.1" string_cache = {version = "0.2.20", features = ["heap_size"]} diff --git a/components/layout/block.rs b/components/layout/block.rs index 9fc527d98d5..f02cd54d5b8 100644 --- a/components/layout/block.rs +++ b/components/layout/block.rs @@ -46,7 +46,6 @@ use fragment::{CoordinateSystem, Fragment, FragmentBorderBoxIterator, HAS_LAYER, use gfx::display_list::{ClippingRegion, StackingContext}; use gfx_traits::{LayerId, StackingContextId}; use layout_debug; -use layout_thread::DISPLAY_PORT_SIZE_FACTOR; use model::{CollapsibleMargins, MaybeAuto, specified, specified_or_none}; use model::{self, IntrinsicISizes, MarginCollapseInfo}; use rustc_serialize::{Encodable, Encoder}; @@ -64,6 +63,9 @@ use style::values::computed::{LengthOrPercentage, LengthOrPercentageOrAuto}; use util::geometry::MAX_RECT; use util::print_tree::PrintTree; +/// The number of screens of data we're allowed to generate display lists for in each direction. +const DISPLAY_PORT_SIZE_FACTOR: i32 = 8; + /// Information specific to floated blocks. #[derive(Clone, RustcEncodable)] pub struct FloatedBlockInfo { diff --git a/components/layout/lib.rs b/components/layout/lib.rs index d1eb3cf41ba..12769808d50 100644 --- a/components/layout/lib.rs +++ b/components/layout/lib.rs @@ -6,7 +6,6 @@ #![feature(box_patterns)] #![feature(box_syntax)] #![feature(custom_derive)] -#![feature(mpsc_select)] #![feature(nonzero)] #![feature(plugin)] #![feature(raw)] @@ -32,7 +31,6 @@ extern crate gfx; extern crate gfx_traits; extern crate heapsize; extern crate ipc_channel; -extern crate layout_traits; extern crate libc; #[macro_use] extern crate log; @@ -46,11 +44,9 @@ extern crate profile_traits; #[macro_use] extern crate range; extern crate rustc_serialize; -extern crate script; extern crate script_layout_interface; extern crate script_traits; extern crate selectors; -extern crate serde_json; extern crate smallvec; #[macro_use(atom, ns)] extern crate string_cache; extern crate style; @@ -63,32 +59,31 @@ extern crate util; extern crate webrender_traits; #[macro_use] -mod layout_debug; +pub mod layout_debug; -mod animation; +pub mod animation; mod block; -mod construct; -mod context; +pub mod construct; +pub mod context; mod data; -mod display_list_builder; +pub mod display_list_builder; mod flex; mod floats; -mod flow; +pub mod flow; mod flow_list; -mod flow_ref; +pub mod flow_ref; mod fragment; mod generated_content; -mod incremental; +pub mod incremental; mod inline; -pub mod layout_thread; mod list_item; mod model; mod multicol; mod opaque_node; -mod parallel; +pub mod parallel; mod persistent_list; -mod query; -mod sequential; +pub mod query; +pub mod sequential; mod table; mod table_caption; mod table_cell; @@ -97,9 +92,9 @@ mod table_row; mod table_rowgroup; mod table_wrapper; mod text; -mod traversal; -mod webrender_helpers; -mod wrapper; +pub mod traversal; +pub mod webrender_helpers; +pub mod wrapper; // For unit tests: pub use fragment::Fragment; diff --git a/components/layout/query.rs b/components/layout/query.rs index e558496f82d..3ce7b31bfa2 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -12,9 +12,9 @@ use euclid::size::Size2D; use flow; use flow_ref::FlowRef; use fragment::{Fragment, FragmentBorderBoxIterator, SpecificFragmentInfo}; -use gfx::display_list::OpaqueNode; +use gfx::display_list::{DisplayItemMetadata, DisplayList, OpaqueNode, ScrollOffsetMap}; use gfx_traits::LayerId; -use layout_thread::LayoutThreadData; +use ipc_channel::ipc::IpcSender; use opaque_node::OpaqueNodeMethods; use script_layout_interface::rpc::{ContentBoxResponse, ContentBoxesResponse}; use script_layout_interface::rpc::{HitTestResponse, LayoutRPC}; @@ -35,10 +35,57 @@ use style::properties::ComputedValues; use style::properties::longhands::{display, position}; use style::properties::style_structs; use style::selector_impl::PseudoElement; +use style::servo::Stylist; use style::values::AuExtensionMethods; use style_traits::cursor::Cursor; use wrapper::ThreadSafeLayoutNodeHelpers; +/// Mutable data belonging to the LayoutThread. +/// +/// This needs to be protected by a mutex so we can do fast RPCs. +pub struct LayoutThreadData { + /// The channel on which messages can be sent to the constellation. + pub constellation_chan: IpcSender<ConstellationMsg>, + + /// The root stacking context. + pub display_list: Option<Arc<DisplayList>>, + + /// Performs CSS selector matching and style resolution. + pub stylist: Arc<Stylist>, + + /// A queued response for the union of the content boxes of a node. + pub content_box_response: Rect<Au>, + + /// A queued response for the content boxes of a node. + pub content_boxes_response: Vec<Rect<Au>>, + + /// A queued response for the client {top, left, width, height} of a node in pixels. + pub client_rect_response: Rect<i32>, + + pub layer_id_response: Option<LayerId>, + + /// A queued response for the node at a given point + pub hit_test_response: (Option<DisplayItemMetadata>, bool), + + /// A pair of overflow property in x and y + pub overflow_response: NodeOverflowResponse, + + /// A queued response for the scroll {top, left, width, height} of a node in pixels. + pub scroll_area_response: Rect<i32>, + + /// A queued response for the resolved style property of an element. + pub resolved_style_response: Option<String>, + + /// A queued response for the offset parent/rect of a node. + pub offset_parent_response: OffsetParentResponse, + + /// A queued response for the offset parent/rect of a node. + pub margin_style_response: MarginStyleResponse, + + /// Scroll offsets of stacking contexts. This will only be populated if WebRender is in use. + pub stacking_context_scroll_offsets: ScrollOffsetMap, +} + pub struct LayoutRPCImpl(pub Arc<Mutex<LayoutThreadData>>); // https://drafts.csswg.org/cssom-view/#overflow-directions diff --git a/components/layout_thread/Cargo.toml b/components/layout_thread/Cargo.toml new file mode 100644 index 00000000000..050fea38197 --- /dev/null +++ b/components/layout_thread/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "layout_thread" +version = "0.0.1" +authors = ["The Servo Project Developers"] +publish = false + +[lib] +name = "layout_thread" +path = "lib.rs" + +[dependencies] +app_units = {version = "0.2.3", features = ["plugins"]} +azure = {git = "https://github.com/servo/rust-azure", features = ["plugins"]} +euclid = {version = "0.6.4", features = ["plugins"]} +fnv = "1.0" +gfx = {path = "../gfx"} +gfx_traits = {path = "../gfx_traits"} +heapsize = "0.3.0" +heapsize_plugin = "0.1.2" +ipc-channel = {git = "https://github.com/servo/ipc-channel"} +layout = {path = "../layout"} +layout_traits = {path = "../layout_traits"} +log = "0.3.5" +msg = {path = "../msg"} +net_traits = {path = "../net_traits"} +plugins = {path = "../plugins"} +profile_traits = {path = "../profile_traits"} +script = {path = "../script"} +script_layout_interface = {path = "../script_layout_interface"} +script_traits = {path = "../script_traits"} +serde_json = "0.7" +serde_macros = "0.7" +style = {path = "../style"} +url = {version = "1.0.0", features = ["heap_size"]} +util = {path = "../util"} +webrender_traits = {git = "https://github.com/servo/webrender_traits"} diff --git a/components/layout/layout_thread.rs b/components/layout_thread/lib.rs index a65b1452a09..e3c904d590b 100644 --- a/components/layout/layout_thread.rs +++ b/components/layout_thread/lib.rs @@ -5,47 +5,83 @@ //! The layout thread. Performs layout on the DOM, builds display lists and sends them to be //! painted. -#![allow(unsafe_code)] +#![feature(box_syntax)] +#![feature(custom_derive)] +#![feature(mpsc_select)] +#![feature(plugin)] + +#![plugin(heapsize_plugin)] +#![plugin(plugins)] + +extern crate app_units; +extern crate azure; +extern crate core; +extern crate euclid; +extern crate fnv; +extern crate gfx; +extern crate gfx_traits; +extern crate heapsize; +extern crate ipc_channel; +#[macro_use] +extern crate layout; +extern crate layout_traits; +#[macro_use] +extern crate log; +extern crate msg; +extern crate net_traits; +#[macro_use] +extern crate profile_traits; +extern crate script; +extern crate script_layout_interface; +extern crate script_traits; +extern crate serde_json; +extern crate style; +extern crate url; +extern crate util; +extern crate webrender_traits; -use animation; use app_units::Au; use azure::azure::AzColor; -use construct::ConstructionResult; -use context::{LayoutContext, SharedLayoutContext, heap_size_of_local_context}; -use display_list_builder::ToGfxColor; use euclid::Matrix4D; use euclid::point::Point2D; use euclid::rect::Rect; use euclid::scale_factor::ScaleFactor; use euclid::size::Size2D; -use flow::{self, Flow, ImmutableFlowUtils, MutableOwnedFlowUtils}; -use flow_ref::{self, FlowRef}; use fnv::FnvHasher; -use gfx::display_list::{ClippingRegion, DisplayItemMetadata, DisplayList, LayerInfo, OpaqueNode}; -use gfx::display_list::{ScrollOffsetMap, StackingContext, StackingContextType, WebRenderImageInfo}; +use gfx::display_list::{ClippingRegion, DisplayList, LayerInfo, OpaqueNode}; +use gfx::display_list::{StackingContext, StackingContextType, WebRenderImageInfo}; use gfx::font; use gfx::font_cache_thread::FontCacheThread; use gfx::font_context; use gfx::paint_thread::LayoutToPaintMsg; use gfx_traits::{color, Epoch, FragmentType, LayerId, ScrollPolicy, StackingContextId}; use heapsize::HeapSizeOf; -use incremental::{LayoutDamageComputation, REFLOW_ENTIRE_DOCUMENT}; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; use ipc_channel::router::ROUTER; -use layout_debug; +use layout::animation; +use layout::construct::ConstructionResult; +use layout::context::{LayoutContext, SharedLayoutContext, heap_size_of_local_context}; +use layout::display_list_builder::ToGfxColor; +use layout::flow::{self, Flow, ImmutableFlowUtils, MutableOwnedFlowUtils}; +use layout::flow_ref::{self, FlowRef}; +use layout::incremental::{LayoutDamageComputation, REFLOW_ENTIRE_DOCUMENT}; +use layout::layout_debug; +use layout::parallel; +use layout::query::process_offset_parent_query; +use layout::query::{LayoutRPCImpl, LayoutThreadData, process_content_box_request, process_content_boxes_request}; +use layout::query::{process_node_geometry_request, process_node_layer_id_request, process_node_scroll_area_request}; +use layout::query::{process_node_overflow_request, process_resolved_style_request, process_margin_style_query}; +use layout::sequential; +use layout::traversal::RecalcStyleAndConstructFlows; +use layout::webrender_helpers::{WebRenderDisplayListConverter, WebRenderFrameBuilder}; +use layout::wrapper::{LayoutNodeLayoutData, NonOpaqueStyleAndLayoutData}; use layout_traits::LayoutThreadFactory; -use log; use msg::constellation_msg::{PanicMsg, PipelineId}; use net_traits::image_cache_thread::UsePlaceholder; use net_traits::image_cache_thread::{ImageCacheChan, ImageCacheResult, ImageCacheThread}; -use parallel; use profile_traits::mem::{self, Report, ReportKind, ReportsChan}; use profile_traits::time::{TimerMetadataFrameType, TimerMetadataReflowType}; use profile_traits::time::{self, TimerMetadata, profile}; -use query::process_offset_parent_query; -use query::{LayoutRPCImpl, process_content_box_request, process_content_boxes_request}; -use query::{process_node_geometry_request, process_node_layer_id_request, process_node_scroll_area_request}; -use query::{process_node_overflow_request, process_resolved_style_request, process_margin_style_query}; use script::layout_wrapper::ServoLayoutNode; use script_layout_interface::message::{Msg, NewLayoutThreadInfo, Reflow, ReflowQueryType, ScriptReflow}; use script_layout_interface::reporter::CSSErrorReporter; @@ -55,8 +91,6 @@ use script_layout_interface::wrapper_traits::LayoutNode; use script_layout_interface::{OpaqueStyleAndLayoutData, PartialStyleAndLayoutData}; use script_traits::{ConstellationControlMsg, LayoutControlMsg, LayoutMsg as ConstellationMsg}; use script_traits::{StackingContextScrollState, UntrustedNodeAddress}; -use sequential; -use serde_json; use std::borrow::ToOwned; use std::cell::RefCell; use std::collections::HashMap; @@ -77,7 +111,6 @@ use style::properties::ComputedValues; use style::selector_matching::USER_OR_USER_AGENT_STYLESHEETS; use style::servo::{SharedStyleContext, Stylesheet, Stylist}; use style::stylesheets::CSSRuleIteratorExt; -use traversal::RecalcStyleAndConstructFlows; use url::Url; use util::geometry::MAX_RECT; use util::ipc::OptionalIpcSender; @@ -85,62 +118,10 @@ use util::opts; use util::thread; use util::thread_state; use util::workqueue::WorkQueue; -use webrender_helpers::{WebRenderDisplayListConverter, WebRenderFrameBuilder}; -use webrender_traits; -use wrapper::{LayoutNodeLayoutData, NonOpaqueStyleAndLayoutData}; - -/// The number of screens of data we're allowed to generate display lists for in each direction. -pub const DISPLAY_PORT_SIZE_FACTOR: i32 = 8; /// The number of screens we have to traverse before we decide to generate new display lists. const DISPLAY_PORT_THRESHOLD_SIZE_FACTOR: i32 = 4; -/// Mutable data belonging to the LayoutThread. -/// -/// This needs to be protected by a mutex so we can do fast RPCs. -pub struct LayoutThreadData { - /// The channel on which messages can be sent to the constellation. - pub constellation_chan: IpcSender<ConstellationMsg>, - - /// The root stacking context. - pub display_list: Option<Arc<DisplayList>>, - - /// Performs CSS selector matching and style resolution. - pub stylist: Arc<Stylist>, - - /// A queued response for the union of the content boxes of a node. - pub content_box_response: Rect<Au>, - - /// A queued response for the content boxes of a node. - pub content_boxes_response: Vec<Rect<Au>>, - - /// A queued response for the client {top, left, width, height} of a node in pixels. - pub client_rect_response: Rect<i32>, - - pub layer_id_response: Option<LayerId>, - - /// A queued response for the node at a given point - pub hit_test_response: (Option<DisplayItemMetadata>, bool), - - /// A pair of overflow property in x and y - pub overflow_response: NodeOverflowResponse, - - /// A queued response for the scroll {top, left, width, height} of a node in pixels. - pub scroll_area_response: Rect<i32>, - - /// A queued response for the resolved style property of an element. - pub resolved_style_response: Option<String>, - - /// A queued response for the offset parent/rect of a node. - pub offset_parent_response: OffsetParentResponse, - - /// A queued response for the offset parent/rect of a node. - pub margin_style_response: MarginStyleResponse, - - /// Scroll offsets of stacking contexts. This will only be populated if WebRender is in use. - pub stacking_context_scroll_offsets: ScrollOffsetMap, -} - /// Information needed by the layout thread. pub struct LayoutThread { /// The ID of the pipeline that we belong to. diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 2c822279c77..05983de473a 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -21,6 +21,7 @@ dependencies = [ "ipc-channel 0.2.3 (git+https://github.com/servo/ipc-channel)", "layout 0.0.1", "layout_tests 0.0.1", + "layout_thread 0.0.1", "libc 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "msg 0.0.1", @@ -1131,7 +1132,6 @@ dependencies = [ "heapsize 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize_plugin 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-channel 0.2.3 (git+https://github.com/servo/ipc-channel)", - "layout_traits 0.0.1", "libc 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "msg 0.0.1", @@ -1140,11 +1140,9 @@ dependencies = [ "profile_traits 0.0.1", "range 0.0.1", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "script 0.0.1", "script_layout_interface 0.0.1", "script_traits 0.0.1", "selectors 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_macros 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1166,6 +1164,37 @@ dependencies = [ ] [[package]] +name = "layout_thread" +version = "0.0.1" +dependencies = [ + "app_units 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "azure 0.4.5 (git+https://github.com/servo/rust-azure)", + "euclid 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "gfx 0.0.1", + "gfx_traits 0.0.1", + "heapsize 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize_plugin 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "ipc-channel 0.2.3 (git+https://github.com/servo/ipc-channel)", + "layout 0.0.1", + "layout_traits 0.0.1", + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "msg 0.0.1", + "net_traits 0.0.1", + "plugins 0.0.1", + "profile_traits 0.0.1", + "script 0.0.1", + "script_layout_interface 0.0.1", + "script_traits 0.0.1", + "serde_json 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_macros 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)", + "style 0.0.1", + "url 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "util 0.0.1", + "webrender_traits 0.1.0 (git+https://github.com/servo/webrender_traits)", +] + +[[package]] name = "layout_traits" version = "0.0.1" dependencies = [ diff --git a/components/servo/Cargo.toml b/components/servo/Cargo.toml index dc1dc080e73..fee429f6ff1 100644 --- a/components/servo/Cargo.toml +++ b/components/servo/Cargo.toml @@ -57,6 +57,7 @@ util = {path = "../util"} script = {path = "../script"} script_traits = {path = "../script_traits"} layout = {path = "../layout"} +layout_thread = {path = "../layout_thread"} gfx = {path = "../gfx"} style = {path = "../style"} canvas = {path = "../canvas"} diff --git a/components/servo/lib.rs b/components/servo/lib.rs index 28ccd87719f..0a3b6c2a7e4 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -31,7 +31,7 @@ pub extern crate devtools_traits; pub extern crate euclid; pub extern crate gfx; pub extern crate ipc_channel; -pub extern crate layout; +pub extern crate layout_thread; pub extern crate msg; pub extern crate net; pub extern crate net_traits; @@ -233,7 +233,7 @@ fn create_constellation(opts: opts::Opts, }; let constellation_chan = Constellation::<script_layout_interface::message::Msg, - layout::layout_thread::LayoutThread, + layout_thread::LayoutThread, script::script_thread::ScriptThread>::start(initial_state); // Send the URL command to the constellation. @@ -267,7 +267,7 @@ pub fn run_content_process(token: String) { script::init(); unprivileged_content.start_all::<script_layout_interface::message::Msg, - layout::layout_thread::LayoutThread, + layout_thread::LayoutThread, script::script_thread::ScriptThread>(true); } |