From 0238410b478c1b8af0599e6a2f2869e8fdd29439 Mon Sep 17 00:00:00 2001 From: Keegan McAllister Date: Tue, 10 Dec 2013 15:15:43 -0800 Subject: [PATCH] Allow setting id, class, style without a full reflow Instead we do selector matching again, then diff the style structs to set the "restyle damage" bits which are used to prune reflow traversals. Also don't force a reflow when timers finish, because individual DOM methods should already take care of that. --- src/components/script/dom/document.rs | 7 ++++++- src/components/script/dom/element.rs | 9 +++++++-- src/components/script/dom/window.rs | 6 +++--- src/components/script/script_task.rs | 3 --- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index 8e0c7676ca8..e86e7465ec3 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -23,6 +23,7 @@ use dom::htmltitleelement::HTMLTitleElement; use html::hubbub_html_parser::build_element_from_tag; use js::jsapi::{JSObject, JSContext, JSTracer}; use servo_util::tree::{TreeNodeRef, ElementLike}; +use layout_interface::{DocumentDamageLevel, ContentChangedDocumentDamage}; use std::hashmap::HashMap; @@ -319,7 +320,11 @@ impl Document { } pub fn content_changed(&self) { - self.window.content_changed(); + self.damage_and_reflow(ContentChangedDocumentDamage); + } + + pub fn damage_and_reflow(&self, damage: DocumentDamageLevel) { + self.window.damage_and_reflow(damage); } pub fn wait_until_safe_to_modify_dom(&self) { diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index a928626fb20..e8acb68f731 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -18,7 +18,8 @@ use dom::document; use dom::namespace; use dom::namespace::Namespace; use layout_interface::{ContentBoxQuery, ContentBoxResponse, ContentBoxesQuery}; -use layout_interface::{ContentBoxesResponse}; +use layout_interface::{ContentBoxesResponse, ContentChangedDocumentDamage}; +use layout_interface::{MatchSelectorsDocumentDamage}; use style; use servo_util::tree::{TreeNodeRef, ElementLike}; @@ -293,8 +294,12 @@ impl<'self> Element { } if abstract_self.is_in_doc() { + let damage = match local_name.as_slice() { + "style" | "id" | "class" => MatchSelectorsDocumentDamage, + _ => ContentChangedDocumentDamage + }; let document = self.node.owner_doc(); - document.document().content_changed(); + document.document().damage_and_reflow(damage); } } } diff --git a/src/components/script/dom/window.rs b/src/components/script/dom/window.rs index 74d785784a4..9f55e3cf3c5 100644 --- a/src/components/script/dom/window.rs +++ b/src/components/script/dom/window.rs @@ -12,7 +12,7 @@ use dom::node::{AbstractNode, ScriptView}; use dom::location::Location; use dom::navigator::Navigator; -use layout_interface::{ReflowForDisplay, ContentChangedDocumentDamage}; +use layout_interface::{ReflowForDisplay, DocumentDamageLevel}; use script_task::{ExitWindowMsg, FireTimerMsg, Page, ScriptChan}; use servo_msg::compositor_msg::ScriptListener; use servo_net::image_cache_task::ImageCacheTask; @@ -185,11 +185,11 @@ impl Window { self.active_timers.remove(&handle); } - pub fn content_changed(&self) { + pub fn damage_and_reflow(&self, damage: DocumentDamageLevel) { // FIXME This should probably be ReflowForQuery, not Display. All queries currently // currently rely on the display list, which means we can't destroy it by // doing a query reflow. - self.page.damage(ContentChangedDocumentDamage); + self.page.damage(damage); self.page.reflow(ReflowForDisplay, self.script_chan.clone(), self.compositor); } diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index 0c3bf255163..b77b383f4ed 100755 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -588,9 +588,6 @@ impl ScriptTask { &rval); } - // We don't know what the script changed, so for now we will do a total redisplay. - page.damage(ContentChangedDocumentDamage); - page.reflow(ReflowForDisplay, self.chan.clone(), self.compositor); } /// Handles a notification that reflow completed.