1<!DOCTYPE html>
2<meta charset=utf-8>
3<title> Dispatch additional events inside an event listener </title>
4<link rel="help" href="https://dom.spec.whatwg.org/#concept-event-dispatch">
5<script src="/resources/testharness.js"></script>
6<script src="/resources/testharnessreport.js"></script>
7<div id=log></div>
8
9<table id="table" border="1" style="display: none">
10    <tbody id="table-body">
11    <tr id="table-row">
12        <td id="table-cell">Shady Grove</td>
13        <td>Aeolian</td>
14    </tr>
15    <tr id="parent">
16        <td id="target">Over the river, Charlie</td>
17        <td>Dorian</td>
18    </tr>
19    </tbody>
20</table>
21
22<script>
23test(function() {
24  var event_type = "bar";
25  var target = document.getElementById("target");
26  var parent = document.getElementById("parent");
27  var tbody = document.getElementById("table-body");
28  var table = document.getElementById("table");
29  var body = document.body;
30  var html = document.documentElement;
31  var targets = [window, document, html, body, table, tbody, parent, target];
32  var expected_targets = [
33    window,
34    document,
35    html,
36    body,
37    table,
38    tbody,
39    parent,
40    target,
41    target,
42    target, // The additional listener for target runs as we copy its listeners twice
43    parent,
44    tbody,
45    table,
46    body,
47    html,
48    document,
49    window
50  ];
51  var expected_listeners = [0,0,0,0,0,0,0,0,1,3,1,1,1,1,1,1,1];
52
53  var actual_targets = [], actual_listeners = [];
54  var test_event_function = function(i) {
55    return this.step_func(function(evt) {
56      actual_targets.push(evt.currentTarget);
57      actual_listeners.push(i);
58
59      if (evt.eventPhase != evt.BUBBLING_PHASE && evt.currentTarget.foo != 1) {
60        evt.currentTarget.removeEventListener(event_type, event_handlers[0], true);
61        evt.currentTarget.addEventListener(event_type, event_handlers[2], true);
62        evt.currentTarget.foo = 1;
63      }
64
65      if (evt.eventPhase != evt.CAPTURING_PHASE && evt.currentTarget.foo != 3) {
66        evt.currentTarget.removeEventListener(event_type, event_handlers[0], false);
67        evt.currentTarget.addEventListener(event_type, event_handlers[3], false);
68        evt.currentTarget.foo = 3;
69      }
70    });
71  }.bind(this);
72  var event_handlers = [
73    test_event_function(0),
74    test_event_function(1),
75    test_event_function(2),
76    test_event_function(3),
77  ];
78
79  for (var i = 0; i < targets.length; ++i) {
80    targets[i].addEventListener(event_type, event_handlers[0], true);
81    targets[i].addEventListener(event_type, event_handlers[1], false);
82  }
83
84  var evt = document.createEvent("Event");
85  evt.initEvent(event_type, true, true);
86  target.dispatchEvent(evt);
87
88  assert_array_equals(actual_targets, expected_targets, "actual_targets");
89  assert_array_equals(actual_listeners, expected_listeners, "actual_listeners");
90});
91</script>
92