mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-15 22:35:43 +00:00
Landing tests for bug 132824. Patch by craig.topper@gmail.com, r+sr=jonas@sicking.cc
This commit is contained in:
parent
b3ec7a255a
commit
164a592d87
@ -186,6 +186,9 @@ _TEST_FILES = test_bug5141.html \
|
||||
test_text_wholeText.html \
|
||||
wholeTexty-helper.xml \
|
||||
test_bug444030.xhtml \
|
||||
test_NodeIterator_basics_filters.xhtml \
|
||||
test_NodeIterator_mutations_1.xhtml \
|
||||
test_NodeIterator_mutations_2.html \
|
||||
$(NULL)
|
||||
|
||||
libs:: $(_TEST_FILES)
|
||||
|
117
content/base/test/test_NodeIterator_basics_filters.xhtml
Normal file
117
content/base/test/test_NodeIterator_basics_filters.xhtml
Normal file
@ -0,0 +1,117 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<!-- NodeIterator basics and filters tests.
|
||||
Originally written by Ian Hickson, Mochi-ified by Zack Weinberg.
|
||||
This file based on 001.xml, 002.xml, and 010.xml from
|
||||
http://hixie.ch/tests/adhoc/dom/traversal/node-iterator/
|
||||
with some additional cases.
|
||||
-->
|
||||
<head>
|
||||
<title>DOM Traversal: NodeIterator: Basics and Filters</title>
|
||||
<script type="text/javascript" src="/MochiKit/packed.js"></script>
|
||||
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||
</head>
|
||||
<body>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none">
|
||||
<!-- comment -->
|
||||
<?body processing instruction?>
|
||||
</div>
|
||||
<pre id="test">
|
||||
<script class="testbody" type="text/javascript"><![CDATA[
|
||||
function compare_arrays(e, f, label) {
|
||||
var length = (e.length > f.length) ? e.length : f.length;
|
||||
for (var i = 0; i < length; i += 1) {
|
||||
if (e[i] > 0)
|
||||
is(f[i], e[i], label + " - index " + i + ": ");
|
||||
else
|
||||
todo_is(f[i], -e[i], label + " - index " + i + ": ");
|
||||
}
|
||||
}
|
||||
|
||||
/** DOM Traversal: NodeIterator: Basics **/
|
||||
// NOTE: If you change the document structure, you have to make sure
|
||||
// the magic numbers in this array (and 'expected_f', below) match.
|
||||
var expected = new Array(9, // document
|
||||
1, // html
|
||||
3, 8, // leading comment
|
||||
3, 1, // head
|
||||
3, 1, 3, // title
|
||||
3, 1, // first script tag
|
||||
3, 1, // second script tag
|
||||
3, 1, // stylesheet tag
|
||||
3, // close head
|
||||
3, 1, // body
|
||||
3, 1, // p#display
|
||||
3, 1, // div#content
|
||||
3, 8, // comment
|
||||
3, 7, // processing instruction
|
||||
3, // close div
|
||||
3, 1, // pre#test
|
||||
3, 1, 4, // script and CDATA block
|
||||
-3, -3, -3); // close close close
|
||||
// these aren't there
|
||||
// not sure why
|
||||
var found = new Array();
|
||||
|
||||
var iterator = document.createNodeIterator(document,
|
||||
NodeFilter.SHOW_ALL,
|
||||
null, false);
|
||||
var node;
|
||||
|
||||
// forwards
|
||||
while (node = iterator.nextNode())
|
||||
found.push(node.nodeType);
|
||||
compare_arrays(expected, found, 'basics forward');
|
||||
|
||||
// backwards
|
||||
found.length = 0;
|
||||
while (node = iterator.previousNode())
|
||||
found.unshift(node.nodeType);
|
||||
compare_arrays(expected, found, 'basics backward');
|
||||
|
||||
/** DOM Traversal: NodeIterator: Filters **/
|
||||
function filter(n) {
|
||||
if (n.nodeType == 3) {
|
||||
return NodeFilter.FILTER_SKIP;
|
||||
} else if (n.nodeName == 'body') {
|
||||
return NodeFilter.FILTER_REJECT; // same as _SKIP
|
||||
}
|
||||
return 1; // FILTER_ACCEPT
|
||||
}
|
||||
|
||||
// Same warning applies to this array as to 'expected'.
|
||||
var expect_f = new Array(9, // document
|
||||
1, // html
|
||||
8, // leading comment
|
||||
1, // head
|
||||
1, // title
|
||||
1, // first script tag
|
||||
1, // second script tag
|
||||
1, // stylesheet tag
|
||||
// body skipped
|
||||
1, // p#display
|
||||
1, // div#content
|
||||
8, // comment
|
||||
// processing instruction skipped
|
||||
1, // pre#test
|
||||
1, 4); // script and CDATA block
|
||||
|
||||
found.length = 0;
|
||||
iterator = document.createNodeIterator(document, NodeFilter.SHOW_ALL,
|
||||
filter, false);
|
||||
|
||||
// forwards
|
||||
while (node = iterator.nextNode())
|
||||
found.push(node.nodeType);
|
||||
compare_arrays(expect_f, found, 'filtered forward');
|
||||
|
||||
// backwards
|
||||
found.length = 0;
|
||||
while (node = iterator.previousNode())
|
||||
found.unshift(node.nodeType);
|
||||
compare_arrays(expect_f, found, 'filtered backward');
|
||||
]]></script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
205
content/base/test/test_NodeIterator_mutations_1.xhtml
Normal file
205
content/base/test/test_NodeIterator_mutations_1.xhtml
Normal file
@ -0,0 +1,205 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<!-- NodeIterator mutation tests.
|
||||
Originally written by Ian Hickson, Mochi-ified by Zack Weinberg.
|
||||
This file based on 00[3-9].xml from
|
||||
http://hixie.ch/tests/adhoc/dom/traversal/node-iterator/
|
||||
-->
|
||||
<head>
|
||||
<title>DOM Traversal: NodeIterator: Mutations (1/x)</title>
|
||||
<script type="text/javascript" src="/MochiKit/packed.js"></script>
|
||||
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||
</head>
|
||||
<body>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none">
|
||||
<span id="X"></span><span id="Y"><span id="root1"><span id="A"><span id="B"><span id="C"><span id="D"><span id="E"></span></span></span></span></span></span></span>
|
||||
<span id="root2"><span id="F"><span id="FF"></span></span><span id="G"></span><span id="H"><span id="HH"></span></span></span>
|
||||
<span id="root3"><span id="I"><span id="II"></span></span><span id="J"></span><span id="K"><span id="KK"></span></span></span>
|
||||
<span id="root4"><span id="L"></span><span id="M"><span id="MM"></span></span><span id="N"></span></span>
|
||||
<span id="root5"><span id="O"></span><span id="P"><span id="PP"></span></span><span id="Q"></span></span>
|
||||
<span id="root6"><span id="R"></span><span id="S"><span id="SS"></span></span><span id="T"></span></span>
|
||||
<span id="root7"><span id="U"></span><span id="V"><span id="VV"></span></span><span id="W"></span></span>
|
||||
</div>
|
||||
<pre id="test">
|
||||
<script class="testbody" type="text/javascript"><![CDATA[
|
||||
/** Originally written by Ian Hickson. **/
|
||||
|
||||
function check(f, e, label) {
|
||||
var eid = e.id;
|
||||
var fid = f ? f.id : 'null';
|
||||
is(f, e, label + ': expected ' + eid + ' have ' + fid);
|
||||
}
|
||||
|
||||
var childid = 0;
|
||||
function addChildTo(a) {
|
||||
var x = document.createElementNS('http://www.w3.org/1999/xhtml', 'span');
|
||||
x.id = 'X' + childid;
|
||||
childid++;
|
||||
ok(a, 'parent ' + (a?a.id:'undefined') + ' for child ' + x.id);
|
||||
if (a)
|
||||
a.appendChild(x);
|
||||
return x;
|
||||
}
|
||||
function remove(a) {
|
||||
var p = a.parentNode;
|
||||
ok(a && p,
|
||||
'removing ' + ( a?(a.id?a.id:'(no id)'):'undefined' )
|
||||
+ ' with parent ' + ( p?(p.id?p.id:'(no id)'):'undefined' ));
|
||||
if (a && p)
|
||||
p.removeChild(a);
|
||||
}
|
||||
|
||||
/** Removal of nodes that should have no effect **/
|
||||
(function () {
|
||||
var root = $('root1');
|
||||
var A = $('A');
|
||||
var B = $('B');
|
||||
var C = $('C');
|
||||
var D = $('D');
|
||||
var E = $('E');
|
||||
|
||||
var iterator = document.createNodeIterator(root, NodeFilter.SHOW_ALL,
|
||||
null, false);
|
||||
check(iterator.nextNode(), root, '1.0');
|
||||
|
||||
// 1. Remove a node unrelated to the reference node
|
||||
remove($('X'));
|
||||
check(iterator.nextNode(), A, '1.1');
|
||||
|
||||
// 2. Remove an ancestor of the root node
|
||||
remove($('Y'));
|
||||
check(iterator.nextNode(), B, '1.2');
|
||||
|
||||
// 3. Remove the root node itself
|
||||
remove(root);
|
||||
check(iterator.nextNode(), C, '1.3');
|
||||
|
||||
// 4. Remove a descendant of the reference node
|
||||
remove(E);
|
||||
check(iterator.nextNode(), D, '1.4');
|
||||
})();
|
||||
|
||||
/** Removal of the reference node **/
|
||||
(function () {
|
||||
var root = $('root2');
|
||||
var F = $('F');
|
||||
var FF = $('FF');
|
||||
var G = $('G');
|
||||
var H = $('H');
|
||||
var iterator = document.createNodeIterator(root, NodeFilter.SHOW_ALL,
|
||||
null, false);
|
||||
|
||||
check(iterator.nextNode(), root, '2.0');
|
||||
check(iterator.nextNode(), F, '2.1');
|
||||
check(iterator.nextNode(), FF, '2.2');
|
||||
check(iterator.nextNode(), G, '2.3');
|
||||
remove(G);
|
||||
check(iterator.previousNode(), FF, '2.4');
|
||||
remove(FF);
|
||||
check(iterator.nextNode(), H, '2.5');
|
||||
})();
|
||||
|
||||
/** Removal of the reference node (deep check) **/
|
||||
(function () {
|
||||
var root = $('root3');
|
||||
var I = $('I');
|
||||
var II = $('II');
|
||||
var J = $('J');
|
||||
var K = $('K');
|
||||
var KK = $('KK');
|
||||
|
||||
var iterator = document.createNodeIterator(root, NodeFilter.SHOW_ALL,
|
||||
null, false);
|
||||
check(iterator.nextNode(), root, '3.0');
|
||||
check(iterator.nextNode(), I, '3.1');
|
||||
check(iterator.nextNode(), II, '3.2');
|
||||
check(iterator.nextNode(), J, '3.3');
|
||||
remove(J);
|
||||
var X = addChildTo(II);
|
||||
check(iterator.nextNode(), X, '3.4');
|
||||
check(iterator.previousNode(), X, '3.5');
|
||||
remove(X);
|
||||
var Y = addChildTo(II);
|
||||
check(iterator.previousNode(), Y, '3.6');
|
||||
check(iterator.nextNode(), Y, '3.7');
|
||||
check(iterator.nextNode(), K, '3.8');
|
||||
check(iterator.nextNode(), KK, '3.9');
|
||||
})();
|
||||
|
||||
/** Removal of an ancestor of the Reference Node (forwards) **/
|
||||
(function () {
|
||||
var root = $('root4');
|
||||
var L = $('L');
|
||||
var M = $('M');
|
||||
var MM = $('MM');
|
||||
var N = $('N');
|
||||
|
||||
var iterator = document.createNodeIterator(root, NodeFilter.SHOW_ALL,
|
||||
null, false);
|
||||
check(iterator.nextNode(), root, '4.1');
|
||||
check(iterator.nextNode(), L, '4.2');
|
||||
check(iterator.nextNode(), M, '4.3');
|
||||
check(iterator.nextNode(), MM, '4.4');
|
||||
remove(M);
|
||||
check(iterator.previousNode(), L, '4.5');
|
||||
})();
|
||||
|
||||
/** Removal of an ancestor of the Reference Node (forwards) (deep check) **/
|
||||
(function () {
|
||||
var root = $('root5');
|
||||
var O = $('O');
|
||||
var P = $('P');
|
||||
var PP = $('PP');
|
||||
var Q = $('Q');
|
||||
|
||||
var iterator = document.createNodeIterator(root, NodeFilter.SHOW_ALL,
|
||||
null, false);
|
||||
check(iterator.nextNode(), root, '5.1');
|
||||
check(iterator.nextNode(), O, '5.2');
|
||||
check(iterator.nextNode(), P, '5.3');
|
||||
check(iterator.nextNode(), PP, '5.4');
|
||||
remove(P);
|
||||
var X = addChildTo(O);
|
||||
check(iterator.nextNode(), X, '5.5');
|
||||
})();
|
||||
|
||||
/** Removal of an ancestor of the Reference Node (backwards) **/
|
||||
(function () {
|
||||
var root = $('root6');
|
||||
var R = $('R');
|
||||
var S = $('S');
|
||||
var SS = $('SS');
|
||||
var T = $('T');
|
||||
|
||||
var iterator = document.createNodeIterator(root, NodeFilter.SHOW_ALL,
|
||||
null, false);
|
||||
check(iterator.nextNode(), root, '6.1');
|
||||
check(iterator.nextNode(), R, '6.2');
|
||||
check(iterator.nextNode(), S, '6.3');
|
||||
check(iterator.nextNode(), SS, '6.4');
|
||||
check(iterator.previousNode(), SS, '6.5');
|
||||
remove(S);
|
||||
check(iterator.nextNode(), T, '6.6');
|
||||
})();
|
||||
|
||||
/** Removal of an ancestor of the Reference Node (backwards) (deep check) **/
|
||||
(function () {
|
||||
var root = $('root7');
|
||||
var U = $('U');
|
||||
var V = $('V');
|
||||
var VV = $('VV');
|
||||
var W = $('W');
|
||||
|
||||
var iterator = document.createNodeIterator(root, NodeFilter.SHOW_ALL,
|
||||
null, false);
|
||||
check(iterator.nextNode(), root, '7.1');
|
||||
check(iterator.nextNode(), U, '7.2');
|
||||
check(iterator.nextNode(), V, '7.3');
|
||||
check(iterator.nextNode(), VV, '7.4');
|
||||
check(iterator.previousNode(), VV, '7.5');
|
||||
remove(V);
|
||||
var X = addChildTo(U);
|
||||
check(iterator.previousNode(), X, '7.6');
|
||||
})();
|
||||
]]></script></pre></body></html>
|
113
content/base/test/test_NodeIterator_mutations_2.html
Normal file
113
content/base/test/test_NodeIterator_mutations_2.html
Normal file
@ -0,0 +1,113 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<!-- NodeIterator mutation tests, 2.
|
||||
Originally part of WebKit, Mochi-ified by Zack Weinberg.
|
||||
This file based on node-iterator-00[...].html from
|
||||
http://svn.webkit.org/repository/webkit/trunk/LayoutTests/traversal/
|
||||
-->
|
||||
<head>
|
||||
<title>DOM Traversal: NodeIterator: Mutations (2/x)</title>
|
||||
<script type="text/javascript" src="/MochiKit/packed.js"></script>
|
||||
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css">
|
||||
</head>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none">
|
||||
</div>
|
||||
<pre id="test">
|
||||
<script class="testbody" type="text/javascript">
|
||||
function resetContent() {
|
||||
var content = $('content');
|
||||
content.innerHTML = ('<span id="A"><\/span><span id="B"><\/span>'
|
||||
+ '<span id="C"><\/span><span id="D"><\/span>'
|
||||
+ '<span id="E"><\/span><span id="F"><\/span>'
|
||||
+ '<span id="G"><\/span><span id="H"><\/span>'
|
||||
+ '<span id="I"><\/span>');
|
||||
return content;
|
||||
}
|
||||
|
||||
function makeSpan(id) {
|
||||
var e = document.createElement('span');
|
||||
e.id = id;
|
||||
return e;
|
||||
}
|
||||
|
||||
function testNodeFilter(n) {
|
||||
if (n.tagName == 'SPAN')
|
||||
return NodeFilter.FILTER_ACCEPT;
|
||||
return NodeFilter.FILTER_SKIP;
|
||||
}
|
||||
|
||||
function checkseq(it, root, expect) {
|
||||
var checkIt = document.createNodeIterator(root, NodeFilter.SHOW_ELEMENT,
|
||||
testNodeFilter, false);
|
||||
var printedPointer = (it.referenceNode == undefined);
|
||||
var string = '';
|
||||
var node;
|
||||
while ((node = checkIt.nextNode()) != null) {
|
||||
if (!printedPointer && it.referenceNode == node) {
|
||||
printedPointer = true;
|
||||
var s = '[' + node.id + '] ';
|
||||
if (it.pointerBeforeReferenceNode)
|
||||
string += "* " + s;
|
||||
else
|
||||
string += s + "* ";
|
||||
} else {
|
||||
string += node.id + " ";
|
||||
}
|
||||
}
|
||||
is(string.slice(0, -1), expect, "sequence check");
|
||||
}
|
||||
|
||||
// first a basic sanity check [node-iterator-001]
|
||||
(function(){
|
||||
var root = resetContent();
|
||||
var it = document.createNodeIterator(root, NodeFilter.SHOW_ELEMENT,
|
||||
testNodeFilter, false);
|
||||
|
||||
checkseq(it, root, 'A B C D E F G H I');
|
||||
it.nextNode();
|
||||
checkseq(it, root, '[A] * B C D E F G H I');
|
||||
it.previousNode();
|
||||
checkseq(it, root, '* [A] B C D E F G H I');
|
||||
it.previousNode();
|
||||
checkseq(it, root, '* [A] B C D E F G H I');
|
||||
})();
|
||||
|
||||
// Mutations that should not move the iterator [node-iterator-002]
|
||||
(function(){
|
||||
var root = resetContent();
|
||||
var it = document.createNodeIterator(root, NodeFilter.SHOW_ELEMENT,
|
||||
testNodeFilter, false);
|
||||
|
||||
for (var i = 0; i < 4; i++)
|
||||
it.nextNode();
|
||||
checkseq(it, root, 'A B C [D] * E F G H I');
|
||||
|
||||
root.removeChild($('E'));
|
||||
checkseq(it, root, 'A B C [D] * F G H I');
|
||||
|
||||
var X = makeSpan('X');
|
||||
root.insertBefore(X, $('F'));
|
||||
checkseq(it, root, 'A B C [D] * X F G H I');
|
||||
|
||||
var I = $('I');
|
||||
root.removeChild(I);
|
||||
root.insertBefore(I, X);
|
||||
checkseq(it, root, 'A B C [D] * I X F G H');
|
||||
})();
|
||||
|
||||
// 002 complete
|
||||
|
||||
/* Template
|
||||
(function(){
|
||||
var root = resetContent();
|
||||
var it = document.createNodeIterator(root, NodeFilter.SHOW_ELEMENT,
|
||||
testNodeFilter, false);
|
||||
|
||||
})();
|
||||
*/
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user