| <!DOCTYPE html> |
| <html id="html"> |
| <head> |
| <meta charset="utf-8"> |
| <title>Selectors Level 4: focus-within</title> |
| <link rel="author" title="Benjamin Poulain" href="mailto:bpoulain@apple.com"> |
| <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> |
| <link rel="help" href="https://drafts.csswg.org/selectors-4/#focus-within-pseudo"> |
| <meta name="assert" content="Checks the basic features of the ':focus-within' pseudo class."> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <style> |
| * { |
| background-color: white; |
| } |
| :focus-within { |
| background-color: rgb(1, 2, 3); |
| } |
| </style> |
| </head> |
| <body id="body"> |
| <div id="test"> |
| <div id="container1"> |
| <div id="sibling1"></div> |
| <div id="sibling2"> |
| <input id="target1"> |
| </div> |
| <div id="sibling3"></div> |
| </div> |
| <div id="container2"> |
| <div id="sibling4"></div> |
| <div id="sibling5"> |
| <textarea id="target2"></textarea> |
| </div> |
| <div id="sibling6"></div> |
| </div> |
| </div> |
| <div id=log></div> |
| |
| <script> |
| "use strict"; |
| |
| function elementsStyledWithFocusWithinSelector() { |
| let elements = []; |
| for (let element of document.querySelectorAll("*")) { |
| if (getComputedStyle(element).backgroundColor === 'rgb(1, 2, 3)') { |
| elements.push(element.id); |
| } |
| } |
| return elements; |
| } |
| |
| function elementsMatchingFocusWithinSelector() { |
| let elements = []; |
| for (let element of document.querySelectorAll(":focus-within")) { |
| elements.push(element.id); |
| } |
| return elements; |
| } |
| |
| test( |
| function() { |
| assert_array_equals(elementsStyledWithFocusWithinSelector(), []); |
| assert_array_equals(elementsMatchingFocusWithinSelector(), []); |
| }, "Initial State"); |
| |
| var container1 = document.getElementById("container1"); |
| var container2 = document.getElementById("container2"); |
| var target1 = document.getElementById("target1"); |
| var target2 = document.getElementById("target2"); |
| |
| test( |
| function() { |
| target1.focus(); |
| assert_array_equals(elementsStyledWithFocusWithinSelector(), ["html", "body", "test", "container1", "sibling2", "target1"]); |
| assert_array_equals(elementsMatchingFocusWithinSelector(), ["html", "body", "test", "container1", "sibling2", "target1"]); |
| }, "Focus 'target1'"); |
| |
| test( |
| function() { |
| target2.focus(); |
| assert_array_equals(elementsStyledWithFocusWithinSelector(), ["html", "body", "test", "container2", "sibling5", "target2"]); |
| assert_array_equals(elementsMatchingFocusWithinSelector(), ["html", "body", "test", "container2", "sibling5", "target2"]); |
| }, "Focus 'target2'"); |
| |
| test( |
| function() { |
| target1.focus(); |
| assert_array_equals(elementsStyledWithFocusWithinSelector(), ["html", "body", "test", "container1", "sibling2", "target1"]); |
| assert_array_equals(elementsMatchingFocusWithinSelector(), ["html", "body", "test", "container1", "sibling2", "target1"]); |
| }, "Focus 'target1' again"); |
| |
| test( |
| function() { |
| target2.focus(); |
| assert_array_equals(elementsStyledWithFocusWithinSelector(), ["html", "body", "test", "container2", "sibling5", "target2"]); |
| assert_array_equals(elementsMatchingFocusWithinSelector(), ["html", "body", "test", "container2", "sibling5", "target2"]); |
| }, "Focus 'target2' again"); |
| |
| test( |
| function() { |
| target1.focus(); |
| assert_array_equals(elementsStyledWithFocusWithinSelector(), ["html", "body", "test", "container1", "sibling2", "target1"]); |
| assert_array_equals(elementsMatchingFocusWithinSelector(), ["html", "body", "test", "container1", "sibling2", "target1"]); |
| }, "Focus 'target1' once again"); |
| |
| test( |
| function() { |
| container1.parentElement.removeChild(container1); |
| assert_array_equals(elementsStyledWithFocusWithinSelector(), []); |
| assert_array_equals(elementsMatchingFocusWithinSelector(), []); |
| assert_equals(container1.querySelectorAll(":focus-within").length, 0); |
| assert_false(target1.matches(":focus")); |
| assert_false(target2.matches(":focus")); |
| }, "Detach 'container1' from the document"); |
| |
| test( |
| function() { |
| target1.focus(); |
| assert_array_equals(elementsStyledWithFocusWithinSelector(), []); |
| assert_array_equals(elementsMatchingFocusWithinSelector(), []); |
| assert_equals(container1.querySelectorAll(":focus-within").length, 0); |
| assert_false(target1.matches(":focus")); |
| assert_false(target2.matches(":focus")); |
| }, "Try to focus 'target1'"); |
| |
| test( |
| function() { |
| target2.focus(); |
| assert_array_equals(elementsStyledWithFocusWithinSelector(), ["html", "body", "test", "container2", "sibling5", "target2"]); |
| assert_array_equals(elementsMatchingFocusWithinSelector(), ["html", "body", "test", "container2", "sibling5", "target2"]); |
| }, "Focus 'target2' once again"); |
| |
| test( |
| function() { |
| container2.appendChild(container1); |
| assert_array_equals(elementsStyledWithFocusWithinSelector(), ["html", "body", "test", "container2", "sibling5", "target2"]); |
| assert_array_equals(elementsMatchingFocusWithinSelector(), ["html", "body", "test", "container2", "sibling5", "target2"]); |
| }, "Attach 'container1' in 'container2'"); |
| |
| test( |
| function() { |
| target1.focus(); |
| assert_array_equals(elementsStyledWithFocusWithinSelector(), ["html", "body", "test", "container2", "container1", "sibling2", "target1"]); |
| assert_array_equals(elementsMatchingFocusWithinSelector(), ["html", "body", "test", "container2", "container1", "sibling2", "target1"]); |
| }, "Focus 'target1' for the last time"); |
| |
| test( |
| function() { |
| container2.appendChild(target1); |
| assert_array_equals(elementsStyledWithFocusWithinSelector(), []); |
| assert_array_equals(elementsMatchingFocusWithinSelector(), []); |
| assert_false(target1.matches(":focus")); |
| assert_false(target2.matches(":focus")); |
| }, "Move 'target1' in 'container2'"); |
| </script> |
| </body> |
| </html> |