aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmltableelement.rs
diff options
context:
space:
mode:
authorKeith Yeung <kungfukeith11@gmail.com>2016-03-19 00:22:33 -0400
committerKeith Yeung <kungfukeith11@gmail.com>2016-04-07 18:37:42 -0400
commit54f139c5cf437da0de243c2c07ceb9cd7c12b5c6 (patch)
treec5b39d8b1400d699e87a9c9bb9c0bba0198d53b8 /components/script/dom/htmltableelement.rs
parent39ab006c8f71404d2fcd81f7715b7b9e47d5aead (diff)
downloadservo-54f139c5cf437da0de243c2c07ceb9cd7c12b5c6.tar.gz
servo-54f139c5cf437da0de243c2c07ceb9cd7c12b5c6.zip
Implement HTMLTableElement#rows
Diffstat (limited to 'components/script/dom/htmltableelement.rs')
-rw-r--r--components/script/dom/htmltableelement.rs32
1 files changed, 30 insertions, 2 deletions
diff --git a/components/script/dom/htmltableelement.rs b/components/script/dom/htmltableelement.rs
index 94c0b6dc986..ab611716b90 100644
--- a/components/script/dom/htmltableelement.rs
+++ b/components/script/dom/htmltableelement.rs
@@ -8,13 +8,15 @@ use dom::bindings::codegen::Bindings::HTMLTableElementBinding;
use dom::bindings::codegen::Bindings::HTMLTableElementBinding::HTMLTableElementMethods;
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
use dom::bindings::inheritance::Castable;
-use dom::bindings::js::{LayoutJS, Root, RootedReference};
+use dom::bindings::js::{JS, LayoutJS, Root, RootedReference};
use dom::document::Document;
use dom::element::{AttributeMutation, Element, RawLayoutElementHelpers};
+use dom::htmlcollection::{CollectionFilter, HTMLCollection};
use dom::htmlelement::HTMLElement;
use dom::htmltablecaptionelement::HTMLTableCaptionElement;
+use dom::htmltablerowelement::HTMLTableRowElement;
use dom::htmltablesectionelement::HTMLTableSectionElement;
-use dom::node::{Node, document_from_node};
+use dom::node::{Node, document_from_node, window_from_node};
use dom::virtualmethods::VirtualMethods;
use std::cell::Cell;
use string_cache::Atom;
@@ -51,6 +53,32 @@ impl HTMLTableElement {
}
impl HTMLTableElementMethods for HTMLTableElement {
+ // https://html.spec.whatwg.org/multipage/#dom-table-rows
+ fn Rows(&self) -> Root<HTMLCollection> {
+ #[allow(unrooted_must_root)]
+ #[derive(JSTraceable, HeapSizeOf)]
+ struct TableRowFilter {
+ sections: Vec<JS<Node>>
+ }
+
+ impl CollectionFilter for TableRowFilter {
+ fn filter(&self, elem: &Element, root: &Node) -> bool {
+ elem.is::<HTMLTableRowElement>()
+ && (root.is_parent_of(elem.upcast())
+ || self.sections.iter().any(|ref section| section.is_parent_of(elem.upcast())))
+ }
+ }
+
+ let filter = TableRowFilter {
+ sections: self.upcast::<Node>()
+ .children()
+ .filter_map(|ref node|
+ node.downcast::<HTMLTableSectionElement>().map(|_| JS::from_rooted(node)))
+ .collect()
+ };
+ HTMLCollection::new(window_from_node(self).r(), self.upcast(), box filter)
+ }
+
// https://html.spec.whatwg.org/multipage/#dom-table-caption
fn GetCaption(&self) -> Option<Root<HTMLTableCaptionElement>> {
self.upcast::<Node>().children().filter_map(Root::downcast).next()