mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
Auto merge of #10508 - g-k:insert-row, r=KiChjang
Insert row Fixes #9269 <!-- 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/10508) <!-- Reviewable:end -->
This commit is contained in:
commit
19a5a9ad08
8 changed files with 100 additions and 42 deletions
|
@ -4,10 +4,11 @@
|
||||||
|
|
||||||
use cssparser::RGBA;
|
use cssparser::RGBA;
|
||||||
use dom::attr::{Attr, AttrValue};
|
use dom::attr::{Attr, AttrValue};
|
||||||
|
use dom::bindings::codegen::Bindings::HTMLCollectionBinding::HTMLCollectionMethods;
|
||||||
use dom::bindings::codegen::Bindings::HTMLTableElementBinding;
|
use dom::bindings::codegen::Bindings::HTMLTableElementBinding;
|
||||||
use dom::bindings::codegen::Bindings::HTMLTableElementBinding::HTMLTableElementMethods;
|
use dom::bindings::codegen::Bindings::HTMLTableElementBinding::HTMLTableElementMethods;
|
||||||
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
|
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::inheritance::Castable;
|
||||||
use dom::bindings::js::{JS, LayoutJS, MutNullableHeap, Root, RootedReference};
|
use dom::bindings::js::{JS, LayoutJS, MutNullableHeap, Root, RootedReference};
|
||||||
use dom::document::Document;
|
use dom::document::Document;
|
||||||
|
@ -166,8 +167,8 @@ impl HTMLTableElementMethods for HTMLTableElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-table-createcaption
|
// https://html.spec.whatwg.org/multipage/#dom-table-createcaption
|
||||||
fn CreateCaption(&self) -> Root<HTMLElement> {
|
fn CreateCaption(&self) -> Root<HTMLTableCaptionElement> {
|
||||||
let caption = match self.GetCaption() {
|
match self.GetCaption() {
|
||||||
Some(caption) => caption,
|
Some(caption) => caption,
|
||||||
None => {
|
None => {
|
||||||
let caption = HTMLTableCaptionElement::new(atom!("caption"),
|
let caption = HTMLTableCaptionElement::new(atom!("caption"),
|
||||||
|
@ -176,8 +177,7 @@ impl HTMLTableElementMethods for HTMLTableElement {
|
||||||
self.SetCaption(Some(caption.r()));
|
self.SetCaption(Some(caption.r()));
|
||||||
caption
|
caption
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
Root::upcast(caption)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-table-deletecaption
|
// https://html.spec.whatwg.org/multipage/#dom-table-deletecaption
|
||||||
|
@ -282,6 +282,61 @@ impl HTMLTableElementMethods for HTMLTableElement {
|
||||||
tbody
|
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
|
// https://html.spec.whatwg.org/multipage/#dom-table-bgcolor
|
||||||
make_getter!(BgColor, "bgcolor");
|
make_getter!(BgColor, "bgcolor");
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
// https://html.spec.whatwg.org/multipage/#htmltableelement
|
// https://html.spec.whatwg.org/multipage/#htmltableelement
|
||||||
interface HTMLTableElement : HTMLElement {
|
interface HTMLTableElement : HTMLElement {
|
||||||
attribute HTMLTableCaptionElement? caption;
|
attribute HTMLTableCaptionElement? caption;
|
||||||
HTMLElement createCaption();
|
HTMLTableCaptionElement createCaption();
|
||||||
void deleteCaption();
|
void deleteCaption();
|
||||||
[SetterThrows]
|
[SetterThrows]
|
||||||
attribute HTMLTableSectionElement? tHead;
|
attribute HTMLTableSectionElement? tHead;
|
||||||
|
@ -19,10 +19,8 @@ interface HTMLTableElement : HTMLElement {
|
||||||
readonly attribute HTMLCollection tBodies;
|
readonly attribute HTMLCollection tBodies;
|
||||||
HTMLTableSectionElement createTBody();
|
HTMLTableSectionElement createTBody();
|
||||||
readonly attribute HTMLCollection rows;
|
readonly attribute HTMLCollection rows;
|
||||||
//HTMLElement insertRow(optional long index = -1);
|
[Throws] HTMLTableRowElement insertRow(optional long index = -1);
|
||||||
//void deleteRow(long index);
|
//void deleteRow(long index);
|
||||||
// attribute boolean sortable;
|
|
||||||
//void stopSorting();
|
|
||||||
|
|
||||||
// also has obsolete members
|
// also has obsolete members
|
||||||
};
|
};
|
||||||
|
|
|
@ -40499,6 +40499,12 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"testharness": {
|
"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": [
|
"html/semantics/tabular-data/the-table-element/tFoot.html": [
|
||||||
{
|
{
|
||||||
"path": "html/semantics/tabular-data/the-table-element/tFoot.html",
|
"path": "html/semantics/tabular-data/the-table-element/tFoot.html",
|
||||||
|
|
|
@ -4128,9 +4128,6 @@
|
||||||
[HTMLAreaElement interface: document.createElement("area") must inherit property "noHref" with the proper type (10)]
|
[HTMLAreaElement interface: document.createElement("area") must inherit property "noHref" with the proper type (10)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[HTMLTableElement interface: operation insertRow(long)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[HTMLTableElement interface: operation deleteRow(long)]
|
[HTMLTableElement interface: operation deleteRow(long)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -4161,12 +4158,6 @@
|
||||||
[HTMLTableElement interface: attribute cellSpacing]
|
[HTMLTableElement interface: attribute cellSpacing]
|
||||||
expected: FAIL
|
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)]
|
[HTMLTableElement interface: document.createElement("table") must inherit property "deleteRow" with the proper type (13)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[insertRow-method-01.html]
|
|
||||||
type: testharness
|
|
||||||
[insertRow(): INDEX_SIZE_ERR]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
[insertRow-method-02.html]
|
|
||||||
type: testharness
|
|
||||||
[insertRow(): Empty table]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[insertRow should insert a tr element]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
[table-insertRow.html]
|
|
||||||
type: testharness
|
|
||||||
[insertRow should not copy prefixes]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[insertRow should insert into a tbody, not into a thead, if table.rows is empty]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[insertRow should insert into a tbody, not into a tfoot, if table.rows is empty]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -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>
|
Loading…
Add table
Add a link
Reference in a new issue