aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-04-09 16:36:40 +0530
committerbors-servo <lbergstrom+bors@mozilla.com>2016-04-09 16:36:40 +0530
commit32e53b80e28731cd05ddbe561f99e9570a34ff07 (patch)
tree6f716c2e2bb803fbaf534c41b535286ede72857b /components/script
parent4720992ffcf23a166b3ae08d8090cff5a993a0b6 (diff)
parent54f139c5cf437da0de243c2c07ceb9cd7c12b5c6 (diff)
downloadservo-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.rs32
-rw-r--r--components/script/dom/webidls/HTMLTableElement.webidl2
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;