summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html')
-rw-r--r--testing/web-platform/tests/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html188
1 files changed, 188 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html b/testing/web-platform/tests/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html
new file mode 100644
index 0000000000..47612e759e
--- /dev/null
+++ b/testing/web-platform/tests/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>dialog element: showModal()</title>
+<link rel="author" title="Denis Ah-Kang" href="mailto:denis@w3.org">
+<link rel=help href="https://html.spec.whatwg.org/multipage/#the-dialog-element">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<button id="b0">OK</button>
+<dialog id="d1">
+ <p>foobar</p>
+ <button id="b1">OK</button>
+</dialog>
+<dialog id="d2" open>
+ <p>foobar</p>
+ <button>OK</button>
+</dialog>
+<dialog id="d3">
+ <p>foobar</p>
+ <button id="b3">OK</button>
+</dialog>
+<dialog id="d4">
+ <p>foobar</p>
+ <button id="b4">OK</button>
+</dialog>
+<dialog id="d5">
+ <p>foobar</p>
+ <button id="b5">OK</button>
+</dialog>
+<dialog id="d6"></dialog>
+<dialog id="d7">
+ <input id="i71" value="foobar">
+ <input id="i72" value="foobar">
+ <button id="b7">OK</button>
+</dialog>
+<dialog id="d8">
+ <input id="i81" value="foobar">
+ <input id="i82" value="foobar" autofocus>
+ <button id="b8">OK</button>
+</dialog>
+<dialog id="d9"></dialog>
+<dialog id="d10"></dialog>
+<dialog id="d11"></dialog>
+<script>
+ var d1 = document.getElementById('d1'),
+ d2 = document.getElementById('d2'),
+ d3 = document.getElementById('d3'),
+ d4 = document.getElementById('d4'),
+ d5 = document.getElementById('d5'),
+ d6 = document.getElementById('d6'),
+ d7 = document.getElementById('d7'),
+ d8 = document.getElementById('d8'),
+ d9 = document.getElementById('d9'),
+ d10 = document.getElementById('d10'),
+ d11 = document.getElementById('d11'),
+ b0 = document.getElementById('b0'),
+ b1 = document.getElementById('b1'),
+ b3 = document.getElementById('b3'),
+ b4 = document.getElementById('b4'),
+ b5 = document.getElementById('b5');
+
+ test(function(){
+ assert_false(d1.open);
+ assert_false(d1.hasAttribute("open"));
+ assert_equals(getComputedStyle(d1).display, "none");
+ d1.showModal();
+ this.add_cleanup(function() { d1.close(); });
+ assert_true(d1.open);
+ assert_equals(d1.getAttribute("open"), "");
+ assert_equals(getComputedStyle(d1).display, "block");
+ assert_equals(document.activeElement, b1);
+ });
+
+ test(function(){
+ this.add_cleanup(function() { d2.close(); });
+ assert_throws_dom("INVALID_STATE_ERR", function() {
+ d2.showModal();
+ });
+ }, "showModal() on a <dialog> that already has an open attribute throws an InvalidStateError exception");
+
+ test(function(){
+ d9.showModal();
+ this.add_cleanup(function() { d9.close(); });
+ assert_true(d9.open);
+ d9.removeAttribute("open");
+ assert_false(d9.open);
+ d9.showModal();
+ assert_true(d9.open);
+ }, "showModal() on a <dialog> after initial showModal() and removing the open attribute");
+
+ test(function(){
+ var d = document.createElement("dialog");
+ this.add_cleanup(function() { d.close(); });
+ assert_throws_dom("INVALID_STATE_ERR", function() {
+ d.showModal();
+ });
+ }, "showModal() on a <dialog> not in a Document throws an InvalidStateError exception");
+
+ test(function(){
+ assert_false(d3.open);
+ assert_false(d4.open);
+ assert_false(d5.open);
+ d3.showModal();
+ this.add_cleanup(function() { d3.close(); });
+ d4.showModal();
+ this.add_cleanup(function() { d4.close(); });
+ d5.showModal();
+ this.add_cleanup(function() { d5.close(); });
+ assert_true(d3.open);
+ assert_true(d4.open);
+ assert_true(d5.open);
+ }, "when opening multiple dialogs, only the newest one is non-inert");
+
+ test(function(){
+ assert_false(d6.open);
+ d6.showModal();
+ this.add_cleanup(function() { d6.close(); });
+ assert_true(d6.open);
+ assert_equals(document.activeElement, d6);
+ }, "opening dialog without focusable children");
+
+ test(function(){
+ assert_false(d7.open);
+ d7.showModal();
+ this.add_cleanup(function() { d7.close(); });
+ assert_true(d7.open);
+ assert_equals(document.activeElement, document.getElementById("i71"));
+ }, "opening dialog with multiple focusable children");
+
+ test(function(){
+ assert_false(d8.open);
+ d8.showModal();
+ this.add_cleanup(function() { d8.close(); });
+ assert_true(d8.open);
+ assert_equals(document.activeElement, document.getElementById("i82"));
+ }, "opening dialog with multiple focusable children, one having the autofocus attribute");
+
+ test(function(){
+ assert_false(d10.open);
+ assert_false(d11.open);
+ d10.showModal();
+ this.add_cleanup(function() { d10.close(); });
+ d11.showModal();
+ this.add_cleanup(function() { d11.close(); });
+ var rect10 = d10.getBoundingClientRect();
+ var rect11 = d11.getBoundingClientRect();
+
+ // The two <dialog>s are both in top layer, with the same position/size.
+ assert_equals(rect10.left, rect11.left);
+ assert_equals(rect10.top, rect11.top);
+ assert_equals(rect10.width, rect11.width);
+ assert_equals(rect10.height, rect11.height);
+
+ var pointX = rect10.left + rect10.width / 2,
+ pointY = rect10.top + rect10.height / 2;
+ function topElement() {
+ return document.elementFromPoint(pointX, pointY);
+ }
+
+ // d11 was most recently openened, and thus on top.
+ assert_equals(topElement(), d11);
+
+ // Removing the open attribute and running through the showModal() algorithm
+ // again should promote d10 to the top.
+ d10.removeAttribute("open");
+ assert_equals(topElement(), d11);
+ d10.showModal();
+ assert_equals(topElement(), d10);
+
+ // Closing d11 with close() should cause d10 to be the topmost element.
+ d11.close();
+ assert_equals(topElement(), d10);
+ }, "when opening multiple dialogs, the most recently opened is rendered on top");
+
+ test(function() {
+ assert_false(d11.open);
+ d11.parentNode.removeChild(d11);
+ assert_throws_dom("INVALID_STATE_ERR", () => d11.showModal());
+
+ const doc = document.implementation.createHTMLDocument();
+ doc.body.appendChild(d11);
+ this.add_cleanup(() => document.body.append(d11));
+ assert_false(d11.open);
+ d11.showModal();
+ assert_true(d11.open);
+ this.add_cleanup(() => d11.close());
+ }, "Although the document is not attached to any pages, showModal() should execute as normal.");
+</script>