<!DOCTYPE html>
<meta charset="utf-8">
<title>AddEventListenerOptions.once</title>
<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
<link rel="help" href="https://dom.spec.whatwg.org/#dom-addeventlisteneroptions-once">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>

test(function() {
  var invoked_once = false;
  var invoked_normal = false;
  function handler_once() {
    invoked_once = true;
  }
  function handler_normal() {
    invoked_normal = true;
  }

  document.addEventListener('test', handler_once, {once: true});
  document.addEventListener('test', handler_normal);
  document.dispatchEvent(new Event('test'));
  assert_equals(invoked_once, true, "Once handler should be invoked");
  assert_equals(invoked_normal, true, "Normal handler should be invoked");

  invoked_once = false;
  invoked_normal = false;
  document.dispatchEvent(new Event('test'));
  assert_equals(invoked_once, false, "Once handler shouldn't be invoked again");
  assert_equals(invoked_normal, true, "Normal handler should be invoked again");
  document.removeEventListener('test', handler_normal);
}, "Once listener should be invoked only once");

test(function() {
  var invoked_count = 0;
  function handler() {
    invoked_count++;
    if (invoked_count == 1)
      document.dispatchEvent(new Event('test'));
  }
  document.addEventListener('test', handler, {once: true});
  document.dispatchEvent(new Event('test'));
  assert_equals(invoked_count, 1, "Once handler should only be invoked once");

  invoked_count = 0;
  function handler2() {
    invoked_count++;
    if (invoked_count == 1)
      document.addEventListener('test', handler2, {once: true});
    if (invoked_count <= 2)
      document.dispatchEvent(new Event('test'));
  }
  document.addEventListener('test', handler2, {once: true});
  document.dispatchEvent(new Event('test'));
  assert_equals(invoked_count, 2, "Once handler should only be invoked once after each adding");
}, "Once listener should be invoked only once even if the event is nested");

test(function() {
  var invoked_count = 0;
  function handler() {
    invoked_count++;
  }

  document.addEventListener('test', handler, {once: true});
  document.addEventListener('test', handler);
  document.dispatchEvent(new Event('test'));
  assert_equals(invoked_count, 1, "The handler should only be added once");

  invoked_count = 0;
  document.dispatchEvent(new Event('test'));
  assert_equals(invoked_count, 0, "The handler was added as a once listener");

  invoked_count = 0;
  document.addEventListener('test', handler, {once: true});
  document.removeEventListener('test', handler);
  document.dispatchEvent(new Event('test'));
  assert_equals(invoked_count, 0, "The handler should have been removed");
}, "Once listener should be added / removed like normal listeners");

</script>
