mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
Implement HTMLTableRowElement insertCell and deleteCell
This commit is contained in:
parent
e31ad01103
commit
1f58169263
8 changed files with 108 additions and 106 deletions
|
@ -4,12 +4,9 @@
|
|||
|
||||
use cssparser::RGBA;
|
||||
use dom::attr::Attr;
|
||||
use dom::bindings::codegen::Bindings::HTMLCollectionBinding::HTMLCollectionMethods;
|
||||
use dom::bindings::codegen::Bindings::HTMLTableSectionElementBinding::{self, HTMLTableSectionElementMethods};
|
||||
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
|
||||
use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast};
|
||||
use dom::bindings::codegen::InheritTypes::{HTMLTableRowElementDerived, NodeCast};
|
||||
use dom::bindings::error::Error;
|
||||
use dom::bindings::codegen::InheritTypes::{HTMLElementCast, HTMLTableRowElementDerived, NodeCast};
|
||||
use dom::bindings::error::{ErrorResult, Fallible};
|
||||
use dom::bindings::js::{Root, RootedReference};
|
||||
use dom::document::Document;
|
||||
|
@ -20,7 +17,6 @@ use dom::htmltablerowelement::HTMLTableRowElement;
|
|||
use dom::node::{Node, window_from_node};
|
||||
use dom::virtualmethods::VirtualMethods;
|
||||
use std::cell::Cell;
|
||||
use std::iter;
|
||||
use util::str::{self, DOMString};
|
||||
|
||||
#[dom_struct]
|
||||
|
@ -67,57 +63,20 @@ impl HTMLTableSectionElementMethods for HTMLTableSectionElement {
|
|||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-tbody-insertrow
|
||||
fn InsertRow(&self, index: i32) -> Fallible<Root<HTMLElement>> {
|
||||
if index < -1 {
|
||||
return Err(Error::IndexSize);
|
||||
}
|
||||
|
||||
let node = NodeCast::from_ref(self);
|
||||
let tr = HTMLTableRowElement::new("tr".to_owned(), None, node.owner_doc().r());
|
||||
|
||||
let after_node = if index == -1 {
|
||||
None
|
||||
} else {
|
||||
match self.Rows()
|
||||
.elements_iter()
|
||||
.map(NodeCast::from_root)
|
||||
.map(Some)
|
||||
.chain(iter::once(None))
|
||||
.nth(index as usize) {
|
||||
None => return Err(Error::IndexSize),
|
||||
Some(node) => node,
|
||||
}
|
||||
};
|
||||
|
||||
{
|
||||
let tr_node = NodeCast::from_ref(tr.r());
|
||||
try!(node.InsertBefore(tr_node, after_node.r()));
|
||||
}
|
||||
|
||||
Ok(HTMLElementCast::from_root(tr))
|
||||
node.insert_cell_or_row(
|
||||
index,
|
||||
|| self.Rows(),
|
||||
|| HTMLTableRowElement::new("tr".to_owned(), None, node.owner_doc().r()))
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-tbody-deleterow
|
||||
fn DeleteRow(&self, index: i32) -> ErrorResult {
|
||||
let element = match index {
|
||||
index if index < -1 => return Err(Error::IndexSize),
|
||||
-1 => {
|
||||
let last_child = NodeCast::from_ref(self).GetLastChild();
|
||||
match last_child.and_then(|node| node.inclusively_preceding_siblings()
|
||||
.filter_map(ElementCast::to_root)
|
||||
.filter(|n| n.is_htmltablerowelement())
|
||||
.next()) {
|
||||
Some(element) => element,
|
||||
None => return Ok(()),
|
||||
}
|
||||
},
|
||||
index => match self.Rows().Item(index as u32) {
|
||||
Some(element) => element,
|
||||
None => return Err(Error::IndexSize),
|
||||
},
|
||||
};
|
||||
|
||||
NodeCast::from_ref(element.r()).remove_self();
|
||||
Ok(())
|
||||
let node = NodeCast::from_ref(self);
|
||||
node.delete_cell_or_row(
|
||||
index,
|
||||
|| self.Rows(),
|
||||
|n| n.is_htmltablerowelement())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue