summaryrefslogtreecommitdiffstats
path: root/LayoutTests/fast/dom/Node/fragment-mutation.html
diff options
context:
space:
mode:
Diffstat (limited to 'LayoutTests/fast/dom/Node/fragment-mutation.html')
-rw-r--r--LayoutTests/fast/dom/Node/fragment-mutation.html148
1 files changed, 148 insertions, 0 deletions
diff --git a/LayoutTests/fast/dom/Node/fragment-mutation.html b/LayoutTests/fast/dom/Node/fragment-mutation.html
new file mode 100644
index 0000000..037e17b
--- /dev/null
+++ b/LayoutTests/fast/dom/Node/fragment-mutation.html
@@ -0,0 +1,148 @@
+<html>
+<head>
+<title>Fragment Mutation Tests</title>
+<script>
+
+if (window.layoutTestController)
+ layoutTestController.dumpAsText();
+
+var log = [];
+
+function logResult(description, outcome)
+{
+ log.push({ description: description, outcome: outcome});
+}
+
+function printLog(methodName)
+{
+ var entries = log.map(function(entry) {
+ return "<li>" + entry.description + ": " + entry.outcome;
+ });
+ document.body.appendChild(document.createElement("p")).innerHTML = "This test creates a fragment containing three elements: \"B\", \"U\", and \"P\", " +
+ " attempts to " + methodName + " this fragment and studies effects of mutation events on the fragment.";
+ document.body.appendChild(document.createElement("ul")).innerHTML = entries.join("\n");
+ document.body.appendChild(document.createElement("br"));
+ log = [];
+}
+
+function produceNodeNameString(nodes)
+{
+ var node = nodes.firstChild;
+ var result = "";
+ while(node) {
+ result += node.nodeName;
+ node = node.nextSibling;
+ }
+ return result;
+}
+
+function expectException(code)
+{
+ return function(stash, exception) {
+ if (!exception)
+ return "FAIL, expected exception with code " + code + ". The resulting fragment was: \"" + produceNodeNameString(stash) + "\".";
+
+ if (code == exception.code)
+ return "PASS";
+ return "FAIL, expected exception code: " + code + ", was: " + exception + ".";
+ }
+}
+
+function expectNodes(nodes)
+{
+ return function(stash, exception) {
+ if (exception)
+ return "FAIL, unexpected exception thrown: " + exception;
+ var result = produceNodeNameString(stash);
+ if (nodes == result)
+ return "PASS";
+ return "FAIL, expected \"" + nodes + "\", was \"" + result + "\".";
+ };
+}
+
+function testFragment(method, description, mutationHandler, expectation, nonStop)
+{
+ var once = 0;
+ var logged = 0;
+ var frag = document.createDocumentFragment();
+ var stash = document.body.appendChild(document.createElement("div"));
+ frag.appendChild(document.createElement("b"));
+ frag.appendChild(document.createElement("u"));
+ frag.appendChild(document.createElement("p"));
+ frag.addEventListener("DOMSubtreeModified", function(evt)
+ {
+ if (!nonStop && once++)
+ return;
+
+ try {
+ mutationHandler(evt, frag, stash);
+ }
+ catch(e) {
+ logResult(description, expectation(stash, e));
+ logged++;
+ }
+ }, false);
+
+ try {
+ method(stash, frag);
+ }
+ catch(e) {
+ logResult(description, expectation(stash, e));
+ logged++;
+ }
+ if (!logged)
+ logResult(description, expectation(stash));
+ document.body.removeChild(stash);
+}
+
+function appendChildMethod(object, subject)
+{
+ object.appendChild(subject);
+}
+
+function insertBeforeMethod(object, subject)
+{
+ object.insertBefore(subject, object.firstChild);
+}
+
+function runTest(methodName, method)
+{
+ var missing = document.body.appendChild(document.createElement("em"));
+ testFragment(method, "Inserting an element in front of the next item in fragment should not affect the result", function(evt, frag)
+ {
+ frag.insertBefore(missing, frag.firstChild);
+ }, expectNodes("BUP"));
+
+ testFragment(method, "Removing next item should not abort iteration", function(evt, frag)
+ {
+ frag.removeChild(frag.firstChild);
+ }, expectNodes("BUP"));
+
+ var extra = document.body.appendChild(document.createElement("em"));
+ testFragment(method, "Appending an element at the end of the fragment should not affect the result", function(evt, frag)
+ {
+ frag.appendChild(extra);
+ }, expectNodes("BUP"));
+
+ testFragment(method, "Continually re-appending removed element to the fragment should eventually throw NOT_FOUND_ERR", function(evt, frag, stash)
+ {
+ stash.insertBefore(frag.lastChild, stash.firstChild);
+ }, expectException(8), true);
+
+ testFragment(method, "Moving next item to become previous sibling of the re-parentee should not result in stack exhaustion", function(evt, frag, stash)
+ {
+ document.body.insertBefore(frag.firstChild, stash);
+ }, expectNodes("BUP"));
+ printLog(methodName);
+}
+function runTests()
+{
+ runTest("appendChild", appendChildMethod);
+ runTest("insertBefore", insertBeforeMethod);
+}
+
+</script>
+</head>
+<body onload="runTests()">
+</body>
+</html> \ No newline at end of file