aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2014-12-13 10:38:17 +0100
committerMs2ger <ms2ger@gmail.com>2014-12-13 10:38:19 +0100
commit14e1455119fde58a9e4ab9232efa816d2585c900 (patch)
treefad9a28ae173629933492a5c15fc853bea37fc14 /components
parent4a2c4b65ccbe583289bd354607ee88e4f9a09c1a (diff)
downloadservo-14e1455119fde58a9e4ab9232efa816d2585c900.tar.gz
servo-14e1455119fde58a9e4ab9232efa816d2585c900.zip
Skip the root node in live HTMLCollections.
The root node is never included in the collection, and omitting it here simplifies and speeds up the filter implementations.
Diffstat (limited to 'components')
-rw-r--r--components/script/dom/htmlcollection.rs24
-rw-r--r--components/script/dom/htmlfieldsetelement.rs7
2 files changed, 11 insertions, 20 deletions
diff --git a/components/script/dom/htmlcollection.rs b/components/script/dom/htmlcollection.rs
index 8a95b558793..86f977c843a 100644
--- a/components/script/dom/htmlcollection.rs
+++ b/components/script/dom/htmlcollection.rs
@@ -16,7 +16,7 @@ use servo_util::namespace;
use servo_util::str::{DOMString, split_html_space_chars};
use std::ascii::AsciiExt;
-use std::iter::FilterMap;
+use std::iter::{FilterMap, Skip};
use string_cache::{Atom, Namespace};
pub trait CollectionFilter : JSTraceable {
@@ -63,10 +63,7 @@ impl HTMLCollection {
namespace_filter: Option<Namespace>
}
impl CollectionFilter for AllElementFilter {
- fn filter(&self, elem: JSRef<Element>, root: JSRef<Node>) -> bool {
- if NodeCast::from_ref(elem) == root {
- return false
- }
+ fn filter(&self, elem: JSRef<Element>, _root: JSRef<Node>) -> bool {
match self.namespace_filter {
None => true,
Some(ref namespace) => *elem.namespace() == *namespace
@@ -89,10 +86,7 @@ impl HTMLCollection {
ascii_lower_tag: Atom,
}
impl CollectionFilter for TagNameFilter {
- fn filter(&self, elem: JSRef<Element>, root: JSRef<Node>) -> bool {
- if NodeCast::from_ref(elem) == root {
- return false
- }
+ fn filter(&self, elem: JSRef<Element>, _root: JSRef<Node>) -> bool {
if elem.html_element_in_html_document() {
*elem.local_name() == self.ascii_lower_tag
} else {
@@ -123,10 +117,7 @@ impl HTMLCollection {
namespace_filter: Option<Namespace>
}
impl CollectionFilter for TagNameNSFilter {
- fn filter(&self, elem: JSRef<Element>, root: JSRef<Node>) -> bool {
- if NodeCast::from_ref(elem) == root {
- return false
- }
+ fn filter(&self, elem: JSRef<Element>, _root: JSRef<Node>) -> bool {
let ns_match = match self.namespace_filter {
Some(ref namespace) => {
*elem.namespace() == *namespace
@@ -150,8 +141,8 @@ impl HTMLCollection {
classes: Vec<Atom>
}
impl CollectionFilter for ClassNameFilter {
- fn filter(&self, elem: JSRef<Element>, root: JSRef<Node>) -> bool {
- (NodeCast::from_ref(elem) != root) && self.classes.iter().all(|class| elem.has_class(class))
+ fn filter(&self, elem: JSRef<Element>, _root: JSRef<Node>) -> bool {
+ self.classes.iter().all(|class| elem.has_class(class))
}
}
let filter = ClassNameFilter {
@@ -176,8 +167,9 @@ impl HTMLCollection {
fn traverse<'a>(root: JSRef<'a, Node>)
-> FilterMap<'a, JSRef<'a, Node>,
JSRef<'a, Element>,
- TreeIterator<'a>> {
+ Skip<TreeIterator<'a>>> {
root.traverse_preorder()
+ .skip(1)
.filter_map(ElementCast::to_ref)
}
}
diff --git a/components/script/dom/htmlfieldsetelement.rs b/components/script/dom/htmlfieldsetelement.rs
index 1dfdaa063b9..3ed4a82200c 100644
--- a/components/script/dom/htmlfieldsetelement.rs
+++ b/components/script/dom/htmlfieldsetelement.rs
@@ -6,7 +6,7 @@ use dom::attr::Attr;
use dom::attr::AttrHelpers;
use dom::bindings::codegen::Bindings::HTMLFieldSetElementBinding;
use dom::bindings::codegen::Bindings::HTMLFieldSetElementBinding::HTMLFieldSetElementMethods;
-use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLFieldSetElementDerived, NodeCast};
+use dom::bindings::codegen::InheritTypes::{HTMLFieldSetElementDerived, NodeCast};
use dom::bindings::codegen::InheritTypes::{HTMLElementCast, HTMLLegendElementDerived};
use dom::bindings::js::{JSRef, Temporary};
use dom::bindings::utils::{Reflectable, Reflector};
@@ -54,11 +54,10 @@ impl<'a> HTMLFieldSetElementMethods for JSRef<'a, HTMLFieldSetElement> {
#[jstraceable]
struct ElementsFilter;
impl CollectionFilter for ElementsFilter {
- fn filter<'a>(&self, elem: JSRef<'a, Element>, root: JSRef<'a, Node>) -> bool {
+ fn filter<'a>(&self, elem: JSRef<'a, Element>, _root: JSRef<'a, Node>) -> bool {
static TAG_NAMES: StaticStringVec = &["button", "fieldset", "input",
"keygen", "object", "output", "select", "textarea"];
- let root: JSRef<Element> = ElementCast::to_ref(root).unwrap();
- elem != root && TAG_NAMES.iter().any(|&tag_name| tag_name == elem.local_name().as_slice())
+ TAG_NAMES.iter().any(|&tag_name| tag_name == elem.local_name().as_slice())
}
}
let node: JSRef<Node> = NodeCast::from_ref(self);