| <!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> |