mirror of
https://github.com/servo/servo.git
synced 2025-08-15 18:35:33 +01:00
style: Distinguish between the tree structures used for traversal and selector matching.
This patch renames TNode::parent_element to traversal_parent, since it returns the parent from the perspective of traversal (which in Gecko uses the flattened tree). It also renames TNode::children to traversal_children for the saem reason. We keep parent_element and children functions on TNode to use for selector matching, which must be done on the real DOM tree structure.
This commit is contained in:
parent
c465dd0375
commit
c533097e20
11 changed files with 102 additions and 67 deletions
|
@ -204,6 +204,16 @@ impl<'ln> GeckoNode<'ln> {
|
|||
true
|
||||
}
|
||||
|
||||
fn flattened_tree_parent(&self) -> Option<Self> {
|
||||
let fast_path = self.flattened_tree_parent_is_parent();
|
||||
debug_assert!(fast_path == unsafe { bindings::Gecko_FlattenedTreeParentIsParent(self.0) });
|
||||
if fast_path {
|
||||
unsafe { self.0.mParent.as_ref().map(GeckoNode) }
|
||||
} else {
|
||||
unsafe { bindings::Gecko_GetFlattenedTreeParentNode(self.0).map(GeckoNode) }
|
||||
}
|
||||
}
|
||||
|
||||
/// This logic is duplicated in Gecko's nsIContent::IsRootOfNativeAnonymousSubtree.
|
||||
fn is_root_of_native_anonymous_subtree(&self) -> bool {
|
||||
use gecko_bindings::structs::NODE_IS_NATIVE_ANONYMOUS_ROOT;
|
||||
|
@ -240,12 +250,24 @@ impl<'ln> TNode for GeckoNode<'ln> {
|
|||
GeckoNode(&*(n.0 as *mut RawGeckoNode))
|
||||
}
|
||||
|
||||
fn children(self) -> LayoutIterator<GeckoChildrenIterator<'ln>> {
|
||||
fn parent_node(&self) -> Option<Self> {
|
||||
unsafe { self.0.mParent.as_ref().map(GeckoNode) }
|
||||
}
|
||||
|
||||
fn children(&self) -> LayoutIterator<GeckoChildrenIterator<'ln>> {
|
||||
LayoutIterator(self.dom_children())
|
||||
}
|
||||
|
||||
fn traversal_parent(&self) -> Option<GeckoElement<'ln>> {
|
||||
self.flattened_tree_parent().and_then(|n| n.as_element())
|
||||
}
|
||||
|
||||
fn traversal_children(&self) -> LayoutIterator<GeckoChildrenIterator<'ln>> {
|
||||
let maybe_iter = unsafe { Gecko_MaybeCreateStyleChildrenIterator(self.0) };
|
||||
if let Some(iter) = maybe_iter.into_owned_opt() {
|
||||
LayoutIterator(GeckoChildrenIterator::GeckoIterator(iter))
|
||||
} else {
|
||||
LayoutIterator(GeckoChildrenIterator::Current(self.first_child()))
|
||||
LayoutIterator(self.dom_children())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -277,16 +299,6 @@ impl<'ln> TNode for GeckoNode<'ln> {
|
|||
// Maybe this isn’t useful for Gecko?
|
||||
}
|
||||
|
||||
fn parent_node(&self) -> Option<Self> {
|
||||
let fast_path = self.flattened_tree_parent_is_parent();
|
||||
debug_assert!(fast_path == unsafe { bindings::Gecko_FlattenedTreeParentIsParent(self.0) });
|
||||
if fast_path {
|
||||
unsafe { self.0.mParent.as_ref().map(GeckoNode) }
|
||||
} else {
|
||||
unsafe { bindings::Gecko_GetFlattenedTreeParentNode(self.0).map(GeckoNode) }
|
||||
}
|
||||
}
|
||||
|
||||
fn is_in_doc(&self) -> bool {
|
||||
unsafe { bindings::Gecko_IsInDocument(self.0) }
|
||||
}
|
||||
|
@ -644,9 +656,10 @@ impl<'le> TElement for GeckoElement<'le> {
|
|||
|
||||
fn inheritance_parent(&self) -> Option<Self> {
|
||||
if self.is_native_anonymous() {
|
||||
return self.closest_non_native_anonymous_ancestor();
|
||||
self.closest_non_native_anonymous_ancestor()
|
||||
} else {
|
||||
self.as_node().flattened_tree_parent().and_then(|n| n.as_element())
|
||||
}
|
||||
return self.parent_element();
|
||||
}
|
||||
|
||||
fn closest_non_native_anonymous_ancestor(&self) -> Option<Self> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue