aboutsummaryrefslogtreecommitdiffstats
path: root/src/servo/layout/layout_task.rs
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2012-11-18 22:19:01 -0800
committerPatrick Walton <pcwalton@mimiga.net>2012-11-18 22:19:01 -0800
commit1ddfc148819b47fffed8d2dfedf8e675788cb46b (patch)
tree7fedd6586681bf1cf252c1f2615bf023ef6c50c4 /src/servo/layout/layout_task.rs
parentc31bd435700446dd13d4f34f7715aa5476d6eba2 (diff)
downloadservo-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.rs35
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);
+ }
+ }
}
}