<!DOCTYPE HTML> <html> <!-- https://bugzilla.mozilla.org/show_bug.cgi?id=611182 --> <head> <title>Test for Bug 611182</title> <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script> <script type="text/javascript" src="/tests/SimpleTest/WindowSnapshot.js"></script> <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> </head> <body> <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=611182">Mozilla Bug 611182</a> <p id="display"></p> <div id="content"> <iframe></iframe> <iframe id="ref" src="data:text/html,foo bar"></iframe> </div> <pre id="test"> <script type="application/javascript"> /** Test for Bug 611182 **/ SimpleTest.waitForExplicitFinish(); SimpleTest.waitForFocus(function() { var iframe = document.querySelector("iframe"); var refElem = document.querySelector("#ref"); var ref = snapshotWindow(refElem.contentWindow, false); function findTextNode(doc) { var body = doc.documentElement; var result = findTextNodeWorker(body); ok(result, "Failed to find the text node"); return result; } function findTextNodeWorker(root) { if (root.isContentEditable) { root.focus(); } for (var i = 0; i < root.childNodes.length; ++i) { var node = root.childNodes[i]; if (node.nodeType == node.TEXT_NODE && node.nodeValue == "fooz bar") { return node; } if (node.nodeType == node.ELEMENT_NODE) { node = findTextNodeWorker(node); if (node) { return node; } } } return null; } function testBackspace(src, callback) { ok(true, "Testing " + src); iframe.addEventListener("load", function() { iframe.removeEventListener("load", arguments.callee, false); var doc = iframe.contentDocument; var win = iframe.contentWindow; doc.body.setAttribute("spellcheck", "false"); iframe.focus(); var textNode = findTextNode(doc); var sel = win.getSelection(); sel.collapse(textNode, 4); synthesizeKey("VK_BACK_SPACE", {}); is(textNode.textContent, "foo bar", "Backspace should work correctly"); var snapshot = snapshotWindow(win, false); ok(compareSnapshots(snapshot, ref, true)[0], "No bogus node should exist in the document"); callback(); }, false); iframe.src = src; } const TEST_URIS = [ "data:text/html,<html contenteditable>fooz bar</html>", "data:text/html,<html contenteditable><body>fooz bar</body></html>", "data:text/html,<body contenteditable>fooz bar</body>", "data:text/html,<body contenteditable><p>fooz bar</p></body>", "data:text/html,<body contenteditable><div>fooz bar</div></body>", "data:text/html,<body contenteditable><span>fooz bar</span></body>", "data:text/html,<p contenteditable style='outline:none'>fooz bar</p>", "data:text/html,<!DOCTYPE html><html><body contenteditable>fooz bar</body></html>", "data:text/html,<!DOCTYPE html><html contenteditable><body>fooz bar</body></html>", 'data:application/xhtml+xml,<html xmlns="http://www.w3.org/1999/xhtml"><body contenteditable="true">fooz bar</body></html>', 'data:application/xhtml+xml,<html xmlns="http://www.w3.org/1999/xhtml" contenteditable="true"><body>fooz bar</body></html>', "data:text/html,<body onload=\"document.designMode='on'\">fooz bar</body>", 'data:text/html,<html><script>' + 'onload = function() {' + 'var old = document.body;' + 'old.parentNode.removeChild(old);' + 'var r = document.documentElement;' + 'var b = document.createElement("body");' + 'r.appendChild(b);' + 'b.appendChild(document.createTextNode("fooz bar"));' + 'b.contentEditable = "true";' + '};' + '<\/script><body></body></html>', 'data:text/html,<html><script>' + 'onload = function() {' + 'var old = document.body;' + 'old.parentNode.removeChild(old);' + 'var r = document.documentElement;' + 'var b = document.createElement("body");' + 'b.appendChild(document.createTextNode("fooz bar"));' + 'b.contentEditable = "true";' + 'r.appendChild(b);' + '};' + '<\/script><body></body></html>', 'data:text/html,<html><script>' + 'onload = function() {' + 'var old = document.body;' + 'old.parentNode.removeChild(old);' + 'var r = document.documentElement;' + 'var b = document.createElement("body");' + 'r.appendChild(b);' + 'b.appendChild(document.createTextNode("fooz bar"));' + 'b.setAttribute("contenteditable", "true");' + '};' + '<\/script><body></body></html>', 'data:text/html,<html><script>' + 'onload = function() {' + 'var old = document.body;' + 'old.parentNode.removeChild(old);' + 'var r = document.documentElement;' + 'var b = document.createElement("body");' + 'b.appendChild(document.createTextNode("fooz bar"));' + 'b.setAttribute("contenteditable", "true");' + 'r.appendChild(b);' + '};' + '<\/script><body></body></html>', 'data:text/html,<html><script>' + 'onload = function() {' + 'var old = document.body;' + 'old.parentNode.removeChild(old);' + 'var r = document.documentElement;' + 'var b = document.createElement("body");' + 'r.appendChild(b);' + 'b.contentEditable = "true";' + 'b.appendChild(document.createTextNode("fooz bar"));' + '};' + '<\/script><body></body></html>', 'data:text/html,<html><script>' + 'onload = function() {' + 'var old = document.body;' + 'old.parentNode.removeChild(old);' + 'var r = document.documentElement;' + 'var b = document.createElement("body");' + 'b.contentEditable = "true";' + 'r.appendChild(b);' + 'b.appendChild(document.createTextNode("fooz bar"));' + '};' + '<\/script><body></body></html>', 'data:text/html,<html><script>' + 'onload = function() {' + 'var old = document.body;' + 'old.parentNode.removeChild(old);' + 'var r = document.documentElement;' + 'var b = document.createElement("body");' + 'r.appendChild(b);' + 'b.setAttribute("contenteditable", "true");' + 'b.appendChild(document.createTextNode("fooz bar"));' + '};' + '<\/script><body></body></html>', 'data:text/html,<html><script>' + 'onload = function() {' + 'var old = document.body;' + 'old.parentNode.removeChild(old);' + 'var r = document.documentElement;' + 'var b = document.createElement("body");' + 'b.setAttribute("contenteditable", "true");' + 'r.appendChild(b);' + 'b.appendChild(document.createTextNode("fooz bar"));' + '};' + '<\/script><body></body></html>', 'data:text/html,<html><script>' + 'onload = function() {' + 'document.open();' + 'document.write("<body contenteditable>fooz bar</body>");' + 'document.close();' + '};' + '<\/script><body></body></html>', 'data:text/html,<html><script>' + 'onload = function() {' + 'document.open();' + 'document.write("<body contenteditable><div>fooz bar</div></body>");' + 'document.close();' + '};' + '<\/script><body></body></html>', 'data:text/html,<html><script>' + 'onload = function() {' + 'document.open();' + 'document.write("<body contenteditable><span>fooz bar</span></body>");' + 'document.close();' + '};' + '<\/script><body></body></html>', 'data:text/html,<html><script>' + 'onload = function() {' + 'document.open();' + 'document.write("<p contenteditable style=\\"outline: none\\">fooz bar</p>");' + 'document.close();' + '};' + '<\/script><body></body></html>', 'data:text/html,<html><script>' + 'onload = function() {' + 'document.open();' + 'document.write("<html contenteditable>fooz bar</html>");' + 'document.close();' + '};' + '<\/script><body></body></html>', 'data:text/html,<html><script>' + 'onload = function() {' + 'document.open();' + 'document.write("<html contenteditable><body>fooz bar</body></html>");' + 'document.close();' + '};' + '<\/script><body></body></html>', ]; var currentTest = 0; function runAllTests() { if (currentTest == TEST_URIS.length) { SimpleTest.finish(); return; } testBackspace(TEST_URIS[currentTest++], runAllTests); } runAllTests(); }); </script> </pre> </body> </html>