1<!DOCTYPE html>
2<meta charset=utf-8>
3<title>EventTarget.dispatchEvent</title>
4<link rel="author" title="Olli Pettay" href="mailto:Olli.Pettay@gmail.com">
5<link rel="author" title="Ms2ger" href="mailto:Ms2ger@gmail.com">
6<link rel="help" href="https://dom.spec.whatwg.org/#dom-eventtarget-dispatchevent">
7<script src="/resources/testharness.js"></script>
8<script src="/resources/testharnessreport.js"></script>
9<script src="/dom/nodes/Document-createEvent.js"></script>
10<div id="log"></div>
11<script>
12setup({
13  "allow_uncaught_exception": true,
14})
15
16test(function() {
17  assert_throws_js(TypeError, function() { document.dispatchEvent(null) })
18}, "Calling dispatchEvent(null).")
19
20for (var alias in aliases) {
21  test(function() {
22    var e = document.createEvent(alias)
23    assert_equals(e.type, "", "Event type should be empty string before initialization")
24    assert_throws_dom("InvalidStateError", function() { document.dispatchEvent(e) })
25  }, "If the event's initialized flag is not set, an InvalidStateError must be thrown (" + alias + ").")
26}
27
28var dispatch_dispatch = async_test("If the event's dispatch flag is set, an InvalidStateError must be thrown.")
29dispatch_dispatch.step(function() {
30  var e = document.createEvent("Event")
31  e.initEvent("type", false, false)
32
33  var target = document.createElement("div")
34  target.addEventListener("type", dispatch_dispatch.step_func(function() {
35    assert_throws_dom("InvalidStateError", function() {
36      target.dispatchEvent(e)
37    })
38    assert_throws_dom("InvalidStateError", function() {
39      document.dispatchEvent(e)
40    })
41  }), false)
42
43  assert_equals(target.dispatchEvent(e), true, "dispatchEvent must return true")
44
45  dispatch_dispatch.done()
46})
47
48test(function() {
49  // https://www.w3.org/Bugs/Public/show_bug.cgi?id=17713
50  // https://www.w3.org/Bugs/Public/show_bug.cgi?id=17714
51
52  var e = document.createEvent("Event")
53  e.initEvent("type", false, false)
54
55  var called = []
56
57  var target = document.createElement("div")
58  target.addEventListener("type", function() {
59    called.push("First")
60    throw new Error()
61  }, false)
62
63  target.addEventListener("type", function() {
64    called.push("Second")
65  }, false)
66
67  assert_equals(target.dispatchEvent(e), true, "dispatchEvent must return true")
68  assert_array_equals(called, ["First", "Second"],
69                      "Should have continued to call other event listeners")
70}, "Exceptions from event listeners must not be propagated.")
71
72async_test(function() {
73  var results = []
74  var outerb = document.createElement("b")
75  var middleb = outerb.appendChild(document.createElement("b"))
76  var innerb = middleb.appendChild(document.createElement("b"))
77  outerb.addEventListener("x", this.step_func(function() {
78    middleb.addEventListener("x", this.step_func(function() {
79      results.push("middle")
80    }), true)
81    results.push("outer")
82  }), true)
83  innerb.dispatchEvent(new Event("x"))
84  assert_array_equals(results, ["outer", "middle"])
85  this.done()
86}, "Event listeners added during dispatch should be called");
87
88async_test(function() {
89  var results = []
90  var b = document.createElement("b")
91  b.addEventListener("x", this.step_func(function() {
92    results.push(1)
93  }), true)
94  b.addEventListener("x", this.step_func(function() {
95    results.push(2)
96  }), false)
97  b.addEventListener("x", this.step_func(function() {
98    results.push(3)
99  }), true)
100  b.dispatchEvent(new Event("x"))
101  assert_array_equals(results, [1, 3, 2])
102  this.done()
103}, "Capturing event listeners should be called before non-capturing ones")
104</script>
105