Add DeleteRow method

This commit is contained in:
Guillaume Gomez 2016-07-25 23:10:15 +02:00
parent 2de3b119a9
commit cf9fd7eb46
8 changed files with 106 additions and 37 deletions

View file

@ -248,7 +248,7 @@ impl<'a> Iterator for HTMLCollectionElementsIter<'a> {
.filter_map(Root::downcast) .filter_map(Root::downcast)
.filter(|element| filter.filter(&element, root)) .filter(|element| filter.filter(&element, root))
.next() .next()
} }
} }
impl HTMLCollectionMethods for HTMLCollection { impl HTMLCollectionMethods for HTMLCollection {

View file

@ -34,6 +34,20 @@ pub struct HTMLTableElement {
tbodies: MutNullableHeap<JS<HTMLCollection>>, tbodies: MutNullableHeap<JS<HTMLCollection>>,
} }
#[allow(unrooted_must_root)]
#[derive(JSTraceable, HeapSizeOf)]
struct TableRowFilter {
sections: Vec<JS<Node>>,
}
impl CollectionFilter for TableRowFilter {
fn filter(&self, elem: &Element, root: &Node) -> bool {
elem.is::<HTMLTableRowElement>() &&
(root.is_parent_of(elem.upcast())
|| self.sections.iter().any(|ref section| section.is_parent_of(elem.upcast())))
}
}
impl HTMLTableElement { impl HTMLTableElement {
fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document)
-> HTMLTableElement { -> HTMLTableElement {
@ -120,32 +134,22 @@ impl HTMLTableElement {
thead.upcast::<Node>().remove_self(); thead.upcast::<Node>().remove_self();
} }
} }
}
impl HTMLTableElementMethods for HTMLTableElement { fn get_rows(&self) -> TableRowFilter {
// https://html.spec.whatwg.org/multipage/#dom-table-rows TableRowFilter {
fn Rows(&self) -> Root<HTMLCollection> {
#[allow(unrooted_must_root)]
#[derive(JSTraceable, HeapSizeOf)]
struct TableRowFilter {
sections: Vec<JS<Node>>
}
impl CollectionFilter for TableRowFilter {
fn filter(&self, elem: &Element, root: &Node) -> bool {
elem.is::<HTMLTableRowElement>() &&
(root.is_parent_of(elem.upcast())
|| self.sections.iter().any(|ref section| section.is_parent_of(elem.upcast())))
}
}
let filter = TableRowFilter {
sections: self.upcast::<Node>() sections: self.upcast::<Node>()
.children() .children()
.filter_map(|ref node| .filter_map(|ref node|
node.downcast::<HTMLTableSectionElement>().map(|_| JS::from_ref(&**node))) node.downcast::<HTMLTableSectionElement>().map(|_| JS::from_ref(&**node)))
.collect() .collect()
}; }
}
}
impl HTMLTableElementMethods for HTMLTableElement {
// https://html.spec.whatwg.org/multipage/#dom-table-rows
fn Rows(&self) -> Root<HTMLCollection> {
let filter = self.get_rows();
HTMLCollection::new(window_from_node(self).r(), self.upcast(), box filter) HTMLCollection::new(window_from_node(self).r(), self.upcast(), box filter)
} }
@ -338,6 +342,22 @@ impl HTMLTableElementMethods for HTMLTableElement {
Ok(new_row) Ok(new_row)
} }
// https://html.spec.whatwg.org/multipage/#dom-table-deleterow
fn DeleteRow(&self, mut index: i32) -> Fallible<()> {
let rows = self.Rows();
// Step 1.
if index == -1 {
index = rows.Length() as i32 - 1;
}
// Step 2.
if index < 0 || index as u32 >= rows.Length() {
return Err(Error::IndexSize);
}
// Step 3.
Root::upcast::<Node>(rows.Item(index as u32).unwrap()).remove_self();
Ok(())
}
// 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");

View file

@ -19,7 +19,7 @@ interface HTMLTableElement : HTMLElement {
HTMLTableSectionElement createTBody(); HTMLTableSectionElement createTBody();
readonly attribute HTMLCollection rows; readonly attribute HTMLCollection rows;
[Throws] HTMLTableRowElement insertRow(optional long index = -1); [Throws] HTMLTableRowElement insertRow(optional long index = -1);
//void deleteRow(long index); [Throws] void deleteRow(long index);
// also has obsolete members // also has obsolete members
}; };

