<!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_equals(Object.getPrototypeOf(ev), window[iface].prototype);
  }, 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_dom("NOT_SUPPORTED_ERR", function () {
          var evt = document.createEvent(plural);
        });
      }, 'Should throw NOT_SUPPORTED_ERR for pluralized legacy event interface "' + plural + '"');
    }
  }
}

test(function() {
  assert_throws_dom("NOT_SUPPORTED_ERR", function() {
    var evt = document.createEvent("foo");
  });
  assert_throws_dom("NOT_SUPPORTED_ERR", function() {
    // 'LATIN CAPITAL LETTER I WITH DOT ABOVE' (U+0130)
    var evt = document.createEvent("U\u0130Event");
  });
  assert_throws_dom("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 = [
  "AnimationEvent",
  "AnimationPlaybackEvent",
  "AnimationPlayerEvent",
  "ApplicationCacheErrorEvent",
  "AudioProcessingEvent",
  "AutocompleteErrorEvent",
  "BeforeInstallPromptEvent",
  "BlobEvent",
  "ClipboardEvent",
  "CloseEvent",
  "CommandEvent",
  "DataContainerEvent",
  "ErrorEvent",
  "ExtendableEvent",
  "ExtendableMessageEvent",
  "FetchEvent",
  "FontFaceSetLoadEvent",
  "GamepadEvent",
  "GeofencingEvent",
  "IDBVersionChangeEvent",
  "InstallEvent",
  "KeyEvent",
  "MIDIConnectionEvent",
  "MIDIMessageEvent",
  "MediaEncryptedEvent",
  "MediaKeyEvent",
  "MediaKeyMessageEvent",
  "MediaQueryListEvent",
  "MediaStreamEvent",
  "MediaStreamTrackEvent",
  "MouseScrollEvent",
  "MutationEvent",
  "NotificationEvent",
  "NotifyPaintEvent",
  "OfflineAudioCompletionEvent",
  "OrientationEvent",
  "PageTransition", // Yes, with no "Event"
  "PageTransitionEvent",
  "PointerEvent",
  "PopStateEvent",
  "PopUpEvent",
  "PresentationConnectionAvailableEvent",
  "PresentationConnectionCloseEvent",
  "ProgressEvent",
  "PromiseRejectionEvent",
  "PushEvent",
  "RTCDTMFToneChangeEvent",
  "RTCDataChannelEvent",
  "RTCIceCandidateEvent",
  "RelatedEvent",
  "ResourceProgressEvent",
  "SVGEvent",
  "SVGZoomEvent",
  "ScrollAreaEvent",
  "SecurityPolicyViolationEvent",
  "ServicePortConnectEvent",
  "ServiceWorkerMessageEvent",
  "SimpleGestureEvent",
  "SpeechRecognitionError",
  "SpeechRecognitionEvent",
  "SpeechSynthesisEvent",
  "SyncEvent",
  "TimeEvent",
  "TouchEvent",
  "TrackEvent",
  "TransitionEvent",
  "WebGLContextEvent",
  "WebKitAnimationEvent",
  "WebKitTransitionEvent",
  "WheelEvent",
  "XULCommandEvent",
];
someNonCreateableEvents.forEach(function (eventInterface) {
  test(function () {
    assert_throws_dom("NOT_SUPPORTED_ERR", function () {
      var evt = document.createEvent(eventInterface);
    });
  }, 'Should throw NOT_SUPPORTED_ERR for non-legacy event interface "' + eventInterface + '"');

  // SVGEvents is allowed, other plurals are not
  if (eventInterface !== "SVGEvent") {
    test(function () {
      assert_throws_dom("NOT_SUPPORTED_ERR", function () {
        var evt = document.createEvent(eventInterface + "s");
      });
    }, 'Should throw NOT_SUPPORTED_ERR for pluralized non-legacy event interface "' + eventInterface + 's"');
  }
});
</script>
