chromium/third_party/blink/web_tests/fast/events/inputevents/inputevent-undo-redo.html

<!DOCTYPE html>
<title>InputEvent: Undo/Redo</title>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<textarea id="one"></textarea>
<textarea id="two"></textarea>
<script>
function inputTextarea() {
  one.focus();
  one.value = '';
  eventSender.keyDown('a');
}

let isUndo = true;
let beforeinputDispatched = false;
let inputDispatched = false;

function onBeforeInput(event) {
  beforeinputDispatched = true;
  assert_equals(event.inputType, isUndo ? 'historyUndo' : 'historyRedo');
}

function onInput(event) {
  inputDispatched = true;
  assert_equals(event.inputType, isUndo ? 'historyUndo' : 'historyRedo');
}

function addEventListeners() {
  one.addEventListener('beforeinput', onBeforeInput);
  one.addEventListener('input', onInput);
}

function removeEventListeners() {
  one.removeEventListener('beforeinput', onBeforeInput);
  one.removeEventListener('input', onInput);
}

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

  inputTextarea();
  addEventListeners();

  testRunner.execCommand('undo');
  assert_equals(one.value, '');
  assert_true(beforeinputDispatched);
  assert_true(inputDispatched);

  removeEventListeners();
}, 'undo-on-focused-element');

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

  inputTextarea();
  two.focus();
  addEventListeners();

  testRunner.execCommand('undo');
  assert_equals(one.value, '');
  assert_true(beforeinputDispatched);
  assert_true(inputDispatched);

  removeEventListeners();
}, 'undo-on-unfocused-element');

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

  isUndo = false;
  inputTextarea();
  testRunner.execCommand('undo');
  two.focus();
  addEventListeners();

  testRunner.execCommand('redo');
  assert_equals(one.value, 'a');
  assert_true(beforeinputDispatched);
  assert_true(inputDispatched);

  removeEventListeners();
}, 'redo-on-unfocused-element');
</script>