tor-browser

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

insertparagraph-in-child-of-html.tentative.html (15611B)


      1 <!doctype html>
      2 <html><head>
      3 <meta chareset="utf-8">
      4 <meta name="timeout" content="long">
      5 <meta name="variant" content="?designMode=off&white-space=normal">
      6 <meta name="variant" content="?designMode=off&white-space=pre">
      7 <meta name="variant" content="?designMode=off&white-space=pre-line">
      8 <meta name="variant" content="?designMode=off&white-space=pre-wrap">
      9 <meta name="variant" content="?designMode=on&white-space=normal">
     10 <meta name="variant" content="?designMode=on&white-space=pre">
     11 <meta name="variant" content="?designMode=on&white-space=pre-line">
     12 <meta name="variant" content="?designMode=on&white-space=pre-wrap">
     13 <title>Insert paragraph in a child of the html element</title>
     14 <script src="/resources/testharness.js"></script>
     15 <script src="/resources/testharnessreport.js"></script>
     16 <script src="/resources/testdriver.js"></script>
     17 <script src="/resources/testdriver-vendor.js"></script>
     18 <script src="/resources/testdriver-actions.js"></script>
     19 <script src="../include/editor-test-utils.js"></script>
     20 </head><body>
     21 <iframe srcdoc=""></iframe>
     22 <script>
     23 "use strict";
     24 
     25 const searchParams = new URLSearchParams(document.location.search);
     26 const whiteSpace = searchParams.get("white-space");
     27 const testingDesignMode = searchParams.get("designMode") == "on";
     28 
     29 const isPreformatted =
     30  whiteSpace == "pre" || whiteSpace == "pre-line" || whiteSpace == "pre-wrap";
     31 
     32 const iframe = document.querySelector("iframe");
     33 const minimumSrcDoc =
     34  "<html>" +
     35    "<head>" +
     36      "<title>iframe</title>" +
     37      "<script src='/resources/testdriver.js'></" + "script>" +
     38      "<script src='/resources/testdriver-vendor.js'></" + "script>" +
     39      "<script src='/resources/testdriver-actions.js'></" + "script>" +
     40    "</head>" +
     41    "<body><br></body>" +
     42  "</html>";
     43 
     44 async function initializeAndWaitForLoad(iframeElement, srcDocValue) {
     45  const waitForLoad =
     46    new Promise(
     47      resolve => iframeElement.addEventListener("load", resolve, {once: true})
     48    );
     49  iframeElement.srcdoc = srcDocValue;
     50  await waitForLoad;
     51  if (testingDesignMode) {
     52    iframeElement.contentDocument.designMode = "on";
     53  } else {
     54    iframeElement.contentDocument.documentElement.setAttribute("contenteditable", "");
     55  }
     56  iframeElement.contentWindow.focus();
     57  iframeElement.contentDocument.execCommand("defaultParagraphSeparator", false, "div");
     58 }
     59 
     60 function removeResourceScriptElements(node) {
     61  node.querySelectorAll("script").forEach(
     62    element => {
     63      if (element.getAttribute("src")?.startsWith("/resources")) {
     64        element.remove()
     65      }
     66    }
     67  );
     68 }
     69 
     70 // DO NOT USE multi-line comment in this file, then, you can comment out
     71 // unnecessary tests when you need to attach the browser with a debugger.
     72 
     73 // For backward compatibility, <div> elements outside <body> should be split
     74 // by insertParagraph.  However, should not unwrap existing <div> in any case
     75 // to avoid its child to become children of the <html>.
     76 promise_test(async () => {
     77  await initializeAndWaitForLoad(iframe, minimumSrcDoc);
     78  const childDoc = iframe.contentDocument;
     79  const div = childDoc.createElement("div");
     80  div.setAttribute("style", `white-space:${whiteSpace}`);
     81  childDoc.documentElement.appendChild(div);
     82  const utils = new EditorTestUtils(div);
     83  utils.setupEditingHost("{}");
     84  await utils.sendEnterKey();
     85  removeResourceScriptElements(childDoc);
     86 
     87  if (!isPreformatted) {
     88    assert_equals(
     89      childDoc.documentElement.innerHTML,
     90      `<head><title>iframe</title></head><body><br></body><div style="white-space:${whiteSpace}"><br></div><div style="white-space:${whiteSpace}"><br></div>`,
     91      "The <div> should be split"
     92    );
     93  } else {
     94    assert_in_array(
     95      childDoc.documentElement.innerHTML,
     96      [
     97        `<head><title>iframe</title></head><body><br></body><div style="white-space:${whiteSpace}">\n</div><div style="white-space:${whiteSpace}">\n</div>`,
     98        `<head><title>iframe</title></head><body><br></body><div style="white-space:${whiteSpace}"><br></div><div style="white-space:${whiteSpace}"><br></div>`,
     99      ],
    100      "The <div> should be split"
    101    );
    102  }
    103 }, `insertParagraph in empty <div style="white-space:${
    104  whiteSpace
    105 }"> after <body> should split the <div>`);
    106 
    107 promise_test(async () => {
    108  await initializeAndWaitForLoad(iframe, minimumSrcDoc);
    109  const childDoc = iframe.contentDocument;
    110  const div = childDoc.createElement("div");
    111  div.setAttribute("style", `white-space:${whiteSpace}`);
    112  childDoc.documentElement.appendChild(div);
    113  const utils = new EditorTestUtils(div);
    114  utils.setupEditingHost("{}<br>");
    115  await utils.sendEnterKey();
    116  removeResourceScriptElements(childDoc);
    117 
    118  if (!isPreformatted) {
    119    assert_equals(
    120      childDoc.documentElement.innerHTML,
    121      `<head><title>iframe</title></head><body><br></body><div style="white-space:${whiteSpace}"><br></div><div style="white-space:${whiteSpace}"><br></div>`,
    122      "The <div> should be split"
    123    );
    124  } else {
    125    assert_in_array(
    126      childDoc.documentElement.innerHTML,
    127      [
    128        `<head><title>iframe</title></head><body><br></body><div style="white-space:${whiteSpace}">\n</div><div style="white-space:${whiteSpace}">\n</div>`,
    129        `<head><title>iframe</title></head><body><br></body><div style="white-space:${whiteSpace}"><br></div><div style="white-space:${whiteSpace}">\n</div>`,
    130        `<head><title>iframe</title></head><body><br></body><div style="white-space:${whiteSpace}">\n</div><div style="white-space:${whiteSpace}"><br></div>`,
    131        `<head><title>iframe</title></head><body><br></body><div style="white-space:${whiteSpace}"><br></div><div style="white-space:${whiteSpace}"><br></div>`,
    132      ],
    133      "The <div> should be split"
    134    );
    135  }
    136 }, `insertParagraph in <div style="white-space:${
    137  whiteSpace
    138 }"> (containing only a <br>) after <body> should split the <div>`);
    139 
    140 promise_test(async () => {
    141  await initializeAndWaitForLoad(iframe, minimumSrcDoc);
    142  const childDoc = iframe.contentDocument;
    143  const div = childDoc.createElement("div");
    144  div.setAttribute("style", `white-space:${whiteSpace}`);
    145  childDoc.documentElement.appendChild(div);
    146  const utils = new EditorTestUtils(div);
    147  utils.setupEditingHost("ab[]cd");
    148  await utils.sendEnterKey();
    149  removeResourceScriptElements(childDoc);
    150 
    151  assert_in_array(
    152    childDoc.documentElement.innerHTML,
    153    [
    154      `<head><title>iframe</title></head><body><br></body><div style="white-space:${whiteSpace}">ab</div><div style="white-space:${whiteSpace}">cd</div>`,
    155      `<head><title>iframe</title></head><body><br></body><div style="white-space:${whiteSpace}">ab<br></div><div style="white-space:${whiteSpace}">cd</div>`,
    156      `<head><title>iframe</title></head><body><br></body><div style="white-space:${whiteSpace}">ab</div><div style="white-space:${whiteSpace}">cd<br></div>`,
    157      `<head><title>iframe</title></head><body><br></body><div style="white-space:${whiteSpace}">ab<br></div><div style="white-space:${whiteSpace}">cd<br></div>`,
    158    ],
    159    "The <div> should be split"
    160  );
    161 }, `insertParagraph in <div style="white-space:${
    162  whiteSpace
    163 }"> (containing text) after <body> should not create another <div> element`);
    164 
    165 promise_test(async () => {
    166  await initializeAndWaitForLoad(iframe, minimumSrcDoc);
    167  const childDoc = iframe.contentDocument;
    168  const div = childDoc.createElement("div");
    169  div.setAttribute("style", `white-space:${whiteSpace}`);
    170  childDoc.documentElement.insertBefore(div, childDoc.body);
    171  const utils = new EditorTestUtils(div);
    172  utils.setupEditingHost("{}");
    173  await utils.sendEnterKey();
    174  removeResourceScriptElements(childDoc);
    175 
    176  if (!isPreformatted) {
    177    assert_equals(
    178      childDoc.documentElement.innerHTML,
    179      `<head><title>iframe</title></head><div style="white-space:${whiteSpace}"><br></div><div style="white-space:${whiteSpace}"><br></div><body><br></body>`,
    180      "The <div> should be split"
    181    );
    182  } else {
    183    assert_in_array(
    184      childDoc.documentElement.innerHTML,
    185      [
    186        `<head><title>iframe</title></head><div style="white-space:${whiteSpace}">\n</div><div style="white-space:${whiteSpace}">\n</div><body><br></body>`,
    187        `<head><title>iframe</title></head><div style="white-space:${whiteSpace}"><br></div><div style="white-space:${whiteSpace}"><br></div><body><br></body>`,
    188      ],
    189      "The <div> should be split"
    190    );
    191  }
    192 }, `insertParagraph in empty <div style="white-space:${
    193  whiteSpace
    194 }"> before <body> should split the <div>`);
    195 
    196 promise_test(async () => {
    197  await initializeAndWaitForLoad(iframe, minimumSrcDoc);
    198  const childDoc = iframe.contentDocument;
    199  const div = childDoc.createElement("div");
    200  div.setAttribute("style", `white-space:${whiteSpace}`);
    201  childDoc.documentElement.insertBefore(div, childDoc.body);
    202  const utils = new EditorTestUtils(div);
    203  utils.setupEditingHost("{}<br>");
    204  await utils.sendEnterKey();
    205  removeResourceScriptElements(childDoc);
    206 
    207  if (!isPreformatted) {
    208    assert_equals(
    209      childDoc.documentElement.innerHTML,
    210      `<head><title>iframe</title></head><div style="white-space:${whiteSpace}"><br></div><div style="white-space:${whiteSpace}"><br></div><body><br></body>`,
    211      "The <div> should be split"
    212    );
    213  } else {
    214    assert_in_array(
    215      childDoc.documentElement.innerHTML,
    216      [
    217        `<head><title>iframe</title></head><div style="white-space:${whiteSpace}">\n</div><div style="white-space:${whiteSpace}">\n</div><body><br></body>`,
    218        `<head><title>iframe</title></head><div style="white-space:${whiteSpace}"><br></div><div style="white-space:${whiteSpace}">\n</div><body><br></body>`,
    219        `<head><title>iframe</title></head><div style="white-space:${whiteSpace}">\n</div><div style="white-space:${whiteSpace}"><br></div><body><br></body>`,
    220        `<head><title>iframe</title></head><div style="white-space:${whiteSpace}"><br></div><div style="white-space:${whiteSpace}"><br></div><body><br></body>`,
    221      ],
    222      "The <div> should be split"
    223    );
    224  }
    225 }, `insertParagraph in <div style="white-space:${
    226  whiteSpace
    227 }"> (containing only a <br>) before <body> should split the <div>`);
    228 
    229 promise_test(async () => {
    230  await initializeAndWaitForLoad(iframe, minimumSrcDoc);
    231  const childDoc = iframe.contentDocument;
    232  const div = childDoc.createElement("div");
    233  div.setAttribute("style", `white-space:${whiteSpace}`);
    234  childDoc.documentElement.insertBefore(div, childDoc.body);
    235  const utils = new EditorTestUtils(div);
    236  utils.setupEditingHost("ab[]cd");
    237  await utils.sendEnterKey();
    238  removeResourceScriptElements(childDoc);
    239 
    240  assert_in_array(
    241    childDoc.documentElement.innerHTML,
    242    [
    243      `<head><title>iframe</title></head><div style="white-space:${whiteSpace}">ab</div><div style="white-space:${whiteSpace}">cd</div><body><br></body>`,
    244      `<head><title>iframe</title></head><div style="white-space:${whiteSpace}">ab<br></div><div style="white-space:${whiteSpace}">cd</div><body><br></body>`,
    245      `<head><title>iframe</title></head><div style="white-space:${whiteSpace}">ab</div><div style="white-space:${whiteSpace}">cd<br></div><body><br></body>`,
    246      `<head><title>iframe</title></head><div style="white-space:${whiteSpace}">ab<br></div><div style="white-space:${whiteSpace}">cd<br></div><body><br></body>`,
    247    ],
    248    "The <div> should be split"
    249  );
    250 }, `insertParagraph in <div style="white-space:${
    251  whiteSpace
    252 }"> (containing text) before <body> should split the <div>`);
    253 
    254 promise_test(async () => {
    255  await initializeAndWaitForLoad(iframe, minimumSrcDoc);
    256  const childDoc = iframe.contentDocument;
    257  const div = document.createElement("div");
    258  div.setAttribute("style", `white-space:${whiteSpace}`);
    259  childDoc.documentElement.insertBefore(div, childDoc.head);
    260  const utils = new EditorTestUtils(div);
    261  utils.setupEditingHost("{}");
    262  await utils.sendEnterKey();
    263  removeResourceScriptElements(childDoc);
    264 
    265  if (!isPreformatted) {
    266    assert_equals(
    267      childDoc.documentElement.innerHTML,
    268      `<div style="white-space:${whiteSpace}"><br></div><div style="white-space:${whiteSpace}"><br></div><head><title>iframe</title></head><body><br></body>`,
    269      "The <div> should be split"
    270    );
    271  } else {
    272    assert_in_array(
    273      childDoc.documentElement.innerHTML,
    274      [
    275        `<div style="white-space:${whiteSpace}">\n</div><div style="white-space:${whiteSpace}">\n</div><head><title>iframe</title></head><body><br></body>`,
    276        `<div style="white-space:${whiteSpace}"><br></div><div style="white-space:${whiteSpace}"><br></div><head><title>iframe</title></head><body><br></body>`,
    277      ],
    278      "The <div> should be split"
    279    );
    280  }
    281 }, `insertParagraph in empty <div style="white-space:${
    282  whiteSpace
    283 }"> before <head> should split the <div>`);
    284 
    285 promise_test(async () => {
    286  await initializeAndWaitForLoad(iframe, minimumSrcDoc);
    287  const childDoc = iframe.contentDocument;
    288  const div = childDoc.createElement("div");
    289  div.setAttribute("style", `white-space:${whiteSpace}`);
    290  childDoc.documentElement.insertBefore(div, childDoc.head);
    291  const utils = new EditorTestUtils(div);
    292  utils.setupEditingHost("{}<br>");
    293  await utils.sendEnterKey();
    294  removeResourceScriptElements(childDoc);
    295 
    296  if (!isPreformatted) {
    297    assert_equals(
    298      childDoc.documentElement.innerHTML,
    299      `<div style="white-space:${whiteSpace}"><br></div><div style="white-space:${whiteSpace}"><br></div><head><title>iframe</title></head><body><br></body>`,
    300      "The <div> should be split"
    301    );
    302  } else {
    303    assert_in_array(
    304      childDoc.documentElement.innerHTML,
    305      [
    306        `<div style="white-space:${whiteSpace}">\n</div><div style="white-space:${whiteSpace}">\n</div><head><title>iframe</title></head><body><br></body>`,
    307        `<div style="white-space:${whiteSpace}"><br></div><div style="white-space:${whiteSpace}">\n</div><head><title>iframe</title></head><body><br></body>`,
    308        `<div style="white-space:${whiteSpace}">\n</div><div style="white-space:${whiteSpace}"><br></div><head><title>iframe</title></head><body><br></body>`,
    309        `<div style="white-space:${whiteSpace}"><br></div><div style="white-space:${whiteSpace}"><br></div><head><title>iframe</title></head><body><br></body>`,
    310      ],
    311      "The <div> should be split"
    312    );
    313  }
    314 }, `insertParagraph in <div style="white-space:${
    315  whiteSpace
    316 }"> (containing only a <br>) before <head> should split the <div>`);
    317 
    318 promise_test(async () => {
    319  await initializeAndWaitForLoad(iframe, minimumSrcDoc);
    320  const childDoc = iframe.contentDocument;
    321  const div = childDoc.createElement("div");
    322  div.setAttribute("style", `white-space:${whiteSpace}`);
    323  childDoc.documentElement.insertBefore(div, childDoc.head);
    324  const utils = new EditorTestUtils(div);
    325  utils.setupEditingHost("ab[]cd");
    326  await utils.sendEnterKey();
    327  removeResourceScriptElements(childDoc);
    328 
    329  assert_in_array(
    330    childDoc.documentElement.innerHTML,
    331    [
    332      `<div style="white-space:${whiteSpace}">ab</div><div style="white-space:${whiteSpace}">cd</div><head><title>iframe</title></head><body><br></body>`,
    333      `<div style="white-space:${whiteSpace}">ab<br></div><div style="white-space:${whiteSpace}">cd</div><head><title>iframe</title></head><body><br></body>`,
    334      `<div style="white-space:${whiteSpace}">ab</div><div style="white-space:${whiteSpace}">cd<br></div><head><title>iframe</title></head><body><br></body>`,
    335      `<div style="white-space:${whiteSpace}">ab<br></div><div style="white-space:${whiteSpace}">cd<br></div><head><title>iframe</title></head><body><br></body>`,
    336    ],
    337    "The <div> should be split"
    338  );
    339 }, `insertParagraph in <div style="white-space:${
    340  whiteSpace
    341 }"> (containing text) before <head> should split the <div>`);
    342 
    343 </script>
    344 </body></html>