auto merge of #3871 : Ms2ger/servo/node-cleanup, r=Ms2ger

This commit is contained in:
bors-servo 2014-11-02 14:51:33 -07:00
commit 1a3ff8739c

View file

@ -59,7 +59,7 @@ use libc;
use libc::{uintptr_t, c_void}; use libc::{uintptr_t, c_void};
use std::cell::{Cell, RefCell, Ref, RefMut}; use std::cell::{Cell, RefCell, Ref, RefMut};
use std::default::Default; use std::default::Default;
use std::iter::{Map, Filter, Peekable}; use std::iter::{FilterMap, Peekable};
use std::mem; use std::mem;
use style; use style;
use style::ComputedValues; use style::ComputedValues;
@ -777,13 +777,7 @@ impl<'a> NodeHelpers<'a> for JSRef<'a, Node> {
fn child_elements(self) -> ChildElementIterator<'a> { fn child_elements(self) -> ChildElementIterator<'a> {
self.children() self.children()
.filter(|node| { .filter_map::<JSRef<Element>>(ElementCast::to_ref)
node.is_element()
})
.map(|node| {
let elem: JSRef<Element> = ElementCast::to_ref(node).unwrap();
elem.clone()
})
.peekable() .peekable()
} }
@ -967,10 +961,12 @@ impl RawLayoutNodeHelpers for Node {
// Iteration and traversal // Iteration and traversal
// //
pub type ChildElementIterator<'a> = Peekable<JSRef<'a, Element>, pub type ChildElementIterator<'a> =
Map<'a, JSRef<'a, Node>, Peekable<JSRef<'a, Element>,
JSRef<'a, Element>, FilterMap<'a,
Filter<'a, JSRef<'a, Node>, NodeChildrenIterator<'a>>>>; JSRef<'a, Node>,
JSRef<'a, Element>,
NodeChildrenIterator<'a>>>;
pub struct NodeChildrenIterator<'a> { pub struct NodeChildrenIterator<'a> {
current: Option<JSRef<'a, Node>>, current: Option<JSRef<'a, Node>>,
@ -1054,15 +1050,13 @@ impl NodeIterator {
} }
fn next_child<'b>(&self, node: JSRef<'b, Node>) -> Option<JSRef<'b, Node>> { fn next_child<'b>(&self, node: JSRef<'b, Node>) -> Option<JSRef<'b, Node>> {
if !self.include_descendants_of_void && node.is_element() { let skip = |element: JSRef<Element>| {
let elem: JSRef<Element> = ElementCast::to_ref(node).unwrap(); !self.include_descendants_of_void && element.is_void()
if elem.is_void() { };
None
} else { match ElementCast::to_ref(node) {
node.first_child().map(|child| (*child.root()).clone()) Some(element) if skip(element) => None,
} _ => node.first_child().map(|child| (*child.root()).clone()),
} else {
node.first_child().map(|child| (*child.root()).clone())
} }
} }
} }