1 use webcore::reference_type::ReferenceType; 2 use webapi::node_list::NodeList; 3 use webapi::element::Element; 4 use webapi::dom_exception::SyntaxError; 5 6 /// The `ParentNode` mixin contains methods and properties 7 /// that are common to all types of `Node` objects that can 8 /// have children. 9 /// 10 /// You most likely don't want to `use` this directly; instead 11 /// you should `use stdweb::traits::*;`. 12 /// 13 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/ParentNode) 14 // https://dom.spec.whatwg.org/#parentnode 15 pub trait IParentNode: ReferenceType { 16 /// Returns the first element that is a descendant of the element on which it is 17 /// invoked that matches the specified group of selectors. 18 /// 19 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelector) 20 // https://dom.spec.whatwg.org/#ref-for-dom-parentnode-queryselector query_selector( &self, selector: &str ) -> Result< Option< Element >, SyntaxError >21 fn query_selector( &self, selector: &str ) -> Result< Option< Element >, SyntaxError > { 22 js_try!( 23 return @{self.as_ref()}.querySelector(@{selector}); 24 ).unwrap() 25 } 26 27 /// Returns a non-live [NodeList](struct.NodeList.html) of all elements descended 28 /// from the element on which it is invoked that matches the specified group of CSS selectors. 29 /// 30 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelectorAll) 31 // https://dom.spec.whatwg.org/#ref-for-dom-parentnode-queryselectorall query_selector_all( &self, selector: &str ) -> Result< NodeList, SyntaxError >32 fn query_selector_all( &self, selector: &str ) -> Result< NodeList, SyntaxError > { 33 js_try!( 34 return @{self.as_ref()}.querySelectorAll(@{selector}); 35 ).unwrap() 36 } 37 } 38 39 #[cfg(all(test, feature = "web_test"))] 40 mod tests { 41 use super::*; 42 use stdweb::web::document; 43 use webapi::node::INode; 44 45 #[test] test_query_selector_finds_h1()46 fn test_query_selector_finds_h1() { 47 let parent = document().create_element("div").unwrap(); 48 let child = document().create_element("h1").unwrap(); 49 parent.append_child(&child); 50 51 assert_eq!(parent.query_selector("h1").unwrap().unwrap().as_ref(), child.as_ref()); 52 } 53 54 55 #[test] test_query_selector_all_finds_h1s()56 fn test_query_selector_all_finds_h1s() { 57 let parent = document().create_element("div").unwrap(); 58 let child = document().create_element("h1").unwrap(); 59 let child2 = document().create_element("h1").unwrap(); 60 parent.append_child(&child); 61 parent.append_child(&child2); 62 63 assert_eq!(parent.query_selector_all("h1").unwrap().len(), 2); 64 } 65 66 #[test] test_query_selector_finds_nested_h1()67 fn test_query_selector_finds_nested_h1() { 68 let parent = document().create_element("div").unwrap(); 69 let child = document().create_element("p").unwrap(); 70 let title = document().create_element("h1").unwrap(); 71 child.append_child(&title); 72 parent.append_child(&child); 73 74 assert_eq!(parent.query_selector("h1").unwrap().unwrap().as_ref(), title.as_ref()); 75 } 76 77 #[test] test_query_selector_all_finds_nested_h1s()78 fn test_query_selector_all_finds_nested_h1s() { 79 let parent = document().create_element("div").unwrap(); 80 let top_title = document().create_element("h1").unwrap(); 81 let child = document().create_element("p").unwrap(); 82 let title = document().create_element("h1").unwrap(); 83 child.append_child(&title); 84 parent.append_child(&child); 85 parent.append_child(&top_title); 86 87 assert_eq!(parent.query_selector_all("h1").unwrap().len(), 2); 88 } 89 90 #[test] test_query_selector_not_found()91 fn test_query_selector_not_found() { 92 let parent = document().create_element("div").unwrap(); 93 let child = document().create_element("h1").unwrap(); 94 parent.append_child(&child); 95 96 assert!(parent.query_selector("p").unwrap().is_none()); 97 } 98 99 #[test] test_query_selector_all_not_found()100 fn test_query_selector_all_not_found() { 101 let parent = document().create_element("div").unwrap(); 102 let child = document().create_element("h1").unwrap(); 103 parent.append_child(&child); 104 105 assert_eq!(parent.query_selector_all("p").unwrap().len(), 0); 106 } 107 108 #[test] test_query_selector_syntax_error()109 fn test_query_selector_syntax_error() { 110 let parent = document().create_element("div").unwrap(); 111 let child = document().create_element("h1").unwrap(); 112 parent.append_child(&child); 113 114 assert!(child.query_selector("invalid syntax +#8$()@!(#").is_err()); 115 } 116 117 #[test] test_query_selector_all_syntax_error()118 fn test_query_selector_all_syntax_error() { 119 let parent = document().create_element("div").unwrap(); 120 let child = document().create_element("h1").unwrap(); 121 parent.append_child(&child); 122 123 assert!(child.query_selector_all("invalid syntax +#8$()@!(#").is_err()); 124 } 125 } 126