chromium/third_party/blink/web_tests/fast/files/file-list-change-events.html

<!DOCTYPE html>
<meta charset=utf-8>
<title>input type=file and change events</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<input type=file multiple>
<script>
async_test(t => {
  const input = document.querySelector('input');
  input.addEventListener('change', t.step_func_done(e => {
    assert_equals(
      input.files.length, 2,
      'event should only be seen for drop, not for assignment');
  }));

  // Manually assign a FileList instance, with 3 files.
  // This should not produce an event.
  const dt = new DataTransfer();
  dt.items.add(new File([], 'file1.txt'));
  dt.items.add(new File([], 'file2.txt'));
  dt.items.add(new File([], 'file3.txt'));
  input.files = dt.files;

  // Now simulate a drag, with 2 files.
  // This should produce an event.
  eventSender.beginDragWithFiles(['fileA.txt', 'fileB.txt']);
  const rect = input.getBoundingClientRect();
  eventSender.mouseMoveTo(rect.left + rect.width / 2, rect.top + rect.height / 2);
  eventSender.mouseUp();

}, 'expected change events');
</script>