mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Pass a RootedVec to NodeList::new_simple_list()
This commit is contained in:
parent
9d027bab0a
commit
c026825e69
3 changed files with 19 additions and 17 deletions
|
@ -26,6 +26,7 @@ use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::js::{MutNullableJS, JS, JSRef, LayoutJS, Temporary, TemporaryPushable};
|
use dom::bindings::js::{MutNullableJS, JS, JSRef, LayoutJS, Temporary, TemporaryPushable};
|
||||||
use dom::bindings::js::{OptionalRootable, RootedReference};
|
use dom::bindings::js::{OptionalRootable, RootedReference};
|
||||||
use dom::bindings::refcounted::Trusted;
|
use dom::bindings::refcounted::Trusted;
|
||||||
|
use dom::bindings::trace::RootedVec;
|
||||||
use dom::bindings::utils::reflect_dom_object;
|
use dom::bindings::utils::reflect_dom_object;
|
||||||
use dom::bindings::utils::{xml_name_type, validate_and_extract};
|
use dom::bindings::utils::{xml_name_type, validate_and_extract};
|
||||||
use dom::bindings::utils::XMLName::InvalidXMLName;
|
use dom::bindings::utils::XMLName::InvalidXMLName;
|
||||||
|
@ -817,22 +818,23 @@ impl Document {
|
||||||
}
|
}
|
||||||
|
|
||||||
trait PrivateDocumentHelpers {
|
trait PrivateDocumentHelpers {
|
||||||
fn createNodeList<F: Fn(JSRef<Node>) -> bool>(self, callback: F) -> Temporary<NodeList>;
|
fn create_node_list<F: Fn(JSRef<Node>) -> bool>(self, callback: F) -> Temporary<NodeList>;
|
||||||
fn get_html_element(self) -> Option<Temporary<HTMLHtmlElement>>;
|
fn get_html_element(self) -> Option<Temporary<HTMLHtmlElement>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> PrivateDocumentHelpers for JSRef<'a, Document> {
|
impl<'a> PrivateDocumentHelpers for JSRef<'a, Document> {
|
||||||
fn createNodeList<F: Fn(JSRef<Node>) -> bool>(self, callback: F) -> Temporary<NodeList> {
|
fn create_node_list<F: Fn(JSRef<Node>) -> bool>(self, callback: F) -> Temporary<NodeList> {
|
||||||
let window = self.window.root();
|
let window = self.window.root();
|
||||||
let document_element = self.GetDocumentElement().root();
|
let document_element = self.GetDocumentElement().root();
|
||||||
let nodes = match document_element {
|
let mut nodes = RootedVec::new();
|
||||||
None => vec!(),
|
if let Some(ref root) = document_element {
|
||||||
Some(ref root) => {
|
for node in NodeCast::from_ref(root.r()).traverse_preorder() {
|
||||||
let root: JSRef<Node> = NodeCast::from_ref(root.r());
|
if callback(node) {
|
||||||
root.traverse_preorder().filter(|&node| callback(node)).collect()
|
nodes.push(node.unrooted());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
NodeList::new_simple_list(window.r(), nodes)
|
NodeList::new_simple_list(window.r(), &nodes)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_html_element(self) -> Option<Temporary<HTMLHtmlElement>> {
|
fn get_html_element(self) -> Option<Temporary<HTMLHtmlElement>> {
|
||||||
|
@ -1255,7 +1257,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> {
|
||||||
|
|
||||||
// http://www.whatwg.org/specs/web-apps/current-work/#dom-document-getelementsbyname
|
// http://www.whatwg.org/specs/web-apps/current-work/#dom-document-getelementsbyname
|
||||||
fn GetElementsByName(self, name: DOMString) -> Temporary<NodeList> {
|
fn GetElementsByName(self, name: DOMString) -> Temporary<NodeList> {
|
||||||
self.createNodeList(|node| {
|
self.create_node_list(|node| {
|
||||||
let element: JSRef<Element> = match ElementCast::to_ref(node) {
|
let element: JSRef<Element> = match ElementCast::to_ref(node) {
|
||||||
Some(element) => element,
|
Some(element) => element,
|
||||||
None => return false,
|
None => return false,
|
||||||
|
|
|
@ -839,13 +839,12 @@ impl<'a> NodeHelpers<'a> for JSRef<'a, Node> {
|
||||||
// http://dom.spec.whatwg.org/#dom-parentnode-queryselectorall
|
// http://dom.spec.whatwg.org/#dom-parentnode-queryselectorall
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
fn query_selector_all(self, selectors: DOMString) -> Fallible<Temporary<NodeList>> {
|
fn query_selector_all(self, selectors: DOMString) -> Fallible<Temporary<NodeList>> {
|
||||||
// Step 1.
|
let mut nodes = RootedVec::new();
|
||||||
unsafe {
|
for node in try!(unsafe { self.query_selector_iter(selectors) }) {
|
||||||
self.query_selector_iter(selectors).map(|iter| {
|
nodes.push(node.unrooted());
|
||||||
let window = window_from_node(self).root();
|
|
||||||
NodeList::new_simple_list(window.r(), iter.collect())
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
let window = window_from_node(self).root();
|
||||||
|
Ok(NodeList::new_simple_list(window.r(), &nodes))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ use dom::bindings::codegen::Bindings::NodeListBinding;
|
||||||
use dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods;
|
use dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods;
|
||||||
use dom::bindings::global::GlobalRef;
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::js::{JS, JSRef, Temporary};
|
use dom::bindings::js::{JS, JSRef, Temporary};
|
||||||
|
use dom::bindings::trace::RootedVec;
|
||||||
use dom::bindings::utils::{Reflector, reflect_dom_object};
|
use dom::bindings::utils::{Reflector, reflect_dom_object};
|
||||||
use dom::node::{Node, NodeHelpers};
|
use dom::node::{Node, NodeHelpers};
|
||||||
use dom::window::Window;
|
use dom::window::Window;
|
||||||
|
@ -38,8 +39,8 @@ impl NodeList {
|
||||||
GlobalRef::Window(window), NodeListBinding::Wrap)
|
GlobalRef::Window(window), NodeListBinding::Wrap)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_simple_list(window: JSRef<Window>, elements: Vec<JSRef<Node>>) -> Temporary<NodeList> {
|
pub fn new_simple_list(window: JSRef<Window>, elements: &RootedVec<JS<Node>>) -> Temporary<NodeList> {
|
||||||
NodeList::new(window, NodeListType::Simple(elements.iter().map(|element| JS::from_rooted(*element)).collect()))
|
NodeList::new(window, NodeListType::Simple((**elements).clone()))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_child_list(window: JSRef<Window>, node: JSRef<Node>) -> Temporary<NodeList> {
|
pub fn new_child_list(window: JSRef<Window>, node: JSRef<Node>) -> Temporary<NodeList> {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue