diff --git a/Makefile.in b/Makefile.in index 8ad50a95772..d5c5e186f10 100644 --- a/Makefile.in +++ b/Makefile.in @@ -274,30 +274,38 @@ DONE_style = $(B)src/components/style/libstyle.dummy DEPS_style = $(CRATE_style) $(SRC_style) $(DONE_SUBMODULES) $(DONE_util) $(DONE_macros) -RFLAGS_layout = $(strip $(CFG_RUSTC_FLAGS)) $(addprefix -L $(B)src/,$(DEPS_SUBMODULES)) -L $(B)src/components/gfx -L $(B)src/components/util -L $(B)src/components/net -L $(B)src/components/script -L $(B)src/components/style -L $(B)src/components/msg -L$(B)src/components/macros +RFLAGS_layout_traits = $(strip $(CFG_RUSTC_FLAGS)) $(addprefix -L $(B)src/,$(DEPS_SUBMODULES)) -L $(B)src/components/gfx -L $(B)src/components/util -L $(B)src/components/net -L $(B)src/components/script -L $(B)src/components/style -L $(B)src/components/msg + +SRC_layout_traits = $(call rwildcard,$(S)src/components/layout_traits/,*.rs) +CRATE_layout_traits = $(S)src/components/layout_traits/layout_traits.rs +DONE_layout_traits = $(B)src/components/layout_traits/liblayout_traits.dummy + +DEPS_layout_traits = $(CRATE_layout_traits) $(SRC_layout_traits) $(DONE_script) $(DONE_msg) $(DONE_net) $(DONE_gfx) $(DONE_util) + +RFLAGS_layout = $(strip $(CFG_RUSTC_FLAGS)) $(addprefix -L $(B)src/,$(DEPS_SUBMODULES)) -L $(B)src/components/gfx -L $(B)src/components/util -L $(B)src/components/net -L $(B)src/components/script -L $(B)src/components/style -L $(B)src/components/msg -L$(B)src/components/macros -L$(B)src/components/layout_traits SRC_layout = $(call rwildcard,$(S)src/components/layout/,*.rs) $(S)src/components/layout/css/user-agent.css CRATE_layout = $(S)src/components/layout/layout.rs DONE_layout = $(B)src/components/layout/liblayout.dummy -DEPS_layout = $(CRATE_layout) $(SRC_layout) $(DONE_script) $(DONE_style) $(DONE_msg) $(DONE_macros) $(DONE_gfx) $(DONE_util) +DEPS_layout = $(CRATE_layout) $(SRC_layout) $(DONE_script) $(DONE_style) $(DONE_msg) $(DONE_macros) $(DONE_gfx) $(DONE_util) $(DONE_layout_traits) -RFLAGS_compositing = $(strip $(CFG_RUSTC_FLAGS)) $(addprefix -L $(B)src/,$(DEPS_SUBMODULES)) -L $(B)src/components/gfx -L $(B)src/components/util -L $(B)src/components/net -L $(B)src/components/script -L $(B)src/components/layout -L $(B)src/components/style -L $(B)src/components/msg +RFLAGS_compositing = $(strip $(CFG_RUSTC_FLAGS)) $(addprefix -L $(B)src/,$(DEPS_SUBMODULES)) -L $(B)src/components/gfx -L $(B)src/components/util -L $(B)src/components/net -L $(B)src/components/script -L $(B)src/components/layout_traits -L $(B)src/components/style -L $(B)src/components/msg SRC_compositing = $(call rwildcard,$(S)src/components/compositing/,*.rs) CRATE_compositing = $(S)src/components/compositing/compositing.rs DONE_compositing = $(B)src/components/compositing/libcompositing.dummy -DEPS_compositing = $(CRATE_compositing) $(SRC_compositing) $(DONE_util) $(DONE_msg) $(DONE_gfx) $(DONE_script) $(DONE_layout) $(DONE_style) +DEPS_compositing = $(CRATE_compositing) $(SRC_compositing) $(DONE_util) $(DONE_msg) $(DONE_gfx) $(DONE_script) $(DONE_layout_traits) $(DONE_style) -RFLAGS_servo = $(strip $(CFG_RUSTC_FLAGS)) $(addprefix -L $(B)src/,$(DEPS_SUBMODULES)) -L $(B)src/components/gfx -L $(B)src/components/util -L $(B)src/components/net -L $(B)src/components/script -L $(B)src/components/layout -L $(B)src/components/compositing -L $(B)src/components/style -L $(B)src/components/msg -L$(B)src/components/macros +RFLAGS_servo = $(strip $(CFG_RUSTC_FLAGS)) $(addprefix -L $(B)src/,$(DEPS_SUBMODULES)) -L $(B)src/components/gfx -L $(B)src/components/util -L $(B)src/components/net -L $(B)src/components/script -L $(B)src/components/layout_traits -L $(B)src/components/layout -L $(B)src/components/compositing -L $(B)src/components/style -L $(B)src/components/msg -L$(B)src/components/macros SRC_servo = $(call rwildcard,$(S)src/components/main/,*.rs) CRATE_servo = $(S)src/components/main/servo.rs -DEPS_servo = $(CRATE_servo) $(SRC_servo) $(DONE_SUBMODULES) $(DONE_util) $(DONE_gfx) $(DONE_script) $(DONE_net) $(DONE_msg) $(DONE_style) $(DONE_macros) $(DONE_layout) $(DONE_compositing) +DEPS_servo = $(CRATE_servo) $(SRC_servo) $(DONE_SUBMODULES) $(DONE_util) $(DONE_gfx) $(DONE_script) $(DONE_net) $(DONE_msg) $(DONE_style) $(DONE_macros) $(DONE_layout) $(DONE_layout_traits) $(DONE_compositing) -SERVO_LIB_CRATES = macros util net msg gfx script style layout compositing +SERVO_LIB_CRATES = macros util net msg gfx script style layout layout_traits compositing # rules that depend on having correct meta-target vars (DEPS_CLEAN, DEPS_servo, etc) # and SERVO_LIB_CRATES @@ -364,7 +372,7 @@ servo: $(DEPS_servo) @$(call E, compile: $@) $(Q)$(RUSTC) $(RFLAGS_servo) $< --crate-type bin,dylib,rlib -RFLAGS_embedding = $(strip $(CFG_RUSTC_FLAGS)) $(addprefix -L $(B)src/,$(DEPS_SUBMODULES)) -L $(B)src/components/gfx -L $(B)src/components/util -L $(B)src/components/net -L $(B)src/components/script -L $(B)src/components/layout -L $(B)src/components/compositing -L $(B)src/components/style -L $(B)src/components/msg -L $(B).. -L $(B)src/components/main -L $(B)src/components/macros -A non_camel_case_types -A unused_variable +RFLAGS_embedding = $(strip $(CFG_RUSTC_FLAGS)) $(addprefix -L $(B)src/,$(DEPS_SUBMODULES)) -L $(B)src/components/gfx -L $(B)src/components/util -L $(B)src/components/net -L $(B)src/components/script -L $(B)src/components/layout -L $(B)src/components/layout_traits -L $(B)src/components/compositing -L $(B)src/components/style -L $(B)src/components/msg -L $(B).. -L $(B)src/components/main -L $(B)src/components/macros -A non_camel_case_types -A unused_variable ifeq ($(CFG_OSTYPE),apple-darwin) RFLAGS_embedding += -C link-args="-Wl,-U,_tc_new -Wl,-U,_tc_newarray -Wl,-U,_tc_delete -Wl,-U,_tc_deletearray" diff --git a/configure b/configure index 9361723d2d2..8d2abe5e1ef 100755 --- a/configure +++ b/configure @@ -616,6 +616,7 @@ make_dir ${CFG_BUILD_DIR}src/components/msg make_dir ${CFG_BUILD_DIR}src/components/net make_dir ${CFG_BUILD_DIR}src/components/gfx make_dir ${CFG_BUILD_DIR}src/components/layout +make_dir ${CFG_BUILD_DIR}src/components/layout_traits make_dir ${CFG_BUILD_DIR}src/components/script make_dir ${CFG_BUILD_DIR}src/components/style make_dir ${CFG_BUILD_DIR}src/components/main diff --git a/src/components/compositing/compositing.rs b/src/components/compositing/compositing.rs index b7700ef51c1..7e8c4e0fa93 100644 --- a/src/components/compositing/compositing.rs +++ b/src/components/compositing/compositing.rs @@ -26,7 +26,7 @@ extern crate glfw; #[cfg(target_os="android")] extern crate glut; extern crate layers; -extern crate layout; +extern crate layout_traits; extern crate opengles; extern crate png; extern crate script; diff --git a/src/components/compositing/constellation.rs b/src/components/compositing/constellation.rs index 4d55b25f4f4..91d44d04d94 100644 --- a/src/components/compositing/constellation.rs +++ b/src/components/compositing/constellation.rs @@ -10,6 +10,7 @@ use geom::size::TypedSize2D; use gfx::render_task; use libc; use pipeline::{Pipeline, CompositionPipeline}; +use layout_traits::LayoutTaskFactory; use script::script_task::{ResizeMsg, ResizeInactiveMsg, ExitPipelineMsg}; use script::layout_interface; use script::layout_interface::LayoutChan; @@ -31,13 +32,14 @@ use servo_util::time::TimeProfilerChan; use servo_util::url::parse_url; use servo_util::task::spawn_named; use std::cell::RefCell; +use std::kinds::marker; use std::mem::replace; use std::io; use std::rc::Rc; use url::Url; /// Maintains the pipelines and navigation context and grants permission to composite -pub struct Constellation { +pub struct Constellation { pub chan: ConstellationChan, pub request_port: Receiver, pub compositor_chan: CompositorChan, @@ -49,6 +51,7 @@ pub struct Constellation { next_pipeline_id: PipelineId, pending_frames: Vec, pending_sizes: HashMap<(PipelineId, SubpageId), TypedRect>, + layout_task_factory: marker::CovariantType, pub time_profiler_chan: TimeProfilerChan, pub window_size: WindowSizeData, pub opts: Opts, @@ -240,7 +243,7 @@ impl NavigationContext { } } -impl Constellation { +impl Constellation { pub fn start(compositor_chan: CompositorChan, opts: &Opts, resource_task: ResourceTask, @@ -252,7 +255,7 @@ impl Constellation { let constellation_chan_clone = constellation_chan.clone(); let opts_clone = opts.clone(); spawn_named("Constellation", proc() { - let mut constellation = Constellation { + let mut constellation : Constellation = Constellation { chan: constellation_chan_clone, request_port: constellation_port, compositor_chan: compositor_chan, @@ -264,6 +267,7 @@ impl Constellation { next_pipeline_id: PipelineId(0), pending_frames: vec!(), pending_sizes: HashMap::new(), + layout_task_factory: marker::CovariantType, time_profiler_chan: time_profiler_chan, window_size: WindowSizeData { visible_viewport: TypedSize2D(800_f32, 600_f32), @@ -286,6 +290,26 @@ impl Constellation { } } + /// Helper function for creating a pipeline + fn new_pipeline(&self, + id: PipelineId, + subpage_id: Option, + url: Url) + -> Pipeline { + Pipeline::create::(id, + subpage_id, + self.chan.clone(), + self.compositor_chan.clone(), + self.image_cache_task.clone(), + self.font_cache_task.clone(), + self.resource_task.clone(), + self.time_profiler_chan.clone(), + self.window_size, + self.opts.clone(), + url) + } + + /// Helper function for getting a unique pipeline Id fn get_next_pipeline_id(&mut self) -> PipelineId { let id = self.next_pipeline_id; @@ -422,17 +446,7 @@ impl Constellation { debug!("creating replacement pipeline for about:failure"); let new_id = self.get_next_pipeline_id(); - let pipeline = Pipeline::create(new_id, - subpage_id, - self.chan.clone(), - self.compositor_chan.clone(), - self.image_cache_task.clone(), - self.font_cache_task.clone(), - self.resource_task.clone(), - self.time_profiler_chan.clone(), - self.window_size, - self.opts.clone(), - parse_url("about:failure", None)); + let pipeline = self.new_pipeline(new_id, subpage_id, parse_url("about:failure", None)); pipeline.load(); let pipeline_wrapped = Rc::new(pipeline); @@ -450,17 +464,8 @@ impl Constellation { } fn handle_init_load(&mut self, url: Url) { - let pipeline = Pipeline::create(self.get_next_pipeline_id(), - None, - self.chan.clone(), - self.compositor_chan.clone(), - self.image_cache_task.clone(), - self.font_cache_task.clone(), - self.resource_task.clone(), - self.time_profiler_chan.clone(), - self.window_size, - self.opts.clone(), - url); + let next_pipeline_id = self.get_next_pipeline_id(); + let pipeline = self.new_pipeline(next_pipeline_id, None, url); pipeline.load(); let pipeline_wrapped = Rc::new(pipeline); @@ -577,30 +582,20 @@ impl Constellation { let pipeline = if same_script { debug!("Constellation: loading same-origin iframe at {:?}", url); // Reuse the script task if same-origin url's - Pipeline::with_script(next_pipeline_id, - subpage_id, - self.chan.clone(), - self.compositor_chan.clone(), - self.image_cache_task.clone(), - self.font_cache_task.clone(), - self.time_profiler_chan.clone(), - self.opts.clone(), - source_pipeline.clone(), - url) + Pipeline::with_script::(next_pipeline_id, + subpage_id, + self.chan.clone(), + self.compositor_chan.clone(), + self.image_cache_task.clone(), + self.font_cache_task.clone(), + self.time_profiler_chan.clone(), + self.opts.clone(), + source_pipeline.clone(), + url) } else { debug!("Constellation: loading cross-origin iframe at {:?}", url); // Create a new script task if not same-origin url's - Pipeline::create(next_pipeline_id, - Some(subpage_id), - self.chan.clone(), - self.compositor_chan.clone(), - self.image_cache_task.clone(), - self.font_cache_task.clone(), - self.resource_task.clone(), - self.time_profiler_chan.clone(), - self.window_size, - self.opts.clone(), - url) + self.new_pipeline(next_pipeline_id, Some(subpage_id), url) }; debug!("Constellation: sending load msg to pipeline {:?}", pipeline.id); @@ -647,18 +642,7 @@ impl Constellation { let subpage_id = source_frame.pipeline.subpage_id; let next_pipeline_id = self.get_next_pipeline_id(); - let pipeline = Pipeline::create(next_pipeline_id, - subpage_id, - self.chan.clone(), - self.compositor_chan.clone(), - self.image_cache_task.clone(), - self.font_cache_task.clone(), - self.resource_task.clone(), - self.time_profiler_chan.clone(), - self.window_size, - self.opts.clone(), - url); - + let pipeline = self.new_pipeline(next_pipeline_id, subpage_id, url); pipeline.load(); let pipeline_wrapped = Rc::new(pipeline); diff --git a/src/components/compositing/pipeline.rs b/src/components/compositing/pipeline.rs index dbd054feb55..4351dc79b69 100644 --- a/src/components/compositing/pipeline.rs +++ b/src/components/compositing/pipeline.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use CompositorChan; -use layout::layout_task::LayoutTask; +use layout_traits::LayoutTaskFactory; use gfx::render_task::{PaintPermissionGranted, PaintPermissionRevoked}; use gfx::render_task::{RenderChan, RenderTask}; @@ -45,17 +45,18 @@ pub struct CompositionPipeline { impl Pipeline { /// Starts a render task, layout task, and script task. Returns the channels wrapped in a /// struct. - pub fn with_script(id: PipelineId, - subpage_id: SubpageId, - constellation_chan: ConstellationChan, - compositor_chan: CompositorChan, - image_cache_task: ImageCacheTask, - font_cache_task: FontCacheTask, - time_profiler_chan: TimeProfilerChan, - opts: Opts, - script_pipeline: Rc, - url: Url) - -> Pipeline { + pub fn with_script( + id: PipelineId, + subpage_id: SubpageId, + constellation_chan: ConstellationChan, + compositor_chan: CompositorChan, + image_cache_task: ImageCacheTask, + font_cache_task: FontCacheTask, + time_profiler_chan: TimeProfilerChan, + opts: Opts, + script_pipeline: Rc, + url: Url) + -> Pipeline { let (layout_port, layout_chan) = LayoutChan::new(); let (render_port, render_chan) = RenderChan::new(); let (render_shutdown_chan, render_shutdown_port) = channel(); @@ -76,18 +77,19 @@ impl Pipeline { time_profiler_chan.clone(), render_shutdown_chan); - LayoutTask::create(id, - layout_port, - layout_chan.clone(), - constellation_chan, - failure, - script_pipeline.script_chan.clone(), - render_chan.clone(), - image_cache_task.clone(), - font_cache_task.clone(), - opts.clone(), - time_profiler_chan, - layout_shutdown_chan); + LayoutTaskFactory::create(None::<&mut LTF>, + id, + layout_port, + layout_chan.clone(), + constellation_chan, + failure, + script_pipeline.script_chan.clone(), + render_chan.clone(), + image_cache_task.clone(), + font_cache_task.clone(), + opts.clone(), + time_profiler_chan, + layout_shutdown_chan); let new_layout_info = NewLayoutInfo { old_pipeline_id: script_pipeline.id.clone(), @@ -109,18 +111,19 @@ impl Pipeline { url) } - pub fn create(id: PipelineId, - subpage_id: Option, - constellation_chan: ConstellationChan, - compositor_chan: CompositorChan, - image_cache_task: ImageCacheTask, - font_cache_task: FontCacheTask, - resource_task: ResourceTask, - time_profiler_chan: TimeProfilerChan, - window_size: WindowSizeData, - opts: Opts, - url: Url) - -> Pipeline { + pub fn create( + id: PipelineId, + subpage_id: Option, + constellation_chan: ConstellationChan, + compositor_chan: CompositorChan, + image_cache_task: ImageCacheTask, + font_cache_task: FontCacheTask, + resource_task: ResourceTask, + time_profiler_chan: TimeProfilerChan, + window_size: WindowSizeData, + opts: Opts, + url: Url) + -> Pipeline { let (script_port, script_chan) = ScriptChan::new(); let (layout_port, layout_chan) = LayoutChan::new(); let (render_port, render_chan) = RenderChan::new(); @@ -161,18 +164,19 @@ impl Pipeline { time_profiler_chan.clone(), render_shutdown_chan); - LayoutTask::create(id, - layout_port, - layout_chan.clone(), - constellation_chan, - failure, - script_chan.clone(), - render_chan.clone(), - image_cache_task, - font_cache_task, - opts.clone(), - time_profiler_chan, - layout_shutdown_chan); + LayoutTaskFactory::create(None::<&mut LTF>, + id, + layout_port, + layout_chan.clone(), + constellation_chan, + failure, + script_chan.clone(), + render_chan.clone(), + image_cache_task, + font_cache_task, + opts.clone(), + time_profiler_chan, + layout_shutdown_chan); pipeline } diff --git a/src/components/layout/layout.rs b/src/components/layout/layout.rs index d864ec9d848..f17d1225204 100644 --- a/src/components/layout/layout.rs +++ b/src/components/layout/layout.rs @@ -19,6 +19,7 @@ extern crate debug; extern crate geom; extern crate gfx; +extern crate layout_traits; extern crate script; extern crate style; #[phase(plugin)] diff --git a/src/components/layout/layout_task.rs b/src/components/layout/layout_task.rs index 06b513f79af..cb40a8f011d 100644 --- a/src/components/layout/layout_task.rs +++ b/src/components/layout/layout_task.rs @@ -30,6 +30,7 @@ use gfx::display_list::{DisplayItemIterator, DisplayList, OpaqueNode}; use gfx::font_context::FontContext; use gfx::render_task::{RenderMsg, RenderChan, RenderLayer}; use gfx::{render_task, color}; +use layout_traits::LayoutTaskFactory; use script::dom::bindings::js::JS; use script::dom::event::ReflowEvent; use script::dom::node::{ElementNodeTypeId, LayoutDataRef, Node}; @@ -272,9 +273,10 @@ impl ImageResponder for LayoutImageResponder { } } -impl LayoutTask { +impl LayoutTaskFactory for LayoutTask { /// Spawns a new layout task. - pub fn create(id: PipelineId, + fn create(_phantom: Option<&mut LayoutTask>, + id: PipelineId, port: Receiver, chan: LayoutChan, constellation_chan: ConstellationChan, @@ -306,7 +308,9 @@ impl LayoutTask { shutdown_chan.send(()); }); } +} +impl LayoutTask { /// Creates a new `LayoutTask` structure. fn new(id: PipelineId, port: Receiver, diff --git a/src/components/layout_traits/layout_traits.rs b/src/components/layout_traits/layout_traits.rs new file mode 100644 index 00000000000..cf95de37678 --- /dev/null +++ b/src/components/layout_traits/layout_traits.rs @@ -0,0 +1,52 @@ +/* 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/. */ + +#![crate_id = "github.com/mozilla/servo#layout_traits:0.1"] +#![crate_type = "lib"] +#![crate_type = "dylib"] +#![crate_type = "rlib"] + +#![comment = "The Servo Parallel Browser Project"] +#![license = "MPL"] + +extern crate gfx; +extern crate script; +extern crate servo_msg = "msg"; +extern crate servo_net = "net"; +extern crate servo_util = "util"; + +// This module contains traits in layout used generically +// in the rest of Servo. +// The traits are here instead of in layout so +// that these modules won't have to depend on layout. + +use gfx::font_cache_task::FontCacheTask; +use gfx::render_task::RenderChan; +use servo_msg::constellation_msg::{ConstellationChan, PipelineId}; +use servo_msg::constellation_msg::Failure; +use servo_net::image_cache_task::ImageCacheTask; +use servo_util::opts::Opts; +use servo_util::time::TimeProfilerChan; +use script::layout_interface::{LayoutChan, Msg}; +use script::script_task::ScriptChan; +use std::comm::{Sender, Receiver}; + +// A static method creating a layout task +// Here to remove the compositor -> layout dependency +pub trait LayoutTaskFactory { + // FIXME: use a proper static method + fn create(_phantom: Option<&mut Self>, + id: PipelineId, + port: Receiver, + chan: LayoutChan, + constellation_chan: ConstellationChan, + failure_msg: Failure, + script_chan: ScriptChan, + render_chan: RenderChan, + img_cache_task: ImageCacheTask, + font_cache_task: FontCacheTask, + opts: Opts, + time_profiler_chan: TimeProfilerChan, + shutdown_chan: Sender<()>); +} diff --git a/src/components/main/servo.rs b/src/components/main/servo.rs index 7bd2a3e4cfa..8d69ceece7c 100644 --- a/src/components/main/servo.rs +++ b/src/components/main/servo.rs @@ -20,6 +20,7 @@ extern crate servo_msg = "msg"; #[phase(plugin, link)] extern crate servo_util = "util"; extern crate script; +extern crate layout; extern crate green; extern crate gfx; extern crate libc; @@ -125,7 +126,8 @@ pub fn run(opts: opts::Opts) { ImageCacheTask::new(resource_task.clone()) }; let font_cache_task = FontCacheTask::new(); - let constellation_chan = Constellation::start(compositor_chan, + let constellation_chan = Constellation::::start( + compositor_chan, opts, resource_task, image_cache_task,