style: Add TNode::children_and_traversal_children_might_differ.

This will be used to optimize out traversing the real DOM children when
propagating restyle hints.
This commit is contained in:
Cameron McCormack 2017-06-09 13:43:52 +08:00
parent c533097e20
commit 719709f0d5
3 changed files with 15 additions and 0 deletions

View file

@ -185,6 +185,12 @@ impl<'ln> TNode for ServoLayoutNode<'ln> {
self.children() self.children()
} }
fn children_and_traversal_children_might_differ(&self) -> bool {
// Servo doesn't have to worry about nodes being rearranged in the
// flattened tree like Gecko does (for XBL and Shadow DOM). Yet.
false
}
fn opaque(&self) -> OpaqueNode { fn opaque(&self) -> OpaqueNode {
unsafe { self.get_jsmanaged().opaque() } unsafe { self.get_jsmanaged().opaque() }
} }

View file

@ -126,6 +126,10 @@ pub trait TNode : Sized + Copy + Clone + Debug + NodeInfo {
/// Get this node's children from the perspective of a restyle traversal. /// Get this node's children from the perspective of a restyle traversal.
fn traversal_children(&self) -> LayoutIterator<Self::ConcreteChildrenIterator>; fn traversal_children(&self) -> LayoutIterator<Self::ConcreteChildrenIterator>;
/// Returns whether `children()` and `traversal_children()` might return
/// iterators over different nodes.
fn children_and_traversal_children_might_differ(&self) -> bool;
/// Converts self into an `OpaqueNode`. /// Converts self into an `OpaqueNode`.
fn opaque(&self) -> OpaqueNode; fn opaque(&self) -> OpaqueNode;

View file

@ -34,6 +34,7 @@ use gecko_bindings::bindings::{Gecko_IsRootElement, Gecko_MatchesElement, Gecko_
use gecko_bindings::bindings::{Gecko_SetNodeFlags, Gecko_UnsetNodeFlags}; use gecko_bindings::bindings::{Gecko_SetNodeFlags, Gecko_UnsetNodeFlags};
use gecko_bindings::bindings::Gecko_ClassOrClassList; use gecko_bindings::bindings::Gecko_ClassOrClassList;
use gecko_bindings::bindings::Gecko_ElementHasAnimations; use gecko_bindings::bindings::Gecko_ElementHasAnimations;
use gecko_bindings::bindings::Gecko_ElementHasBindingWithAnonymousContent;
use gecko_bindings::bindings::Gecko_ElementHasCSSAnimations; use gecko_bindings::bindings::Gecko_ElementHasCSSAnimations;
use gecko_bindings::bindings::Gecko_ElementHasCSSTransitions; use gecko_bindings::bindings::Gecko_ElementHasCSSTransitions;
use gecko_bindings::bindings::Gecko_GetActiveLinkAttrDeclarationBlock; use gecko_bindings::bindings::Gecko_GetActiveLinkAttrDeclarationBlock;
@ -271,6 +272,10 @@ impl<'ln> TNode for GeckoNode<'ln> {
} }
} }
fn children_and_traversal_children_might_differ(&self) -> bool {
self.as_element().map_or(false, |e| unsafe { Gecko_ElementHasBindingWithAnonymousContent(e.0) })
}
fn opaque(&self) -> OpaqueNode { fn opaque(&self) -> OpaqueNode {
let ptr: usize = self.0 as *const _ as usize; let ptr: usize = self.0 as *const _ as usize;
OpaqueNode(ptr) OpaqueNode(ptr)