diff options
author | Greg Guthe <greg.guthe@gmail.com> | 2016-04-10 00:05:52 -0400 |
---|---|---|
committer | Greg Guthe <greg.guthe@gmail.com> | 2016-04-18 15:18:16 -0400 |
commit | 1d59d8784d99ca03bdd676080d4b5ae283d9dbed (patch) | |
tree | 416cd922599ab3715a763ad919788f1bc18858a2 /components/script/dom/htmltableelement.rs | |
parent | 84f01d1d7b1b1b893cbb28097b65c21c5fada8b3 (diff) | |
download | servo-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.rs | 65 |
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"); |