Files
firefox/editor/libeditor/tests/test_nsITableEditor_insertTableColumn.html
Masayuki Nakano 67e3cd1e1b Bug 1730442 - part 6: Make HTMLEditor::InsertTableColumnsWithTransaction() collect all necessary data before touching the DOM tree r=m_kato
It needs to work with the latest layout information to consider which cell
element is the insertion point due to rowspan and colspan.  Therefore,
this patch makes it collects all cell data before touching the DOM except
the case that it needs to normalize the table to make it rectanble.

Note that the case requiring the normalizer should be fixed in a later patch.

This method is corresponding to an XPCOM method.  Therefore, this is tested
by `test_nsITableEditor_insertTableColumn.html`.

And also it's used by the inline table editor, but we don't have automated tests
for this because of no API to get the buttons.  Therefore, I tested it by my
hand.

Note that the old code fails to put caret to newly inserted cell at the reftest
situation.  This fixes the bug too.  Therefore, this changes the reftest's
reference.

Differential Revision: https://phabricator.services.mozilla.com/D146364
2022-05-20 07:39:53 +00:00

548 lines
25 KiB
HTML

<!DOCTYPE>
<html>
<head>
<title>Test for nsITableEditor.insertTableColumn()</title>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" href="/tests/SimpleTest/test.css">
</head>
<body>
<div id="display">
</div>
<div id="content" contenteditable>out of table<table><tr><td>default content</td></tr></table></div>
<pre id="test">
</pre>
<script class="testbody" type="application/javascript">
"use strict";
SimpleTest.waitForExplicitFinish();
SimpleTest.waitForFocus(() => {
let editor = document.getElementById("content");
let selection = document.getSelection();
let selectionRanges = [];
function checkInputEvent(aEvent, aDescription) {
ok(aEvent instanceof InputEvent,
`"${aEvent.type}" event should be dispatched with InputEvent interface ${aDescription}`);
is(aEvent.cancelable, false,
`"${aEvent.type}" event should be never cancelable ${aDescription}`);
is(aEvent.bubbles, true,
`"${aEvent.type}" event should always bubble ${aDescription}`);
is(aEvent.inputType, "",
`inputType of "${aEvent.type}" event should be empty string ${aDescription}`);
is(aEvent.data, null,
`data of "${aEvent.type}" event should be null ${aDescription}`);
is(aEvent.dataTransfer, null,
`dataTransfer of "${aEvent.type}" event should be null ${aDescription}`);
let targetRanges = aEvent.getTargetRanges();
if (aEvent.type === "beforeinput") {
is(targetRanges.length, selectionRanges.length,
`getTargetRanges() of "beforeinput" event should return selection ranges ${aDescription}`);
if (targetRanges.length === selectionRanges.length) {
for (let i = 0; i < selectionRanges.length; i++) {
is(targetRanges[i].startContainer, selectionRanges[i].startContainer,
`startContainer of getTargetRanges()[${i}] of "beforeinput" event does not match ${aDescription}`);
is(targetRanges[i].startOffset, selectionRanges[i].startOffset,
`startOffset of getTargetRanges()[${i}] of "beforeinput" event does not match ${aDescription}`);
is(targetRanges[i].endContainer, selectionRanges[i].endContainer,
`endContainer of getTargetRanges()[${i}] of "beforeinput" event does not match ${aDescription}`);
is(targetRanges[i].endOffset, selectionRanges[i].endOffset,
`endOffset of getTargetRanges()[${i}] of "beforeinput" event does not match ${aDescription}`);
}
}
} else {
is(targetRanges.length, 0,
`getTargetRanges() of "${aEvent.type}" event should return empty array ${aDescription}`);
}
}
let beforeInputEvents = [];
let inputEvents = [];
function onBeforeInput(aEvent) {
beforeInputEvents.push(aEvent);
selectionRanges = [];
for (let i = 0; i < selection.rangeCount; i++) {
let range = selection.getRangeAt(i);
selectionRanges.push({startContainer: range.startContainer, startOffset: range.startOffset,
endContainer: range.endContainer, endOffset: range.endOffset});
}
}
function onInput(aEvent) {
inputEvents.push(aEvent);
}
editor.addEventListener("beforeinput", onBeforeInput);
editor.addEventListener("input", onInput);
beforeInputEvents = [];
inputEvents = [];
selection.collapse(editor.firstChild, 0);
getTableEditor().insertTableColumn(1, false);
is(editor.innerHTML, "out of table<table><tbody><tr><td>default content</td></tr></tbody></table>",
"nsITableEditor.insertTableColumn(1, false) should do nothing if selection is not in <table>");
is(beforeInputEvents.length, 1,
'beforeinput" event should be fired when a call of nsITableEditor.insertTableColumn(1, false) even though it will do nothing');
checkInputEvent(beforeInputEvents[0], "when selection is collapsed outside table element (nsITableEditor.insertTableColumn(1, false))");
is(inputEvents.length, 0,
'No "input" event should be fired when a call of nsITableEditor.insertTableColumn(1, false) does nothing');
beforeInputEvents = [];
inputEvents = [];
getTableEditor().insertTableColumn(1, true);
is(editor.innerHTML, "out of table<table><tbody><tr><td>default content</td></tr></tbody></table>",
"nsITableEditor.insertTableColumn(1, true) should do nothing if selection is not in <table>");
is(beforeInputEvents.length, 1,
'"beforeinput" event should be fired when a call of nsITableEditor.insertTableColumn(1, true) even though it will do nothing');
checkInputEvent(beforeInputEvents[0], "when selection is collapsed outside table element (nsITableEditor.insertTableColumn(1, true))");
is(inputEvents.length, 0,
'No "input" event should be fired when a call of nsITableEditor.insertTableColumn(1, true) does nothing');
selection.removeAllRanges();
try {
beforeInputEvents = [];
inputEvents = [];
getTableEditor().insertTableColumn(1, false);
ok(false, "getTableEditor().insertTableColumn(1, false) without selection ranges should throw exception");
} catch (e) {
ok(true, "getTableEditor().insertTableColumn(1, false) without selection ranges should throw exception");
is(beforeInputEvents.length, 0,
'No "beforeinput" event should be fired when nsITableEditor.insertTableColumn(1, false) causes exception due to no selection range');
is(inputEvents.length, 0,
'No "input" event should be fired when nsITableEditor.insertTableColumn(1, false) causes exception due to no selection range');
}
try {
beforeInputEvents = [];
inputEvents = [];
getTableEditor().insertTableColumn(1, true);
ok(false, "getTableEditor().insertTableColumn(1, true) without selection ranges should throw exception");
} catch (e) {
ok(true, "getTableEditor().insertTableColumn(1, true) without selection ranges should throw exception");
is(beforeInputEvents.length, 0,
'No "beforeinput" event should be fired when nsITableEditor.insertTableColumn(1, true) causes exception due to no selection range');
is(inputEvents.length, 0,
'No "input" event should be fired when nsITableEditor.insertTableColumn(1, true) causes exception due to no selection range');
}
(function testInsertBeforeFirstColumn() {
selection.removeAllRanges();
editor.innerHTML =
"<table>" +
'<tr><td id="select">cell1-1</td><td>cell1-2</td><td>cell1-3</td></tr>' +
"<tr><td>cell2-1</td><td>cell2-2</td><td>cell2-3</td></tr>" +
"</table>";
editor.focus();
beforeInputEvents = [];
inputEvents = [];
selection.setBaseAndExtent(
document.getElementById("select").firstChild,
0,
document.getElementById("select").firstChild,
0
);
getTableEditor().insertTableColumn(1, false);
is(
editor.innerHTML,
"<table><tbody>" +
'<tr><td valign="top"><br></td><td id="select">cell1-1</td><td>cell1-2</td><td>cell1-3</td></tr>' +
'<tr><td valign="top"><br></td><td>cell2-1</td><td>cell2-2</td><td>cell2-3</td></tr>' +
"</tbody></table>",
"testInsertBeforeFirstColumn: nsITableEditor.insertTableColumn(1, false) should insert a column before the first column"
);
is(
beforeInputEvents.length,
1,
'testInsertBeforeFirstColumn: Only one "beforeinput" event should be fired'
);
checkInputEvent(
beforeInputEvents[0],
"when selection is collapsed in the first column (testInsertBeforeFirstColumn)"
);
is(
inputEvents.length,
1,
'testInsertBeforeFirstColumn: Only one "input" event should be fired'
);
checkInputEvent(
inputEvents[0],
"when selection is collapsed in the first column (testInsertBeforeFirstColumn)"
);
})();
(function testInsertAfterLastColumn() {
selection.removeAllRanges();
editor.innerHTML =
"<table>" +
'<tr><td>cell1-1</td><td>cell1-2</td><td id="select">cell1-3</td></tr>' +
"<tr><td>cell2-1</td><td>cell2-2</td><td>cell2-3</td></tr>" +
"</table>";
editor.focus();
beforeInputEvents = [];
inputEvents = [];
selection.setBaseAndExtent(
document.getElementById("select").firstChild,
0,
document.getElementById("select").firstChild,
0
);
getTableEditor().insertTableColumn(1, true);
is(
editor.innerHTML,
"<table><tbody>" +
'<tr><td>cell1-1</td><td>cell1-2</td><td id="select">cell1-3</td><td valign="top"><br></td></tr>' +
'<tr><td>cell2-1</td><td>cell2-2</td><td>cell2-3</td><td valign="top"><br></td></tr>' +
"</tbody></table>",
"testInsertAfterLastColumn: nsITableEditor.insertTableColumn(1, true) should insert a column after the last column"
);
is(
beforeInputEvents.length,
1,
'testInsertAfterLastColumn: Only one "beforeinput" event should be fired'
);
checkInputEvent(
beforeInputEvents[0],
"when selection is collapsed in the last column (testInsertAfterLastColumn)"
);
is(
inputEvents.length,
1,
'testInsertAfterLastColumn: One "input" event should be fired'
);
checkInputEvent(
inputEvents[0],
"when selection is collapsed in the last column (testInsertAfterLastColumn)"
);
})();
selection.removeAllRanges();
editor.innerHTML = "<table>" +
'<tr><td>cell1-1</td><td id="select">cell1-2</td><td>cell1-3</td></tr>' +
"<tr><td>cell2-1</td><td>cell2-2</td><td>cell2-3</td></tr>" +
"</table>";
editor.focus();
beforeInputEvents = [];
inputEvents = [];
selection.setBaseAndExtent(document.getElementById("select").firstChild, 0,
document.getElementById("select").firstChild, 0);
getTableEditor().insertTableColumn(1, false);
is(editor.innerHTML, "<table><tbody>" +
'<tr><td>cell1-1</td><td valign="top"><br></td><td id="select">cell1-2</td><td>cell1-3</td></tr>' +
'<tr><td>cell2-1</td><td valign="top"><br></td><td>cell2-2</td><td>cell2-3</td></tr>' +
"</tbody></table>",
"nsITableEditor.insertTableColumn(1, false) should insert a column to left of the second column");
is(beforeInputEvents.length, 1,
'Only one "beforeinput" event should be fired when selection is collapsed in a cell in second column (before)');
checkInputEvent(beforeInputEvents[0], "when selection is collapsed in a cell in second column (before)");
is(inputEvents.length, 1,
'Only one "input" event should be fired when selection is collapsed in a cell in second column (before)');
checkInputEvent(inputEvents[0], "when selection is collapsed in a cell in second column (before)");
selection.removeAllRanges();
editor.innerHTML = "<table>" +
'<tr><td>cell1-1</td><td id="select">cell1-2</td><td>cell1-3</td></tr>' +
"<tr><td>cell2-1</td><td>cell2-2</td><td>cell2-3</td></tr>" +
"</table>";
editor.focus();
beforeInputEvents = [];
inputEvents = [];
selection.setBaseAndExtent(document.getElementById("select").firstChild, 0,
document.getElementById("select").firstChild, 0);
getTableEditor().insertTableColumn(1, true);
is(editor.innerHTML, "<table><tbody>" +
'<tr><td>cell1-1</td><td id="select">cell1-2</td><td valign="top"><br></td><td>cell1-3</td></tr>' +
'<tr><td>cell2-1</td><td>cell2-2</td><td valign="top"><br></td><td>cell2-3</td></tr>' +
"</tbody></table>",
"nsITableEditor.insertTableColumn(1, false) should insert a column to right of the second column");
is(beforeInputEvents.length, 1,
'Only one "beforeinput" event should be fired when selection is collapsed in a cell in second column (after)');
checkInputEvent(beforeInputEvents[0], "when selection is collapsed in a cell in second column (after)");
is(inputEvents.length, 1,
'Only one "input" event should be fired when selection is collapsed in a cell in second column (after)');
checkInputEvent(inputEvents[0], "when selection is collapsed in a cell in second column (after)");
selection.removeAllRanges();
editor.innerHTML = "<table>" +
'<tr><td>cell1-1</td><td id="select">cell1-2</td><td>cell1-3</td></tr>' +
'<tr><td colspan="2">cell2-1</td><td>cell2-3</td></tr>' +
"</table>";
editor.focus();
beforeInputEvents = [];
inputEvents = [];
selection.setBaseAndExtent(document.getElementById("select").firstChild, 0,
document.getElementById("select").firstChild, 0);
getTableEditor().insertTableColumn(1, false);
is(editor.innerHTML, "<table><tbody>" +
'<tr><td>cell1-1</td><td valign="top"><br></td><td id="select">cell1-2</td><td>cell1-3</td></tr>' +
'<tr><td colspan="3">cell2-1</td><td>cell2-3</td></tr>' +
"</tbody></table>",
"nsITableEditor.insertTableColumn(1, false) should insert a column to left of the second column and colspan in the first column should be increased");
is(beforeInputEvents.length, 1,
'Only one "beforeinput" event should be fired when selection is collapsed in a cell in second column whose next row cell is col-spanned (before)');
checkInputEvent(beforeInputEvents[0], "when selection is collapsed in a cell in second column whose next row cell is col-spanned (before)");
is(inputEvents.length, 1,
'Only one "input" event should be fired when selection is collapsed in a cell in second column whose next row cell is col-spanned (before)');
checkInputEvent(inputEvents[0], "when selection is collapsed in a cell in second column whose next row cell is col-spanned (before)");
selection.removeAllRanges();
editor.innerHTML = "<table>" +
'<tr><td>cell1-1</td><td id="select">cell1-2</td><td>cell1-3</td></tr>' +
'<tr><td colspan="3">cell2-1</td></tr>' +
"</table>";
editor.focus();
beforeInputEvents = [];
inputEvents = [];
selection.setBaseAndExtent(document.getElementById("select").firstChild, 0,
document.getElementById("select").firstChild, 0);
getTableEditor().insertTableColumn(1, true);
is(editor.innerHTML, "<table><tbody>" +
'<tr><td>cell1-1</td><td id="select">cell1-2</td><td valign="top"><br></td><td>cell1-3</td></tr>' +
'<tr><td colspan="4">cell2-1</td></tr>' +
"</tbody></table>",
"nsITableEditor.insertTableColumn(1, true) should insert a column to right of the second column and colspan in the first column should be increased");
is(beforeInputEvents.length, 1,
'Only one "beforeinput" event should be fired when selection is collapsed in a cell in second column whose next row cell is col-spanned (after)');
checkInputEvent(beforeInputEvents[0], "when selection is collapsed in a cell in second column whose next row cell is col-spanned (after)");
is(inputEvents.length, 1,
'Only one "input" event should be fired when selection is collapsed in a cell in second column whose next row cell is col-spanned (after)');
checkInputEvent(inputEvents[0], "when selection is collapsed in a cell in second column whose next row cell is col-spanned (after)");
selection.removeAllRanges();
editor.innerHTML = "<table>" +
"<tr><td>cell1-1</td><td>cell1-2</td><td>cell1-3</td></tr>" +
'<tr><td id="select" colspan="2">cell2-1</td><td>cell2-3</td></tr>' +
"</table>";
editor.focus();
beforeInputEvents = [];
inputEvents = [];
selection.setBaseAndExtent(document.getElementById("select").firstChild, 0,
document.getElementById("select").firstChild, 1);
getTableEditor().insertTableColumn(2, false);
is(editor.innerHTML, "<table><tbody>" +
'<tr><td valign="top"><br></td><td valign="top"><br></td><td>cell1-1</td><td>cell1-2</td><td>cell1-3</td></tr>' +
'<tr><td valign="top"><br></td><td valign="top"><br></td><td id="select" colspan="2">cell2-1</td><td>cell2-3</td></tr>' +
"</tbody></table>",
"nsITableEditor.insertTableColumn(2, false) should insert 2 columns to left of the first column");
is(beforeInputEvents.length, 1,
'Only one "beforeinput" event should be fired when selection is collapsed in a cell which is col-spanning (before)');
checkInputEvent(beforeInputEvents[0], "when selection is collapsed in a cell which is col-spanning (before)");
is(inputEvents.length, 1,
'Only one "input" event should be fired when selection is collapsed in a cell which is col-spanning (before)');
checkInputEvent(inputEvents[0], "when selection is collapsed in a cell which is col-spanning (before)");
selection.removeAllRanges();
editor.innerHTML = "<table>" +
"<tr><td>cell1-1</td><td>cell1-2</td><td>cell1-3</td></tr>" +
'<tr><td id="select" colspan="2">cell2-1</td><td>cell2-3</td></tr>' +
"</table>";
editor.focus();
beforeInputEvents = [];
inputEvents = [];
selection.setBaseAndExtent(document.getElementById("select").firstChild, 0,
document.getElementById("select").firstChild, 1);
getTableEditor().insertTableColumn(2, true);
is(editor.innerHTML, "<table><tbody>" +
'<tr><td>cell1-1</td><td>cell1-2</td><td valign="top"><br></td><td valign="top"><br></td><td>cell1-3</td></tr>' +
'<tr><td id="select" colspan="2">cell2-1</td><td valign="top"><br></td><td valign="top"><br></td><td>cell2-3</td></tr>' +
"</tbody></table>",
"nsITableEditor.insertTableColumn(2, false) should insert 2 columns to right of the second column (i.e., right of the right-most column of the column-spanning cell");
is(beforeInputEvents.length, 1,
'Only one "beforeinput" event should be fired when selection is collapsed in a cell which is col-spanning (after)');
checkInputEvent(beforeInputEvents[0], "when selection is collapsed in a cell which is col-spanning (after)");
is(inputEvents.length, 1,
'Only one "input" event should be fired when selection is collapsed in a cell which is col-spanning (after)');
checkInputEvent(inputEvents[0], "when selection is collapsed in a cell which is col-spanning (after)");
(function testInsertBeforeFirstColumnFollowingTextNode() {
selection.removeAllRanges();
editor.innerHTML =
"<table>" +
'<tr> <td id="select">cell1-1</td><td>cell1-2</td><td>cell1-3</td> </tr>' +
"<tr> <td>cell2-1</td><td>cell2-2</td><td>cell2-3</td> </tr>" +
"</table>";
editor.focus();
beforeInputEvents = [];
inputEvents = [];
selection.setBaseAndExtent(
document.getElementById("select").firstChild,
0,
document.getElementById("select").firstChild,
0
);
getTableEditor().insertTableColumn(1, false);
is(
editor.innerHTML,
"<table><tbody>" +
'<tr> <td valign="top"><br></td><td id="select">cell1-1</td><td>cell1-2</td><td>cell1-3</td> </tr>' +
'<tr> <td valign="top"><br></td><td>cell2-1</td><td>cell2-2</td><td>cell2-3</td> </tr>' +
"</tbody></table>",
"testInsertBeforeFirstColumnFollowingTextNode: nsITableEditor.insertTableColumn(1, false) should insert a column before the first column"
);
is(
beforeInputEvents.length,
1,
'testInsertBeforeFirstColumnFollowingTextNode: Only one "beforeinput" event should be fired'
);
checkInputEvent(
beforeInputEvents[0],
"when selection is collapsed in the first column (testInsertBeforeFirstColumnFollowingTextNode)"
);
is(
inputEvents.length,
1,
'testInsertBeforeFirstColumnFollowingTextNode: Only one "input" event should be fired'
);
checkInputEvent(
inputEvents[0],
"when selection is collapsed in the first column (testInsertBeforeFirstColumnFollowingTextNode)"
);
})();
(function testInsertAfterLastColumnFollowedByTextNode() {
selection.removeAllRanges();
editor.innerHTML =
"<table>" +
'<tr> <td>cell1-1</td><td>cell1-2</td><td id="select">cell1-3</td> </tr>' +
"<tr> <td>cell2-1</td><td>cell2-2</td><td>cell2-3</td> </tr>" +
"</table>";
editor.focus();
beforeInputEvents = [];
inputEvents = [];
selection.setBaseAndExtent(
document.getElementById("select").firstChild,
0,
document.getElementById("select").firstChild,
0
);
getTableEditor().insertTableColumn(1, true);
is(
editor.innerHTML,
"<table><tbody>" +
'<tr> <td>cell1-1</td><td>cell1-2</td><td id="select">cell1-3</td><td valign="top"><br></td> </tr>' +
'<tr> <td>cell2-1</td><td>cell2-2</td><td>cell2-3</td><td valign="top"><br></td> </tr>' +
"</tbody></table>",
"testInsertAfterLastColumnFollowedByTextNode: nsITableEditor.insertTableColumn(1, true) should insert a column after the last column"
);
is(
beforeInputEvents.length,
1,
'testInsertAfterLastColumnFollowedByTextNode: Only one "beforeinput" event should be fired'
);
checkInputEvent(
beforeInputEvents[0],
"when selection is collapsed in the last column (testInsertAfterLastColumnFollowedByTextNode)"
);
is(
inputEvents.length,
1,
'testInsertAfterLastColumnFollowedByTextNode: One "input" event should be fired'
);
checkInputEvent(
inputEvents[0],
"when selection is collapsed in the last column (testInsertAfterLastColumnFollowedByTextNode)"
);
})();
(function testInsertBeforeColumnFollowingTextNode() {
selection.removeAllRanges();
editor.innerHTML =
"<table>" +
'<tr><td>cell1-1</td> <td id="select">cell1-2</td> <td>cell1-3</td></tr>' +
"<tr><td>cell2-1</td> <td>cell2-2</td> <td>cell2-3</td></tr>" +
"</table>";
editor.focus();
beforeInputEvents = [];
inputEvents = [];
selection.setBaseAndExtent(
document.getElementById("select").firstChild,
0,
document.getElementById("select").firstChild,
0
);
getTableEditor().insertTableColumn(1, false);
is(
editor.innerHTML,
"<table><tbody>" +
'<tr><td>cell1-1</td> <td valign="top"><br></td><td id="select">cell1-2</td> <td>cell1-3</td></tr>' +
'<tr><td>cell2-1</td> <td valign="top"><br></td><td>cell2-2</td> <td>cell2-3</td></tr>' +
"</tbody></table>",
"testInsertBeforeColumnFollowingTextNode: nsITableEditor.insertTableColumn(1, false) should insert a column before the first column"
);
is(
beforeInputEvents.length,
1,
'testInsertBeforeColumnFollowingTextNode: Only one "beforeinput" event should be fired'
);
checkInputEvent(
beforeInputEvents[0],
"when selection is collapsed in the column following a text node (testInsertBeforeColumnFollowingTextNode)"
);
is(
inputEvents.length,
1,
'testInsertBeforeColumnFollowingTextNode: Only one "input" event should be fired'
);
checkInputEvent(
inputEvents[0],
"when selection is collapsed in the column following a text node (testInsertBeforeColumnFollowingTextNode)"
);
})();
(function testInsertAfterColumnFollowedByTextNode() {
selection.removeAllRanges();
editor.innerHTML =
"<table>" +
'<tr><td>cell1-1</td> <td id="select">cell1-2</td> <td>cell1-3</td></tr>' +
"<tr><td>cell2-1</td> <td>cell2-2</td> <td>cell2-3</td></tr>" +
"</table>";
editor.focus();
beforeInputEvents = [];
inputEvents = [];
selection.setBaseAndExtent(
document.getElementById("select").firstChild,
0,
document.getElementById("select").firstChild,
0
);
getTableEditor().insertTableColumn(1, true);
is(
editor.innerHTML,
"<table><tbody>" +
'<tr><td>cell1-1</td> <td id="select">cell1-2</td><td valign="top"><br></td> <td>cell1-3</td></tr>' +
'<tr><td>cell2-1</td> <td>cell2-2</td><td valign="top"><br></td> <td>cell2-3</td></tr>' +
"</tbody></table>",
"testInsertAfterColumnFollowedByTextNode: nsITableEditor.insertTableColumn(1, true) should insert a column before the first column"
);
is(
beforeInputEvents.length,
1,
'testInsertAfterColumnFollowedByTextNode: Only one "beforeinput" event should be fired'
);
checkInputEvent(
beforeInputEvents[0],
"when selection is collapsed in the column followed by a text node (testInsertAfterColumnFollowedByTextNode)"
);
is(
inputEvents.length,
1,
'testInsertAfterColumnFollowedByTextNode: Only one "input" event should be fired'
);
checkInputEvent(
inputEvents[0],
"when selection is collapsed in the column followed by a text node (testInsertAfterColumnFollowedByTextNode)"
);
})();
editor.removeEventListener("beforeinput", onBeforeInput);
editor.removeEventListener("input", onInput);
SimpleTest.finish();
});
function getTableEditor() {
var editingSession = SpecialPowers.wrap(window).docShell.editingSession;
return editingSession.getEditorForWindow(window).QueryInterface(SpecialPowers.Ci.nsITableEditor);
}
</script>
</body>
</html>