View file

@ -11,3 +11,4 @@
[Various fileBits] [Various fileBits]
expected: FAIL expected: FAIL
bug: https://github.com/servo/servo/issues/10911 bug: https://github.com/servo/servo/issues/10911

View file

@ -15225,6 +15225,10 @@
"path": "dom/nodes/prepend-on-Document.html", "path": "dom/nodes/prepend-on-Document.html",
"url": "/dom/nodes/prepend-on-Document.html" "url": "/dom/nodes/prepend-on-Document.html"
}, },
{
"path": "dom/nodes/remove-row.html",
"url": "/dom/nodes/remove-row.html"
},
{ {
"path": "dom/nodes/remove-unscopable.html", "path": "dom/nodes/remove-unscopable.html",
"url": "/dom/nodes/remove-unscopable.html" "url": "/dom/nodes/remove-unscopable.html"
@ -37201,7 +37205,9 @@
] ]
}, },
"local_changes": { "local_changes": {
"deleted": [], "deleted": [
"dom/nodes/remove-row.html"
],
"deleted_reftests": {}, "deleted_reftests": {},
"items": { "items": {
"testharness": { "testharness": {
@ -37210,6 +37216,12 @@
"path": "html/semantics/scripting-1/the-script-element/script-charset-03.html", "path": "html/semantics/scripting-1/the-script-element/script-charset-03.html",
"url": "/html/semantics/scripting-1/the-script-element/script-charset-03.html" "url": "/html/semantics/scripting-1/the-script-element/script-charset-03.html"
} }
],
"html/semantics/tabular-data/the-table-element/remove-row.html": [
{
"path": "html/semantics/tabular-data/the-table-element/remove-row.html",
"url": "/html/semantics/tabular-data/the-table-element/remove-row.html"
}
] ]
} }
}, },

View file

@ -1,5 +0,0 @@
[getElementsByClassName-21.htm]
type: testharness
[delete element from collection]
expected: FAIL

View file

@ -3237,9 +3237,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 deleteRow(long)]
expected: FAIL
[HTMLTableElement interface: attribute sortable] [HTMLTableElement interface: attribute sortable]
expected: FAIL expected: FAIL
@ -3267,12 +3264,6 @@
[HTMLTableElement interface: attribute cellSpacing] [HTMLTableElement interface: attribute cellSpacing]
expected: FAIL expected: FAIL
[HTMLTableElement interface: document.createElement("table") must inherit property "deleteRow" with the proper type (13)]
expected: FAIL
[HTMLTableElement interface: calling deleteRow(long) on document.createElement("table") with too few arguments must throw TypeError]
expected: FAIL
[HTMLTableElement interface: document.createElement("table") must inherit property "sortable" with the proper type (14)] [HTMLTableElement interface: document.createElement("table") must inherit property "sortable" with the proper type (14)]
expected: FAIL expected: FAIL

View file

@ -0,0 +1,50 @@
<!doctype html>
<meta charset="utf-8">
<title>Delete Row tests</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<table id="element">
<thead>
<th>First column</th>
<th>Second column</th>
</thead>
<tbody>
<tr>
<td>1.1</td>
<td>1.2</td>
</tr>
<tr>
<td>2.1</td>
<td>2.2</td>
</tr>
</tbody>
</table>
<script>
var el = document.getElementById('element');
test(function() {
assert_throws("IndexSizeError", function() {
el.deleteRow(-2)
})
}, 'deleteRow function invalid argument');
test(function() {
assert_throws("IndexSizeError", function() {
el.deleteRow(el.rows.length)
})
}, 'deleteRow function invalid argument bis');
test(function() {
var old_length = el.rows.length;
el.insertRow(-1);
el.deleteRow(-1);
assert_equals(old_length, el.rows.length);
}, "check normal deleteRow");
test(function() {
while (el.rows.length > 1) {
el.deleteRow(-1);
}
assert_equals(1, el.rows.length);
}, "check normal deleteRow bis");
</script>