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 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
<!doctype html>
<meta charset="utf-8" />
<meta name="author" title="Luke Warlow" href="mailto:luke@warlow.dev" />
<meta name="timeout" content="long" />
<link rel="help" href="https://open-ui.org/components/invokers.explainer/" />
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="resources/invoker-utils.js"></script>
<details id="invokee">Details Contents</details>
<button id="invokerbutton" commandfor="invokee" command="open"></button>
<script>
function resetState() {
invokerbutton.removeAttribute("command");
invokee.removeAttribute("open");
}
// Open actions
[
"toggle",
"open",
/* test case sensitivity */
"tOgGlE",
"oPeN",
].forEach((command) => {
promise_test(
async function (t) {
t.add_cleanup(resetState);
invokerbutton.command = command;
assert_false(invokee.matches("[open]"), "invokee does not match [open]");
await clickOn(invokerbutton);
assert_true(invokee.matches("[open]"), "invokee matches [open]");
},
`invoking (as ${command}) closed details opens`,
);
promise_test(
async function (t) {
t.add_cleanup(resetState);
invokerbutton.command = command;
assert_false(invokee.matches("[open]"), "invokee does not match [open]");
invokee.addEventListener("command", (e) => e.preventDefault(), {
once: true,
});
await clickOn(invokerbutton);
t.add_cleanup(() => invokee.removeAttribute("open"));
assert_false(invokee.matches("[open]"), "invokee still does not match [open]");
},
`invoking (as ${command}) closed details with preventDefault does not open`,
);
});
// Close actions
[
"toggle",
"close",
/* test case sensitivity */
"tOgGlE",
"cLoSe",
].forEach((command) => {
promise_test(
async function (t) {
t.add_cleanup(resetState);
invokerbutton.command = command;
invokee.setAttribute("open", "");
assert_true(invokee.matches("[open]"));
await clickOn(invokerbutton);
assert_false(invokee.matches("[open]"));
},
`invoking (as ${command}) open details closes`,
);
promise_test(
async function (t) {
t.add_cleanup(resetState);
invokerbutton.command = command;
invokee.setAttribute("open", "");
invokerbutton.setAttribute("command", "toggle");
invokee.addEventListener("command", (e) => e.preventDefault(), {
once: true,
});
assert_true(invokee.matches("[open]"));
await clickOn(invokerbutton);
assert_true(invokee.matches("[open]"));
},
`invoking (as ${command}) open details with prevent default closes`,
);
});
// toggle specific
promise_test(async function (t) {
t.add_cleanup(resetState);
invokerbutton.command = "toggle";
invokee.addEventListener(
"command",
(e) => {
invokee.setAttribute("open", "");
},
{
once: true,
},
);
assert_false(invokee.matches("[open]"));
await clickOn(invokerbutton);
assert_false(invokee.matches("[open]"));
}, "invoking (as toggle) closed details where event listener opens leads to a closed details");
// open specific
promise_test(async function (t) {
t.add_cleanup(resetState);
invokerbutton.command = "open";
invokee.setAttribute("open", "");
assert_true(invokee.matches("[open]"));
await clickOn(invokerbutton);
assert_true(invokee.matches("[open]"));
}, "invoking open details with open command is noop");
// close
promise_test(async function (t) {
t.add_cleanup(resetState);
invokerbutton.command = "close";
assert_false(invokee.matches("[open]"));
await clickOn(invokerbutton);
assert_false(invokee.matches("[open]"));
}, "invoking closed details with close command is noop");
</script>
|