Simplify ThreadSafeLayoutNodeChildrenIterator::next().

This commit is contained in:
Ms2ger 2015-07-17 18:56:47 +02:00
parent 126f5ae8f0
commit b3892b74f7

View file

@ -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()
}
}) })
} else { },
None
};
}
None => { None => {
if self.parent_node.has_after_pseudo() { if self.parent_node.has_after_pseudo() {
let pseudo_after_node = if self.parent_node.pseudo == PseudoElementType::Normal { let pseudo = PseudoElementType::After(
let pseudo = PseudoElementType::After(self.parent_node.get_after_display()); self.parent_node.get_after_display());
Some(self.parent_node.with_pseudo(pseudo)) Some(self.parent_node.with_pseudo(pseudo))
} else { } else {
None None
}
}
}
},
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
},
}; };
self.current_node = pseudo_after_node;
return self.current_node.clone()
}
}
} }
node node