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>