tor-browser

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

test_nsITableEditor_insertTableCell.html (28007B)


      1 <!DOCTYPE>
      2 <html>
      3 <head>
      4  <title>Test for nsITableEditor.insertTableCell()</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, false,
     28       `"${aEvent.type}" event should be never cancelable ${aDescription}`);
     29    is(aEvent.bubbles, true,
     30       `"${aEvent.type}" event should always bubble ${aDescription}`);
     31    is(aEvent.inputType, "",
     32       `inputType of "${aEvent.type}" event should be empty string ${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().insertTableCell(1, false);
     80  is(editor.innerHTML, "out of table<table><tbody><tr><td>default content</td></tr></tbody></table>",
     81     "nsITableEditor.insertTableCell(1, false) 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.insertTableCell(1, false) even though it will do nothing');
     84  checkInputEvent(beforeInputEvents[0], "when selection collapsed outside table element (nsITableEditor.insertTableCell(1, false))");
     85  is(inputEvents.length, 0,
     86     'No "input" event should be fired when a call of nsITableEditor.insertTableCell(1, false) does nothing');
     87 
     88  beforeInputEvents = [];
     89  inputEvents = [];
     90  getTableEditor().insertTableCell(1, true);
     91  is(editor.innerHTML, "out of table<table><tbody><tr><td>default content</td></tr></tbody></table>",
     92     "nsITableEditor.insertTableCell(1, true) should do nothing if selection is not in <table>");
     93  is(beforeInputEvents.length, 1,
     94     '"beforeinput" event should be fired when a call of nsITableEditor.insertTableCell(1, true) even though it will  do nothing');
     95  checkInputEvent(beforeInputEvents[0], "when selection is collapsed outside table element (nsITableEditor.insertTableCell(1, true))");
     96  is(inputEvents.length, 0,
     97     'No "input" event should be fired when a call of nsITableEditor.insertTableCell(1, true) does nothing');
     98 
     99  selection.removeAllRanges();
    100  try {
    101    beforeInputEvents = [];
    102    inputEvents = [];
    103    getTableEditor().insertTableCell(1, false);
    104    ok(false, "getTableEditor().insertTableCell(1, false) without selection ranges should throw exception");
    105  } catch (e) {
    106    ok(true, "getTableEditor().insertTableCell(1, false) without selection ranges should throw exception");
    107    is(beforeInputEvents.length, 0,
    108       'No "beforeinput" event should be fired when nsITableEditor.insertTableCell(1, false) causes exception due to no selection range');
    109    is(inputEvents.length, 0,
    110       'No "input" event should be fired when nsITableEditor.insertTableCell(1, false) causes exception due to no selection range');
    111  }
    112  try {
    113    beforeInputEvents = [];
    114    inputEvents = [];
    115    getTableEditor().insertTableCell(1, true);
    116    ok(false, "getTableEditor().insertTableCell(1, true) without selection ranges should throw exception");
    117  } catch (e) {
    118    ok(true, "getTableEditor().insertTableCell(1, true) without selection ranges should throw exception");
    119    is(beforeInputEvents.length, 0,
    120       'No "beforeinput" event should be fired when nsITableEditor.insertTableCell(1, true) causes exception due to no selection range');
    121    is(inputEvents.length, 0,
    122       'No "input" event should be fired when nsITableEditor.insertTableCell(1, true) causes exception due to no selection range');
    123  }
    124 
    125  (function testInsertZeroCellsBefore() {
    126    selection.removeAllRanges();
    127    editor.innerHTML =
    128      "<table>" +
    129        "<tr><td>cell1-1</td><td>cell1-2</td></tr>" +
    130        '<tr><td id="select">cell2-1</td><td>cell2-2</td></tr>' +
    131        "<tr><td>cell3-1</td><td>cell3-2</td></tr>" +
    132      "</table>";
    133    editor.focus();
    134    beforeInputEvents = [];
    135    inputEvents = [];
    136    selection.setBaseAndExtent(
    137      document.getElementById("select").firstChild,
    138      0,
    139      document.getElementById("select").firstChild,
    140      0
    141    );
    142    getTableEditor().insertTableCell(0, false);
    143    is(
    144      editor.innerHTML,
    145      "<table><tbody>" +
    146        "<tr><td>cell1-1</td><td>cell1-2</td></tr>" +
    147        '<tr><td id="select">cell2-1</td><td>cell2-2</td></tr>' +
    148        "<tr><td>cell3-1</td><td>cell3-2</td></tr>" +
    149      "</tbody></table>",
    150      "testInsertZeroCellsBefore: nsITableEditor.insertTableCell(0, false) should do nothing without throwing exception"
    151    );
    152    is(
    153      beforeInputEvents.length,
    154      0,
    155      'testInsertZeroCellsBefore: No "beforeinput" event should be fired'
    156    );
    157    is(
    158      inputEvents.length,
    159      0,
    160      'testInsertZeroCellsBefore: No "input" event should be fired'
    161    );
    162  })();
    163 
    164  (function testInsertZeroCellsAfter() {
    165    selection.removeAllRanges();
    166    editor.innerHTML =
    167      "<table>" +
    168        "<tr><td>cell1-1</td><td>cell1-2</td></tr>" +
    169        '<tr><td id="select">cell2-1</td><td>cell2-2</td></tr>' +
    170        "<tr><td>cell3-1</td><td>cell3-2</td></tr>" +
    171      "</table>";
    172    editor.focus();
    173    beforeInputEvents = [];
    174    inputEvents = [];
    175    selection.setBaseAndExtent(
    176      document.getElementById("select").firstChild,
    177      0,
    178      document.getElementById("select").firstChild,
    179      0
    180    );
    181    getTableEditor().insertTableCell(0, true);
    182    is(
    183      editor.innerHTML,
    184      "<table><tbody>" +
    185        "<tr><td>cell1-1</td><td>cell1-2</td></tr>" +
    186        '<tr><td id="select">cell2-1</td><td>cell2-2</td></tr>' +
    187        "<tr><td>cell3-1</td><td>cell3-2</td></tr>" +
    188      "</tbody></table>",
    189      "testInsertZeroCellsAfter: nsITableEditor.insertTableCell(0, true) should do nothing without throwing exception"
    190    );
    191    is(
    192      beforeInputEvents.length,
    193      0,
    194      'testInsertZeroCellsAfter: No "beforeinput" event should be fired'
    195    );
    196    is(
    197      inputEvents.length,
    198      0,
    199      'testInsertZeroCellsAfter: No "input" event should be fired'
    200    );
    201  })();
    202 
    203  selection.removeAllRanges();
    204  editor.innerHTML = "<table>" +
    205                       "<tr><td>cell1-1</td><td>cell1-2</td></tr>" +
    206                       '<tr><td id="select">cell2-1</td><td>cell2-2</td></tr>' +
    207                       "<tr><td>cell3-1</td><td>cell3-2</td></tr>" +
    208                     "</table>";
    209  editor.focus();
    210  beforeInputEvents = [];
    211  inputEvents = [];
    212  selection.setBaseAndExtent(document.getElementById("select").firstChild, 0,
    213                             document.getElementById("select").firstChild, 0);
    214  getTableEditor().insertTableCell(1, false);
    215  is(editor.innerHTML, "<table><tbody>" +
    216                         "<tr><td>cell1-1</td><td>cell1-2</td></tr>" +
    217                         '<tr><td valign="top"><br></td><td id="select">cell2-1</td><td>cell2-2</td></tr>' +
    218                         "<tr><td>cell3-1</td><td>cell3-2</td></tr>" +
    219                       "</tbody></table>",
    220     "nsITableEditor.insertTableCell(1, false) should insert a cell before the cell containing selection");
    221  is(beforeInputEvents.length, 1,
    222     'Only one "beforeinput" event should be fired when selection collapsed in a cell in middle row (before)');
    223  checkInputEvent(beforeInputEvents[0], "when selection collapsed in a cell in middle row (before)");
    224  is(inputEvents.length, 1,
    225     'Only one "input" event should be fired when selection collapsed in a cell in middle row (before)');
    226  checkInputEvent(inputEvents[0], "when selection collapsed in a cell in middle row (before)");
    227 
    228  selection.removeAllRanges();
    229  editor.innerHTML = "<table>" +
    230                       "<tr><td>cell1-1</td><td>cell1-2</td></tr>" +
    231                       '<tr><td id="select">cell2-1</td><td>cell2-2</td></tr>' +
    232                       "<tr><td>cell3-1</td><td>cell3-2</td></tr>" +
    233                     "</table>";
    234  editor.focus();
    235  beforeInputEvents = [];
    236  inputEvents = [];
    237  selection.setBaseAndExtent(document.getElementById("select").firstChild, 0,
    238                             document.getElementById("select").firstChild, 0);
    239  getTableEditor().insertTableCell(1, true);
    240  is(editor.innerHTML, "<table><tbody>" +
    241                         "<tr><td>cell1-1</td><td>cell1-2</td></tr>" +
    242                         '<tr><td id="select">cell2-1</td><td valign="top"><br></td><td>cell2-2</td></tr>' +
    243                         "<tr><td>cell3-1</td><td>cell3-2</td></tr>" +
    244                       "</tbody></table>",
    245     "nsITableEditor.insertTableCell(1, true) should insert a cell after the cell containing selection");
    246  is(beforeInputEvents.length, 1,
    247     'Only one "beforeinput" event should be fired when selection collapsed in a cell in middle row (after)');
    248  checkInputEvent(beforeInputEvents[0], "when selection collapsed in a cell in middle row (after)");
    249  is(inputEvents.length, 1,
    250     'Only one "input" event should be fired when selection collapsed in a cell in middle row (after)');
    251  checkInputEvent(inputEvents[0], "when selection collapsed in a cell in middle row (after)");
    252 
    253  (function testInsertBeforeCellFollowingTextNode() {
    254    selection.removeAllRanges();
    255    editor.innerHTML =
    256      "<table>" +
    257        "<tr><td>cell1-1</td> <td>cell1-2</td> <td>cell1-3</td></tr>" +
    258        '<tr><td>cell2-1</td> <td id="select">cell2-2</td> <td>cell2-3</tr>' +
    259        "<tr><td>cell3-1</td> <td>cell3-2</td> <td>cell3-3</td></tr>" +
    260      "</table>";
    261    editor.focus();
    262    beforeInputEvents = [];
    263    inputEvents = [];
    264    selection.setBaseAndExtent(
    265      document.getElementById("select").firstChild,
    266      0,
    267      document.getElementById("select").firstChild,
    268      0
    269    );
    270    getTableEditor().insertTableCell(1, false);
    271    is(
    272      editor.innerHTML,
    273      "<table><tbody>" +
    274        "<tr><td>cell1-1</td> <td>cell1-2</td> <td>cell1-3</td></tr>" +
    275        '<tr><td>cell2-1</td> <td valign="top"><br></td><td id="select">cell2-2</td> <td>cell2-3</td></tr>' +
    276        "<tr><td>cell3-1</td> <td>cell3-2</td> <td>cell3-3</td></tr>" +
    277      "</tbody></table>",
    278      "testInsertBeforeCellFollowingTextNode: nsITableEditor.insertTableCell(1, false) should insert a cell before the cell containing selection"
    279    );
    280    is(
    281      beforeInputEvents.length,
    282      1,
    283      'testInsertBeforeCellFollowingTextNode: Only one "beforeinput" event should be fired'
    284    );
    285    checkInputEvent(
    286      beforeInputEvents[0],
    287      "when selection collapsed in a cell following a text node (testInsertBeforeCellFollowingTextNode)"
    288    );
    289    is(
    290      inputEvents.length,
    291      1,
    292      'testInsertBeforeCellFollowingTextNode: Only one "input" event should be fired'
    293    );
    294    checkInputEvent(
    295      inputEvents[0],
    296      "when selection collapsed in a cell following a text node (testInsertBeforeCellFollowingTextNode)"
    297    );
    298  })();
    299 
    300  (function testInsertAfterCellFollowedByTextNode() {
    301    selection.removeAllRanges();
    302    editor.innerHTML =
    303      "<table>" +
    304        "<tr><td>cell1-1</td> <td>cell1-2</td> <td>cell1-3</td></tr>" +
    305        '<tr><td>cell2-1</td> <td id="select">cell2-2</td> <td>cell2-3</tr>' +
    306        "<tr><td>cell3-1</td> <td>cell3-2</td> <td>cell3-3</td></tr>" +
    307      "</table>";
    308    editor.focus();
    309    beforeInputEvents = [];
    310    inputEvents = [];
    311    selection.setBaseAndExtent(
    312      document.getElementById("select").firstChild,
    313      0,
    314      document.getElementById("select").firstChild,
    315      0
    316    );
    317    getTableEditor().insertTableCell(1, true);
    318    is(
    319      editor.innerHTML,
    320      "<table><tbody>" +
    321        "<tr><td>cell1-1</td> <td>cell1-2</td> <td>cell1-3</td></tr>" +
    322        '<tr><td>cell2-1</td> <td id="select">cell2-2</td><td valign="top"><br></td> <td>cell2-3</td></tr>' +
    323        "<tr><td>cell3-1</td> <td>cell3-2</td> <td>cell3-3</td></tr>" +
    324      "</tbody></table>",
    325      "testInsertAfterCellFollowedByTextNode: nsITableEditor.insertTableCell(1, true) should insert a cell after the cell containing selection"
    326    );
    327    is(
    328      beforeInputEvents.length,
    329      1,
    330      'testInsertAfterCellFollowedByTextNode: Only one "beforeinput" event should be fired'
    331    );
    332    checkInputEvent(
    333      beforeInputEvents[0],
    334      "when selection collapsed in a cell followed by a text node (testInsertAfterCellFollowedByTextNode)"
    335    );
    336    is(
    337      inputEvents.length,
    338      1,
    339      'testInsertAfterCellFollowedByTextNode: Only one "input" event should be fired'
    340    );
    341    checkInputEvent(
    342      inputEvents[0],
    343      "when selection collapsed in a cell followed by a text node (testInsertAfterCellFollowedByTextNode)"
    344    );
    345  })();
    346 
    347  // with rowspan.
    348 
    349  // Odd case. This puts the cell containing selection moves right of row-spanning cell.
    350  selection.removeAllRanges();
    351  editor.innerHTML = "<table>" +
    352                       '<tr><td>cell1-1</td><td rowspan="2">cell1-2</td></tr>' +
    353                       '<tr><td id="select">cell2-1</td></tr>' +
    354                       "<tr><td>cell3-1</td><td>cell3-2</td></tr>" +
    355                     "</table>";
    356  editor.focus();
    357  beforeInputEvents = [];
    358  inputEvents = [];
    359  selection.setBaseAndExtent(document.getElementById("select").firstChild, 0,
    360                             document.getElementById("select").firstChild, 0);
    361  getTableEditor().insertTableCell(1, false);
    362  is(editor.innerHTML, "<table><tbody>" +
    363                         '<tr><td>cell1-1</td><td rowspan="2">cell1-2</td></tr>' +
    364                         '<tr><td valign="top"><br></td><td id="select">cell2-1</td></tr>' +
    365                         "<tr><td>cell3-1</td><td>cell3-2</td></tr>" +
    366                       "</tbody></table>",
    367     "nsITableEditor.insertTableCell(1, false) should insert a cell before the cell containing selection and moves the cell to right of the row-spanning cell element");
    368  is(beforeInputEvents.length, 1,
    369     'Only one "beforeinput" event should be fired when selection collapsed in a cell in middle row and it has row-spanned cell (before)');
    370  checkInputEvent(beforeInputEvents[0], "when selection collapsed in a cell in middle row and it has row-spanned cell (before)");
    371  is(inputEvents.length, 1,
    372     'Only one "input" event should be fired when selection collapsed in a cell in middle row and it has row-spanned cell (before)');
    373  checkInputEvent(inputEvents[0], "when selection collapsed in a cell in middle row and it has row-spanned cell (before)");
    374 
    375  selection.removeAllRanges();
    376  editor.innerHTML = "<table>" +
    377                       '<tr><td>cell1-1</td><td rowspan="3">cell1-2</td></tr>' +
    378                       '<tr><td id="select">cell2-1</td></tr>' +
    379                       "<tr><td>cell3-1</td></tr>" +
    380                     "</table>";
    381  editor.focus();
    382  beforeInputEvents = [];
    383  inputEvents = [];
    384  selection.setBaseAndExtent(document.getElementById("select").firstChild, 0,
    385                             document.getElementById("select").firstChild, 0);
    386  getTableEditor().insertTableCell(1, true);
    387  is(editor.innerHTML, "<table><tbody>" +
    388                         '<tr><td>cell1-1</td><td rowspan="3">cell1-2</td></tr>' +
    389                         '<tr><td id="select">cell2-1</td><td valign="top"><br></td></tr>' +
    390                         "<tr><td>cell3-1</td></tr>" +
    391                       "</tbody></table>",
    392     "nsITableEditor.insertTableCell(1, true) should insert a cell after the cell containing selection and moves the cell to right of the row-spanning cell element");
    393  is(beforeInputEvents.length, 1,
    394     'Only one "beforeinput" event should be fired when selection collapsed in a cell in middle row and it has row-spanned cell (after)');
    395  checkInputEvent(beforeInputEvents[0], "when selection collapsed in a cell in middle row and it has row-spanned cell (after)");
    396  is(inputEvents.length, 1,
    397     'Only one "input" event should be fired when selection collapsed in a cell in middle row and it has row-spanned cell (after)');
    398  checkInputEvent(inputEvents[0], "when selection collapsed in a cell in middle row and it has row-spanned cell (after)");
    399 
    400  selection.removeAllRanges();
    401  editor.innerHTML = "<table>" +
    402                       '<tr><td>cell1-1</td><td id="select" rowspan="2">cell1-2</td></tr>' +
    403                       "<tr><td>cell2-1</td></tr>" +
    404                       "<tr><td>cell3-1</td><td>cell3-2</td></tr>" +
    405                     "</table>";
    406  editor.focus();
    407  beforeInputEvents = [];
    408  inputEvents = [];
    409  selection.setBaseAndExtent(document.getElementById("select").firstChild, 0,
    410                             document.getElementById("select").firstChild, 1);
    411  getTableEditor().insertTableCell(2, false);
    412  is(editor.innerHTML, "<table><tbody>" +
    413                         '<tr><td>cell1-1</td><td valign="top"><br></td><td valign="top"><br></td><td id="select" rowspan="2">cell1-2</td></tr>' +
    414                         "<tr><td>cell2-1</td></tr>" +
    415                         "<tr><td>cell3-1</td><td>cell3-2</td></tr>" +
    416                       "</tbody></table>",
    417     "nsITableEditor.insertTableCell(2, false) should insert 2 cells before the row-spanning cell containing selection");
    418  is(beforeInputEvents.length, 1,
    419     'Only one "beforeinput" event should be fired when selection collapsed in a cell in row-spanning (before)');
    420  checkInputEvent(beforeInputEvents[0], "when selection collapsed in a cell in row-spanning (before)");
    421  is(inputEvents.length, 1,
    422     'Only one "input" event should be fired when selection collapsed in a cell in row-spanning (before)');
    423  checkInputEvent(inputEvents[0], "when selection collapsed in a cell in row-spanning (before)");
    424 
    425  selection.removeAllRanges();
    426  editor.innerHTML = "<table>" +
    427                       '<tr><td>cell1-1</td><td id="select" rowspan="2">cell1-2</td></tr>' +
    428                       "<tr><td>cell2-1</td></tr>" +
    429                       "<tr><td>cell3-1</td><td>cell3-2</td></tr>" +
    430                     "</table>";
    431  editor.focus();
    432  beforeInputEvents = [];
    433  inputEvents = [];
    434  selection.setBaseAndExtent(document.getElementById("select").firstChild, 0,
    435                             document.getElementById("select").firstChild, 1);
    436  getTableEditor().insertTableCell(2, true);
    437  is(editor.innerHTML, "<table><tbody>" +
    438                         '<tr><td>cell1-1</td><td id="select" rowspan="2">cell1-2</td><td valign="top"><br></td><td valign="top"><br></td></tr>' +
    439                         "<tr><td>cell2-1</td></tr>" +
    440                         "<tr><td>cell3-1</td><td>cell3-2</td></tr>" +
    441                       "</tbody></table>",
    442     "nsITableEditor.insertTableCell(2, false) should insert 2 cells after the row-spanning cell containing selection");
    443  is(beforeInputEvents.length, 1,
    444     'Only one "beforeinput" event should be fired when selection collapsed in a cell in row-spanning (after)');
    445  checkInputEvent(beforeInputEvents[0], "when selection collapsed in a cell in row-spanning (after)");
    446  is(inputEvents.length, 1,
    447     'Only one "input" event should be fired when selection collapsed in a cell in row-spanning (after)');
    448  checkInputEvent(inputEvents[0], "when selection collapsed in a cell in row-spanning (after)");
    449 
    450  // with colspan
    451 
    452  selection.removeAllRanges();
    453  editor.innerHTML = "<table>" +
    454                       '<tr><td>cell1-1</td><td id="select">cell1-2</td><td>cell1-3</td></tr>' +
    455                       '<tr><td colspan="2">cell2-1</td><td>cell2-3</td></tr>' +
    456                     "</table>";
    457  editor.focus();
    458  beforeInputEvents = [];
    459  inputEvents = [];
    460  selection.setBaseAndExtent(document.getElementById("select").firstChild, 0,
    461                             document.getElementById("select").firstChild, 0);
    462  getTableEditor().insertTableCell(1, false);
    463  is(editor.innerHTML, "<table><tbody>" +
    464                         '<tr><td>cell1-1</td><td valign="top"><br></td><td id="select">cell1-2</td><td>cell1-3</td></tr>' +
    465                         '<tr><td colspan="2">cell2-1</td><td>cell2-3</td></tr>' +
    466                       "</tbody></table>",
    467     "nsITableEditor.insertTableCell(1, false) should insert a cell before the cell containing selection but do not modify col-spanning cell");
    468  is(beforeInputEvents.length, 1,
    469     'Only one "beforeinput" event should be fired when selection collapsed in a cell whose next row cell is col-spanned (before)');
    470  checkInputEvent(beforeInputEvents[0], "when selection collapsed in a cell whose next row cell is col-spanned (before)");
    471  is(inputEvents.length, 1,
    472     'Only one "input" event should be fired when selection collapsed in a cell whose next row cell is col-spanned (before)');
    473  checkInputEvent(inputEvents[0], "when selection collapsed in a cell whose next row cell is col-spanned (before)");
    474 
    475  selection.removeAllRanges();
    476  editor.innerHTML = "<table>" +
    477                       '<tr><td>cell1-1</td><td id="select">cell1-2</td><td>cell1-3</td></tr>' +
    478                       '<tr><td colspan="3">cell2-1</td></tr>' +
    479                     "</table>";
    480  editor.focus();
    481  beforeInputEvents = [];
    482  inputEvents = [];
    483  selection.setBaseAndExtent(document.getElementById("select").firstChild, 0,
    484                             document.getElementById("select").firstChild, 0);
    485  getTableEditor().insertTableCell(1, true);
    486  is(editor.innerHTML, "<table><tbody>" +
    487                         '<tr><td>cell1-1</td><td id="select">cell1-2</td><td valign="top"><br></td><td>cell1-3</td></tr>' +
    488                         '<tr><td colspan="3">cell2-1</td></tr>' +
    489                       "</tbody></table>",
    490     "nsITableEditor.insertTableCell(1, true) should insert a cell after the cell containing selection but do not modify col-spanning cell");
    491  is(beforeInputEvents.length, 1,
    492     'Only one "beforeinput" event should be fired when selection collapsed in a cell whose next row cell is col-spanned (after)');
    493  checkInputEvent(beforeInputEvents[0], "when selection collapsed in a cell whose next row cell is col-spanned (after)");
    494  is(inputEvents.length, 1,
    495     'Only one "input" event should be fired when selection collapsed in a cell whose next row cell is col-spanned (after)');
    496  checkInputEvent(inputEvents[0], "when selection collapsed in a cell whose next row cell is col-spanned (after)");
    497 
    498  selection.removeAllRanges();
    499  editor.innerHTML = "<table>" +
    500                       "<tr><td>cell1-1</td><td>cell1-2</td><td>cell1-3</td></tr>" +
    501                       '<tr><td id="select" colspan="2">cell2-1</td><td>cell2-3</td></tr>' +
    502                     "</table>";
    503  editor.focus();
    504  beforeInputEvents = [];
    505  inputEvents = [];
    506  selection.setBaseAndExtent(document.getElementById("select").firstChild, 0,
    507                             document.getElementById("select").firstChild, 1);
    508  getTableEditor().insertTableCell(2, false);
    509  is(editor.innerHTML, "<table><tbody>" +
    510                         "<tr><td>cell1-1</td><td>cell1-2</td><td>cell1-3</td></tr>" +
    511                         '<tr><td valign="top"><br></td><td valign="top"><br></td><td id="select" colspan="2">cell2-1</td><td>cell2-3</td></tr>' +
    512                       "</tbody></table>",
    513     "nsITableEditor.insertTableCell(2, false) should insert 2 cells before the col-spanning cell containing selection");
    514  is(beforeInputEvents.length, 1,
    515     'Only one "beforeinput" event should be fired when selection collapsed in a cell which is col-spanning (before)');
    516  checkInputEvent(beforeInputEvents[0], "when selection collapsed in a cell which is col-spanning (before)");
    517  is(inputEvents.length, 1,
    518     'Only one "input" event should be fired when selection collapsed in a cell which is col-spanning (before)');
    519  checkInputEvent(inputEvents[0], "when selection collapsed in a cell which is col-spanning (before)");
    520 
    521  selection.removeAllRanges();
    522  editor.innerHTML = "<table>" +
    523                       "<tr><td>cell1-1</td><td>cell1-2</td><td>cell1-3</td></tr>" +
    524                       '<tr><td id="select" colspan="2">cell2-1</td><td>cell2-3</td></tr>' +
    525                     "</table>";
    526  editor.focus();
    527  beforeInputEvents = [];
    528  inputEvents = [];
    529  selection.setBaseAndExtent(document.getElementById("select").firstChild, 0,
    530                             document.getElementById("select").firstChild, 1);
    531  getTableEditor().insertTableCell(2, true);
    532  is(editor.innerHTML, "<table><tbody>" +
    533                         "<tr><td>cell1-1</td><td>cell1-2</td><td>cell1-3</td></tr>" +
    534                         '<tr><td id="select" colspan="2">cell2-1</td><td valign="top"><br></td><td valign="top"><br></td><td>cell2-3</td></tr>' +
    535                       "</tbody></table>",
    536     "nsITableEditor.insertTableCell(2, false) should insert 2 cells after the col-spanning cell containing selection");
    537  is(beforeInputEvents.length, 1,
    538     'Only one "beforeinput" event should be fired when selection collapsed in a cell which is col-spanning (after)');
    539  checkInputEvent(beforeInputEvents[0], "when selection collapsed in a cell which is col-spanning (after)");
    540  is(inputEvents.length, 1,
    541     'Only one "input" event should be fired when selection collapsed in a cell which is col-spanning (after)');
    542  checkInputEvent(inputEvents[0], "when selection collapsed in a cell which is col-spanning (after)");
    543 
    544  editor.removeEventListener("beforeinput", onBeforeInput);
    545  editor.removeEventListener("input", onInput);
    546 
    547  SimpleTest.finish();
    548 });
    549 
    550 function getTableEditor() {
    551  var editingSession = SpecialPowers.wrap(window).docShell.editingSession;
    552  return editingSession.getEditorForWindow(window).QueryInterface(SpecialPowers.Ci.nsITableEditor);
    553 }
    554 
    555 </script>
    556 </body>
    557 
    558 </html>