diff options
author | Patrick Walton <pcwalton@mimiga.net> | 2012-11-18 22:19:01 -0800 |
---|---|---|
committer | Patrick Walton <pcwalton@mimiga.net> | 2012-11-18 22:19:01 -0800 |
commit | 1ddfc148819b47fffed8d2dfedf8e675788cb46b (patch) | |
tree | 7fedd6586681bf1cf252c1f2615bf023ef6c50c4 /src | |
parent | c31bd435700446dd13d4f34f7715aa5476d6eba2 (diff) | |
download | servo-1ddfc148819b47fffed8d2dfedf8e675788cb46b.tar.gz servo-1ddfc148819b47fffed8d2dfedf8e675788cb46b.zip |
content, layout: Very, very early beginnings of support for incremental reflow.
Don't perform CSS selector matching when the window is resized.
Diffstat (limited to 'src')
-rw-r--r-- | src/servo/content/content_task.rs | 18 | ||||
-rw-r--r-- | src/servo/layout/layout_task.rs | 35 |
2 files changed, 45 insertions, 8 deletions
diff --git a/src/servo/content/content_task.rs b/src/servo/content/content_task.rs index 6e6038a2b99..bb41b96606c 100644 --- a/src/servo/content/content_task.rs +++ b/src/servo/content/content_task.rs @@ -9,7 +9,8 @@ use dom::node::{Node, NodeScope, define_bindings}; use dom::event::{Event, ResizeEvent, ReflowEvent}; use dom::window::Window; use layout::layout_task; -use layout::layout_task::{AddStylesheet, BuildData, BuildMsg, LayoutTask}; +use layout::layout_task::{AddStylesheet, BuildData, BuildMsg, Damage, LayoutTask}; +use layout::layout_task::{MatchSelectorsDamage, NoDamage, ReflowDamage}; use core::comm::{Port, Chan, listen, select2}; use core::either; @@ -96,6 +97,9 @@ pub struct Content { resource_task: ResourceTask, compartment: Option<compartment>, + + // What parts of layout are dirty. + mut damage: Damage, } fn Content(layout_task: LayoutTask, @@ -136,7 +140,9 @@ fn Content(layout_task: LayoutTask, window_size : Size2D(800u, 600u), resource_task : resource_task, - compartment : compartment + compartment : compartment, + + damage : MatchSelectorsDamage, }; cx.set_cx_private(ptr::to_unsafe_ptr(&*content) as *()); @@ -196,7 +202,10 @@ impl Content { let document = Document(root, self.scope); let window = Window(self.control_chan.clone()); + + self.damage.add(MatchSelectorsDamage); self.relayout(&document, &url); + self.document = Some(@move document); self.window = Some(@move window); self.doc_url = Some(move url); @@ -302,7 +311,8 @@ impl Content { url: copy *doc_url, dom_event_chan: self.event_chan.clone(), window_size: self.window_size, - content_join_chan: move join_chan + content_join_chan: move join_chan, + damage: replace(&mut self.damage, NoDamage), }; self.layout_task.send(BuildMsg(move data)); @@ -331,6 +341,7 @@ impl Content { match event { ResizeEvent(new_width, new_height, response_chan) => { debug!("content got resize event: %u, %u", new_width, new_height); + self.damage.add(ReflowDamage); self.window_size = Size2D(new_width, new_height); match copy self.document { None => { @@ -346,6 +357,7 @@ impl Content { } ReflowEvent => { debug!("content got reflow event"); + self.damage.add(MatchSelectorsDamage); match copy self.document { None => { // Nothing to do. diff --git a/src/servo/layout/layout_task.rs b/src/servo/layout/layout_task.rs index 8a43bf9cfe5..94894a243e3 100644 --- a/src/servo/layout/layout_task.rs +++ b/src/servo/layout/layout_task.rs @@ -57,12 +57,31 @@ pub enum Msg { ExitMsg } +// Dirty bits for layout. +pub enum Damage { + NoDamage, // Document is clean; do nothing. + ReflowDamage, // Reflow; don't perform CSS selector matching. + MatchSelectorsDamage, // Perform CSS selector matching and reflow. +} + +impl Damage { + fn add(&mut self, new_damage: Damage) { + match (*self, new_damage) { + (NoDamage, _) => *self = new_damage, + (ReflowDamage, NoDamage) => *self = ReflowDamage, + (ReflowDamage, new_damage) => *self = new_damage, + (MatchSelectorsDamage, _) => *self = MatchSelectorsDamage + } + } +} + struct BuildData { node: Node, url: Url, dom_event_chan: pipes::SharedChan<Event>, window_size: Size2D<uint>, - content_join_chan: pipes::Chan<()> + content_join_chan: pipes::Chan<()>, + damage: Damage, } fn LayoutTask(render_task: RenderTask, @@ -147,7 +166,6 @@ impl Layout { } fn handle_build(data: BuildData) { - let node = &data.node; // FIXME: Bad copy let doc_url = copy data.url; @@ -155,6 +173,7 @@ impl Layout { let dom_event_chan = data.dom_event_chan.clone(); debug!("layout: received layout request for: %s", doc_url.to_str()); + debug!("layout: damage is %?", data.damage); debug!("layout: parsed Node tree"); debug!("%?", node.dump()); @@ -176,9 +195,15 @@ impl Layout { node.initialize_style_for_subtree(&self.layout_refs); } - do time("layout: selector matching") { - do self.css_select_ctx.borrow_imm |ctx| { - node.restyle_subtree(ctx); + // Perform CSS selector matching if necessary. + match data.damage { + NoDamage | ReflowDamage => {} + MatchSelectorsDamage => { + do time("layout: selector matching") { + do self.css_select_ctx.borrow_imm |ctx| { + node.restyle_subtree(ctx); + } + } } } |