diff options
6 files changed, 31 insertions, 29 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; diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini index b28e62669b5..a1e6fcabbab 100644 --- a/tests/wpt/metadata/html/dom/interfaces.html.ini +++ b/tests/wpt/metadata/html/dom/interfaces.html.ini @@ -4179,9 +4179,6 @@ [HTMLTableElement interface: attribute tBodies] expected: FAIL - [HTMLTableElement interface: attribute rows] - expected: FAIL - [HTMLTableElement interface: operation insertRow(long)] expected: FAIL @@ -4236,9 +4233,6 @@ [HTMLTableElement interface: document.createElement("table") must inherit property "tBodies" with the proper type (9)] expected: FAIL - [HTMLTableElement interface: document.createElement("table") must inherit property "rows" with the proper type (11)] - expected: FAIL - [HTMLTableElement interface: document.createElement("table") must inherit property "insertRow" with the proper type (12)] expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/tabular-data/the-caption-element/caption_001.html.ini b/tests/wpt/metadata/html/semantics/tabular-data/the-caption-element/caption_001.html.ini deleted file mode 100644 index ab6dcbaa27c..00000000000 --- a/tests/wpt/metadata/html/semantics/tabular-data/the-caption-element/caption_001.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[caption_001.html] - type: testharness - [caption of the third table element should be null] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/tabular-data/the-table-element/insertRow-method-02.html.ini b/tests/wpt/metadata/html/semantics/tabular-data/the-table-element/insertRow-method-02.html.ini index 4755074483a..22418c828ba 100644 --- a/tests/wpt/metadata/html/semantics/tabular-data/the-table-element/insertRow-method-02.html.ini +++ b/tests/wpt/metadata/html/semantics/tabular-data/the-table-element/insertRow-method-02.html.ini @@ -3,9 +3,6 @@ [insertRow(): Empty table] expected: FAIL - [table should start out empty] - expected: FAIL - [insertRow should insert a tr element] expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/tabular-data/the-table-element/table-rows.html.ini b/tests/wpt/metadata/html/semantics/tabular-data/the-table-element/table-rows.html.ini index f79dbcc5dd2..4370c22560c 100644 --- a/tests/wpt/metadata/html/semantics/tabular-data/the-table-element/table-rows.html.ini +++ b/tests/wpt/metadata/html/semantics/tabular-data/the-table-element/table-rows.html.ini @@ -1,17 +1,5 @@ [table-rows.html] type: testharness - [Children of table] - expected: FAIL - - [Children of thead] - expected: FAIL - - [Children of tbody] - expected: FAIL - - [Children of tfoot] - expected: FAIL - [Complicated case] expected: FAIL |