Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!doctype html>
<meta charset="utf-8" />
<meta name="author" title="Luke Warlow" href="mailto:luke@warlow.dev" />
<meta name="timeout" content="long" />
<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>