diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /testing/web-platform/tests/custom-elements/microtasks-and-constructors.html | |
parent | Initial commit. (diff) | |
download | firefox-43a97878ce14b72f0981164f87f2e35e14151312.tar.xz firefox-43a97878ce14b72f0981164f87f2e35e14151312.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/custom-elements/microtasks-and-constructors.html')
-rw-r--r-- | testing/web-platform/tests/custom-elements/microtasks-and-constructors.html | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/testing/web-platform/tests/custom-elements/microtasks-and-constructors.html b/testing/web-platform/tests/custom-elements/microtasks-and-constructors.html new file mode 100644 index 0000000000..78d2cba42c --- /dev/null +++ b/testing/web-platform/tests/custom-elements/microtasks-and-constructors.html @@ -0,0 +1,123 @@ +<!DOCTYPE html> +<title>Custom elements: performing a microtask checkpoint after construction</title> +<meta name="author" title="Domenic Denicola" href="mailto:d@domenic.me"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#concept-upgrade-an-element"> +<link rel="help" href="https://dom.spec.whatwg.org/#concept-create-element"> +<link rel="help" href="https://github.com/whatwg/html/issues/2381"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<div id="log"></div> + +<x-upgrade></x-upgrade> + +<script> +"use strict"; +setup({ allow_uncaught_exception: true }); + +window.doMicrotasks = (callback1, callback2 = callback1) => { + Promise.resolve().then(callback1); + + const mo = new MutationObserver(callback2); + const node = document.createTextNode(""); + mo.observe(node, { characterData: true }); + node.data = "x"; +}; + +window.logMicrotasks = events => { + window.doMicrotasks(() => events.push("promise microtask"), + () => events.push("MutationObserver microtask")); +}; + +window.flushAsyncEvents = () => { + return new Promise(resolve => step_timeout(resolve, 0)); +}; + +window.x0Events = []; +customElements.define("x-0", class extends HTMLElement { + constructor() { + super(); + logMicrotasks(window.x0Events); + } +}); +</script> + +<x-0></x-0> + +<script> +"use strict"; + +test(() => { + assert_array_equals(window.x0Events, ["promise microtask", "MutationObserver microtask"]); +}, "Microtasks evaluate immediately when the stack is empty inside the parser"); + +customElements.define("x-bad", class extends HTMLElement { + constructor() { + super(); + doMicrotasks(() => this.setAttribute("attribute", "value")); + } +}); +</script> + +<x-bad></x-bad> + +<script> +"use strict"; + +test(() => { + const xBad = document.querySelector("x-bad"); + assert_false(xBad.hasAttribute("attribute"), "The attribute must not be present"); + assert_true(xBad instanceof HTMLUnknownElement, "The element must be a HTMLUnknownElement"); +}, "Microtasks evaluate immediately when the stack is empty inside the parser, causing the " + + "checks on no attributes to fail") + +promise_test(() => { + const events = []; + customElements.define("x-1", class extends HTMLElement { + constructor() { + super(); + logMicrotasks(events); + } + }); + + document.createElement("x-1"); + events.push("after"); + + return flushAsyncEvents().then(() => { + assert_array_equals(events, ["after", "promise microtask", "MutationObserver microtask"]); + }); +}, "Microtasks evaluate afterward when the stack is not empty using createElement()"); + +promise_test(() => { + const events = []; + class X2 extends HTMLElement { + constructor() { + super(); + logMicrotasks(events); + } + } + customElements.define("x-2", X2); + + new X2(); + events.push("after"); + + return flushAsyncEvents().then(() => { + assert_array_equals(events, ["after", "promise microtask", "MutationObserver microtask"]); + }); +}, "Microtasks evaluate afterward when the stack is not empty using the constructor"); + +promise_test(() => { + const events = []; + customElements.define("x-upgrade", class extends HTMLElement { + constructor() { + super(); + logMicrotasks(events); + } + }); + events.push("after"); + + return flushAsyncEvents().then(() => { + assert_array_equals(events, ["after", "promise microtask", "MutationObserver microtask"]); + }); +}, "Microtasks evaluate afterward when the stack is not empty due to upgrades"); +</script> |