diff options
Diffstat (limited to 'src/components/main/css/node_util.rs')
-rw-r--r-- | src/components/main/css/node_util.rs | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/components/main/css/node_util.rs b/src/components/main/css/node_util.rs index 0342d8e2dc7..a63ee695af5 100644 --- a/src/components/main/css/node_util.rs +++ b/src/components/main/css/node_util.rs @@ -3,6 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use layout::aux::LayoutAuxMethods; +use layout::incremental::RestyleDamage; use std::cast::transmute; use newcss::complete::CompleteSelectResults; @@ -11,6 +12,10 @@ use script::dom::node::{AbstractNode, LayoutView}; pub trait NodeUtil<'self> { fn get_css_select_results(self) -> &'self CompleteSelectResults; fn set_css_select_results(self, decl: CompleteSelectResults); + fn have_css_select_results(self) -> bool; + + fn get_restyle_damage(self) -> RestyleDamage; + fn set_restyle_damage(self, damage: RestyleDamage); } impl<'self> NodeUtil<'self> for AbstractNode<LayoutView> { @@ -32,6 +37,11 @@ impl<'self> NodeUtil<'self> for AbstractNode<LayoutView> { } } + /// Does this node have a computed style yet? + fn have_css_select_results(self) -> bool { + self.has_layout_data() && self.layout_data().style.is_some() + } + /// Update the computed style of an HTML element with a style specified by CSS. fn set_css_select_results(self, decl: CompleteSelectResults) { if !self.has_layout_data() { @@ -40,4 +50,30 @@ impl<'self> NodeUtil<'self> for AbstractNode<LayoutView> { self.layout_data().style = Some(decl); } + + /// Get the description of how to account for recent style changes. + /// This is a simple bitfield and fine to copy by value. + fn get_restyle_damage(self) -> RestyleDamage { + // For DOM elements, if we haven't computed damage yet, assume the worst. + // Other nodes don't have styles. + let default = if self.is_element() { + RestyleDamage::all() + } else { + RestyleDamage::none() + }; + + if !self.has_layout_data() { + return default; + } + self.layout_data().restyle_damage.get_or_default(default) + } + + /// Set the restyle damage field. + fn set_restyle_damage(self, damage: RestyleDamage) { + if !self.has_layout_data() { + fail!(~"set_restyle_damage() called on a node without aux data!"); + } + + self.layout_data().restyle_damage = Some(damage); + } } |