Skip to content

Commit

Permalink
Implement HTMLTableElement.insertRow()
Browse files Browse the repository at this point in the history
refs: #9269

and update HTMLTableElement.webidl

insertRow returns an HTMLTableRowElement and throws an IndexSizeError
sortable and stopSorting were removed.
  • Loading branch information
g-k committed Apr 18, 2016
1 parent 84f01d1 commit 1d59d87
Show file tree
Hide file tree
Showing 8 changed files with 100 additions and 42 deletions.
65 changes: 60 additions & 5 deletions components/script/dom/htmltableelement.rs
Expand Up @@ -4,10 +4,11 @@

use cssparser::RGBA;
use dom::attr::{Attr, AttrValue};
use dom::bindings::codegen::Bindings::HTMLCollectionBinding::HTMLCollectionMethods;
use dom::bindings::codegen::Bindings::HTMLTableElementBinding;
use dom::bindings::codegen::Bindings::HTMLTableElementBinding::HTMLTableElementMethods;
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
use dom::bindings::error::{Error, ErrorResult};
use dom::bindings::error::{Error, ErrorResult, Fallible};
use dom::bindings::inheritance::Castable;
use dom::bindings::js::{JS, LayoutJS, MutNullableHeap, Root, RootedReference};
use dom::document::Document;
Expand Down Expand Up @@ -166,8 +167,8 @@ impl HTMLTableElementMethods for HTMLTableElement {
}

