| <!DOCTYPE html> |
| <title>DocumentAndElementEventHandlers / clipboard events for MathML</title> |
| <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#dom-and-javascript"/> |
| <link rel="help" href="https://html.spec.whatwg.org/multipage/webappapis.html#documentandelementeventhandlers"/> |
| <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 incorporate a functional DocumentAndElementEventHandlers interface" |
| /> |
| |
| <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> |