aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom/node.rs
diff options
context:
space:
mode:
authorSimon Sapin <simon.sapin@exyr.org>2014-08-16 12:24:34 +0100
committerSimon Sapin <simon.sapin@exyr.org>2014-08-16 12:24:34 +0100
commit444ff8425922d350120eb5412c96c26060b55c88 (patch)
tree53d7e8a5d5c163d084117944bd3fdd4eb71de13d /src/components/script/dom/node.rs
parentba592364b7655b66a4d384e8deabcde88755825f (diff)
parent4ca385ba10faeaf32b5aeb2cbd293542c8d8a3c9 (diff)
downloadservo-444ff8425922d350120eb5412c96c26060b55c88.tar.gz
servo-444ff8425922d350120eb5412c96c26060b55c88.zip
Merge pull request #3078 from SimonSapin/style-cleanup
Various refactoring and fixes in the style crate
Diffstat (limited to 'src/components/script/dom/node.rs')
-rw-r--r--src/components/script/dom/node.rs60
1 files changed, 28 insertions, 32 deletions
diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs
index 5850779692c..9ef327f4fa4 100644
--- a/src/components/script/dom/node.rs
+++ b/src/components/script/dom/node.rs
@@ -4,7 +4,6 @@
//! The core DOM types. Defines the basic DOM hierarchy as well as all the HTML elements.
-use cssparser::tokenize;
use dom::attr::Attr;
use dom::bindings::codegen::Bindings::AttrBinding::AttrMethods;
use dom::bindings::codegen::Bindings::CharacterDataBinding::CharacterDataMethods;
@@ -48,7 +47,7 @@ use layout_interface::{ContentBoxQuery, ContentBoxResponse, ContentBoxesQuery, C
LayoutChan, ReapLayoutDataMsg, TrustedNodeAddress, UntrustedNodeAddress};
use servo_util::geometry::Au;
use servo_util::str::{DOMString, null_str_as_empty};
-use style::{parse_selector_list, matches_compound_selector, NamespaceMap};
+use style::{parse_selector_list_from_str, matches};
use js::jsapi::{JSContext, JSObject, JSRuntime};
use js::jsfriendapi;
@@ -611,21 +610,16 @@ impl<'m, 'n> NodeHelpers<'m, 'n> for JSRef<'n, Node> {
// http://dom.spec.whatwg.org/#dom-parentnode-queryselector
fn query_selector(&self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>> {
// Step 1.
- let namespace = NamespaceMap::new();
- match parse_selector_list(tokenize(selectors.as_slice()).map(|(token, _)| token).collect(), &namespace) {
+ match parse_selector_list_from_str(selectors.as_slice()) {
// Step 2.
- None => return Err(Syntax),
+ Err(()) => return Err(Syntax),
// Step 3.
- Some(ref selectors) => {
+ Ok(ref selectors) => {
let root = self.ancestors().last().unwrap_or(self.clone());
- for selector in selectors.iter() {
- assert!(selector.pseudo_element.is_none());
- for node in root.traverse_preorder().filter(|node| node.is_element()) {
- let mut _shareable: bool = false;
- if matches_compound_selector(selector.compound_selectors.deref(), &node, &mut _shareable) {
- let elem: &JSRef<Element> = ElementCast::to_ref(&node).unwrap();
- return Ok(Some(Temporary::from_rooted(elem)));
- }
+ for node in root.traverse_preorder() {
+ if node.is_element() && matches(selectors, &node) {
+ let elem: &JSRef<Element> = ElementCast::to_ref(&node).unwrap();
+ return Ok(Some(Temporary::from_rooted(elem)));
}
}
}
@@ -636,23 +630,15 @@ impl<'m, 'n> NodeHelpers<'m, 'n> for JSRef<'n, Node> {
// http://dom.spec.whatwg.org/#dom-parentnode-queryselectorall
fn query_selector_all(&self, selectors: DOMString) -> Fallible<Temporary<NodeList>> {
// Step 1.
- let mut nodes = vec!();
+ let nodes;
let root = self.ancestors().last().unwrap_or(self.clone());
- let namespace = NamespaceMap::new();
- match parse_selector_list(tokenize(selectors.as_slice()).map(|(token, _)| token).collect(), &namespace) {
+ match parse_selector_list_from_str(selectors.as_slice()) {
// Step 2.
- None => return Err(Syntax),
+ Err(()) => return Err(Syntax),
// Step 3.
- Some(ref selectors) => {
- for selector in selectors.iter() {
- assert!(selector.pseudo_element.is_none());
- for node in root.traverse_preorder().filter(|node| node.is_element()) {
- let mut _shareable: bool = false;
- if matches_compound_selector(selector.compound_selectors.deref(), &node, &mut _shareable) {
- nodes.push(node.clone())
- }
- }
- }
+ Ok(ref selectors) => {
+ nodes = root.traverse_preorder().filter(
+ |node| node.is_element() && matches(selectors, node)).collect()
}
}
let window = window_from_node(self).root();
@@ -1997,29 +1983,32 @@ impl<'a> style::TNode<JSRef<'a, Element>> for JSRef<'a, Node> {
fn parent_node(&self) -> Option<JSRef<'a, Node>> {
(self as &NodeHelpers).parent_node().map(|node| *node.root())
}
+
fn prev_sibling(&self) -> Option<JSRef<'a, Node>> {
(self as &NodeHelpers).prev_sibling().map(|node| *node.root())
}
+
fn next_sibling(&self) -> Option<JSRef<'a, Node>> {
(self as &NodeHelpers).next_sibling().map(|node| *node.root())
}
+
fn is_document(&self) -> bool {
(self as &NodeHelpers).is_document()
}
+
fn is_element(&self) -> bool {
(self as &NodeHelpers).is_element()
}
+
fn as_element(&self) -> JSRef<'a, Element> {
let elem: Option<&JSRef<'a, Element>> = ElementCast::to_ref(self);
assert!(elem.is_some());
*elem.unwrap()
}
+
fn match_attr(&self, attr: &style::AttrSelector, test: |&str| -> bool) -> bool {
let name = {
- let elem: Option<&JSRef<'a, Element>> = ElementCast::to_ref(self);
- assert!(elem.is_some());
- let elem: &ElementHelpers = elem.unwrap() as &ElementHelpers;
- if elem.html_element_in_html_document() {
+ if self.is_html_element_in_html_document() {
attr.lower_name.as_slice()
} else {
attr.name.as_slice()
@@ -2034,6 +2023,13 @@ impl<'a> style::TNode<JSRef<'a, Element>> for JSRef<'a, Node> {
style::AnyNamespace => false,
}
}
+
+ fn is_html_element_in_html_document(&self) -> bool {
+ let elem: Option<&JSRef<'a, Element>> = ElementCast::to_ref(self);
+ assert!(elem.is_some());
+ let elem: &ElementHelpers = elem.unwrap() as &ElementHelpers;
+ elem.html_element_in_html_document()
+ }
}
pub trait DisabledStateHelpers {