File: event-handler-all-global-events.html

package info (click to toggle)
thunderbird 1%3A91.13.0-1~deb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 2,953,400 kB
  • sloc: cpp: 6,084,049; javascript: 4,790,441; ansic: 3,341,496; python: 862,958; asm: 366,542; xml: 204,277; java: 152,477; sh: 111,436; makefile: 21,388; perl: 15,312; yacc: 4,583; objc: 3,026; lex: 1,720; exp: 762; pascal: 635; awk: 564; sql: 453; php: 436; lisp: 432; ruby: 99; sed: 69; csh: 45
file content (88 lines) | stat: -rw-r--r-- 3,676 bytes parent folder | download | duplicates (14)
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
<!DOCTYPE html>
<title>GlobalEventHandlers</title>
<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
<link rel="help" href="https://html.spec.whatwg.org/multipage/#globaleventhandlers">
<link rel="help" href="https://html.spec.whatwg.org/multipage/#event-handler-idl-attributes">
<link rel="help" href="https://html.spec.whatwg.org/multipage/#event-handler-content-attributes">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>

<script>
"use strict";

// The prefixed animation events are special; their event types are
// camel-case.
const prefixedAnimationAttributeToEventType = new Map([
  ["webkitanimationend", "webkitAnimationEnd"],
  ["webkitanimationiteration", "webkitAnimationIteration"],
  ["webkitanimationstart", "webkitAnimationStart"],
  ["webkittransitionend", "webkitTransitionEnd"],
]);

setup({ explicit_done: true });

fetch("/interfaces/html.idl").then(res => res.text()).then(htmlIDL => {
  const parsedHTMLIDL = WebIDL2.parse(htmlIDL);
  const globalEventHandlers = parsedHTMLIDL.find(idl => idl.name === "GlobalEventHandlers");

  // onerror is too special
  const names = globalEventHandlers.members.map(member => member.name).filter(name => name !== "onerror");

  for (const name of names) {
    const withoutOn = name.substring(2);

    test(() => {
      for (const location of [window, HTMLElement.prototype, SVGElement.prototype, Document.prototype]) {
        assert_true(location.hasOwnProperty(name),
          `${location.constructor.name} has an own property named "${name}"`);
      }
      assert_false(name in Element.prototype, `Element.prototype must not contain a "${name}" property`);
    }, `${name}: must be on the appropriate locations for GlobalEventHandlers`);

    test(() => {
      const htmlElement = document.createElement("span");
      const svgElement = document.createElementNS("http://www.w3.org/2000/svg", "g");

      for (var location of [window, htmlElement, svgElement, document]) {
        assert_equals(location[name], null,
          `The default value of the property is null for a ${location.constructor.name} instance`);
      }
    }, `${name}: the default value must be null`);

    test(() => {
      const el = document.createElement("div");
      el.setAttribute(name, `window.${name}Happened = true;`);
      const compiledHandler = el[name];

      assert_equals(typeof compiledHandler, "function", `The ${name} property must be a function`);
      compiledHandler();
      assert_true(window[name + "Happened"], "Calling the handler must run the code");
    }, `${name}: the content attribute must be compiled into a function as the corresponding property`);

    test(() => {
      const el = document.createElement("div");
      el.setAttribute(name, `window.${name}Happened2 = true;`);

      let eventType = withoutOn;
      if (prefixedAnimationAttributeToEventType.has(eventType)) {
        eventType = prefixedAnimationAttributeToEventType.get(eventType);
      }
      el.dispatchEvent(new Event(eventType));

      assert_true(window[name + "Happened2"], "Dispatching an event must run the code");
    }, `${name}: the content attribute must execute when an event is dispatched`);

    test(() => {
      const element = document.createElement("meta");
      element[name] = e => {
        assert_equals(e.currentTarget, element, "The event must be fired at the <meta> element");
      };

      element.dispatchEvent(new Event(withoutOn));
    }, `${name}: dispatching an Event at a <meta> element must trigger element.${name}`);
  }

  done();
});
</script>