<!DOCTYPE HTML> <html> <!-- https://bugzilla.mozilla.org/show_bug.cgi?id=449243 --> <head> <title>Test for Bug 449243</title> <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> <script type="text/javascript" src="/tests/SimpleTest/EventUtils.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=449243">Mozilla Bug 449243</a> <p id="display"></p> <div id="content" contenteditable> <h2>This is a title</h2> <ul> <li>this is a</li> <li>bullet list</li> </ul> <ol> <li>this is a</li> <li>numbered list</li> </ol> </div> <pre id="test"> <script type="application/javascript"> /** Test for Bug 449243 **/ SimpleTest.waitForExplicitFinish(); SimpleTest.waitForFocus(runTests); const CARET_BEGIN = 0; const CARET_MIDDLE = 1; const CARET_END = 2; function split(element, caretPos, nbKeyPresses) { // put the caret on the requested position var sel = window.getSelection(); var len = element.textContent.length; var pos = -1; switch (caretPos) { case CARET_BEGIN: pos = 0; break; case CARET_MIDDLE: pos = Math.floor(len/2); break; case CARET_END: pos = len; break; } sel.collapse(element.firstChild, pos); // simulates a [Return] keypress for (var i = 0; i < nbKeyPresses; i++) synthesizeKey("VK_RETURN", {}); } function undo(nbKeyPresses) { for (var i = 0; i < nbKeyPresses; i++) document.execCommand("Undo", false, null); } function SameTypeAsPreviousSibling(element) { var sibling = element.previousSibling; while (sibling && sibling.nodeType != 1) sibling = element.previousSibling; return (element.nodeName == sibling.nodeName); } function isParagraph(element) { return element.nodeName.toLowerCase() == "p"; } function runTests() { const content = document.querySelector("[contenteditable]"); const header = content.querySelector("h2"); const ulItem = content.querySelector("ul > li:last-child"); const olItem = content.querySelector("ol > li:last-child"); content.focus(); // beginning of selection: split current node split(header, CARET_BEGIN, 1); ok(SameTypeAsPreviousSibling(header), "Pressing [Return] at the beginning of a header " + "should create another header."); split(ulItem, CARET_BEGIN, 2); ok(SameTypeAsPreviousSibling(ulItem), "Pressing [Return] at the beginning of an unordered list item " + "should create another list item."); split(olItem, CARET_BEGIN, 2); ok(SameTypeAsPreviousSibling(olItem), "Pressing [Return] at the beginning of an ordered list item " + "should create another list item."); undo(3); // middle of selection: split current node split(header, CARET_MIDDLE, 1); ok(SameTypeAsPreviousSibling(header), "Pressing [Return] at the middle of a header " + "should create another header."); split(ulItem, CARET_MIDDLE, 2); ok(SameTypeAsPreviousSibling(ulItem), "Pressing [Return] at the middle of an unordered list item " + "should create another list item."); split(olItem, CARET_MIDDLE, 2); ok(SameTypeAsPreviousSibling(olItem), "Pressing [Return] at the middle of an ordered list item " + "should create another list item."); undo(3); // end of selection: create a new paragraph split(header, CARET_END, 1); ok(isParagraph(content.querySelector("h2+*")), "Pressing [Return] at the end of a header " + "should create a new paragraph."); split(ulItem, CARET_END, 2); ok(isParagraph(content.querySelector("ul+*")), "Pressing [Return] twice at the end of an unordered list item " + "should create a new paragraph."); split(olItem, CARET_END, 2); ok(isParagraph(content.querySelector("ol+*")), "Pressing [Return] twice at the end of an ordered list item " + "should create a new paragraph."); undo(3); // done SimpleTest.finish(); } </script> </pre> </body> </html>