File: interestfor-event-timing.tentative.html

package info (click to toggle)
firefox 144.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,637,504 kB
  • sloc: cpp: 7,576,692; javascript: 6,430,831; ansic: 3,748,119; python: 1,398,978; xml: 628,810; asm: 438,679; java: 186,194; sh: 63,212; makefile: 19,159; objc: 13,086; perl: 12,986; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 53; csh: 10
file content (84 lines) | stat: -rw-r--r-- 3,829 bytes parent folder | download | duplicates (3)
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
<!DOCTYPE html>
<meta charset="utf-8" />
<link rel="author" href="mailto:masonf@chromium.org">
<link rel="help" href="https://open-ui.org/components/interest-invokers.explainer">
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="resources/invoker-utils.js"></script>

<button interestfor=popover id=invoker>Button</button>
<div popover id=popover>Target</div>
<button id=unrelated>Unrelated</div>
<style>
  [interestfor] {
    interest-delay: 0s;
  }
</style>

<script>
promise_test(async (t) => {
  const invoker = document.getElementById('invoker');
  const popover = document.getElementById('popover');
  const unrelated = document.getElementById('unrelated');

  let interestFired = 0;
  let loseInterestFired = 0;
  let listenerErrors = [];
  function assert_in_listener(cond, expectation, msg) {
    if (cond != expectation) {
      listenerErrors.push(msg);
    }
  }
  popover.addEventListener('interest', (e) => {
    ++interestFired;
    assert_in_listener(invoker.matches(':interest-source'),false,':interest-source should not yet match in the event handler');
    assert_in_listener(popover.matches(':interest-target'),false,':interest-target should not yet match in the event handler');
    assert_in_listener(popover.matches(':popover-open'),false,'popover shouldn\'t be open yet');
    if (interestFired === 1) {
      e.preventDefault();
    }
  });
  popover.addEventListener('loseinterest', (e) => {
    ++loseInterestFired;
    assert_in_listener(invoker.matches(':interest-source'),true,':interest-source should match in the event handler');
    assert_in_listener(popover.matches(':interest-target'),true,':interest-target should match in the event handler');
    assert_in_listener(popover.matches(':popover-open'),true,'popover should still be open');
    if (loseInterestFired === 1) {
      e.preventDefault();
    }
  });

  // Hover once, and cancel the event:
  await hoverOver(invoker);
  assert_equals(interestFired, 1, 'The `interest` event should have fired once (and event canceled)');
  await hoverOver(unrelated);
  assert_equals(interestFired, 1, 'No further interest events');
  assert_equals(loseInterestFired, 0, 'No loseinterest events yet (the `interest` event was canceled, so we can\'t "lose" interest we never gained)');

  // Hover again, and don't cancel the event:
  await hoverOver(invoker);
  assert_equals(interestFired, 2, 'The `interest` event should have fired twice (event not canceled the second time)');
  assert_equals(loseInterestFired, 0, 'Still no loseinterest events');

  // De-hover, and cancel the event:
  await hoverOver(unrelated);
  assert_equals(interestFired, 2, 'No further interest events');
  assert_equals(loseInterestFired, 1, 'The `loseinterest` event should have fired once (and event canceled)');

  // De-hover again, and don't cancel the event:
  await hoverOver(invoker); // Have to re-hover to get another interest event
  assert_equals(interestFired, 2, 'No additional `interest` event because we cancelled loseinterest, so we still had interest');
  await hoverOver(unrelated);
  assert_equals(interestFired, 2, 'No further interest events');
  assert_equals(loseInterestFired, 2, 'The `loseinterest` event should have fired once (event not canceled the second time)');

  assert_false(popover.matches(':popover-open'),'popover should be closed at the end');

  // Make sure none of the conditions within the event listeners failed.
  assert_equals(listenerErrors.length,0,listenerErrors.join(', '));
},'Event and pseudo-class timing for interest and loseinterest');
</script>