summaryrefslogtreecommitdiffstats
path: root/dom/events/test/test_passive_listeners.html
blob: dd132fc6bca4139b9b60ffb1e40db2d72ad67e10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<html>
<head>
  <title>Tests for passive event listeners</title>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css">
  <script src="/tests/SimpleTest/SimpleTest.js"></script>

<body>
<p id="display"></p>
<div id="dummy">
</div>

<script>
var listenerHitCount;
var doPreventDefault;

function listener(e)
{
  listenerHitCount++;
  if (doPreventDefault) {
    // When this function is registered as a passive listener, this
    // call should be a no-op and might report a console warning.
    e.preventDefault();
  }
}

function listener2(e)
{
  if (doPreventDefault) {
    e.preventDefault();
  }
}

var elem = document.getElementById('dummy');

function doTest(description, passiveArg)
{
  listenerHitCount = 0;

  elem.addEventListener('test', listener, { passive: passiveArg });

  // Test with a cancelable event
  var e1 = new Event('test', { cancelable: true });
  elem.dispatchEvent(e1);
  is(listenerHitCount, 1, description + ' | hit count');
  var expectedDefaultPrevented = (doPreventDefault && !passiveArg);
  is(e1.defaultPrevented, expectedDefaultPrevented, description + ' | default prevented');

  // Test with a non-cancelable event
  var e2 = new Event('test', { cancelable: false });
  elem.dispatchEvent(e2);
  is(listenerHitCount, 2, description + ' | hit count after non-cancelable event');
  is(e2.defaultPrevented, false, description + ' | default prevented on non-cancelable event');

  // Test combining passive-enabled and "traditional" listeners
  elem.addEventListener('test', listener2);
  var e3 = new Event('test', { cancelable: true });
  elem.dispatchEvent(e3);
  is(listenerHitCount, 3, description + ' | hit count with second listener');
  is(e3.defaultPrevented, doPreventDefault, description + ' | default prevented with second listener');
  elem.removeEventListener('test', listener2);

  elem.removeEventListener('test', listener);
}

function testAddListenerKey(passiveListenerFirst)
{
  listenerHitCount = 0;
  doPreventDefault = true;

  elem.addEventListener('test', listener, { capture: false, passive: passiveListenerFirst });
  // This second listener should not be registered, because the "key" of
  // { type, callback, capture } is the same, even though the 'passive' flag
  // is different.
  elem.addEventListener('test', listener, { capture: false, passive: !passiveListenerFirst });

  var e1 = new Event('test', { cancelable: true });
  elem.dispatchEvent(e1);

  is(listenerHitCount, 1, 'Duplicate addEventListener was correctly ignored');
  is(e1.defaultPrevented, !passiveListenerFirst, 'Prevent-default result based on first registered listener');

  // Even though passive is the opposite of the first addEventListener call, it
  // should remove the listener registered above.
  elem.removeEventListener('test', listener, { capture: false, passive: !passiveListenerFirst });

  var e2 = new Event('test', { cancelable: true });
  elem.dispatchEvent(e2);

  is(listenerHitCount, 1, 'non-passive listener was correctly unregistered');
  is(e2.defaultPrevented, false, 'no listener was registered to preventDefault this event');
}

function test()
{
  doPreventDefault = false;

  doTest('base case', undefined);
  doTest('non-passive listener', false);
  doTest('passive listener', true);

  doPreventDefault = true;

  doTest('base case', undefined);
  doTest('non-passive listener', false);
  doTest('passive listener', true);

  testAddListenerKey(false);
  testAddListenerKey(true);
}

test();

</script>

</body>
</html>