diff options
author | Jack Moffitt <jack@metajack.im> | 2014-08-28 09:34:23 -0600 |
---|---|---|
committer | Jack Moffitt <jack@metajack.im> | 2014-09-08 20:21:42 -0600 |
commit | c6ab60dbfc6da7b4f800c9e40893c8b58413960c (patch) | |
tree | d1d74076cf7fa20e4f77ec7cb82cae98b67362cb /components/script/dom/nodelist.rs | |
parent | db2f642c32fc5bed445bb6f2e45b0f6f0b4342cf (diff) | |
download | servo-c6ab60dbfc6da7b4f800c9e40893c8b58413960c.tar.gz servo-c6ab60dbfc6da7b4f800c9e40893c8b58413960c.zip |
Cargoify servo
Diffstat (limited to 'components/script/dom/nodelist.rs')
-rw-r--r-- | components/script/dom/nodelist.rs | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/components/script/dom/nodelist.rs b/components/script/dom/nodelist.rs new file mode 100644 index 00000000000..424eb09416c --- /dev/null +++ b/components/script/dom/nodelist.rs @@ -0,0 +1,82 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::codegen::Bindings::NodeListBinding; +use dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods; +use dom::bindings::global::Window; +use dom::bindings::js::{JS, JSRef, Temporary}; +use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; +use dom::node::{Node, NodeHelpers}; +use dom::window::Window; + +#[deriving(Encodable)] +pub enum NodeListType { + Simple(Vec<JS<Node>>), + Children(JS<Node>) +} + +#[deriving(Encodable)] +pub struct NodeList { + list_type: NodeListType, + reflector_: Reflector, +} + +impl NodeList { + pub fn new_inherited(list_type: NodeListType) -> NodeList { + NodeList { + list_type: list_type, + reflector_: Reflector::new(), + } + } + + pub fn new(window: &JSRef<Window>, + list_type: NodeListType) -> Temporary<NodeList> { + reflect_dom_object(box NodeList::new_inherited(list_type), + &Window(*window), NodeListBinding::Wrap) + } + + pub fn new_simple_list(window: &JSRef<Window>, elements: Vec<JSRef<Node>>) -> Temporary<NodeList> { + NodeList::new(window, Simple(elements.iter().map(|element| JS::from_rooted(element)).collect())) + } + + pub fn new_child_list(window: &JSRef<Window>, node: &JSRef<Node>) -> Temporary<NodeList> { + NodeList::new(window, Children(JS::from_rooted(node))) + } +} + +impl<'a> NodeListMethods for JSRef<'a, NodeList> { + fn Length(&self) -> u32 { + match self.list_type { + Simple(ref elems) => elems.len() as u32, + Children(ref node) => { + let node = node.root(); + node.deref().children().count() as u32 + } + } + } + + fn Item(&self, index: u32) -> Option<Temporary<Node>> { + match self.list_type { + _ if index >= self.Length() => None, + Simple(ref elems) => Some(Temporary::new(elems[index as uint].clone())), + Children(ref node) => { + let node = node.root(); + node.deref().children().nth(index as uint) + .map(|child| Temporary::from_rooted(&child)) + } + } + } + + fn IndexedGetter(&self, index: u32, found: &mut bool) -> Option<Temporary<Node>> { + let item = self.Item(index); + *found = item.is_some(); + item + } +} + +impl Reflectable for NodeList { + fn reflector<'a>(&'a self) -> &'a Reflector { + &self.reflector_ + } +} |