<!DOCTYPE html>
<meta charset=utf-8>
<title>Document.createEvent</title>
<link rel=help href="https://dom.spec.whatwg.org/#dom-document-createevent">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="Document-createEvent.js"></script>
<div id="log"></div>
<script>
function testAlias(arg, iface) {
  var ev;
  test(function() {
    ev = document.createEvent(arg);
    assert_true(ev instanceof window[iface]);
    assert_true(ev instanceof Event);
  }, arg + " should be an alias for " + iface + ".");
  test(function() {
    assert_equals(ev.type, "",
                  "type should be initialized to the empty string");
    assert_equals(ev.target, null,
                  "target should be initialized to null");
    assert_equals(ev.currentTarget, null,
                  "currentTarget should be initialized to null");
    assert_equals(ev.eventPhase, 0,
                  "eventPhase should be initialized to NONE (0)");
    assert_equals(ev.bubbles, false,
                  "bubbles should be initialized to false");
    assert_equals(ev.cancelable, false,
                  "cancelable should be initialized to false");
    assert_equals(ev.defaultPrevented, false,
                  "defaultPrevented should be initialized to false");
    assert_equals(ev.isTrusted, false,
                  "isTrusted should be initialized to false");
  }, "createEvent('" + arg + "') should be initialized correctly.");
}
for (var alias in aliases) {
  var iface = aliases[alias];
  testAlias(alias, iface);
  testAlias(alias.toLowerCase(), iface);
  testAlias(alias.toUpperCase(), iface);

  if (alias[alias.length - 1] != "s") {
    var plural = alias + "s";
    if (!(plural in aliases)) {
      test(function () {
        assert_throws("NOT_SUPPORTED_ERR", function () {
          var evt = document.createEvent(plural);
        });
      }, 'Should throw NOT_SUPPORTED_ERR for pluralized legacy event interface "' + plural + '"');
    }
  }
}

test(function() {
  assert_throws("NOT_SUPPORTED_ERR", function() {
    var evt = document.createEvent("foo");
  });
  assert_throws("NOT_SUPPORTED_ERR", function() {
    // 'LATIN CAPITAL LETTER I WITH DOT ABOVE' (U+0130)
    var evt = document.createEvent("U\u0130Event");
  });
  assert_throws("NOT_SUPPORTED_ERR", function() {
    // 'LATIN SMALL LETTER DOTLESS I' (U+0131)
    var evt = document.createEvent("U\u0131Event");
  });
}, "Should throw NOT_SUPPORTED_ERR for unrecognized arguments");

/*
 * The following are event interfaces which do actually exist, but must still
 * throw since they're absent from the table in the spec for
 * document.createEvent().  This list is not exhaustive, but includes all
 * interfaces that it is known some UA does or did not throw for.
 */
var someNonCreateableEvents = [
  "AnimationPlayerEvent",
  "ApplicationCacheErrorEvent",
  "AudioProcessingEvent",
  "AutocompleteErrorEvent",
  "BeforeInstallPromptEvent",
  "BlobEvent",
  "ClipboardEvent",
  "CommandEvent",
  "DataContainerEvent",
  "DeviceLightEvent",
  "ExtendableEvent",
  "ExtendableMessageEvent",
  "FetchEvent",
  "FontFaceSetLoadEvent",
  "GamepadEvent",
  "GeofencingEvent",
  "InstallEvent",
  "KeyEvent",
  "MIDIConnectionEvent",
  "MIDIMessageEvent",
  "MediaEncryptedEvent",
  "MediaKeyEvent",
  "MediaKeyMessageEvent",
  "MediaQueryListEvent",
  "MediaStreamEvent",
  "MediaStreamTrackEvent",
  "MouseScrollEvent",
  "MutationEvent",
  "NotificationEvent",
  "NotifyPaintEvent",
  "OfflineAudioCompletionEvent",
  "OrientationEvent",
  "PageTransition", // Yes, with no "Event"
  "PopUpEvent",
  "PresentationConnectionAvailableEvent",
  "PresentationConnectionCloseEvent",
  "PromiseRejectionEvent",
  "PushEvent",
  "RTCDTMFToneChangeEvent",
  "RTCDataChannelEvent",
  "RTCIceCandidateEvent",
  "RelatedEvent",
  "ResourceProgressEvent",
  "SVGEvent",
  "ScrollAreaEvent",
  "SecurityPolicyViolationEvent",
  "ServicePortConnectEvent",
  "ServiceWorkerMessageEvent",
  "SimpleGestureEvent",
  "SpeechRecognitionError",
  "SpeechRecognitionEvent",
  "SpeechSynthesisEvent",
  "SyncEvent",
  "TimeEvent",
  "WebKitAnimationEvent",
  "WebKitTransitionEvent",
  "XULCommandEvent",
];
someNonCreateableEvents.forEach(function (eventInterface) {
  // SVGEvents is allowed, but not SVGEvent.  Make sure we only test if it's
  // not whitelisted.
  if (!(eventInterface in aliases)) {
    test(function () {
      assert_throws("NOT_SUPPORTED_ERR", function () {
        var evt = document.createEvent(eventInterface);
      });
    }, 'Should throw NOT_SUPPORTED_ERR for non-legacy event interface "' + eventInterface + '"');
  }

  if (!(eventInterface + "s" in aliases)) {
    test(function () {
      assert_throws("NOT_SUPPORTED_ERR", function () {
        var evt = document.createEvent(eventInterface + "s");
      });
    }, 'Should throw NOT_SUPPORTED_ERR for pluralized non-legacy event interface "' + eventInterface + 's"');
  }
});
</script>
