tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>