diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-04-09 16:36:40 +0530 |
---|---|---|
committer | bors-servo <lbergstrom+bors@mozilla.com> | 2016-04-09 16:36:40 +0530 |
commit | 32e53b80e28731cd05ddbe561f99e9570a34ff07 (patch) | |
tree | 6f716c2e2bb803fbaf534c41b535286ede72857b /components/script | |
parent | 4720992ffcf23a166b3ae08d8090cff5a993a0b6 (diff) | |
parent | 54f139c5cf437da0de243c2c07ceb9cd7c12b5c6 (diff) | |
download | servo-32e53b80e28731cd05ddbe561f99e9570a34ff07.tar.gz servo-32e53b80e28731cd05ddbe561f99e9570a34ff07.zip |
Auto merge of #10086 - KiChjang:table-rows, r=Manishearth
Implement HTMLTableElement#rows
Fixes #8084.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="35" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/10086)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/htmltableelement.rs | 32 | ||||
-rw-r--r-- | components/script/dom/webidls/HTMLTableElement.webidl | 2 |
2 files changed, 31 insertions, 3 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() diff --git a/components/script/dom/webidls/HTMLTableElement.webidl b/components/script/dom/webidls/HTMLTableElement.webidl index edf8d1d720f..2697f4c1e93 100644 --- a/components/script/dom/webidls/HTMLTableElement.webidl +++ b/components/script/dom/webidls/HTMLTableElement.webidl @@ -16,7 +16,7 @@ interface HTMLTableElement : HTMLElement { //void deleteTFoot(); //readonly attribute HTMLCollection tBodies; HTMLTableSectionElement createTBody(); - //readonly attribute HTMLCollection rows; + readonly attribute HTMLCollection rows; //HTMLElement insertRow(optional long index = -1); //void deleteRow(long index); // attribute boolean sortable; |