File: clipboard-event-handlers.tentative.html

package info (click to toggle)
thunderbird 1%3A115.16.0esr-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 3,476,252 kB
  • sloc: cpp: 6,972,150; javascript: 5,209,211; ansic: 3,507,222; python: 1,137,609; asm: 432,531; xml: 205,149; java: 175,761; sh: 116,485; makefile: 22,152; perl: 13,971; objc: 12,561; yacc: 4,583; pascal: 2,840; lex: 1,720; ruby: 1,075; exp: 762; sql: 666; awk: 580; php: 436; lisp: 430; sed: 70; csh: 10
file content (119 lines) | stat: -rw-r--r-- 4,184 bytes parent folder | download | duplicates (19)
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
119
<!DOCTYPE html>
<title>clipboard event handlers for MathML</title>
<link rel="help" href="https://w3c.github.io/mathml-core/#dom-and-javascript"/>
<link rel="help" href="https://html.spec.whatwg.org/multipage/webappapis.html#globaleventhandlers"/>
<link rel="help" href="https://w3c.github.io/clipboard-apis/#clipboard-event-copy"/>
<link rel="help" href="https://w3c.github.io/clipboard-apis/#clipboard-event-cut"/>
<link rel="help" href="https://w3c.github.io/clipboard-apis/#clipboard-event-paste"/>
<meta
  name="assert"
  content="MathMLElements incorporates oncopy / oncut / onpaste event handlers"
/>

<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<math
  oncopy="window.copyHappened1 = true"
  oncut="window.cutHappened1 = true"
  onpaste="window.pasteHappened1 = true"
>
  <mi>E</mi>
</math>
<script>
  const EVENTS = ["copy", "cut", "paste"];
  const el = document.querySelector("math");

  function dispatchEventTest(name) {
    const mathEl = document.createElementNS(
        "http://www.w3.org/1998/Math/MathML",
        "math"
    );
    test(() => {
      let target = undefined;
      mathEl[`on${name}`] = (e) => { target = e.currentTarget; }
      const event = new ClipboardEvent(name, {
        bubbles: true,
        cancellable: true
      });
      mathEl.dispatchEvent(event);
      assert_equals(target, mathEl, "The event must be fired at the <math> element");
    }, `${name}: dispatching an Event at a <math> element must trigger element.on${name}`);
  }

  function evaluatedHandlerTest(name) {
    const handlerName = "on" + name;

    test(() => {
      const compiledHandler = el[handlerName];

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

    test(() => {
        const mathEl = document.createElementNS(
            "http://www.w3.org/1998/Math/MathML",
            "math"
        );
        assert_equals(mathEl[handlerName], null, `The ${handlerName} property must be null (no attribute)`);

        mathEl.setAttribute(handlerName, `window.${handlerName}Happened2 = true;`);
        const compiledHandler = mathEl[handlerName];
        assert_equals(
            typeof compiledHandler,
            "function",
            `The ${handlerName} property must be a function (set attribute)`
        );
        compiledHandler();
        assert_true(
            window[`${handlerName}Happened2`],
            "Calling the handler must run the code (set attribute)"
        );

        window[`${handlerName}Happened2`] = false;
        const clonedMathEl = mathEl.cloneNode(true);
        const clonedCompiledHandler = clonedMathEl[handlerName];
        assert_equals(
            typeof clonedCompiledHandler,
            "function",
            `The ${handlerName} property must be a function (clone node)`
        );
        clonedCompiledHandler();
        assert_true(
            window[`${handlerName}Happened2`],
            "Calling the handler must run the code (clone node)"
        );

        mathEl.setAttribute(handlerName, `window.${handlerName}Happened3 = true;`);
        const newCompiledHandler = mathEl[handlerName];
        assert_equals(
            typeof newCompiledHandler,
            "function",
            `The ${handlerName} property must be a function (modify attribute)`
        );
        newCompiledHandler();
        assert_true(
            window[`${handlerName}Happened3`],
            "Calling the handler must run the code (modify attribute)"
        );

        mathEl.removeAttribute(handlerName);
        assert_equals(mathEl[handlerName], null, `The ${handlerName} property must be null (remove attribute)`);
    }, `${handlerName}: dynamic changes on the attribute`);

  }

  EVENTS.forEach(name => {
    dispatchEventTest(name);
    evaluatedHandlerTest(name);
  });
</script>