test_nsITableEditor_deleteTableRow.html (29474B)
1 <!DOCTYPE> 2 <html> 3 <head> 4 <title>Test for nsITableEditor.deleteTableRow()</title> 5 <script src="/tests/SimpleTest/SimpleTest.js"></script> 6 <link rel="stylesheet" href="/tests/SimpleTest/test.css"> 7 </head> 8 <body> 9 <div id="display"> 10 </div> 11 <div id="content" contenteditable>out of table<table><tr><td>default content</td></tr></table></div> 12 <pre id="test"> 13 </pre> 14 15 <script class="testbody" type="application/javascript"> 16 "use strict"; 17 18 SimpleTest.waitForExplicitFinish(); 19 SimpleTest.waitForFocus(() => { 20 let editor = document.getElementById("content"); 21 let selection = document.getSelection(); 22 let selectionRanges = []; 23 24 function checkInputEvent(aEvent, aDescription) { 25 ok(aEvent instanceof InputEvent, 26 `"${aEvent.type}" event should be dispatched with InputEvent interface ${aDescription}`); 27 is(aEvent.cancelable, aEvent.type === "beforeinput", 28 `"${aEvent.type}" event should ${aEvent.type === "beforeinput" ? "be" : "be never"} cancelable ${aDescription}`); 29 is(aEvent.bubbles, true, 30 `"${aEvent.type}" event should always bubble ${aDescription}`); 31 is(aEvent.inputType, "deleteContent", 32 `inputType of "${aEvent.type}" event should be "deleteContent" ${aDescription}`); 33 is(aEvent.data, null, 34 `data of "${aEvent.type}" event should be null ${aDescription}`); 35 is(aEvent.dataTransfer, null, 36 `dataTransfer of "${aEvent.type}" event should be null ${aDescription}`); 37 let targetRanges = aEvent.getTargetRanges(); 38 if (aEvent.type === "beforeinput") { 39 is(targetRanges.length, selectionRanges.length, 40 `getTargetRanges() of "beforeinput" event should return selection ranges ${aDescription}`); 41 if (targetRanges.length === selectionRanges.length) { 42 for (let i = 0; i < selectionRanges.length; i++) { 43 is(targetRanges[i].startContainer, selectionRanges[i].startContainer, 44 `startContainer of getTargetRanges()[${i}] of "beforeinput" event does not match ${aDescription}`); 45 is(targetRanges[i].startOffset, selectionRanges[i].startOffset, 46 `startOffset of getTargetRanges()[${i}] of "beforeinput" event does not match ${aDescription}`); 47 is(targetRanges[i].endContainer, selectionRanges[i].endContainer, 48 `endContainer of getTargetRanges()[${i}] of "beforeinput" event does not match ${aDescription}`); 49 is(targetRanges[i].endOffset, selectionRanges[i].endOffset, 50 `endOffset of getTargetRanges()[${i}] of "beforeinput" event does not match ${aDescription}`); 51 } 52 } 53 } else { 54 is(targetRanges.length, 0, 55 `getTargetRanges() of "${aEvent.type}" event should return empty array ${aDescription}`); 56 } 57 } 58 59 let beforeInputEvents = []; 60 let inputEvents = []; 61 function onBeforeInput(aEvent) { 62 beforeInputEvents.push(aEvent); 63 selectionRanges = []; 64 for (let i = 0; i < selection.rangeCount; i++) { 65 let range = selection.getRangeAt(i); 66 selectionRanges.push({startContainer: range.startContainer, startOffset: range.startOffset, 67 endContainer: range.endContainer, endOffset: range.endOffset}); 68 } 69 } 70 function onInput(aEvent) { 71 inputEvents.push(aEvent); 72 } 73 editor.addEventListener("beforeinput", onBeforeInput); 74 editor.addEventListener("input", onInput); 75 76 beforeInputEvents = []; 77 inputEvents = []; 78 selection.collapse(editor.firstChild, 0); 79 getTableEditor().deleteTableRow(1); 80 is(editor.innerHTML, "out of table<table><tbody><tr><td>default content</td></tr></tbody></table>", 81 "nsITableEditor.deleteTableRow(1) should do nothing if selection is not in <table>"); 82 is(beforeInputEvents.length, 1, 83 '"beforeinput" event should be fired when a call of nsITableEditor.deleteTableRow(1) even though it will do nothing'); 84 checkInputEvent(beforeInputEvents[0], "when selection is collapsed outside table element (nsITableEditor.deleteTableRow(1))"); 85 is(inputEvents.length, 0, 86 'No "input" event should be fired when a call of nsITableEditor.deleteTableRow(1) does nothing'); 87 88 selection.removeAllRanges(); 89 try { 90 beforeInputEvents = []; 91 inputEvents = []; 92 getTableEditor().deleteTableRow(1); 93 ok(false, "getTableEditor().deleteTableRow(1) without selection ranges should throw exception"); 94 } catch (e) { 95 ok(true, "getTableEditor().deleteTableRow(1) without selection ranges should throw exception"); 96 is(beforeInputEvents.length, 0, 97 'No "beforeinput" event should be fired when nsITableEditor.deleteTableRow(1) causes exception due to no selection range'); 98 is(inputEvents.length, 0, 99 'No "input" event should be fired when nsITableEditor.deleteTableRow(1) causes exception due to no selection range'); 100 } 101 102 // If a cell is selected and the argument is less than number of rows, 103 // specified number of rows should be removed starting from the row 104 // containing the selected cell. But if the argument is same or 105 // larger than actual number of rows when a cell in the first row is 106 // selected, the <table> should be removed. 107 selection.removeAllRanges(); 108 editor.innerHTML = 109 '<table><tr><td id="select">cell1-1</td><td>cell1-2</td></tr><tr><td>cell2-1</td><td>cell2-2</td></tr></table>'; 110 beforeInputEvents = []; 111 inputEvents = []; 112 let range = document.createRange(); 113 range.selectNode(document.getElementById("select")); 114 selection.addRange(range); 115 getTableEditor().deleteTableRow(1); 116 is(editor.innerHTML, "<table><tbody><tr><td>cell2-1</td><td>cell2-2</td></tr></tbody></table>", 117 "nsITableEditor.deleteTableRow(1) should delete the first row when a cell in the first row is selected"); 118 is(beforeInputEvents.length, 1, 119 'Only one "beforeinput" event should be fired when a cell in the first row is selected'); 120 checkInputEvent(beforeInputEvents[0], "when a cell in the first row is selected"); 121 is(inputEvents.length, 1, 122 'Only one "input" event should be fired when a cell in the first row is selected'); 123 checkInputEvent(inputEvents[0], "when a cell in the first row is selected"); 124 125 selection.removeAllRanges(); 126 editor.innerHTML = 127 '<table><tr><td>cell1-1</td><td>cell1-2</td></tr><tr><td id="select">cell2-1</td><td>cell2-2</td></tr></table>'; 128 beforeInputEvents = []; 129 inputEvents = []; 130 range = document.createRange(); 131 range.selectNode(document.getElementById("select")); 132 selection.addRange(range); 133 getTableEditor().deleteTableRow(1); 134 is(editor.innerHTML, "<table><tbody><tr><td>cell1-1</td><td>cell1-2</td></tr></tbody></table>", 135 "nsITableEditor.deleteTableRow(1) should delete the second row when a cell in the second row is selected"); 136 is(beforeInputEvents.length, 1, 137 'Only one "beforeinput" event should be fired when a cell in the second row is selected'); 138 checkInputEvent(beforeInputEvents[0], "when a cell in the second row is selected"); 139 is(inputEvents.length, 1, 140 'Only one "input" event should be fired when a cell in the second row is selected'); 141 checkInputEvent(inputEvents[0], "when a cell in the second row is selected"); 142 143 selection.removeAllRanges(); 144 editor.innerHTML = 145 '<table><tr><td id="select">cell1-1</td><td>cell1-2</td></tr><tr><td>cell2-1</td><td>cell2-2</td></tr></table>'; 146 beforeInputEvents = []; 147 inputEvents = []; 148 range = document.createRange(); 149 range.selectNode(document.getElementById("select")); 150 selection.addRange(range); 151 getTableEditor().deleteTableRow(2); 152 is(editor.innerHTML, "", 153 "nsITableEditor.deleteTableRow(2) should delete the <table> since there is only 2 rows"); 154 is(beforeInputEvents.length, 1, 155 'Only one "beforeinput" event should be fired when a cell in first row is selected and argument is same as number of rows'); 156 checkInputEvent(beforeInputEvents[0], "when a cell in first row is selected and argument is same as number of rows"); 157 is(inputEvents.length, 1, 158 'Only one "input" event should be fired when a cell in first row is selected and argument is same as number of rows'); 159 checkInputEvent(inputEvents[0], "when a cell in first row is selected and argument is same as number of rows"); 160 161 selection.removeAllRanges(); 162 editor.innerHTML = 163 '<table><tr><td id="select">cell1-1</td><td>cell1-2</td></tr><tr><td>cell2-1</td><td>cell2-2</td></tr></table>'; 164 beforeInputEvents = []; 165 inputEvents = []; 166 range = document.createRange(); 167 range.selectNode(document.getElementById("select")); 168 selection.addRange(range); 169 getTableEditor().deleteTableRow(3); 170 is(editor.innerHTML, "", 171 "nsITableEditor.deleteTableRow(3) should delete the <table> when argument is larger than actual number of rows"); 172 is(beforeInputEvents.length, 1, 173 'Only one "beforeinput" event should be fired when argument is larger than actual number of rows'); 174 checkInputEvent(beforeInputEvents[0], "when argument is larger than actual number of rows"); 175 is(inputEvents.length, 1, 176 'Only one "input" event should be fired when argument is larger than actual number of rows'); 177 checkInputEvent(inputEvents[0], "when argument is larger than actual number of rows"); 178 179 selection.removeAllRanges(); 180 editor.innerHTML = 181 '<table><tr><td>cell1-1</td><td>cell1-2</td></tr><tr><td id="select">cell2-1</td><td>cell2-2</td></tr><tr><td>cell3-1</td><td>cell3-2</td></tr></table>'; 182 beforeInputEvents = []; 183 inputEvents = []; 184 range = document.createRange(); 185 range.selectNode(document.getElementById("select")); 186 selection.addRange(range); 187 getTableEditor().deleteTableRow(2); 188 is(editor.innerHTML, "<table><tbody><tr><td>cell1-1</td><td>cell1-2</td></tr></tbody></table>", 189 "nsITableEditor.deleteTableRow(2) should delete the second row containing selected cell and next row"); 190 is(beforeInputEvents.length, 1, 191 'Only one "beforeinput" event should be fired when a cell in second row and argument is same as the remaining rows'); 192 checkInputEvent(beforeInputEvents[0], "when a cell in second row and argument is same as the remaining rows"); 193 is(inputEvents.length, 1, 194 'Only one "input" event should be fired when a cell in second row and argument is same as the remaining rows'); 195 checkInputEvent(inputEvents[0], "when a cell in second row and argument is same as the remaining rows"); 196 197 selection.removeAllRanges(); 198 editor.innerHTML = 199 '<table><tr><td>cell1-1</td><td>cell1-2</td></tr><tr><td id="select">cell2-1</td><td>cell2-2</td></tr><tr><td>cell3-1</td><td>cell3-2</td></tr></table>'; 200 beforeInputEvents = []; 201 inputEvents = []; 202 range = document.createRange(); 203 range.selectNode(document.getElementById("select")); 204 selection.addRange(range); 205 getTableEditor().deleteTableRow(3); 206 is(editor.innerHTML, "<table><tbody><tr><td>cell1-1</td><td>cell1-2</td></tr></tbody></table>", 207 "nsITableEditor.deleteTableRow(3) should delete the second row (containing selected cell) and the third row even though the argument is larger than the rows"); 208 is(beforeInputEvents.length, 1, 209 'Only one "beforeinput" event should be fired when a cell in second row and argument is larger than the remaining rows'); 210 checkInputEvent(beforeInputEvents[0], "when a cell in second row and argument is larger than the remaining rows"); 211 is(inputEvents.length, 1, 212 'Only one "input" event should be fired when a cell in second row and argument is larger than the remaining rows'); 213 checkInputEvent(inputEvents[0], "when a cell in second row and argument is larger than the remaining rows"); 214 215 // Similar to selected a cell, when selection is in a cell, the cell should 216 // treated as selected. 217 selection.removeAllRanges(); 218 editor.innerHTML = 219 '<table><tr><td id="select">cell1-1</td><td>cell1-2</td></tr><tr><td>cell2-1</td><td>cell2-2</td></tr></table>'; 220 beforeInputEvents = []; 221 inputEvents = []; 222 range = document.createRange(); 223 range.selectNode(document.getElementById("select").firstChild); 224 selection.addRange(range); 225 getTableEditor().deleteTableRow(1); 226 is(editor.innerHTML, "<table><tbody><tr><td>cell2-1</td><td>cell2-2</td></tr></tbody></table>", 227 "nsITableEditor.deleteTableRow(1) should delete the first row when a cell in the first row contains selection range"); 228 is(beforeInputEvents.length, 1, 229 'Only one "beforeinput" event should be fired when a cell in the first row contains selection range'); 230 checkInputEvent(beforeInputEvents[0], "when a cell in the first row contains selection range"); 231 is(inputEvents.length, 1, 232 'Only one "input" event should be fired when a cell in the first row contains selection range'); 233 checkInputEvent(inputEvents[0], "when a cell in the first row contains selection range"); 234 235 selection.removeAllRanges(); 236 editor.innerHTML = 237 '<table><tr><td>cell1-1</td><td>cell1-2</td></tr><tr><td id="select">cell2-1</td><td>cell2-2</td></tr></table>'; 238 beforeInputEvents = []; 239 inputEvents = []; 240 range = document.createRange(); 241 range.selectNode(document.getElementById("select").firstChild); 242 selection.addRange(range); 243 getTableEditor().deleteTableRow(1); 244 is(editor.innerHTML, "<table><tbody><tr><td>cell1-1</td><td>cell1-2</td></tr></tbody></table>", 245 "nsITableEditor.deleteTableRow(1) should delete the second row when a cell in the second row contains selection range"); 246 is(beforeInputEvents.length, 1, 247 'Only one "beforeinput" event should be fired when a cell in the second row contains selection range'); 248 checkInputEvent(beforeInputEvents[0], "when a cell in the second row contains selection range"); 249 is(inputEvents.length, 1, 250 'Only one "input" event should be fired when a cell in the second row contains selection range'); 251 checkInputEvent(inputEvents[0], "when a cell in the second row contains selection range"); 252 253 selection.removeAllRanges(); 254 editor.innerHTML = 255 '<table><tr><td id="select">cell1-1</td><td>cell1-2</td></tr><tr><td>cell2-1</td><td>cell2-2</td></tr></table>'; 256 beforeInputEvents = []; 257 inputEvents = []; 258 range = document.createRange(); 259 range.selectNode(document.getElementById("select").firstChild); 260 selection.addRange(range); 261 getTableEditor().deleteTableRow(2); 262 is(editor.innerHTML, "", 263 "nsITableEditor.deleteTableRow(2) should delete the <table> since there is only 2 rows"); 264 is(beforeInputEvents.length, 1, 265 'Only one "beforeinput" event should be fired when all text in a cell in first row is selected and argument includes next row'); 266 checkInputEvent(beforeInputEvents[0], "when all text in a cell in first row is selected and argument includes next row"); 267 is(inputEvents.length, 1, 268 'Only one "input" event should be fired when all text in a cell in first row is selected and argument includes next row'); 269 checkInputEvent(inputEvents[0], "when all text in a cell in first row is selected and argument includes next row"); 270 271 selection.removeAllRanges(); 272 editor.innerHTML = 273 '<table><tr><td id="select">cell1-1</td><td>cell1-2</td></tr><tr><td>cell2-1</td><td>cell2-2</td></tr></table>'; 274 beforeInputEvents = []; 275 inputEvents = []; 276 range = document.createRange(); 277 range.selectNode(document.getElementById("select").firstChild); 278 selection.addRange(range); 279 getTableEditor().deleteTableRow(3); 280 is(editor.innerHTML, "", 281 "nsITableEditor.deleteTableRow(3) should delete the <table> when argument is larger than actual number of rows"); 282 is(beforeInputEvents.length, 1, 283 'Only one "beforeinput" event should be fired when all text in a cell in first row is selected and argument is same as number of all rows'); 284 checkInputEvent(beforeInputEvents[0], "when all text in a cell in first row is selected and argument is same as number of all rows"); 285 is(inputEvents.length, 1, 286 'Only one "input" event should be fired when all text in a cell in first row is selected and argument is same as number of all rows'); 287 checkInputEvent(inputEvents[0], "when all text in a cell in first row is selected and argument is same as number of all rows"); 288 289 selection.removeAllRanges(); 290 editor.innerHTML = 291 '<table><tr><td>cell1-1</td><td>cell1-2</td></tr><tr><td id="select">cell2-1</td><td>cell2-2</td></tr><tr><td>cell3-1</td><td>cell3-2</td></tr></table>'; 292 beforeInputEvents = []; 293 inputEvents = []; 294 range = document.createRange(); 295 range.selectNode(document.getElementById("select").firstChild); 296 selection.addRange(range); 297 getTableEditor().deleteTableRow(2); 298 is(editor.innerHTML, "<table><tbody><tr><td>cell1-1</td><td>cell1-2</td></tr></tbody></table>", 299 "nsITableEditor.deleteTableRow(2) should delete the second row containing a cell containing selection range and next row"); 300 is(beforeInputEvents.length, 1, 301 'Only one "beforeinput" event should be fired when all text in a cell is selected and argument is same than renaming number of rows'); 302 checkInputEvent(beforeInputEvents[0], "when all text in a cell is selected and argument is same than renaming number of rows"); 303 is(inputEvents.length, 1, 304 'Only one "input" event should be fired when all text in a cell is selected and argument is same than renaming number of rows'); 305 checkInputEvent(inputEvents[0], "when all text in a cell is selected and argument is same than renaming number of rows"); 306 307 selection.removeAllRanges(); 308 editor.innerHTML = 309 '<table><tr><td>cell1-1</td><td>cell1-2</td></tr><tr><td id="select">cell2-1</td><td>cell2-2</td></tr><tr><td>cell3-1</td><td>cell3-2</td></tr></table>'; 310 beforeInputEvents = []; 311 inputEvents = []; 312 range = document.createRange(); 313 range.selectNode(document.getElementById("select").firstChild); 314 selection.addRange(range); 315 getTableEditor().deleteTableRow(3); 316 is(editor.innerHTML, "<table><tbody><tr><td>cell1-1</td><td>cell1-2</td></tr></tbody></table>", 317 "nsITableEditor.deleteTableRow(3) should delete the second row (containing selection range) and the third row even though the argument is larger than the rows"); 318 is(beforeInputEvents.length, 1, 319 'Only one "beforeinput" event should be fired when all text in a cell in the second row and argument is larger than renaming number of rows'); 320 checkInputEvent(beforeInputEvents[0], "when all text in a cell in the second row and argument is larger than renaming number of rows"); 321 is(inputEvents.length, 1, 322 'Only one "input" event should be fired when all text in a cell in the second row and argument is larger than renaming number of rows'); 323 checkInputEvent(inputEvents[0], "when all text in a cell in the second row and argument is larger than renaming number of rows"); 324 325 // The argument should be ignored when 2 or more cells are selected. 326 // XXX If the argument is less than number of rows and cells in all rows are 327 // selected, only all rows are removed. However, this leaves empty <table> 328 // element. Is this expected? 329 selection.removeAllRanges(); 330 editor.innerHTML = 331 '<table><tr><td id="select1">cell1-1</td><td>cell1-2</td></tr><tr><td id="select2">cell2-1</td><td>cell2-2</td></tr></table>'; 332 beforeInputEvents = []; 333 inputEvents = []; 334 range = document.createRange(); 335 range.selectNode(document.getElementById("select1")); 336 selection.addRange(range); 337 range = document.createRange(); 338 range.selectNode(document.getElementById("select2")); 339 selection.addRange(range); 340 getTableEditor().deleteTableRow(1); 341 is(editor.innerHTML, "<table><tbody></tbody></table>", 342 "nsITableEditor.deleteTableRow(1) should delete all rows if every row's cell is selected"); 343 is(beforeInputEvents.length, 1, 344 'Only one "beforeinput" event should be fired when cells in every row are selected #1'); 345 checkInputEvent(beforeInputEvents[0], "when cells in every row are selected #1"); 346 is(inputEvents.length, 1, 347 'Only one "input" event should be fired when cells in every row are selected #1'); 348 checkInputEvent(inputEvents[0], "when cells in every row are selected #1"); 349 350 selection.removeAllRanges(); 351 editor.innerHTML = 352 '<table><tr><td id="select1">cell1-1</td><td>cell1-2</td></tr><tr><td id="select2">cell2-1</td><td>cell2-2</td></tr></table>'; 353 beforeInputEvents = []; 354 inputEvents = []; 355 range = document.createRange(); 356 range.selectNode(document.getElementById("select1")); 357 selection.addRange(range); 358 range = document.createRange(); 359 range.selectNode(document.getElementById("select2")); 360 selection.addRange(range); 361 getTableEditor().deleteTableRow(2); 362 is(editor.innerHTML, "", 363 "nsITableEditor.deleteTableRow(2) should delete the <table> since 2 is number of rows of the <table>"); 364 is(beforeInputEvents.length, 1, 365 'Only one "beforeinput" event should be fired when cells in every row are selected #2'); 366 checkInputEvent(beforeInputEvents[0], "when cells in every row are selected #2"); 367 is(inputEvents.length, 1, 368 'Only one "input" event should be fired when cells in every row are selected #2'); 369 checkInputEvent(inputEvents[0], "when cells in every row are selected #2"); 370 371 selection.removeAllRanges(); 372 editor.innerHTML = 373 '<table><tr><td id="select1">cell1-1</td><td id="select2">cell1-2</td></tr><tr><td>cell2-1</td><td>cell2-2</td></tr></table>'; 374 beforeInputEvents = []; 375 inputEvents = []; 376 range = document.createRange(); 377 range.selectNode(document.getElementById("select1")); 378 selection.addRange(range); 379 range = document.createRange(); 380 range.selectNode(document.getElementById("select2")); 381 selection.addRange(range); 382 getTableEditor().deleteTableRow(2); 383 is(editor.innerHTML, "", 384 "nsITableEditor.deleteTableRow(2) should delete the <table> since 2 is number of rows of the <table>"); 385 is(beforeInputEvents.length, 1, 386 'Only one "beforeinput" event should be fired when 2 cells in same row are selected'); 387 checkInputEvent(beforeInputEvents[0], "when 2 cells in same row are selected"); 388 is(inputEvents.length, 1, 389 'Only one "input" event should be fired when 2 cells in same row are selected'); 390 checkInputEvent(inputEvents[0], "when 2 cells in same row are selected"); 391 392 selection.removeAllRanges(); 393 editor.innerHTML = 394 '<table><tr><td id="select1">cell1-1</td><td>cell1-2</td></tr><tr><td id="select2">cell2-1</td><td>cell2-2</td></tr><tr><td>cell3-1</td><td>cell3-2</td></tr></table>'; 395 beforeInputEvents = []; 396 inputEvents = []; 397 range = document.createRange(); 398 range.selectNode(document.getElementById("select1")); 399 selection.addRange(range); 400 range = document.createRange(); 401 range.selectNode(document.getElementById("select2")); 402 selection.addRange(range); 403 getTableEditor().deleteTableRow(1); 404 is(editor.innerHTML, "<table><tbody><tr><td>cell3-1</td><td>cell3-2</td></tr></tbody></table>", 405 "nsITableEditor.deleteTableRow(1) should delete first 2 rows because cells in the both rows are selected"); 406 is(beforeInputEvents.length, 1, 407 'Only one "beforeinput" event should be fired when 2 cell elements in different rows are selected #1'); 408 checkInputEvent(beforeInputEvents[0], "when 2 cell elements in different rows are selected #1"); 409 is(inputEvents.length, 1, 410 'Only one "input" event should be fired when 2 cell elements in different rows are selected #1'); 411 checkInputEvent(inputEvents[0], "when 2 cell elements in different rows are selected #1"); 412 413 selection.removeAllRanges(); 414 editor.innerHTML = 415 '<table><tr><td id="select1">cell1-1</td><td>cell1-2</td></tr><tr><td>cell2-1</td><td>cell2-2</td></tr><tr><td id="select2">cell3-1</td><td>cell3-2</td></tr></table>'; 416 beforeInputEvents = []; 417 inputEvents = []; 418 range = document.createRange(); 419 range.selectNode(document.getElementById("select1")); 420 selection.addRange(range); 421 range = document.createRange(); 422 range.selectNode(document.getElementById("select2")); 423 selection.addRange(range); 424 getTableEditor().deleteTableRow(1); 425 is(editor.innerHTML, "<table><tbody><tr><td>cell2-1</td><td>cell2-2</td></tr></tbody></table>", 426 "nsITableEditor.deleteTableRow(1) should delete the first and the last rows because cells in the both rows are selected"); 427 is(beforeInputEvents.length, 1, 428 'Only one "beforeinput" event should be fired when 2 cell elements in different rows are selected #2'); 429 checkInputEvent(beforeInputEvents[0], "when 2 cell elements in different rows are selected #2"); 430 is(inputEvents.length, 1, 431 'Only one "input" event should be fired when 2 cell elements in different rows are selected #2'); 432 checkInputEvent(inputEvents[0], "when 2 cell elements in different rows are selected #2"); 433 434 selection.removeAllRanges(); 435 editor.innerHTML = 436 '<table><tr><td id="select" rowspan="2">cell1-1</td><td>cell1-2</td></tr><tr><td>cell2-2</td></tr><tr><td>cell3-1</td><td>cell3-2</td></tr></table>'; 437 beforeInputEvents = []; 438 inputEvents = []; 439 range = document.createRange(); 440 range.selectNode(document.getElementById("select")); 441 selection.addRange(range); 442 getTableEditor().deleteTableRow(1); 443 is(editor.innerHTML, '<table><tbody><tr><td valign="top"><br></td><td>cell2-2</td></tr><tr><td>cell3-1</td><td>cell3-2</td></tr></tbody></table>', 444 "nsITableEditor.deleteTableRow(1) with a selected cell is rowspan=\"2\" should delete the first row and add empty cell to the second row"); 445 is(beforeInputEvents.length, 1, 446 'Only one "beforeinput" event should be fired when a cell is selected and its rowspan is 2'); 447 checkInputEvent(beforeInputEvents[0], "when a cell is selected and its rowspan is 2"); 448 is(inputEvents.length, 1, 449 'Only one "input" event should be fired when a cell is selected and its rowspan is 2'); 450 checkInputEvent(inputEvents[0], "when a cell is selected and its rowspan is 2"); 451 452 selection.removeAllRanges(); 453 editor.innerHTML = 454 '<table><tr><td id="select" rowspan="3">cell1-1</td><td>cell1-2</td></tr><tr><td>cell2-2</td></tr><tr><td>cell3-2</td></tr></table>'; 455 beforeInputEvents = []; 456 inputEvents = []; 457 range = document.createRange(); 458 range.selectNode(document.getElementById("select")); 459 selection.addRange(range); 460 getTableEditor().deleteTableRow(1); 461 is(editor.innerHTML, '<table><tbody><tr><td valign="top" rowspan="2"><br></td><td>cell2-2</td></tr><tr><td>cell3-2</td></tr></tbody></table>', 462 "nsITableEditor.deleteTableRow(1) with a selected cell is rowspan=\"3\" should delete the first row and add empty cell whose rowspan is 2 to the second row"); 463 is(beforeInputEvents.length, 1, 464 'Only one "beforeinput" event should be fired when a cell is selected and its rowspan is 3'); 465 checkInputEvent(beforeInputEvents[0], "when a cell is selected and its rowspan is 3"); 466 is(inputEvents.length, 1, 467 'Only one "input" event should be fired when a cell is selected and its rowspan is 3'); 468 checkInputEvent(inputEvents[0], "when a cell is selected and its rowspan is 3"); 469 470 // XXX Must be buggy case. When removing a row which does not have a cell due 471 // to rowspan, the rowspan is not changed properly. 472 selection.removeAllRanges(); 473 editor.innerHTML = 474 '<table><tr><td rowspan="3">cell1-1</td><td>cell1-2</td></tr><tr><td id="select1">cell2-2</td></tr><tr><td>cell3-2</td></tr></table>'; 475 beforeInputEvents = []; 476 inputEvents = []; 477 range = document.createRange(); 478 range.selectNode(document.getElementById("select1")); 479 selection.addRange(range); 480 getTableEditor().deleteTableRow(1); 481 is(editor.innerHTML, '<table><tbody><tr><td rowspan="1">cell1-1</td><td>cell1-2</td></tr><tr><td>cell3-2</td></tr></tbody></table>', 482 "nsITableEditor.deleteTableRow(1) with selected cell in the second row should delete the second row and the row span should be adjusted"); 483 is(beforeInputEvents.length, 1, 484 'Only one "beforeinput" event should be fired when a cell in 2nd row which is only cell defined by the row #1'); 485 checkInputEvent(beforeInputEvents[0], "when a cell in 2nd row which is only cell defined by the row #1"); 486 is(inputEvents.length, 1, 487 'Only one "input" event should be fired when a cell in 2nd row which is only cell defined by the row #1'); 488 checkInputEvent(inputEvents[0], "when a cell in 2nd row which is only cell defined by the row #1"); 489 490 selection.removeAllRanges(); 491 editor.innerHTML = 492 '<table><tr><td rowspan="2">cell1-1</td><td>cell1-2</td></tr><tr><td id="select">cell2-2</td></tr><tr><td>cell3-1</td><td>cell3-2</td></tr></table>'; 493 beforeInputEvents = []; 494 inputEvents = []; 495 range = document.createRange(); 496 range.selectNode(document.getElementById("select")); 497 selection.addRange(range); 498 getTableEditor().deleteTableRow(1); 499 is(editor.innerHTML, '<table><tbody><tr><td rowspan="1">cell1-1</td><td>cell1-2</td></tr><tr><td>cell3-1</td><td>cell3-2</td></tr></tbody></table>', 500 "nsITableEditor.deleteTableRow(1) with selected cell in the second row should delete the second row and the row span should be adjusted"); 501 is(beforeInputEvents.length, 1, 502 'Only one "beforeinput" event should be fired when a cell in 2nd row which is only cell defined by the row #2'); 503 checkInputEvent(beforeInputEvents[0], "when a cell in 2nd row which is only cell defined by the row #2"); 504 is(inputEvents.length, 1, 505 'Only one "input" event should be fired when a cell in 2nd row which is only cell defined by the row #2'); 506 checkInputEvent(inputEvents[0], "when a cell in 2nd row which is only cell defined by the row #2"); 507 508 editor.removeEventListener("beforeinput", onBeforeInput); 509 editor.removeEventListener("input", onInput); 510 511 SimpleTest.finish(); 512 }); 513 514 function getTableEditor() { 515 var editingSession = SpecialPowers.wrap(window).docShell.editingSession; 516 return editingSession.getEditorForWindow(window).QueryInterface(SpecialPowers.Ci.nsITableEditor); 517 } 518 519 </script> 520 </body> 521 522 </html>