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/servo/layout/layout_task.rs | |
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/servo/layout/layout_task.rs')
-rw-r--r-- | src/servo/layout/layout_task.rs | 35 |
1 files changed, 30 insertions, 5 deletions
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); + } + } } } |