chromium/third_party/blink/web_tests/editing/undo/type_with_mutation_event_undo_order.html

<!doctype html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../assert_selection.js"></script>
<script>
// Regression test for crbug.com/685975

test(() => {
  assert_not_equals(window.eventSender, undefined,
                    'This test requires eventSender');

  assert_selection(
    [
      '<div contenteditable id="div1">foo|</div>',
      '<div contenteditable id="div2">bar</div>'
    ].join(''),
    (selection, testRunner) => {
      const document = selection.document;
      const div1 = document.getElementById('div1');
      const div2 = document.getElementById('div2');
      eventSender.keyDown('a');
      div1.addEventListener('DOMSubtreeModified', () => {
        div2.focus();
        document.execCommand('selectAll');
        document.execCommand('delete');
      });
      eventSender.keyDown('b');
      document.execCommand('undo');
    },
    [
      '<div contenteditable id="div1">fooab</div>',
      '<div contenteditable id="div2">^bar|</div>'
    ].join(''));
}, 'Undo ordering maintained when inserting text to open typing triggers another command in event handler.');

test(() => {
  assert_not_equals(window.eventSender, undefined,
                    'This test requires eventSender');

  assert_selection(
    [
      '<div contenteditable id="div1">foo|</div>',
      '<div contenteditable id="div2">bar</div>'
    ].join(''),
    (selection, testRunner) => {
      const document = selection.document;
      const div1 = document.getElementById('div1');
      const div2 = document.getElementById('div2');
      eventSender.keyDown('a');
      div1.addEventListener('DOMSubtreeModified', () => {
        div2.focus();
        document.execCommand('selectAll');
        document.execCommand('delete');
      });
      eventSender.keyDown('Enter');
      document.execCommand('undo');
    },
    [
      '<div contenteditable id="div1">fooa',
        '<div><br></div>',
      '</div>',
      '<div contenteditable id="div2">^bar|</div>'
    ].join(''));
}, 'Undo ordering maintained when inserting paragraph separator to open typing triggers another command in event handler.');

test(() => {
  assert_not_equals(window.eventSender, undefined,
                    'This test requires eventSender');

  assert_selection(
    [
      '<div contenteditable id="div1"><blockquote type="cite">foo|</blockquote></div>',
      '<div contenteditable id="div2">bar</div>'
    ].join(''),
    (selection, testRunner) => {
      const document = selection.document;
      const div1 = document.getElementById('div1');
      const div2 = document.getElementById('div2');
      eventSender.keyDown('a');
      div1.addEventListener('DOMSubtreeModified', () => {
        div2.focus();
        document.execCommand('selectAll');
        document.execCommand('delete');
      });
      testRunner.execCommand('insertNewLineInQuotedContent');
      document.execCommand('undo');
    },
    [
      '<div contenteditable id="div1"><blockquote type="cite">fooa</blockquote><br></div>',
      '<div contenteditable id="div2">^bar|</div>'
    ].join(''));
}, 'Undo ordering maintained when inserting paragraph separator in quoted content to open typing triggers another command in event handler.');

test(() => {
  assert_not_equals(window.eventSender, undefined,
                    'This test requires eventSender');

  assert_selection(
    [
      '<div contenteditable id="div1">foo|</div>',
      '<div contenteditable id="div2">bar</div>'
    ].join(''),
    (selection, testRunner) => {
      const document = selection.document;
      const div1 = document.getElementById('div1');
      const div2 = document.getElementById('div2');
      eventSender.keyDown('a');
      div1.addEventListener('DOMSubtreeModified', () => {
        div2.focus();
        document.execCommand('selectAll');
        document.execCommand('delete');
      });
      eventSender.keyDown('Enter', ['shiftKey']);
      document.execCommand('undo');
    },
    [
      '<div contenteditable id="div1">fooa<br><br></div>',
      '<div contenteditable id="div2">^bar|</div>'
    ].join(''));
}, 'Undo ordering maintained when inserting linebreak to open typing triggers another command in event handler.');
</script>