tor-browser

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

typing-around-link-element-at-collapsed-selection.tentative.html (28096B)


      1 <!doctype html>
      2 <html>
      3 <head>
      4 <meta charset="utf-8">
      5 <meta name="timeout" content="long">
      6 <meta name="variant" content="?target=ContentEditable">
      7 <meta name="variant" content="?target=ContentEditable&parent=b">
      8 <meta name="variant" content="?target=ContentEditable&child=b">
      9 <meta name="variant" content="?target=ContentEditable&parent=b&child=i">
     10 <meta name="variant" content="?target=DesignMode">
     11 <meta name="variant" content="?target=DesignMode&parent=b">
     12 <meta name="variant" content="?target=DesignMode&child=b">
     13 <meta name="variant" content="?target=DesignMode&parent=b&child=i">
     14 <title>Testing inserting content around link element</title>
     15 <script src="/resources/testharness.js"></script>
     16 <script src="/resources/testharnessreport.js"></script>
     17 <script src="/resources/testdriver.js"></script>
     18 <script src="/resources/testdriver-vendor.js"></script>
     19 <script src="/resources/testdriver-actions.js"></script>
     20 <script src="../include/editor-test-utils.js"></script>
     21 <style>
     22 .bold {
     23  font-weight: bold;
     24 }
     25 </style>
     26 </head>
     27 <body>
     28 <div contenteditable></div>
     29 <iframe srcdoc="
     30  <!doctype html>
     31  <html>
     32    <script>document.designMode='on';</script>
     33    <script src='/resources/testdriver.js'></script>
     34    <script src='/resources/testdriver-vendor.js'></script>
     35    <script src='/resources/testdriver-actions.js'></script>
     36    <body></body>
     37  </html>"></iframe>
     38 <script>
     39 "use strict";
     40 
     41 const params = new URLSearchParams(location.search.substring(1));
     42 const kTarget = params.get("target");
     43 const kParentTag = params.get("parent") === null
     44  ? ["", ""]
     45  : [`<${params.get("parent")}>`, `</${params.get("parent")}>`];
     46 const kChildTag = params.get("child") === null
     47  ? ["", ""]
     48  : [`<${params.get("child")}>`, `</${params.get("child")}>`];
     49 const kLinkDesc = (() => {
     50  let result = ""
     51  if (kParentTag[0] !== "") {
     52    result += `in ${kParentTag[0]} `;
     53    if (kChildTag[0] !== "") {
     54      result += "and ";
     55    }
     56  }
     57  if (kChildTag[0] !== "") {
     58    result += `containing ${kChildTag[0]} `;
     59  }
     60  return result;
     61 })();
     62 const kNewContainerOfLink = (() => {
     63  if (kParentTag !== "" && kChildTag !== "") {
     64    return [`${kParentTag[0]}${kChildTag[0]}`, `${kChildTag[1]}${kParentTag[1]}`];
     65  }
     66  if (kParentTag !== "") {
     67    return kParentTag;
     68  }
     69  if (kChildTag !== "") {
     70    return kChildTag;
     71  }
     72  return ["", ""];
     73 })();
     74 const kSelectorForTextNodeContainer = kChildTag[0] === ""
     75  ? "a"
     76  : `a > ${kChildTag[0].substr(1, kChildTag[0].length - 2)}`;
     77 
     78 function getEditingHost() {
     79  return kTarget === "ContentEditable"
     80    ? document.querySelector("div[contenteditable]")
     81    : document.querySelector("iframe").contentDocument.body;
     82 }
     83 
     84 function addPromiseTest(test) {
     85  promise_test(async () => {
     86    let editingHost = getEditingHost();
     87    let utils = new EditorTestUtils(editingHost);
     88    utils.setupEditingHost(test.innerHTML);
     89    utils.window.focus();
     90    utils.document.body.focus();
     91    editingHost.focus();
     92    await test.run(utils);
     93    if (Array.isArray(test.expectedResult)) {
     94      assert_in_array(editingHost.innerHTML, test.expectedResult);
     95    } else {
     96      assert_equals(editingHost.innerHTML, test.expectedResult);
     97    }
     98  }, `${test.description.trim()} in ${test.innerHTML}`);
     99 }
    100 
    101 promise_test(async () => {
    102  await new Promise(resolve => {
    103    addEventListener("load", resolve, { once: true });
    104  });
    105 }, "");
    106 
    107 if (kChildTag[0] === "") {
    108  // Immediately after creating a link with Document.execCommand.
    109 
    110  addPromiseTest({
    111    description: `Replacing text in a link ${kLinkDesc}with "XY"`,
    112    innerHTML: `<p>${kParentTag[0]}[abc]${kParentTag[1]}</p>`,
    113    run: async (utils) => {
    114      utils.document.execCommand("createLink", false, "about:blank");
    115      await utils.sendKey("X", utils.kShiftKey);
    116      await utils.sendKey("Y", utils.kShiftKey);
    117    },
    118    expectedResult: [
    119      `<p>${kParentTag[0]}<a href="about:blank">XY${kParentTag[1]}</a></p>`,
    120      `<p>${kParentTag[0]}<a href="about:blank">XY${kParentTag[1]}</a><br></p>`,
    121    ],
    122  });
    123 
    124  addPromiseTest({
    125    description: `Inserting "XY" after making a link ${kLinkDesc}(following Selection.collapseToEnd)`,
    126    innerHTML: `<p>${kParentTag[0]}[abc]${kParentTag[1]}</p>`,
    127    run: async (utils) => {
    128      utils.document.execCommand("createLink", false, "about:blank");
    129      utils.selection.collapseToEnd();
    130      await utils.sendKey("X", utils.kShiftKey);
    131      await utils.sendKey("Y", utils.kShiftKey);
    132    },
    133    expectedResult: [
    134      `<p>${kParentTag[0]}<a href="about:blank">abc</a>XY${kParentTag[1]}</p>`,
    135      `<p>${kParentTag[0]}<a href="about:blank">abc</a>XY${kParentTag[1]}<br></p>`,
    136    ],
    137  });
    138 
    139  addPromiseTest({
    140    description: `Inserting "XY" after making a link ${kLinkDesc}(following ArrowRight key press)`,
    141    innerHTML: `<p>${kParentTag[0]}[abc]${kParentTag[1]}</p>`,
    142    run: async (utils) => {
    143      utils.document.execCommand("createLink", false, "about:blank");
    144      await utils.sendArrowRightKey();
    145      await utils.sendKey("X", utils.kShiftKey);
    146      await utils.sendKey("Y", utils.kShiftKey);
    147    },
    148    expectedResult: [
    149      `<p>${kParentTag[0]}<a href="about:blank">abc</a>XY${kParentTag[1]}</p>`,
    150      `<p>${kParentTag[0]}<a href="about:blank">abc</a>XY${kParentTag[1]}<br></p>`,
    151    ],
    152  });
    153 
    154  addPromiseTest({
    155    description: `Inserting "XY" after making a link ${kLinkDesc}(following End key press)`,
    156    innerHTML: `<p>${kParentTag[0]}[abc]${kParentTag[1]}</p>`,
    157    run: async (utils) => {
    158      utils.document.execCommand("createLink", false, "about:blank");
    159      if (!navigator.platform.includes("Mac")) {
    160        await utils.sendEndKey();
    161      } else {
    162        await utils.sendArrowRightKey(utils.kMetaKey);
    163      }
    164      await utils.sendKey("X", utils.kShiftKey);
    165      await utils.sendKey("Y", utils.kShiftKey);
    166    },
    167    expectedResult: [
    168      `<p>${kParentTag[0]}<a href="about:blank">abc</a>XY${kParentTag[1]}</p>`,
    169      `<p>${kParentTag[0]}<a href="about:blank">abc</a>XY${kParentTag[1]}<br></p>`,
    170    ],
    171  });
    172 
    173  addPromiseTest({
    174    description: `Inserting "XY" after making a link ${kLinkDesc}(following Selection.collapseToStart)`,
    175    innerHTML: `<p>${kParentTag[0]}[abc]${kParentTag[1]}</p>`,
    176    run: async (utils) => {
    177      utils.document.execCommand("createLink", false, "about:blank");
    178      utils.selection.collapseToStart();
    179      await utils.sendKey("X", utils.kShiftKey);
    180      await utils.sendKey("Y", utils.kShiftKey);
    181    },
    182    expectedResult: [
    183      `<p>${kParentTag[0]}XY<a href="about:blank">abc</a>${kParentTag[1]}</p>`,
    184      `<p>${kParentTag[0]}XY<a href="about:blank">abc</a>${kParentTag[1]}<br></p>`,
    185    ],
    186  });
    187 
    188  addPromiseTest({
    189    description: `Inserting "XY" after making a link ${kLinkDesc}(following ArrowLeft key press)`,
    190    innerHTML: `<p>${kParentTag[0]}[abc]${kParentTag[1]}</p>`,
    191    run: async (utils) => {
    192      utils.document.execCommand("createLink", false, "about:blank");
    193      await utils.sendArrowLeftKey();
    194      await utils.sendKey("X", utils.kShiftKey);
    195      await utils.sendKey("Y", utils.kShiftKey);
    196    },
    197    expectedResult: [
    198      `<p>${kParentTag[0]}XY<a href="about:blank">abc</a>${kParentTag[1]}</p>`,
    199      `<p>${kParentTag[0]}XY<a href="about:blank">abc</a>${kParentTag[1]}<br></p>`,
    200    ],
    201  });
    202 
    203  addPromiseTest({
    204    description: `Inserting "XY" after making a link ${kLinkDesc}(following Home key press)`,
    205    innerHTML: `<p>${kParentTag[0]}[abc]${kParentTag[1]}</p>`,
    206    run: async (utils) => {
    207      utils.document.execCommand("createLink", false, "about:blank");
    208      if (!navigator.platform.includes("Mac")) {
    209        await utils.sendHomeKey();
    210      } else {
    211        await utils.sendArrowLeftKey(utils.kMetaKey);
    212      }
    213      await utils.sendKey("X", utils.kShiftKey);
    214      await utils.sendKey("Y", utils.kShiftKey);
    215    },
    216    expectedResult: [
    217      `<p>${kParentTag[0]}XY<a href="about:blank">abc</a>${kParentTag[1]}</p>`,
    218      `<p>${kParentTag[0]}XY<a href="about:blank">abc</a>${kParentTag[1]}<br></p>`,
    219    ],
    220  });
    221 }
    222 
    223 addPromiseTest({
    224  description: `Inserting "XY" after setting caret position to middle of a link ${kLinkDesc}(Selection.collapse)`,
    225  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}[]abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    226  run: async (utils) => {
    227    utils.selection.collapse(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, 2);
    228    await utils.sendKey("X", utils.kShiftKey);
    229    await utils.sendKey("Y", utils.kShiftKey);
    230  },
    231  expectedResult: [
    232    `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abXYc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    233    `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abXYc${kChildTag[1]}</a>${kParentTag[1]}<br></p>`,
    234  ],
    235 });
    236 
    237 addPromiseTest({
    238  description: `Inserting "XY" after setting caret position to middle of a link ${kLinkDesc}(Selection.addRange)`,
    239  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}[]abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    240  run: async (utils) => {
    241    utils.selection.removeAllRanges();
    242    let range = utils.document.createRange();
    243    range.setStart(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, 2);
    244    utils.selection.addRange(range);
    245    await utils.sendKey("X", utils.kShiftKey);
    246    await utils.sendKey("Y", utils.kShiftKey);
    247  },
    248  expectedResult: [
    249    `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abXYc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    250    `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abXYc${kChildTag[1]}</a>${kParentTag[1]}<br></p>`,
    251  ],
    252 });
    253 
    254 addPromiseTest({
    255  description: `Inserting "XY" after setting caret position to start of a link ${kLinkDesc}(Selection.collapse)`,
    256  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}ab[]c${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    257  run: async (utils) => {
    258    utils.selection.collapse(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, 0);
    259    await utils.sendKey("X", utils.kShiftKey);
    260    await utils.sendKey("Y", utils.kShiftKey);
    261  },
    262  expectedResult: [
    263    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
    264    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[2]}<br></p>`,
    265  ],
    266 });
    267 
    268 addPromiseTest({
    269  description: `Inserting "XY" after setting caret position to start of a link ${kLinkDesc}(Selection.addRange)`,
    270  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}ab[]c${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    271  run: async (utils) => {
    272  utils.selection.removeAllRanges();
    273  let range = utils.document.createRange();
    274  range.setStart(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, 0);
    275  utils.selection.addRange(range);
    276    await utils.sendKey("X", utils.kShiftKey);
    277    await utils.sendKey("Y", utils.kShiftKey);
    278  },
    279  expectedResult: [
    280    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
    281    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[2]}<br></p>`,
    282  ],
    283 });
    284 
    285 addPromiseTest({
    286  description: `Inserting "XY" after setting caret position to end of a link ${kLinkDesc}(Selection.collapse)`,
    287  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}ab[]c${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    288  run: async (utils) => {
    289    utils.selection.collapse(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, "abc".length);
    290    await utils.sendKey("X", utils.kShiftKey);
    291    await utils.sendKey("Y", utils.kShiftKey);
    292  },
    293  expectedResult: [
    294    `<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
    295    `<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[2]}<br></p>`,
    296  ],
    297 });
    298 
    299 addPromiseTest({
    300  description: `Inserting "XY" after setting caret position to end of a link ${kLinkDesc}(Selection.addRange)`,
    301  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}ab[]c${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    302  run: async (utils) => {
    303    utils.selection.collapse(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, "abc".length);
    304    await utils.sendKey("X", utils.kShiftKey);
    305    await utils.sendKey("Y", utils.kShiftKey);
    306  },
    307  expectedResult: [
    308    `<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
    309    `<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[2]}<br></p>`,
    310  ],
    311 });
    312 
    313 // Type text after moving caret with Range API.
    314 addPromiseTest({
    315  description: `Inserting "XY" after modifying caret position to middle of a link ${kLinkDesc}`,
    316  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}[]abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    317  run: async (utils) => {
    318    let range = utils.selection.getRangeAt(0);
    319    range.setStart(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, 2);
    320    await utils.sendKey("X", utils.kShiftKey);
    321    await utils.sendKey("Y", utils.kShiftKey);
    322  },
    323  expectedResult: [
    324    `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abXYc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    325    `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abXYc${kChildTag[1]}</a>${kParentTag[1]}<br></p>`,
    326  ],
    327 });
    328 
    329 addPromiseTest({
    330  description: `Inserting "XY" after modifying caret position to start of a link ${kLinkDesc}`,
    331  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}ab[]c${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    332  run: async (utils) => {
    333    let range = utils.selection.getRangeAt(0);
    334    range.setStart(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, 0);
    335    range.setEnd(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, 0);
    336    await utils.sendKey("X", utils.kShiftKey);
    337    await utils.sendKey("Y", utils.kShiftKey);
    338  },
    339  expectedResult: [
    340    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
    341    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}<br></p>`,
    342  ],
    343 });
    344 
    345 addPromiseTest({
    346  description: `Inserting "XY" after modifying caret position to end of a link ${kLinkDesc}`,
    347  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}ab[]c${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    348  run: async (utils) => {
    349    let range = utils.selection.getRangeAt(0);
    350    range.setStart(utils.editingHost.querySelector(kSelectorForTextNodeContainer).firstChild, "abc".length);
    351    await utils.sendKey("X", utils.kShiftKey);
    352    await utils.sendKey("Y", utils.kShiftKey);
    353  },
    354  expectedResult: [
    355    `<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
    356    `<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
    357  ],
    358 });
    359 
    360 // Type text after deleting character immediately before/after a link.
    361 addPromiseTest({
    362  description: `Inserting "XY" after deleting following character of a link ${kLinkDesc}(Backspace)`,
    363  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abc${kChildTag[1]}</a>d[]${kParentTag[1]}</p>`,
    364  run: async (utils) => {
    365    await utils.sendBackspaceKey();
    366    await utils.sendKey("X", utils.kShiftKey);
    367    await utils.sendKey("Y", utils.kShiftKey);
    368  },
    369  expectedResult: [
    370    `<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
    371    `<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
    372  ],
    373 });
    374 
    375 addPromiseTest({
    376  description: `Inserting "XY" after deleting following character of a link ${kLinkDesc}(execCommand("delete"))`,
    377  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abc${kChildTag[1]}</a>d[]${kParentTag[1]}</p>`,
    378  run: async (utils) => {
    379    await utils.document.execCommand("delete", false);
    380    await utils.sendKey("X", utils.kShiftKey);
    381    await utils.sendKey("Y", utils.kShiftKey);
    382  },
    383  expectedResult: [
    384    `<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
    385    `<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
    386  ],
    387 });
    388 
    389 addPromiseTest({
    390  description: `Inserting "XY" after deleting a previous character of a link ${kLinkDesc}(Delete)`,
    391  innerHTML: `<p>${kParentTag[0]}[]z<a href="about:blank">${kChildTag[0]}abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    392  run: async (utils) => {
    393    await utils.sendDeleteKey();
    394    await utils.sendKey("X", utils.kShiftKey);
    395    await utils.sendKey("Y", utils.kShiftKey);
    396  },
    397  expectedResult: [
    398    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
    399    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}<br></p>`,
    400  ],
    401 });
    402 
    403 addPromiseTest({
    404  description: `Inserting "XY" after deleting a previous character of a link ${kLinkDesc}(execCommand("forwarddelete"))`,
    405  innerHTML: `<p>${kParentTag[0]}[]z<a href="about:blank">${kChildTag[0]}abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    406  run: async (utils) => {
    407    await utils.document.execCommand("forwarddelete", false);
    408    await utils.sendKey("X", utils.kShiftKey);
    409    await utils.sendKey("Y", utils.kShiftKey);
    410  },
    411  expectedResult: [
    412    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
    413    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}<br></p>`,
    414  ],
    415 });
    416 
    417 // Type text after deleting the last character in a link.
    418 addPromiseTest({
    419  description: `Inserting "XY" after deleting last character of a link ${kLinkDesc}(Backspace)`,
    420  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abcd[]${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    421  run: async (utils) => {
    422    await utils.sendBackspaceKey();
    423    await utils.sendKey("X", utils.kShiftKey);
    424    await utils.sendKey("Y", utils.kShiftKey);
    425  },
    426  expectedResult: [
    427    `<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
    428    `<p>${kNewContainerOfLink[1]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
    429  ],
    430 });
    431 
    432 addPromiseTest({
    433  description: `Inserting "XY" after deleting last character of a link ${kLinkDesc}(execCommand("delete"))`,
    434  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abcd[]${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    435  run: async (utils) => {
    436    await utils.document.execCommand("delete", false);
    437    await utils.sendKey("X", utils.kShiftKey);
    438    await utils.sendKey("Y", utils.kShiftKey);
    439  },
    440  expectedResult: [
    441    `<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
    442    `<p>${kNewContainerOfLink[1]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
    443  ],
    444 });
    445 
    446 addPromiseTest({
    447  description: `Inserting "XY" after deleting last character of a link ${kLinkDesc}(Delete)`,
    448  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abc[]d${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    449  run: async (utils) => {
    450    await utils.sendDeleteKey();
    451    await utils.sendKey("X", utils.kShiftKey);
    452    await utils.sendKey("Y", utils.kShiftKey);
    453  },
    454  expectedResult: [
    455    `<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
    456    `<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
    457  ],
    458 });
    459 
    460 addPromiseTest({
    461  description: `Inserting "XY" after deleting last character of a link ${kLinkDesc}(execCommand("forwarddelete"))`,
    462  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}abc[]d${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    463  run: async (utils) => {
    464    await utils.document.execCommand("forwarddelete", false);
    465    await utils.sendKey("X", utils.kShiftKey);
    466    await utils.sendKey("Y", utils.kShiftKey);
    467  },
    468  expectedResult: [
    469    `<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}</p>`,
    470    `<p>${kNewContainerOfLink[0]}<a href="about:blank">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
    471  ],
    472 });
    473 
    474 // Type text after deleting the first character in a link.
    475 addPromiseTest({
    476  description: `Inserting "XY" after deleting first character of a link ${kLinkDesc}(Backspace)`,
    477  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}z[]abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    478  run: async (utils) => {
    479    await utils.sendBackspaceKey();
    480    await utils.sendKey("X", utils.kShiftKey);
    481    await utils.sendKey("Y", utils.kShiftKey);
    482  },
    483  expectedResult: [
    484    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
    485    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}<br></p>`,
    486  ],
    487 });
    488 
    489 addPromiseTest({
    490  description: `Inserting "XY" after deleting first character of a link ${kLinkDesc}(execCommand("delete"))`,
    491  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}z[]abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    492  run: async (utils) => {
    493    await utils.document.execCommand("delete", false);
    494    await utils.sendKey("X", utils.kShiftKey);
    495    await utils.sendKey("Y", utils.kShiftKey);
    496  },
    497  expectedResult: [
    498    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
    499    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}<br></p>`,
    500  ],
    501 });
    502 
    503 addPromiseTest({
    504  description: `Inserting "XY" after deleting first character of a link ${kLinkDesc}(Delete)`,
    505  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}[]zabc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    506  run: async (utils) => {
    507    await utils.sendDeleteKey();
    508    await utils.sendKey("X", utils.kShiftKey);
    509    await utils.sendKey("Y", utils.kShiftKey);
    510  },
    511  expectedResult: [
    512    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
    513    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}<br></p>`,
    514  ],
    515 });
    516 
    517 addPromiseTest({
    518  description: `Inserting "XY" after deleting first character of a link ${kLinkDesc}(execCommand("forwarddelete"))`,
    519  innerHTML: `<p>${kParentTag[0]}<a href="about:blank">${kChildTag[0]}[]zabc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    520  run: async (utils) => {
    521    await utils.document.execCommand("forwarddelete", false);
    522    await utils.sendKey("X", utils.kShiftKey);
    523    await utils.sendKey("Y", utils.kShiftKey);
    524  },
    525  expectedResult: [
    526    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}</p>`,
    527    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank">abc</a>${kNewContainerOfLink[1]}<br></p>`,
    528  ],
    529 });
    530 
    531 // Don't create `<span>` element for preserving specified style of the link and
    532 // don't clone `class` nor `style` attribute of the link.
    533 addPromiseTest({
    534  description: `Inserting "XY" at start of a link which has a class for bold text`,
    535  innerHTML: `<p>${kParentTag[0]}<a href="about:blank" class="bold">${kChildTag[0]}[]abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    536  run: async (utils) => {
    537    await utils.sendKey("X", utils.kShiftKey);
    538    await utils.sendKey("Y", utils.kShiftKey);
    539  },
    540  expectedResult: [
    541    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank" class="bold">abc</a>${kNewContainerOfLink[1]}</p>`,
    542    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank" class="bold">abc</a>${kNewContainerOfLink[1]}<br></p>`,
    543  ],
    544 });
    545 addPromiseTest({
    546  description: `Inserting "XY" at end of a link which has a class for bold text`,
    547  innerHTML: `<p>${kParentTag[0]}<a href="about:blank" class="bold">${kChildTag[0]}abc[]${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    548  run: async (utils) => {
    549    await utils.sendKey("X", utils.kShiftKey);
    550    await utils.sendKey("Y", utils.kShiftKey);
    551  },
    552  expectedResult: [
    553    `<p>${kNewContainerOfLink[0]}<a href="about:blank" class="bold">abc</a>XY${kNewContainerOfLink[1]}</p>`,
    554    `<p>${kNewContainerOfLink[0]}<a href="about:blank" class="bold">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
    555  ],
    556 });
    557 addPromiseTest({
    558  description: `Inserting "XY" at start of a link which has inline style for bold text`,
    559  innerHTML: `<p>${kParentTag[0]}<a href="about:blank" style="font-weight: bold">${kChildTag[0]}[]abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    560  run: async (utils) => {
    561    await utils.sendKey("X", utils.kShiftKey);
    562    await utils.sendKey("Y", utils.kShiftKey);
    563  },
    564  expectedResult: [
    565    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank" style="font-weight: bold">abc</a>${kNewContainerOfLink[1]}</p>`,
    566    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank" style="font-weight: bold">abc</a>${kNewContainerOfLink[1]}<br></p>`,
    567  ],
    568 });
    569 addPromiseTest({
    570  description: `Inserting "XY" at end of a link which has inline style for bold text`,
    571  innerHTML: `<p>${kParentTag[0]}<a href="about:blank" style="font-weight: bold">${kChildTag[0]}abc[]${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    572  run: async (utils) => {
    573    await utils.sendKey("X", utils.kShiftKey);
    574    await utils.sendKey("Y", utils.kShiftKey);
    575  },
    576  expectedResult: [
    577    `<p>${kNewContainerOfLink[0]}<a href="about:blank" style="font-weight: bold">abc</a>XY${kNewContainerOfLink[1]}</p>`,
    578    `<p>${kNewContainerOfLink[0]}<a href="about:blank" style="font-weight: bold">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
    579  ],
    580 });
    581 document.execCommand("styleWithCSS", false, "true");
    582 addPromiseTest({
    583  description: `Inserting "XY" at start of a link which has a class for bold text (in CSS mode)`,
    584  innerHTML: `<p>${kParentTag[0]}<a href="about:blank" class="bold">${kChildTag[0]}[]abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    585  run: async (utils) => {
    586    await utils.sendKey("X", utils.kShiftKey);
    587    await utils.sendKey("Y", utils.kShiftKey);
    588  },
    589  expectedResult: [
    590    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank" class="bold">abc</a>${kNewContainerOfLink[1]}</p>`,
    591    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank" class="bold">abc</a>${kNewContainerOfLink[1]}<br></p>`,
    592  ],
    593 });
    594 addPromiseTest({
    595  description: `Inserting "XY" at end of a link which has a class for bold text (in CSS mode)`,
    596  innerHTML: `<p>${kParentTag[0]}<a href="about:blank" class="bold">${kChildTag[0]}abc[]${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    597  run: async (utils) => {
    598    await utils.sendKey("X", utils.kShiftKey);
    599    await utils.sendKey("Y", utils.kShiftKey);
    600  },
    601  expectedResult: [
    602    `<p>${kNewContainerOfLink[0]}<a href="about:blank" class="bold">abc</a>XY${kNewContainerOfLink[1]}</p>`,
    603    `<p>${kNewContainerOfLink[0]}<a href="about:blank" class="bold">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
    604  ],
    605 });
    606 addPromiseTest({
    607  description: `Inserting "XY" at start of a link which has inline style for bold text (in CSS mode)`,
    608  innerHTML: `<p>${kParentTag[0]}<a href="about:blank" style="font-weight: bold">${kChildTag[0]}[]abc${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    609  run: async (utils) => {
    610    await utils.sendKey("X", utils.kShiftKey);
    611    await utils.sendKey("Y", utils.kShiftKey);
    612  },
    613  expectedResult: [
    614    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank" style="font-weight: bold">abc</a>${kNewContainerOfLink[1]}</p>`,
    615    `<p>${kNewContainerOfLink[0]}XY<a href="about:blank" style="font-weight: bold">abc</a>${kNewContainerOfLink[1]}<br></p>`,
    616  ],
    617 });
    618 document.execCommand("styleWithCSS", false, "false");
    619 addPromiseTest({
    620  description: `Inserting "XY" at end of a link which has inline style for bold text (in CSS mode)`,
    621  innerHTML: `<p>${kParentTag[0]}<a href="about:blank" style="font-weight: bold">${kChildTag[0]}abc[]${kChildTag[1]}</a>${kParentTag[1]}</p>`,
    622  run: async (utils) => {
    623    await utils.sendKey("X", utils.kShiftKey);
    624    await utils.sendKey("Y", utils.kShiftKey);
    625  },
    626  expectedResult: [
    627    `<p>${kNewContainerOfLink[0]}<a href="about:blank" style="font-weight: bold">abc</a>XY${kNewContainerOfLink[1]}</p>`,
    628    `<p>${kNewContainerOfLink[0]}<a href="about:blank" style="font-weight: bold">abc</a>XY${kNewContainerOfLink[1]}<br></p>`,
    629  ],
    630 });
    631 document.execCommand("styleWithCSS", false, "false");
    632 
    633 </script>
    634 </body>
    635 </html>