diff options
Diffstat (limited to '')
-rw-r--r-- | editor/libeditor/tests/test_nsIEditor_outputToString.html | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/editor/libeditor/tests/test_nsIEditor_outputToString.html b/editor/libeditor/tests/test_nsIEditor_outputToString.html new file mode 100644 index 0000000000..9d2e83245b --- /dev/null +++ b/editor/libeditor/tests/test_nsIEditor_outputToString.html @@ -0,0 +1,135 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset="utf-8"> + <title>Tests of nsIEditor#outputToString()</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" href="/tests/SimpleTest/test.css"/> + <script> + SimpleTest.waitForExplicitFinish(); + SimpleTest.waitForFocus(() => { + const originalBody = document.body.innerHTML; + const Ci = SpecialPowers.Ci; + + /** + * TODO: Add "text/html" cases and other `nsIDocumentEncoder.*` options. + */ + (function test_with_text_editor() { + for (const test of [ + { + tag: "input", + innerHTML: "<input>", + }, + { + tag: "textarea", + innerHTML: "<textarea></textarea>", + }, + ]) { + document.body.innerHTML = test.innerHTML; + const textControl = document.body.querySelector(test.tag); + const editor = SpecialPowers.wrap(textControl).editor; + is( + editor.outputToString("text/plain", Ci.nsIDocumentEncoder.OutputRaw), + "", + `outputToString("text/plain", OutputRaw) for <${test.tag}> should return empty string (before focused)` + ); + textControl.focus(); + is( + editor.outputToString("text/plain", Ci.nsIDocumentEncoder.OutputRaw), + "", + `outputToString("text/plain", OutputRaw) for <${test.tag}> should return empty string (after focused)` + ); + textControl.value = "abc"; + is( + editor.outputToString("text/plain", Ci.nsIDocumentEncoder.OutputRaw), + "abc", + `outputToString("text/plain", OutputRaw) for <${test.tag}> whose value is "abc" should return the value as-is` + ); + if (editor.flags & Ci.nsIEditor.eEditorSingleLineMask) { + continue; + } + textControl.value = "abc\ndef"; + is( + editor.outputToString("text/plain", Ci.nsIDocumentEncoder.OutputRaw).replace(/\r/g, ""), + "abc\ndef", + `outputToString("text/plain", OutputRaw) for <${test.tag}> whose value is "abc\ndef" should return the value as-is` + ); + textControl.value = "abc\ndef\n"; + is( + editor.outputToString("text/plain", Ci.nsIDocumentEncoder.OutputRaw).replace(/\r/g, ""), + "abc\ndef\n", + `outputToString("text/plain", OutputRaw) for <${test.tag}> whose value is "abc\ndef\n" should return the value as-is` + ); + textControl.value = "abc\ndef\n\n"; + is( + editor.outputToString("text/plain", Ci.nsIDocumentEncoder.OutputRaw).replace(/\r/g, ""), + "abc\ndef\n\n", + `outputToString("text/plain", OutputRaw) for <${test.tag}> whose value is "abc\ndef\n\n" should return the value as-is` + ); + } + })(); + + function getHTMLEditor() { + const editingSession = SpecialPowers.wrap(window).docShell.editingSession; + if (!editingSession) { + return null; + } + return editingSession.getEditorForWindow(window); + } + + (function test_with_contenteditable() { + document.body.setAttribute("contenteditable", ""); + document.body.blur(); + document.body.innerHTML = ""; + is( + getHTMLEditor().outputToString("text/plain", Ci.nsIDocumentEncoder.OutputRaw).replace(/\r/g, ""), + "", + `outputToString("text/plain", OutputRaw) for empty <body contenteditable> should return empty string (before focused)` + ); + document.body.focus(); + is( + getHTMLEditor().outputToString("text/plain", Ci.nsIDocumentEncoder.OutputRaw).replace(/\r/g, ""), + "", // Ignore the padding <br> element for empty editor. + `outputToString("text/plain", OutputRaw) for empty <body contenteditable> should return empty string (after focused)` + ); + const sourceHasParagraphsAndDivs = "<p>abc</p><p>def<br></p><div>ghi</div><div>jkl<br>mno<br></div>"; + document.body.innerHTML = sourceHasParagraphsAndDivs; + // XXX Oddly, an ASCII white-space is inserted at the head of the result. + todo_is( + getHTMLEditor().outputToString("text/plain", Ci.nsIDocumentEncoder.OutputRaw).replace(/\r/g, ""), + sourceHasParagraphsAndDivs.replace(/<br>/gi, "\n").replace(/<[^>]+>/g, ""), + `outputToString("text/plain", OutputRaw) for <body contenteditable> should return the expected string` + ); + + document.body.removeAttribute("contenteditable"); + document.body.innerHTML = "<div contenteditable></div>"; + is( + getHTMLEditor().outputToString("text/plain", Ci.nsIDocumentEncoder.OutputRaw).replace(/\r/g, ""), + "", + `outputToString("text/plain", OutputRaw) for empty <div contenteditable> should return empty string (before focused)` + ); + document.body.querySelector("div[contenteditable]").focus(); + is( + getHTMLEditor().outputToString("text/plain", Ci.nsIDocumentEncoder.OutputRaw).replace(/\r/g, ""), + "", // Ignore the padding <br> element for empty editor. + `outputToString("text/plain", OutputRaw) for empty <div contenteditable> should return empty string (after focused)` + ); + document.body.querySelector("div[contenteditable]").innerHTML = sourceHasParagraphsAndDivs; + is( + getHTMLEditor().outputToString("text/plain", Ci.nsIDocumentEncoder.OutputRaw).replace(/\r/g, ""), + sourceHasParagraphsAndDivs.replace(/<br>/gi, "\n").replace(/<[^>]+>/g, ""), + `outputToString("text/plain", OutputRaw) for <div contenteditable> should return the expected string` + ); + })(); + + document.body.innerHTML = originalBody; + SimpleTest.finish(); + }); + </script> +</head> +<body> +<p id="display"></p> +<div id="content" style="display: none"></div> +<pre id="test"></pre> +</body> +</html> |