diff options
Diffstat (limited to 'editor/libeditor/tests/test_bug1310912.html')
-rw-r--r-- | editor/libeditor/tests/test_bug1310912.html | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/editor/libeditor/tests/test_bug1310912.html b/editor/libeditor/tests/test_bug1310912.html new file mode 100644 index 0000000000..6c2036e4c0 --- /dev/null +++ b/editor/libeditor/tests/test_bug1310912.html @@ -0,0 +1,242 @@ +<!DOCTYPE html> +<!-- +https://bugzilla.mozilla.org/show_bug.cgi?id=1310912 +--> +<html> +<head> + <title>Test for Bug 1310912</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <script 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=1310912">Mozilla Bug 1310912</a> +<p id="display"></p> +<div id="content" style="display: none;"> + +</div> + +<div contenteditable>ABC</div> +<pre id="test"> + +<script class="testbody" type="application/javascript"> +SimpleTest.waitForExplicitFinish(); +SimpleTest.waitForFocus(function() { + const editor = document.querySelector("div[contenteditable]"); + + editor.focus(); + const sel = window.getSelection(); + sel.collapse(editor.childNodes[0], editor.textContent.length); + + (function testInsertEmptyTextNodeWhenCaretIsAtEndOfComposition() { + const description = + "testInsertEmptyTextNodeWhenCaretIsAtEndOfComposition: "; + synthesizeCompositionChange({ + composition: { + string: "DEF", + clauses: [ + { length: 3, attr: COMPOSITION_ATTR_RAW_CLAUSE }, + ], + }, + caret: { start: 3, length: 0 }, + }); + is( + editor.textContent, + "ABCDEF", + `${description} Composing text "DEF" should be inserted at end of the text node` + ); + + window.getSelection().getRangeAt(0).insertNode(document.createTextNode("")); + is( + editor.childNodes[0].data, + "ABCDEF", + `${ + description + } First text node should have both preceding text and the composing text` + ); + is( + editor.childNodes[1].data, + "", + `${description} Second text node should be empty` + ); + })(); + + (function testInsertEmptyTextNodeWhenCaretIsAtStartOfComposition() { + const description = + "testInsertEmptyTextNodeWhenCaretIsAtStartOfComposition: "; + synthesizeCompositionChange({ + composition: { + string: "GHI", + clauses: [ + { length: 3, attr: COMPOSITION_ATTR_CONVERTED_CLAUSE }, + ], + }, + caret: { start: 0, length: 0 }, + }); + is( + editor.textContent, + "ABCGHI", + `${description} Composing text should be replaced with new one` + ); + + window.getSelection().getRangeAt(0).insertNode(document.createTextNode("")); + is( + editor.childNodes[0].data, + "ABC", + `${ + description + } First text node should have only the preceding text of the composition` + ); + is( + editor.childNodes[1].data, + "", + `${description} Second text node should have be empty` + ); + is( + editor.childNodes[2].data, + "GHI", + `${description} Third text node should have only composing text` + ); + })(); + + (function testInsertEmptyTextNodeWhenCaretIsAtStartOfCompositionAgain() { + const description = + "testInsertEmptyTextNodeWhenCaretIsAtStartOfCompositionAgain: "; + synthesizeCompositionChange({ + composition: { + string: "JKL", + clauses: [ + { length: 3, attr: COMPOSITION_ATTR_CONVERTED_CLAUSE }, + ], + }, + caret: { start: 0, length: 0 }, + }); + is( + editor.textContent, + "ABCJKL", + `${description} Composing text should be replaced` + ); + + window.getSelection().getRangeAt(0).insertNode(document.createTextNode("")); + is( + editor.childNodes[0].data, + "ABC", + `${ + description + } First text node should have only the preceding text of the composition` + ); + is( + editor.childNodes[1].data, + "", + `${description} Second text node should have be empty` + ); + is( + editor.childNodes[2].data, + "JKL", + `${description} Third text node should have only composing text` + ); + })(); + + (function testInsertEmptyTextNodeWhenCaretIsAtMiddleOfComposition() { + const description = + "testInsertEmptyTextNodeWhenCaretIsAtMiddleOfComposition: "; + synthesizeCompositionChange({ + composition: { + string: "MNO", + clauses: [ + { length: 3, attr: COMPOSITION_ATTR_CONVERTED_CLAUSE }, + ], + }, + caret: { start: 1, length: 0 }, + }); + is( + editor.textContent, + "ABCMNO", + `${description} Composing text should be replaced` + ); + + // Normal selection is the caret, therefore, inserting empty text node + // creates the following DOM tree: + // <div contenteditable> + // |- #text ("ABCM") + // |- #text ("") + // +- #text ("NO") + window.getSelection().getRangeAt(0).insertNode(document.createTextNode("")); + is( + editor.childNodes[0].data, + "ABCM", + `${ + description + } First text node should have the preceding text and composing string before the split point` + ); + is( + editor.childNodes[1].data, + "", + `${description} Second text node should be empty` + ); + is( + editor.childNodes[2].data, + "NO", + `${ + description + } Third text node should have the remaining composing string` + ); + todo_is(editor.childNodes[3].nodeName, "BR", + "Forth node is empty text node, but I don't where this comes from"); + })(); + + // Then, committing composition makes the commit string into the first + // text node and makes the following text nodes empty. + // XXX I don't know whether the empty text nodes should be removed or not + // at this moment. + (function testCommitComposition() { + const description = "testCommitComposition: "; + synthesizeComposition({ type: "compositioncommitasis" }); + is( + editor.textContent, + "ABCMNO", + `${description} Composing text should be committed as-is` + ); + is( + editor.childNodes[0].data, + "ABCMNO", + `${description} First text node should have the committed string` + ); + })(); + + (function testUndoComposition() { + const description = "testUndoComposition: "; + synthesizeKey("Z", { accelKey: true }); + is( + editor.textContent, + "ABC", + `${description} Text should be undone (commit string should've gone)` + ); + is( + editor.childNodes[0].data, + "ABC", + `${description} First text node should have all text` + ); + })(); + + (function testUndoAgain() { + const description = "testUndoAgain: "; + synthesizeKey("Z", { accelKey: true, shiftKey: true }); + is( + editor.textContent, + "ABCMNO", + `${description} Text should be redone (commit string should've be back)` + ); + is( + editor.childNodes[0].data, + "ABCMNO", + `${description} First text node should have all text` + ); + })(); + + SimpleTest.finish(); +}); +</script> +</pre> +</body> +</html> |