mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
Simplify ThreadSafeLayoutNodeChildrenIterator::next().
This commit is contained in:
parent
126f5ae8f0
commit
b3892b74f7
1 changed files with 40 additions and 35 deletions
|
@ -670,15 +670,6 @@ impl<'ln> ThreadSafeLayoutNode<'ln> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the next sibling of this node. Unsafe and private because this can lead to races.
|
|
||||||
unsafe fn next_sibling(&self) -> Option<ThreadSafeLayoutNode<'ln>> {
|
|
||||||
if self.pseudo.is_before() {
|
|
||||||
return self.get_jsmanaged().first_child_ref().map(|node| self.new_with_this_lifetime(&node))
|
|
||||||
}
|
|
||||||
|
|
||||||
self.get_jsmanaged().next_sibling_ref().map(|node| self.new_with_this_lifetime(&node))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns an iterator over this node's children.
|
/// Returns an iterator over this node's children.
|
||||||
pub fn children(&self) -> ThreadSafeLayoutNodeChildrenIterator<'ln> {
|
pub fn children(&self) -> ThreadSafeLayoutNodeChildrenIterator<'ln> {
|
||||||
ThreadSafeLayoutNodeChildrenIterator {
|
ThreadSafeLayoutNodeChildrenIterator {
|
||||||
|
@ -975,34 +966,48 @@ impl<'a> Iterator for ThreadSafeLayoutNodeChildrenIterator<'a> {
|
||||||
fn next(&mut self) -> Option<ThreadSafeLayoutNode<'a>> {
|
fn next(&mut self) -> Option<ThreadSafeLayoutNode<'a>> {
|
||||||
let node = self.current_node.clone();
|
let node = self.current_node.clone();
|
||||||
|
|
||||||
match node {
|
if let Some(ref node) = node {
|
||||||
Some(ref node) => {
|
self.current_node = match node.pseudo {
|
||||||
if node.pseudo.is_after() {
|
PseudoElementType::Before(_) => {
|
||||||
return None
|
match unsafe { self.parent_node.get_jsmanaged().first_child_ref() } {
|
||||||
}
|
Some(first) => {
|
||||||
|
Some(unsafe {
|
||||||
self.current_node = if self.parent_node.pseudo == PseudoElementType::Normal {
|
self.parent_node.new_with_this_lifetime(&first)
|
||||||
self.current_node.clone().and_then(|node| {
|
})
|
||||||
unsafe {
|
},
|
||||||
node.next_sibling()
|
None => {
|
||||||
|
if self.parent_node.has_after_pseudo() {
|
||||||
|
let pseudo = PseudoElementType::After(
|
||||||
|
self.parent_node.get_after_display());
|
||||||
|
Some(self.parent_node.with_pseudo(pseudo))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
} else {
|
},
|
||||||
|
PseudoElementType::Normal => {
|
||||||
|
match unsafe { node.get_jsmanaged().next_sibling_ref() } {
|
||||||
|
Some(next) => {
|
||||||
|
Some(unsafe {
|
||||||
|
self.parent_node.new_with_this_lifetime(&next)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
None => {
|
||||||
|
if self.parent_node.has_after_pseudo() {
|
||||||
|
let pseudo = PseudoElementType::After(
|
||||||
|
self.parent_node.get_after_display());
|
||||||
|
Some(self.parent_node.with_pseudo(pseudo))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
PseudoElementType::After(_) => {
|
||||||
None
|
None
|
||||||
};
|
},
|
||||||
}
|
};
|
||||||
None => {
|
|
||||||
if self.parent_node.has_after_pseudo() {
|
|
||||||
let pseudo_after_node = if self.parent_node.pseudo == PseudoElementType::Normal {
|
|
||||||
let pseudo = PseudoElementType::After(self.parent_node.get_after_display());
|
|
||||||
Some(self.parent_node.with_pseudo(pseudo))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
};
|
|
||||||
self.current_node = pseudo_after_node;
|
|
||||||
return self.current_node.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
node
|
node
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue