diff options
Diffstat (limited to 'components/script/dom/node.rs')
-rw-r--r-- | components/script/dom/node.rs | 51 |
1 files changed, 14 insertions, 37 deletions
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index f6389b57efe..ea00f62f43d 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -149,8 +149,6 @@ bitflags! { pub flags NodeFlags: u8 { #[doc = "Specifies whether this node is in a document."] const IS_IN_DOC = 0x01, - #[doc = "Specifies whether this node _must_ be reflowed regardless of style differences."] - const HAS_CHANGED = 0x02, #[doc = "Specifies whether this node needs style recalc on next reflow."] const IS_DIRTY = 0x04, #[doc = "Specifies whether this node has descendants (inclusive of itself) which \ @@ -175,7 +173,7 @@ bitflags! { impl NodeFlags { pub fn new() -> NodeFlags { - HAS_CHANGED | IS_DIRTY | HAS_DIRTY_DESCENDANTS + IS_DIRTY } } @@ -251,6 +249,8 @@ impl Node { let parent_in_doc = self.is_in_doc(); for node in new_child.traverse_preorder() { node.set_flag(IS_IN_DOC, parent_in_doc); + // Out-of-document elements never have the descendants flag set. + debug_assert!(!node.get_flag(HAS_DIRTY_DESCENDANTS)); vtable_for(&&*node).bind_to_tree(parent_in_doc); } let document = new_child.owner_doc(); @@ -289,7 +289,8 @@ impl Node { self.children_count.set(self.children_count.get() - 1); for node in child.traverse_preorder() { - node.set_flag(IS_IN_DOC, false); + // Out-of-document elements never have the descendants flag set. + node.set_flag(IS_IN_DOC | HAS_DIRTY_DESCENDANTS, false); vtable_for(&&*node).unbind_from_tree(&context); node.style_and_layout_data.get().map(|d| node.dispose(d)); } @@ -428,14 +429,6 @@ impl Node { self.flags.set(flags); } - pub fn has_changed(&self) -> bool { - self.get_flag(HAS_CHANGED) - } - - pub fn set_has_changed(&self, state: bool) { - self.set_flag(HAS_CHANGED, state) - } - pub fn is_dirty(&self) -> bool { self.get_flag(IS_DIRTY) } @@ -452,10 +445,6 @@ impl Node { self.set_flag(HAS_DIRTY_DESCENDANTS, state) } - pub fn force_dirty_ancestors(&self, damage: NodeDamage) { - self.dirty_impl(damage, true) - } - pub fn rev_version(&self) { // The new version counter is 1 plus the max of the node's current version counter, // its descendants version, and the document's version. Normally, this will just be @@ -470,30 +459,18 @@ impl Node { } pub fn dirty(&self, damage: NodeDamage) { - self.dirty_impl(damage, false) - } - - pub fn dirty_impl(&self, damage: NodeDamage, force_ancestors: bool) { - // 0. Set version counter self.rev_version(); - - // 1. Dirty self. - match damage { - NodeDamage::NodeStyleDamaged => {} - NodeDamage::OtherNodeDamage => self.set_has_changed(true), + if !self.is_in_doc() { + return; } - if self.is_dirty() && !force_ancestors { - return - } - - self.set_flag(IS_DIRTY, true); - - // 4. Dirty ancestors. - for ancestor in self.ancestors() { - if !force_ancestors && ancestor.has_dirty_descendants() { break } - ancestor.set_has_dirty_descendants(true); - } + match self.type_id() { + NodeTypeId::CharacterData(CharacterDataTypeId::Text) => + self.parent_node.get().unwrap().downcast::<Element>().unwrap().restyle(damage), + NodeTypeId::Element(_) => + self.downcast::<Element>().unwrap().restyle(damage), + _ => {}, + }; } /// The maximum version number of this node's descendants, including itself |