Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!doctype html>
<title>focus(options) - focusVisible</title>
<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>
<style>
div {
height: 10px;
border: 1px solid black;
}
</style>
<button>ABC</button>
<input>
<div id="contenteditable" contenteditable></div>
<div id="tabindex" tabindex=0></div>
<div id="not_focusable"></div>
<div id="reset_focus" tabindex=0></div>
<script>
const reset_focus = document.getElementById("reset_focus");
async function check_focus_visible(element, options, { shouldBeVisible, shouldBeFocused }) {
// Reset focus by clicking on a div, which should not show focus rings.
await test_driver.click(reset_focus);
assert_equals(document.activeElement, reset_focus, "Reset should be focused");
assert_true(reset_focus.matches(":focus"), "Clicking focusable div should match :focus");
assert_false(reset_focus.matches(":focus-visible"), "Clicking focusable div shouldn't match :focus-visible");
element.focus(options);
assert_equals(document.activeElement, shouldBeFocused ? element : reset_focus, "activeElement");
assert_equals(element.matches(":focus"), shouldBeFocused, ":focus");
assert_equals(element.matches(":focus-visible"), shouldBeVisible, ":focus-visible");
}
for (let selector of ["button", "input", "#contenteditable", "#tabindex", "#not_focusable"]) {
promise_test(async function() {
const takesKeyboardInput = selector == "#contenteditable" || selector == "input";
const shouldBeFocused = selector != "#not_focusable";
const element = document.querySelector(selector);
await check_focus_visible(element, {}, {
shouldBeVisible: takesKeyboardInput,
shouldBeFocused,
});
await check_focus_visible(element, { focusVisible: true }, {
shouldBeVisible: shouldBeFocused,
shouldBeFocused,
});
await check_focus_visible(element, { focusVisible: false }, {
shouldBeVisible: false,
shouldBeFocused,
});
}, "FocusOptions.focusVisible: " + selector);
}
</script>