aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/nodelist.rs
diff options
context:
space:
mode:
authorJack Moffitt <jack@metajack.im>2014-08-28 09:34:23 -0600
committerJack Moffitt <jack@metajack.im>2014-09-08 20:21:42 -0600
commitc6ab60dbfc6da7b4f800c9e40893c8b58413960c (patch)
treed1d74076cf7fa20e4f77ec7cb82cae98b67362cb /components/script/dom/nodelist.rs
parentdb2f642c32fc5bed445bb6f2e45b0f6f0b4342cf (diff)
downloadservo-c6ab60dbfc6da7b4f800c9e40893c8b58413960c.tar.gz
servo-c6ab60dbfc6da7b4f800c9e40893c8b58413960c.zip
Cargoify servo
Diffstat (limited to 'components/script/dom/nodelist.rs')
-rw-r--r--components/script/dom/nodelist.rs82
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_
+ }
+}