aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmltableelement.rs
diff options
context:
space:
mode:
authorGreg Guthe <greg.guthe@gmail.com>2016-04-10 00:05:52 -0400
committerGreg Guthe <greg.guthe@gmail.com>2016-04-18 15:18:16 -0400
commit1d59d8784d99ca03bdd676080d4b5ae283d9dbed (patch)
tree416cd922599ab3715a763ad919788f1bc18858a2 /components/script/dom/htmltableelement.rs
parent84f01d1d7b1b1b893cbb28097b65c21c5fada8b3 (diff)
downloadservo-1d59d8784d99ca03bdd676080d4b5ae283d9dbed.tar.gz
servo-1d59d8784d99ca03bdd676080d4b5ae283d9dbed.zip
Implement HTMLTableElement.insertRow()
refs: https://github.com/servo/servo/issues/9269 and update HTMLTableElement.webidl insertRow returns an HTMLTableRowElement and throws an IndexSizeError sortable and stopSorting were removed.
Diffstat (limited to 'components/script/dom/htmltableelement.rs')
-rw-r--r--components/script/dom/htmltableelement.rs65
1 files changed, 60 insertions, 5 deletions
diff --git a/components/script/dom/htmltableelement.rs b/components/script/dom/htmltableelement.rs
index 4ea908675b1..4b5cd44773d 100644
--- a/components/script/dom/htmltableelement.rs
+++ b/components/script/dom/htmltableelement.rs
@@ -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;
@@ -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"),
@@ -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
@@ -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");