From 4e64ff499bd985da35e07db6d130e59908a43c0e Mon Sep 17 00:00:00 2001 From: David Zbarsky Date: Thu, 1 Oct 2015 19:53:35 -0400 Subject: [PATCH] Implement HTMLTableRowElement::Cells Extracted from #6936 --- components/script/dom/htmltablerowelement.rs | 35 ++++++++++++++++--- .../dom/webidls/HTMLTableRowElement.webidl | 2 +- tests/wpt/metadata/MANIFEST.json | 4 +++ .../wpt/metadata/html/dom/interfaces.html.ini | 6 ---- .../tabular-data/the-tr-element/cells.html | 28 +++++++++++++++ 5 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 tests/wpt/web-platform-tests/html/semantics/tabular-data/the-tr-element/cells.html diff --git a/components/script/dom/htmltablerowelement.rs b/components/script/dom/htmltablerowelement.rs index 88096980bcf..d1cbac2d789 100644 --- a/components/script/dom/htmltablerowelement.rs +++ b/components/script/dom/htmltablerowelement.rs @@ -5,20 +5,37 @@ use cssparser::RGBA; use dom::attr::Attr; use dom::bindings::codegen::Bindings::HTMLTableRowElementBinding::{self, HTMLTableRowElementMethods}; -use dom::bindings::codegen::InheritTypes::{HTMLElementCast, HTMLTableRowElementDerived}; -use dom::bindings::js::Root; +use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; +use dom::bindings::codegen::InheritTypes::HTMLElementCast; +use dom::bindings::codegen::InheritTypes::HTMLTableDataCellElementDerived; +use dom::bindings::codegen::InheritTypes::HTMLTableHeaderCellElementDerived; +use dom::bindings::codegen::InheritTypes::HTMLTableRowElementDerived; +use dom::bindings::codegen::InheritTypes::NodeCast; +use dom::bindings::js::{JS, MutNullableHeap, Root, RootedReference}; use dom::document::Document; -use dom::element::{AttributeMutation, ElementTypeId}; +use dom::element::{AttributeMutation, Element, ElementTypeId}; use dom::eventtarget::{EventTarget, EventTargetTypeId}; +use dom::htmlcollection::{CollectionFilter, HTMLCollection}; use dom::htmlelement::{HTMLElement, HTMLElementTypeId}; -use dom::node::{Node, NodeTypeId}; +use dom::node::{Node, NodeTypeId, window_from_node}; use dom::virtualmethods::VirtualMethods; use std::cell::Cell; use util::str::{self, DOMString}; + +#[derive(JSTraceable)] +struct CellsFilter; +impl CollectionFilter for CellsFilter { + fn filter(&self, elem: &Element, root: &Node) -> bool { + (elem.is_htmltableheadercellelement() || elem.is_htmltabledatacellelement()) + && NodeCast::from_ref(elem).GetParentNode().r() == Some(root) + } +} + #[dom_struct] pub struct HTMLTableRowElement { htmlelement: HTMLElement, + cells: MutNullableHeap>, background_color: Cell>, } @@ -38,6 +55,7 @@ impl HTMLTableRowElement { localName, prefix, document), + cells: Default::default(), background_color: Cell::new(None), } } @@ -61,6 +79,15 @@ impl HTMLTableRowElementMethods for HTMLTableRowElement { // https://html.spec.whatwg.org/multipage/#dom-tr-bgcolor make_setter!(SetBgColor, "bgcolor"); + + // https://html.spec.whatwg.org/multipage/#dom-tr-cells + fn Cells(&self) -> Root { + self.cells.or_init(|| { + let window = window_from_node(self); + let filter = box CellsFilter; + HTMLCollection::create(window.r(), NodeCast::from_ref(self), filter) + }) + } } impl VirtualMethods for HTMLTableRowElement { diff --git a/components/script/dom/webidls/HTMLTableRowElement.webidl b/components/script/dom/webidls/HTMLTableRowElement.webidl index e5c2183b103..c2de0ea0b5b 100644 --- a/components/script/dom/webidls/HTMLTableRowElement.webidl +++ b/components/script/dom/webidls/HTMLTableRowElement.webidl @@ -7,7 +7,7 @@ interface HTMLTableRowElement : HTMLElement { //readonly attribute long rowIndex; //readonly attribute long sectionRowIndex; - //readonly attribute HTMLCollection cells; + readonly attribute HTMLCollection cells; //HTMLElement insertCell(optional long index = -1); //void deleteCell(long index); diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index f291aeae279..0a2fb3c92df 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -17743,6 +17743,10 @@ "path": "html/semantics/tabular-data/the-tbody-element/insertRow.html", "url": "/html/semantics/tabular-data/the-tbody-element/insertRow.html" }, + { + "path": "html/semantics/tabular-data/the-tr-element/cells.html", + "url": "/html/semantics/tabular-data/the-tr-element/cells.html" + }, { "path": "html/semantics/tabular-data/the-tr-element/deleteCell.html", "url": "/html/semantics/tabular-data/the-tr-element/deleteCell.html" diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini index a91707c524b..19e7229823a 100644 --- a/tests/wpt/metadata/html/dom/interfaces.html.ini +++ b/tests/wpt/metadata/html/dom/interfaces.html.ini @@ -4791,9 +4791,6 @@ [HTMLTableRowElement interface: attribute sectionRowIndex] expected: FAIL - [HTMLTableRowElement interface: attribute cells] - expected: FAIL - [HTMLTableRowElement interface: operation insertCell(long)] expected: FAIL @@ -4818,9 +4815,6 @@ [HTMLTableRowElement interface: document.createElement("tr") must inherit property "sectionRowIndex" with the proper type (1)] expected: FAIL - [HTMLTableRowElement interface: document.createElement("tr") must inherit property "cells" with the proper type (2)] - expected: FAIL - [HTMLTableRowElement interface: document.createElement("tr") must inherit property "insertCell" with the proper type (3)] expected: FAIL diff --git a/tests/wpt/web-platform-tests/html/semantics/tabular-data/the-tr-element/cells.html b/tests/wpt/web-platform-tests/html/semantics/tabular-data/the-tr-element/cells.html new file mode 100644 index 00000000000..2678d3b1c27 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/tabular-data/the-tr-element/cells.html @@ -0,0 +1,28 @@ + + +HTMLTableRowElement#cells + + + +
+ + + + +
+ + + +
FirstSecondThird + + +
Nested first
+
+