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>