diff options
author | Simon Sapin <simon.sapin@exyr.org> | 2014-08-16 12:24:34 +0100 |
---|---|---|
committer | Simon Sapin <simon.sapin@exyr.org> | 2014-08-16 12:24:34 +0100 |
commit | 444ff8425922d350120eb5412c96c26060b55c88 (patch) | |
tree | 53d7e8a5d5c163d084117944bd3fdd4eb71de13d /src/components/script/dom/node.rs | |
parent | ba592364b7655b66a4d384e8deabcde88755825f (diff) | |
parent | 4ca385ba10faeaf32b5aeb2cbd293542c8d8a3c9 (diff) | |
download | servo-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.rs | 60 |
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 { |