test_plaintext_linebreak.html (5210B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <title>Test line breaks for plaintext serializer</title> 5 <script src="/tests/SimpleTest/SimpleTest.js"></script> 6 <script src="/tests/SimpleTest/EventUtils.js"></script> 7 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 8 </head> 9 <body> 10 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1650720">Mozilla Bug 1650720</a> 11 <p id="display"></p> 12 <div id="content" style="display: none"> 13 </div> 14 <pre id="preformatted"></pre> 15 <div id="container"></div> 16 <script> 17 18 const de = SpecialPowers.Ci.nsIDocumentEncoder; 19 const platformLineBreak = navigator.platform.indexOf("Win") == 0 ? "\r\n" : "\n"; 20 const CASES = [ 21 "\r", 22 "\n", 23 "\r\r", 24 "\r\n", 25 "\n\r", 26 "\n\n", 27 "\r\r\r", 28 "\r\r\n", 29 "\r\n\r", 30 "\r\n\n", 31 "\n\r\r", 32 "\n\r\n", 33 "\n\n\r", 34 "\n\n\n", 35 "\r \n", 36 "\n \r", 37 ]; 38 39 function convertLineBreaksForTestResult(aText) { 40 return aText.replace(/\r?\n|\r(?!\n)/g, platformLineBreak); 41 } 42 43 function convertLineBreaksForClipboardTestResult(aText) { 44 return aText.replace(/(?<!\r)\n/g, platformLineBreak); 45 } 46 47 function selectAndEncode(aElement, aEncoderFlags = 0) { 48 // Select the element. 49 const selection = window.getSelection(); 50 selection.removeAllRanges(); 51 selection.selectAllChildren(aElement); 52 53 const encoder = SpecialPowers.Cu.createHTMLCopyEncoder(); 54 encoder.init(document, "text/plain", de.OutputSelectionOnly | aEncoderFlags); 55 encoder.setSelection(selection); 56 return encoder.encodeToString(); 57 } 58 59 CASES.forEach((lineBreaks) => { 60 const text = `${lineBreaks}First${lineBreaks}Second${lineBreaks}`; 61 62 add_task(async function test_pre_text() { 63 info(`Testing line breaks: ${JSON.stringify(lineBreaks)}`); 64 65 const pre = document.getElementById("preformatted"); 66 pre.textContent = text; 67 68 is(selectAndEncode(pre), text.replace(/\r|\n/g, platformLineBreak), 69 `Encoded data for line breaks: ${JSON.stringify(lineBreaks)}`); 70 is(selectAndEncode(pre, de.OutputForPlainTextClipboardCopy), convertLineBreaksForClipboardTestResult(text), 71 `Encoded data for line breaks: ${JSON.stringify(lineBreaks)} (OutputForPlainTextClipboardCopy)`); 72 }); 73 74 add_task(async function test_pre_img_alt() { 75 info(`Testing line breaks: ${JSON.stringify(lineBreaks)}`); 76 77 const pre = document.getElementById("preformatted"); 78 const img = document.createElement("img"); 79 img.alt = text; 80 pre.replaceChildren(img); 81 82 is(selectAndEncode(pre), convertLineBreaksForTestResult(text), 83 `Encoded data for line breaks: ${JSON.stringify(lineBreaks)}`); 84 is(selectAndEncode(pre, de.OutputForPlainTextClipboardCopy), convertLineBreaksForClipboardTestResult(text), 85 `Encoded data for line breaks: ${JSON.stringify(lineBreaks)} (OutputForPlainTextClipboardCopy)`); 86 }); 87 88 add_task(async function test_pre_img_title() { 89 info(`Testing line breaks: ${JSON.stringify(lineBreaks)}`); 90 91 const pre = document.getElementById("preformatted"); 92 const img = document.createElement("img"); 93 img.title = text; 94 pre.replaceChildren(img); 95 96 is(selectAndEncode(pre), ` [${convertLineBreaksForTestResult(text)}] `, 97 `Encoded data for line breaks: ${JSON.stringify(lineBreaks)}`); 98 is(selectAndEncode(pre, de.OutputForPlainTextClipboardCopy), ` [${convertLineBreaksForClipboardTestResult(text)}] `, 99 `Encoded data for line breaks: ${JSON.stringify(lineBreaks)} (OutputForPlainTextClipboardCopy)`); 100 }); 101 102 add_task(async function test_div_text() { 103 info(`Testing line breaks: ${JSON.stringify(lineBreaks)}`); 104 105 const div = document.getElementById("container"); 106 div.textContent = text; 107 108 is(selectAndEncode(div), ` First Second `, 109 `Encoded data for line breaks: ${JSON.stringify(lineBreaks)}`); 110 is(selectAndEncode(div, de.OutputForPlainTextClipboardCopy), ` First Second `, 111 `Encoded data for line breaks: ${JSON.stringify(lineBreaks)} (OutputForPlainTextClipboardCopy)`); 112 }); 113 114 add_task(async function test_div_img_alt() { 115 info(`Testing line breaks: ${JSON.stringify(lineBreaks)}`); 116 117 const div = document.getElementById("container"); 118 const img = document.createElement("img"); 119 img.alt = text; 120 div.replaceChildren(img); 121 122 // Our plain text serializer keep the first CR/LF. 123 is(selectAndEncode(div), `${lineBreaks[0]}First Second `, 124 `Encoded data for line breaks: ${JSON.stringify(lineBreaks)}`); 125 is(selectAndEncode(div, de.OutputForPlainTextClipboardCopy), ` First Second `, 126 `Encoded data for line breaks: ${JSON.stringify(lineBreaks)} (OutputForPlainTextClipboardCopy)`); 127 }); 128 129 add_task(async function test_div_img_title() { 130 info(`Testing line breaks: ${JSON.stringify(lineBreaks)}`); 131 132 const div = document.getElementById("container"); 133 const img = document.createElement("img"); 134 img.title = text; 135 div.replaceChildren(img); 136 137 is(selectAndEncode(div), ` [ First Second ] `, 138 `Encoded data for line breaks: ${JSON.stringify(lineBreaks)}`); 139 is(selectAndEncode(div, de.OutputForPlainTextClipboardCopy), ` [ First Second ] `, 140 `Encoded data for line breaks: ${JSON.stringify(lineBreaks)} (OutputForPlainTextClipboardCopy)`); 141 }); 142 }); 143 144 </script> 145 </body> 146 </html>