summaryrefslogtreecommitdiffstats
path: root/editor/libeditor/tests/test_nsIEditor_outputToString.html
diff options
context:
space:
mode:
Diffstat (limited to 'editor/libeditor/tests/test_nsIEditor_outputToString.html')
-rw-r--r--editor/libeditor/tests/test_nsIEditor_outputToString.html135
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>