// https://html.spec.whatwg.org/multipage/#dom-table-createcaption
fn CreateCaption(&self) -> Root<HTMLElement> {
let caption = match self.GetCaption() {
fn CreateCaption(&self) -> Root<HTMLTableCaptionElement> {
match self.GetCaption() {
Some(caption) => caption,
None => {
let caption = HTMLTableCaptionElement::new(atom!("caption"),
Expand All @@ -176,8 +177,7 @@ impl HTMLTableElementMethods for HTMLTableElement {
self.SetCaption(Some(caption.r()));
caption
}
};
Root::upcast(caption)
}
}

// https://html.spec.whatwg.org/multipage/#dom-table-deletecaption
Expand Down Expand Up @@ -282,6 +282,61 @@ impl HTMLTableElementMethods for HTMLTableElement {
tbody
}

// https://html.spec.whatwg.org/multipage/#dom-table-insertrow
fn InsertRow(&self, index: i32) -> Fallible<Root<HTMLTableRowElement>> {
let rows = self.Rows();
let number_of_row_elements = rows.Length();

if index < -1 || index > number_of_row_elements as i32 {
return Err(Error::IndexSize);
}

let new_row = HTMLTableRowElement::new(atom!("tr"),
None,
document_from_node(self).r());
let node = self.upcast::<Node>();

if number_of_row_elements == 0 {
// append new row to last or new tbody in table
if let Some(last_tbody) = node.rev_children()
.filter_map(Root::downcast::<Element>)
.find(|n| n.is::<HTMLTableSectionElement>() && n.local_name() == &atom!("tbody")) {
last_tbody.upcast::<Node>().AppendChild(new_row.upcast::<Node>())
.expect("InsertRow failed to append first row.");
} else {
let tbody = self.CreateTBody();
node.AppendChild(tbody.upcast())
.expect("InsertRow failed to append new tbody.");

tbody.upcast::<Node>().AppendChild(new_row.upcast::<Node>())
.expect("InsertRow failed to append first row.");
}
} else if index == number_of_row_elements as i32 || index == -1 {
// append new row to parent of last row in table
let last_row = rows.Item(number_of_row_elements - 1)
.expect("InsertRow failed to find last row in table.");

let last_row_parent =
last_row.upcast::<Node>().GetParentNode()
.expect("InsertRow failed to find parent of last row in table.");

last_row_parent.upcast::<Node>().AppendChild(new_row.upcast::<Node>())
.expect("InsertRow failed to append last row.");
} else {
// insert new row before the index-th row in rows using the same parent
let ith_row = rows.Item(index as u32)
.expect("InsertRow failed to find a row in table.");

let ith_row_parent = ith_row.upcast::<Node>().GetParentNode()
.expect("InsertRow failed to find parent of a row in table.");

ith_row_parent.upcast::<Node>().InsertBefore(new_row.upcast::<Node>(), Some(ith_row.upcast::<Node>()))
.expect("InsertRow failed to append row");
}

Ok(new_row)
}

// https://html.spec.whatwg.org/multipage/#dom-table-bgcolor
make_getter!(BgColor, "bgcolor");

Expand Down
6 changes: 2 additions & 4 deletions components/script/dom/webidls/HTMLTableElement.webidl
Expand Up @@ -6,7 +6,7 @@
// https://html.spec.whatwg.org/multipage/#htmltableelement
interface HTMLTableElement : HTMLElement {
attribute HTMLTableCaptionElement? caption;
HTMLElement createCaption();
HTMLTableCaptionElement createCaption();
void deleteCaption();
[SetterThrows]
attribute HTMLTableSectionElement? tHead;
Expand All @@ -19,10 +19,8 @@ interface HTMLTableElement : HTMLElement {
readonly attribute HTMLCollection tBodies;
HTMLTableSectionElement createTBody();
readonly attribute HTMLCollection rows;
//HTMLElement insertRow(optional long index = -1);
[Throws] HTMLTableRowElement insertRow(optional long index = -1);
//void deleteRow(long index);
// attribute boolean sortable;
//void stopSorting();

// also has obsolete members
};
Expand Down
6 changes: 6 additions & 0 deletions tests/wpt/metadata/MANIFEST.json
Expand Up @@ -35061,6 +35061,12 @@
"deleted": [],
"items": {
"testharness": {
"html/semantics/tabular-data/the-table-element/insertRow-method-03.html": [
{
"path": "html/semantics/tabular-data/the-table-element/insertRow-method-03.html",
"url": "/html/semantics/tabular-data/the-table-element/insertRow-method-03.html"
}
],
"html/semantics/tabular-data/the-table-element/tFoot.html": [
{
"path": "html/semantics/tabular-data/the-table-element/tFoot.html",
Expand Down
9 changes: 0 additions & 9 deletions tests/wpt/metadata/html/dom/interfaces.html.ini
Expand Up @@ -4128,9 +4128,6 @@
[HTMLAreaElement interface: document.createElement("area") must inherit property "noHref" with the proper type (10)]
expected: FAIL

[HTMLTableElement interface: operation insertRow(long)]
expected: FAIL

[HTMLTableElement interface: operation deleteRow(long)]
expected: FAIL

Expand Down Expand Up @@ -4161,12 +4158,6 @@
[HTMLTableElement interface: attribute cellSpacing]
expected: FAIL

[HTMLTableElement interface: document.createElement("table") must inherit property "insertRow" with the proper type (12)]
expected: FAIL

[HTMLTableElement interface: calling insertRow(long) on document.createElement("table") with too few arguments must throw TypeError]
expected: FAIL

[HTMLTableElement interface: document.createElement("table") must inherit property "deleteRow" with the proper type (13)]
expected: FAIL

Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

@@ -0,0 +1,32 @@
<!DOCTYPE html>
<title>insertRow(): non-empty table</title>
<link rel="author" title="g-k" href="mailto:greg.guthe@gmail.com">
<link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-table-insertrow">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<div id="test">
<table>
<tbody><tr id="first"></tr><tr id="second"></tr></tbody>
</table>
</div>
<script>
var HTML = "http://www.w3.org/1999/xhtml";
test(function() {
var table = document.getElementById("test").getElementsByTagName("table")[0];
test(function() {
assert_equals(table.childNodes.length, 3);
assert_equals(table.rows.length, 2);
}, "table should start out with two rows")

var tr;
test(function() {
tr = table.insertRow(1);
assert_equals(tr.localName, "tr");
assert_equals(tr.namespaceURI, HTML);
assert_equals(table.getElementsByTagName("tr")[0].id, "first");
assert_equals(table.getElementsByTagName("tr")[1].id, "");
assert_equals(table.getElementsByTagName("tr")[2].id, "second");
}, "insertRow should insert a tr element before the second row")
});
</script>

0 comments on commit 1d59d87

Please sign in to comment.