aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorShamir Khodzha <khodzha.sh@gmail.com>2014-03-12 18:33:31 +0400
committerShamir Khodzha <khodzha.sh@gmail.com>2014-03-14 17:46:35 +0400
commit574fba310fc040ee3ca016093ed6b329decf1af7 (patch)
tree3a745fe24f84667832b9478936f2e1f67e233051 /src
parentaf616dba58cbf589b116b9e3cde4429df43e72cd (diff)
downloadservo-574fba310fc040ee3ca016093ed6b329decf1af7.tar.gz
servo-574fba310fc040ee3ca016093ed6b329decf1af7.zip
implemented Node.normalize()
Diffstat (limited to 'src')
-rw-r--r--src/components/script/dom/bindings/codegen/Bindings.conf1
-rw-r--r--src/components/script/dom/node.rs24
-rw-r--r--src/test/content/test_node_normalize.html35
3 files changed, 58 insertions, 2 deletions
diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf
index 369d08bfdf0..68c2f8975f2 100644
--- a/src/components/script/dom/bindings/codegen/Bindings.conf
+++ b/src/components/script/dom/bindings/codegen/Bindings.conf
@@ -87,6 +87,7 @@ DOMInterfaces = {
'isEqualNode',
'nodeName',
'nodeValue',
+ 'normalize',
'removeChild',
'replaceChild',
'textContent',
diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs
index 9999503a758..f1bf5d98d17 100644
--- a/src/components/script/dom/node.rs
+++ b/src/components/script/dom/node.rs
@@ -1422,8 +1422,28 @@ impl Node {
}
// http://dom.spec.whatwg.org/#dom-node-normalize
- pub fn Normalize(&mut self) {
- // FIXME (#1823) implement.
+ pub fn Normalize(&mut self, abstract_self: &mut JS<Node>) {
+ let mut prev_text = None;
+ for mut child in self.children() {
+ if child.is_text() {
+ let characterdata: JS<CharacterData> = CharacterDataCast::to(&child);
+ if characterdata.get().Length() == 0 {
+ abstract_self.remove_child(&mut child);
+ } else {
+ match prev_text {
+ Some(ref text_node) => {
+ let mut prev_characterdata: JS<CharacterData> = CharacterDataCast::to(text_node);
+ prev_characterdata.get_mut().AppendData(characterdata.get().Data());
+ abstract_self.remove_child(&mut child);
+ },
+ None => prev_text = Some(child)
+ }
+ }
+ } else {
+ prev_text = None;
+ }
+
+ }
}
// http://dom.spec.whatwg.org/#dom-node-clonenode
diff --git a/src/test/content/test_node_normalize.html b/src/test/content/test_node_normalize.html
new file mode 100644
index 00000000000..b2e9a367128
--- /dev/null
+++ b/src/test/content/test_node_normalize.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <script src="harness.js"></script>
+ </head>
+ <body>
+ <script>
+ // test1: Node.normalize
+ var parent1 = document.createElement("div");
+ var child1 = document.createTextNode("aaa");
+ var child2 = document.createTextNode("");
+ var child3 = document.createTextNode("bb");
+
+ var parent2 = document.createElement("div");
+
+ parent1.appendChild(child1);
+ parent1.appendChild(child2);
+ parent1.appendChild(child3);
+
+ parent2.appendChild(document.createTextNode(""));
+
+ parent1.normalize();
+ parent2.normalize();
+
+ is(Array.prototype.map.call(parent1.childNodes, function(el) {return el.length}).indexOf(0), -1, "Node.normalize removes empty text nodes");
+ is(parent1.childNodes.length, 1, "Node.normalize merges text nodes in one");
+ is(parent1.childNodes[0].length, 5, "test 1-2, Node.normalize merges text nodes values");
+ is(parent2.childNodes.length, 0, "Node.normalize removes empty text nodes even if there is only one text node");
+ is(child2.textContent, "", "Node.normalize doesn't change removed children original content")
+ is(child3.textContent, "bb", "Node.normalize doesn't change removed children original content")
+
+ finish();
+ </script>
+ </body>
+</html>