tor-browser

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

test_nsIEditor_insertLineBreak.html (23825B)


      1 <!DOCTYPE>
      2 <html>
      3 <head>
      4  <title>Test for nsIEditor.insertLineBreak()</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 <input value="abcdef">
     12 <textarea>abcdef</textarea>
     13 <div id="content" contenteditable></div>
     14 <pre id="test">
     15 </pre>
     16 
     17 <script class="testbody" type="application/javascript">
     18 "use strict";
     19 
     20 SimpleTest.waitForExplicitFinish();
     21 SimpleTest.expectAssertions(0, 2);  // In a11y module
     22 SimpleTest.waitForFocus(() => {
     23  let input = document.getElementsByTagName("input")[0];
     24  let textarea = document.getElementsByTagName("textarea")[0];
     25  let contenteditable = document.getElementById("content");
     26  let selection = window.getSelection();
     27 
     28  let beforeInputEvents = [];
     29  let inputEvents = [];
     30  function onBeforeInput(event) {
     31    beforeInputEvents.push(event);
     32  }
     33  function onInput(event) {
     34    inputEvents.push(event);
     35  }
     36 
     37  function checkInputEvent(aEvent, aInputType, aTargetRanges, aDescription) {
     38    ok(aEvent != null, `aEvent is null (${aDescription})`);
     39    ok(aEvent instanceof InputEvent,
     40       `"${aEvent.type}" event should be dispatched with InputEvent interface (${aDescription})`);
     41    is(aEvent.cancelable, aEvent.type === "beforeinput",
     42       `"${aEvent.type}" event should ${aEvent.type === "beforeinput" ? "be" : "be never"} cancelable (${aDescription})`);
     43    is(aEvent.bubbles, true,
     44       `"${aEvent.type}" event should always bubble (${aDescription})`);
     45    is(aEvent.inputType, aInputType,
     46       `inputType of "${aEvent.type}" event should be "${aInputType}" ${aDescription}`);
     47    is(aEvent.data, null,
     48       `data of "${aEvent.type}" event should be null ${aDescription}`);
     49    is(aEvent.dataTransfer, null,
     50       `dataTransfer of "${aEvent.type}" event should be null ${aDescription}`);
     51    let targetRanges = aEvent.getTargetRanges();
     52    if (aTargetRanges.length === 0) {
     53      is(targetRanges.length, 0,
     54         `getTargetRange() of "${aEvent.type}" event should return empty array: ${aDescription}`);
     55    } else {
     56      is(targetRanges.length, aTargetRanges.length,
     57         `getTargetRange() of "${aEvent.type}" event should return static range array: ${aDescription}`);
     58      if (targetRanges.length == aTargetRanges.length) {
     59        for (let i = 0; i < targetRanges.length; i++) {
     60          is(targetRanges[i].startContainer, aTargetRanges[i].startContainer,
     61             `startContainer of getTargetRanges()[${i}] of "${aEvent.type}" event does not match: ${aDescription}`);
     62          is(targetRanges[i].startOffset, aTargetRanges[i].startOffset,
     63             `startOffset of getTargetRanges()[${i}] of "${aEvent.type}" event does not match: ${aDescription}`);
     64          is(targetRanges[i].endContainer, aTargetRanges[i].endContainer,
     65             `endContainer of getTargetRanges()[${i}] of "${aEvent.type}" event does not match: ${aDescription}`);
     66          is(targetRanges[i].endOffset, aTargetRanges[i].endOffset,
     67             `endOffset of getTargetRanges()[${i}] of "${aEvent.type}" event does not match: ${aDescription}`);
     68        }
     69      }
     70    }
     71  }
     72 
     73  input.focus();
     74  input.selectionStart = input.selectionEnd = 3;
     75  beforeInputEvents = [];
     76  inputEvents = [];
     77  input.addEventListener("beforeinput", onBeforeInput);
     78  input.addEventListener("input", onInput);
     79  try {
     80    getPlaintextEditor(input).insertLineBreak();
     81  } catch (e) {
     82    ok(true, e.message);
     83  }
     84  input.removeEventListener("beforeinput", onBeforeInput);
     85  input.removeEventListener("input", onInput);
     86  is(input.value, "abcdef", "nsIEditor.insertLineBreak() should do nothing on single line editor");
     87  is(beforeInputEvents.length, 1, 'nsIEditor.insertLineBreak() should cause a "beforeinput" event on single line editor');
     88  checkInputEvent(beforeInputEvents[0], "insertLineBreak", [], "on single line editor");
     89  is(inputEvents.length, 0, 'nsIEditor.insertLineBreak() should not cause "input" event on single line editor');
     90 
     91  textarea.focus();
     92  textarea.selectionStart = textarea.selectionEnd = 3;
     93  beforeInputEvents = [];
     94  inputEvents = [];
     95  textarea.addEventListener("beforeinput", onBeforeInput);
     96  textarea.addEventListener("input", onInput);
     97  getPlaintextEditor(textarea).insertLineBreak();
     98  textarea.removeEventListener("beforeinput", onBeforeInput);
     99  textarea.removeEventListener("input", onInput);
    100  is(textarea.value, "abc\ndef", "nsIEditor.insertLineBreak() should insert \\n into multi-line editor");
    101  is(beforeInputEvents.length, 1, 'nsIEditor.insertLineBreak() should cause "beforeinput" event once on multi-line editor');
    102  checkInputEvent(beforeInputEvents[0], "insertLineBreak", [], "on multi-line editor");
    103  is(inputEvents.length, 1, 'nsIEditor.insertLineBreak() should cause "input" event once on multi-line editor');
    104  checkInputEvent(inputEvents[0], "insertLineBreak", [], "on multi-line editor");
    105 
    106  // Note that despite of the name, insertLineBreak() should insert paragraph separator in HTMLEditor.
    107 
    108  document.execCommand("defaultParagraphSeparator", false, "br");
    109 
    110  contenteditable.innerHTML = "abcdef";
    111  contenteditable.focus();
    112  contenteditable.scrollTop;
    113  let selectionContainer = contenteditable.firstChild;
    114  selection.collapse(selectionContainer, 3);
    115  beforeInputEvents = [];
    116  inputEvents = [];
    117  contenteditable.addEventListener("beforeinput", onBeforeInput);
    118  contenteditable.addEventListener("input", onInput);
    119  getPlaintextEditor(contenteditable).insertLineBreak();
    120  contenteditable.removeEventListener("beforeinput", onBeforeInput);
    121  contenteditable.removeEventListener("input", onInput);
    122  is(contenteditable.innerHTML, "abc<br>def",
    123     'nsIEditor.insertLineBreak() should insert <br> element into text node when defaultParagraphSeparator is "br"');
    124  is(beforeInputEvents.length, 1,
    125     'nsIEditor.insertLineBreak() should cause "beforeinput" event once on contenteditable which has only text node when defaultParagraphSeparator is "br"');
    126  checkInputEvent(beforeInputEvents[0], "insertParagraph",
    127                  [{startContainer: selectionContainer, startOffset: 3,
    128                    endContainer: selectionContainer, endOffset: 3}],
    129                  'on HTMLEditor (when defaultParagraphSeparator is "br")');
    130  is(inputEvents.length, 1,
    131     'nsIEditor.insertLineBreak() should cause "input" event once on contenteditable which has only text node when defaultParagraphSeparator is "br"');
    132  checkInputEvent(inputEvents[0], "insertParagraph", [], 'on HTMLEditor (when defaultParagraphSeparator is "br")');
    133 
    134  contenteditable.innerHTML = "<p>abcdef</p>";
    135  contenteditable.focus();
    136  contenteditable.scrollTop;
    137  selectionContainer = contenteditable.firstChild.firstChild;
    138  selection.collapse(selectionContainer, 3);
    139  beforeInputEvents = [];
    140  inputEvents = [];
    141  contenteditable.addEventListener("beforeinput", onBeforeInput);
    142  contenteditable.addEventListener("input", onInput);
    143  getPlaintextEditor(contenteditable).insertLineBreak();
    144  contenteditable.removeEventListener("beforeinput", onBeforeInput);
    145  contenteditable.removeEventListener("input", onInput);
    146  is(contenteditable.innerHTML, "<p>abc</p><p>def</p>",
    147     'nsIEditor.insertLineBreak() should add <p> element after <p> element even when defaultParagraphSeparator is "br"');
    148  is(beforeInputEvents.length, 1,
    149     'nsIEditor.insertLineBreak() should cause "beforeinput" event once on contenteditable which has <p> element when defaultParagraphSeparator is "br"');
    150  checkInputEvent(beforeInputEvents[0], "insertParagraph",
    151                  [{startContainer: selectionContainer, startOffset: 3,
    152                    endContainer: selectionContainer, endOffset: 3}],
    153                  'in <p> element on HTMLEditor (when defaultParagraphSeparator is "br")');
    154  is(inputEvents.length, 1,
    155     'nsIEditor.insertLineBreak() should cause "input" event once on contenteditable which has <p> element when defaultParagraphSeparator is "br"');
    156  checkInputEvent(inputEvents[0], "insertParagraph", [], 'in <p> element on HTMLEditor (when defaultParagraphSeparator is "br")');
    157 
    158  contenteditable.innerHTML = "<div>abcdef</div>";
    159  contenteditable.focus();
    160  contenteditable.scrollTop;
    161  selectionContainer = contenteditable.firstChild.firstChild;
    162  selection.collapse(selectionContainer, 3);
    163  beforeInputEvents = [];
    164  inputEvents = [];
    165  contenteditable.addEventListener("beforeinput", onBeforeInput);
    166  contenteditable.addEventListener("input", onInput);
    167  getPlaintextEditor(contenteditable).insertLineBreak();
    168  contenteditable.removeEventListener("beforeinput", onBeforeInput);
    169  contenteditable.removeEventListener("input", onInput);
    170  is(contenteditable.innerHTML, "<div>abc<br>def</div>",
    171     'nsIEditor.insertLineBreak() should insert <br> element into <div> element when defaultParagraphSeparator is "br"');
    172  is(beforeInputEvents.length, 1,
    173     'nsIEditor.insertLineBreak() should cause "beforeinput" event once on contenteditable which has <div> element when defaultParagraphSeparator is "br"');
    174  checkInputEvent(beforeInputEvents[0], "insertParagraph",
    175                  [{startContainer: selectionContainer, startOffset: 3,
    176                    endContainer: selectionContainer, endOffset: 3}],
    177                  'in <div> element on HTMLEditor (when defaultParagraphSeparator is "br")');
    178  is(inputEvents.length, 1,
    179     'nsIEditor.insertLineBreak() should cause "input" event once on contenteditable which has <div> element when defaultParagraphSeparator is "br"');
    180  checkInputEvent(inputEvents[0], "insertParagraph", [], 'in <div> element on HTMLEditor (when defaultParagraphSeparator is "br")');
    181 
    182  contenteditable.innerHTML = "<pre>abcdef</pre>";
    183  contenteditable.focus();
    184  contenteditable.scrollTop;
    185  selectionContainer = contenteditable.firstChild.firstChild;
    186  selection.collapse(selectionContainer, 3);
    187  beforeInputEvents = [];
    188  inputEvents = [];
    189  contenteditable.addEventListener("beforeinput", onBeforeInput);
    190  contenteditable.addEventListener("input", onInput);
    191  getPlaintextEditor(contenteditable).insertLineBreak();
    192  contenteditable.removeEventListener("beforeinput", onBeforeInput);
    193  contenteditable.removeEventListener("input", onInput);
    194  is(contenteditable.innerHTML, "<pre>abc<br>def</pre>",
    195     'nsIEditor.insertLineBreak() should insert <br> element into <pre> element when defaultParagraphSeparator is "br"');
    196  is(beforeInputEvents.length, 1,
    197     'nsIEditor.insertLineBreak() should cause "beforeinput" event once on contenteditable which has <pre> element when defaultParagraphSeparator is "br"');
    198  checkInputEvent(beforeInputEvents[0], "insertParagraph",
    199                  [{startContainer: selectionContainer, startOffset: 3,
    200                    endContainer: selectionContainer, endOffset: 3}],
    201                  'in <pre> element on HTMLEditor (when defaultParagraphSeparator is "br")');
    202  is(inputEvents.length, 1,
    203     'nsIEditor.insertLineBreak() should cause "input" event once on contenteditable which has <pre> element when defaultParagraphSeparator is "br"');
    204  checkInputEvent(inputEvents[0], "insertParagraph", [], 'in <pre> element on HTMLEditor (when defaultParagraphSeparator is "br")');
    205 
    206  document.execCommand("defaultParagraphSeparator", false, "p");
    207 
    208  contenteditable.innerHTML = "abcdef";
    209  contenteditable.focus();
    210  contenteditable.scrollTop;
    211  selectionContainer = contenteditable.firstChild;
    212  selection.collapse(selectionContainer, 3);
    213  beforeInputEvents = [];
    214  inputEvents = [];
    215  contenteditable.addEventListener("beforeinput", onBeforeInput);
    216  contenteditable.addEventListener("input", onInput);
    217  getPlaintextEditor(contenteditable).insertLineBreak();
    218  contenteditable.removeEventListener("beforeinput", onBeforeInput);
    219  contenteditable.removeEventListener("input", onInput);
    220  is(contenteditable.innerHTML, "<p>abc</p><p>def</p>",
    221     'nsIEditor.insertLineBreak() should create <p> elements when there is only text node and defaultParagraphSeparator is "p"');
    222  is(beforeInputEvents.length, 1,
    223     'nsIEditor.insertLineBreak() should cause "beforeinput" event once on contenteditable which has only text node when defaultParagraphSeparator is "p"');
    224  checkInputEvent(beforeInputEvents[0], "insertParagraph",
    225                  [{startContainer: selectionContainer, startOffset: 3,
    226                    endContainer: selectionContainer, endOffset: 3}],
    227                  'on HTMLEditor (when defaultParagraphSeparator is "p")');
    228  is(inputEvents.length, 1,
    229     'nsIEditor.insertLineBreak() should cause "input" event once on contenteditable which has only text node when defaultParagraphSeparator is "p"');
    230  checkInputEvent(inputEvents[0], "insertParagraph", [], 'on HTMLEditor (when defaultParagraphSeparator is "p")');
    231 
    232  contenteditable.innerHTML = "<p>abcdef</p>";
    233  contenteditable.focus();
    234  contenteditable.scrollTop;
    235  selectionContainer = contenteditable.firstChild.firstChild;
    236  selection.collapse(selectionContainer, 3);
    237  beforeInputEvents = [];
    238  inputEvents = [];
    239  contenteditable.addEventListener("beforeinput", onBeforeInput);
    240  contenteditable.addEventListener("input", onInput);
    241  getPlaintextEditor(contenteditable).insertLineBreak();
    242  contenteditable.removeEventListener("beforeinput", onBeforeInput);
    243  contenteditable.removeEventListener("input", onInput);
    244  is(contenteditable.innerHTML, "<p>abc</p><p>def</p>",
    245     'nsIEditor.insertLineBreak() should add <p> element after <p> element when defaultParagraphSeparator is "p"');
    246  is(beforeInputEvents.length, 1,
    247     'nsIEditor.insertLineBreak() should cause "beforeinput" event once on contenteditable which has <p> element when defaultParagraphSeparator is "p"');
    248  checkInputEvent(beforeInputEvents[0], "insertParagraph",
    249                  [{startContainer: selectionContainer, startOffset: 3,
    250                    endContainer: selectionContainer, endOffset: 3}],
    251                  'in <p> element on HTMLEditor (when defaultParagraphSeparator is "p")');
    252  is(inputEvents.length, 1,
    253     'nsIEditor.insertLineBreak() should cause "input" event once on contenteditable which has <p> element when defaultParagraphSeparator is "p"');
    254  checkInputEvent(inputEvents[0], "insertParagraph", [], 'in <p> element on HTMLEditor (when defaultParagraphSeparator is "p")');
    255 
    256  contenteditable.innerHTML = "<div>abcdef</div>";
    257  contenteditable.focus();
    258  contenteditable.scrollTop;
    259  selectionContainer = contenteditable.firstChild.firstChild;
    260  selection.collapse(selectionContainer, 3);
    261  beforeInputEvents = [];
    262  inputEvents = [];
    263  contenteditable.addEventListener("beforeinput", onBeforeInput);
    264  contenteditable.addEventListener("input", onInput);
    265  getPlaintextEditor(contenteditable).insertLineBreak();
    266  contenteditable.removeEventListener("beforeinput", onBeforeInput);
    267  contenteditable.removeEventListener("input", onInput);
    268  is(contenteditable.innerHTML, "<div>abc</div><div>def</div>",
    269     'nsIEditor.insertLineBreak() should add <div> element after <div> element even when defaultParagraphSeparator is "p"');
    270  is(beforeInputEvents.length, 1,
    271     'nsIEditor.insertLineBreak() should cause "beforeinput" event once on contenteditable which has <div> element when defaultParagraphSeparator is "p"');
    272  checkInputEvent(beforeInputEvents[0], "insertParagraph",
    273                  [{startContainer: selectionContainer, startOffset: 3,
    274                    endContainer: selectionContainer, endOffset: 3}],
    275                  'in <div> element on HTMLEditor (when defaultParagraphSeparator is "p")');
    276  is(inputEvents.length, 1,
    277     'nsIEditor.insertLineBreak() should cause "input" event once on contenteditable which has <div> element when defaultParagraphSeparator is "p"');
    278  checkInputEvent(inputEvents[0], "insertParagraph", [], 'in <div> element on HTMLEditor (when defaultParagraphSeparator is "p")');
    279 
    280  contenteditable.innerHTML = "<pre>abcdef</pre>";
    281  contenteditable.focus();
    282  contenteditable.scrollTop;
    283  selectionContainer = contenteditable.firstChild.firstChild;
    284  selection.collapse(selectionContainer, 3);
    285  beforeInputEvents = [];
    286  inputEvents = [];
    287  contenteditable.addEventListener("beforeinput", onBeforeInput);
    288  contenteditable.addEventListener("input", onInput);
    289  getPlaintextEditor(contenteditable).insertLineBreak();
    290  contenteditable.removeEventListener("beforeinput", onBeforeInput);
    291  contenteditable.removeEventListener("input", onInput);
    292  is(contenteditable.innerHTML, "<pre>abc<br>def</pre>",
    293     'nsIEditor.insertLineBreak() should insert <br> element into <pre> element when defaultParagraphSeparator is "p"');
    294  is(beforeInputEvents.length, 1,
    295     'nsIEditor.insertLineBreak() should cause "beforeinput" event once on contenteditable which has <pre> element when defaultParagraphSeparator is "p"');
    296  checkInputEvent(beforeInputEvents[0], "insertParagraph",
    297                  [{startContainer: selectionContainer, startOffset: 3,
    298                    endContainer: selectionContainer, endOffset: 3}],
    299                  'in <pre> element on HTMLEditor (when defaultParagraphSeparator is "p")');
    300  is(inputEvents.length, 1,
    301     'nsIEditor.insertLineBreak() should cause "input" event once on contenteditable which has <pre> element when defaultParagraphSeparator is "p"');
    302  checkInputEvent(inputEvents[0], "insertParagraph", [], 'in <pre> element on HTMLEditor (when defaultParagraphSeparator is "p")');
    303 
    304  document.execCommand("defaultParagraphSeparator", false, "div");
    305 
    306  contenteditable.innerHTML = "abcdef";
    307  contenteditable.focus();
    308  contenteditable.scrollTop;
    309  selectionContainer = contenteditable.firstChild;
    310  selection.collapse(selectionContainer, 3);
    311  beforeInputEvents = [];
    312  inputEvents = [];
    313  contenteditable.addEventListener("beforeinput", onBeforeInput);
    314  contenteditable.addEventListener("input", onInput);
    315  getPlaintextEditor(contenteditable).insertLineBreak();
    316  contenteditable.removeEventListener("beforeinput", onBeforeInput);
    317  contenteditable.removeEventListener("input", onInput);
    318  is(contenteditable.innerHTML, "<div>abc</div><div>def</div>",
    319     'nsIEditor.insertLineBreak() should create <div> elements when there is only text node and defaultParagraphSeparator is "div"');
    320  is(beforeInputEvents.length, 1,
    321     'nsIEditor.insertLineBreak() should cause "beforeinput" event once on contenteditable which has only text node when defaultParagraphSeparator is "div"');
    322  checkInputEvent(beforeInputEvents[0], "insertParagraph",
    323                  [{startContainer: selectionContainer, startOffset: 3,
    324                    endContainer: selectionContainer, endOffset: 3}],
    325                  'on HTMLEditor (when defaultParagraphSeparator is "div")');
    326  is(inputEvents.length, 1,
    327     'nsIEditor.insertLineBreak() should cause "input" event once on contenteditable which has only text node when defaultParagraphSeparator is "div"');
    328  checkInputEvent(inputEvents[0], "insertParagraph", [], 'on HTMLEditor (when defaultParagraphSeparator is "div")');
    329 
    330  contenteditable.innerHTML = "<p>abcdef</p>";
    331  contenteditable.focus();
    332  contenteditable.scrollTop;
    333  selectionContainer = contenteditable.firstChild.firstChild;
    334  selection.collapse(selectionContainer, 3);
    335  beforeInputEvents = [];
    336  inputEvents = [];
    337  contenteditable.addEventListener("beforeinput", onBeforeInput);
    338  contenteditable.addEventListener("input", onInput);
    339  getPlaintextEditor(contenteditable).insertLineBreak();
    340  contenteditable.removeEventListener("beforeinput", onBeforeInput);
    341  contenteditable.removeEventListener("input", onInput);
    342  is(contenteditable.innerHTML, "<p>abc</p><p>def</p>",
    343     'nsIEditor.insertLineBreak() should add <p> element after <p> element even when defaultParagraphSeparator is "div"');
    344  is(beforeInputEvents.length, 1,
    345     'nsIEditor.insertLineBreak() should cause "beforeinput" event once on contenteditable which has <p> element when defaultParagraphSeparator is "div"');
    346  checkInputEvent(beforeInputEvents[0], "insertParagraph",
    347                  [{startContainer: selectionContainer, startOffset: 3,
    348                    endContainer: selectionContainer, endOffset: 3}],
    349                  'in <p> element on HTMLEditor (when defaultParagraphSeparator is "div")');
    350  is(inputEvents.length, 1,
    351     'nsIEditor.insertLineBreak() should cause "input" event once on contenteditable which has <p> element when defaultParagraphSeparator is "div"');
    352  checkInputEvent(inputEvents[0], "insertParagraph", [], 'in <p> element on HTMLEditor (when defaultParagraphSeparator is "div")');
    353 
    354  contenteditable.innerHTML = "<div>abcdef</div>";
    355  contenteditable.focus();
    356  contenteditable.scrollTop;
    357  selectionContainer = contenteditable.firstChild.firstChild;
    358  selection.collapse(selectionContainer, 3);
    359  beforeInputEvents = [];
    360  inputEvents = [];
    361  contenteditable.addEventListener("beforeinput", onBeforeInput);
    362  contenteditable.addEventListener("input", onInput);
    363  getPlaintextEditor(contenteditable).insertLineBreak();
    364  contenteditable.removeEventListener("beforeinput", onBeforeInput);
    365  contenteditable.removeEventListener("input", onInput);
    366  is(contenteditable.innerHTML, "<div>abc</div><div>def</div>",
    367     'nsIEditor.insertLineBreak() should add <div> element after <div> element when defaultParagraphSeparator is "div"');
    368  is(beforeInputEvents.length, 1,
    369     'nsIEditor.insertLineBreak() should cause "beforeinput" event once on contenteditable which has <div> element when defaultParagraphSeparator is "div"');
    370  checkInputEvent(beforeInputEvents[0], "insertParagraph",
    371                  [{startContainer: selectionContainer, startOffset: 3,
    372                    endContainer: selectionContainer, endOffset: 3}],
    373                  'in <div> element on HTMLEditor (when defaultParagraphSeparator is "div")');
    374  is(inputEvents.length, 1,
    375     'nsIEditor.insertLineBreak() should cause "input" event once on contenteditable which has <div> element when defaultParagraphSeparator is "div"');
    376  checkInputEvent(inputEvents[0], "insertParagraph", [], 'in <div> element on HTMLEditor (when defaultParagraphSeparator is "div")');
    377 
    378  contenteditable.innerHTML = "<pre>abcdef</pre>";
    379  contenteditable.focus();
    380  contenteditable.scrollTop;
    381  selectionContainer = contenteditable.firstChild.firstChild;
    382  selection.collapse(selectionContainer, 3);
    383  beforeInputEvents = [];
    384  inputEvents = [];
    385  contenteditable.addEventListener("beforeinput", onBeforeInput);
    386  contenteditable.addEventListener("input", onInput);
    387  getPlaintextEditor(contenteditable).insertLineBreak();
    388  contenteditable.removeEventListener("beforeinput", onBeforeInput);
    389  contenteditable.removeEventListener("input", onInput);
    390  is(contenteditable.innerHTML, "<pre>abc<br>def</pre>",
    391     'nsIEditor.insertLineBreak() should insert <br> element into <pre> element when defaultParagraphSeparator is "div"');
    392  is(beforeInputEvents.length, 1,
    393     'nsIEditor.insertLineBreak() should cause "beforeinput" event once on contenteditable which has <pre> element when defaultParagraphSeparator is "div"');
    394  checkInputEvent(beforeInputEvents[0], "insertParagraph",
    395                  [{startContainer: selectionContainer, startOffset: 3,
    396                    endContainer: selectionContainer, endOffset: 3}],
    397                  'in <pre> element on HTMLEditor (when defaultParagraphSeparator is "div")');
    398  is(inputEvents.length, 1,
    399     'nsIEditor.insertLineBreak() should cause "input" event once on contenteditable which has <pre> element when defaultParagraphSeparator is "div"');
    400  checkInputEvent(inputEvents[0], "insertParagraph", [], 'in <pre> element on HTMLEditor (when defaultParagraphSeparator is "div")');
    401 
    402  SimpleTest.finish();
    403 });
    404 
    405 function getPlaintextEditor(aEditorElement) {
    406  let editor = aEditorElement ? SpecialPowers.wrap(aEditorElement).editor : null;
    407  if (!editor) {
    408    editor = SpecialPowers.wrap(window).docShell.editingSession.getEditorForWindow(window);
    409  }
    410  return editor;
    411 }
    412 
    413 </script>
    414 </body>
    415 
    416 </html>