| <!DOCTYPE HTML> | |
| <meta charset="UTF-8"> | |
| <title>CSS Toggles: creation of toggles</title> | |
| <link rel="author" title="L. David Baron" href="https://dbaron.org/"> | |
| <link rel="author" title="Google" href="http://www.google.com/"> | |
| <link rel="help" href="https://tabatkins.github.io/css-toggle/#checked-pseudoclass"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="../support/parsing-testcommon.js"></script> | |
| <script src="support/toggle-helpers.js"></script> | |
| <body> | |
| <div id="container"></div> | |
| <script> | |
| test_valid_selector(":toggle(my-toggle)"); | |
| test_valid_selector(":toggle(my-toggle 0)"); | |
| test_valid_selector(":toggle(my-toggle 1)"); | |
| test_valid_selector(":toggle( my-toggle 1 )", ":toggle(my-toggle 1)"); | |
| test_valid_selector(":toggle(my-toggle named-state)"); | |
| test_valid_selector(":toggle( my-toggle named-state )", ":toggle(my-toggle named-state)"); | |
| test_invalid_selector(":toggle(my-toggle, 0)"); | |
| test_invalid_selector(":toggle(my-toggle, named-state)"); | |
| test_invalid_selector(":toggle(my-toggle named-state 0)"); | |
| // In these tests, the following class attributes lead to markup creation: | |
| // class=toggle, class=toggle-self, class=variant-toggle, | |
| // class=variant-toggle-self. These all lead to the creation of a toggle | |
| // called "markup-test". If "-self" is present then the toggle has narrow | |
| // scope (otherwise wide scope). If "variant-" is present then the toggle has | |
| // a value different from what the primary test assertions target (otherwise | |
| // it is what the test assertions target). | |
| // | |
| // The following class attributes lead to test assertions: | |
| // class=assert-match: Assert the :toggle() selector matches the toggle | |
| // class=assert-no-match: Assert the :toggle() selector does not match the | |
| // toggle. | |
| // class=assert-variant-match: Assert the :toggle() selector matches the | |
| // variant toggle. | |
| let scope_search_tests = [ | |
| ` | |
| <div> | |
| <div class="assert-no-match"></div> | |
| <div class="toggle assert-match"> | |
| <div class="assert-match"></div> | |
| </div> | |
| <div class="assert-match"></div> | |
| </div> | |
| <div class="assert-no-match"></div> | |
| `, | |
| ` | |
| <div> | |
| <div class="assert-no-match"></div> | |
| <div class="toggle-self assert-match"> | |
| <div class="assert-match"></div> | |
| </div> | |
| <div class="assert-no-match"></div> | |
| </div> | |
| <div class="assert-no-match"></div> | |
| `, | |
| ` | |
| <div class="toggle"></div> | |
| <div class="variant-toggle-self"> | |
| <div class="assert-variant-match"></div> | |
| </div> | |
| <div class="assert-match"></div> | |
| `, | |
| ` | |
| <div class="toggle"></div> | |
| <div class="assert-match"></div> | |
| <div class="variant-toggle"> | |
| <div class="assert-variant-match"></div> | |
| </div> | |
| <div class="assert-variant-match"></div> | |
| `, | |
| ]; | |
| for (let t of scope_search_tests) { | |
| promise_test(async function() { | |
| container.innerHTML = t; | |
| for (let e of container.querySelectorAll(".toggle")) { | |
| e.style.toggleRoot = "scope-test 10 at 3"; | |
| } | |
| for (let e of container.querySelectorAll(".toggle-self")) { | |
| e.style.toggleRoot = "scope-test 10 at 3 self"; | |
| } | |
| for (let e of container.querySelectorAll(".variant-toggle")) { | |
| e.style.toggleRoot = "scope-test 10 at 8"; | |
| } | |
| for (let e of container.querySelectorAll(".variant-toggle-self")) { | |
| e.style.toggleRoot = "scope-test 10 at 8 self"; | |
| } | |
| for (let e of container.querySelectorAll( | |
| ".toggle, .toggle-self, .variant-toggle, .variant-toggle-self")) { | |
| await wait_for_toggle_creation(e); | |
| } | |
| let assert_match = (e, selector) => { | |
| assert_true(e.matches(selector), | |
| `matches ${selector} (class ${e.className})`); | |
| }; | |
| let assert_nomatch = (e, selector) => { | |
| assert_false(e.matches(selector), | |
| `does not match ${selector} (class ${e.className})`); | |
| }; | |
| for (let e of container.querySelectorAll(".assert-match")) { | |
| assert_match(e, ":toggle(scope-test)"); | |
| assert_match(e, ":toggle(scope-test 3)"); | |
| assert_nomatch(e, ":toggle(scope-test 8)"); | |
| } | |
| for (let e of container.querySelectorAll(".assert-variant-match")) { | |
| assert_match(e, ":toggle(scope-test)"); | |
| assert_nomatch(e, ":toggle(scope-test 3)"); | |
| assert_match(e, ":toggle(scope-test 8)"); | |
| } | |
| for (let e of container.querySelectorAll(".assert-no-match")) { | |
| assert_nomatch(e, ":toggle(scope-test)"); | |
| assert_nomatch(e, ":toggle(scope-test 3)"); | |
| assert_nomatch(e, ":toggle(scope-test 8)"); | |
| } | |
| }, `scope search test for markup ${t}`); | |
| } | |
| let selector_match_tests = [ | |
| { | |
| specifier: [ "my-toggle 2 at 1" ], | |
| matching_selectors: [ | |
| ":toggle(my-toggle)", | |
| ":toggle(my-toggle 1)", | |
| ], | |
| not_matching_selectors: [ | |
| ":toggle(my-toggle 0)", | |
| ":toggle(my-toggle 2)", | |
| ":toggle(my-toggle named-state)", | |
| ], | |
| }, | |
| { | |
| specifier: [ "my-toggle 2 at 0" ], | |
| matching_selectors: [ | |
| ":toggle(my-toggle 0)", | |
| ], | |
| not_matching_selectors: [ | |
| ":toggle(my-toggle)", | |
| ":toggle(my-toggle 1)", | |
| ":toggle(my-toggle 2)", | |
| ":toggle(my-toggle named-state)", | |
| ], | |
| }, | |
| { | |
| specifier: [ "my-toggle 2 at named-state" ], | |
| matching_selectors: [ | |
| ":toggle(my-toggle)", | |
| ":toggle(my-toggle named-state)", | |
| ], | |
| not_matching_selectors: [ | |
| ":toggle(my-toggle 0)", | |
| ":toggle(my-toggle 1)", | |
| ":toggle(my-toggle 2)", | |
| ":toggle(my-toggle infinite)", | |
| ":toggle(my-toggle infinity)", | |
| ], | |
| }, | |
| { | |
| specifier: [ | |
| "my-toggle [a b c d] at 0", | |
| "my-toggle [a b c d] at a", | |
| ], | |
| matching_selectors: [ | |
| ":toggle(my-toggle 0)", | |
| ":toggle(my-toggle a)", | |
| ], | |
| not_matching_selectors: [ | |
| ":toggle(my-toggle)", | |
| ":toggle(my-toggle 1)", | |
| ":toggle(my-toggle 2)", | |
| ":toggle(my-toggle b)", | |
| ":toggle(my-toggle d)", | |
| ":toggle(my-toggle named-state)", | |
| ], | |
| }, | |
| { | |
| specifier: [ | |
| "my-toggle [a b c d] at 1", | |
| "my-toggle [a b c d] at b", | |
| ], | |
| matching_selectors: [ | |
| ":toggle(my-toggle)", | |
| ":toggle(my-toggle 1)", | |
| ":toggle(my-toggle b)", | |
| ], | |
| not_matching_selectors: [ | |
| ":toggle(my-toggle 0)", | |
| ":toggle(my-toggle a)", | |
| ":toggle(my-toggle 2)", | |
| ":toggle(my-toggle d)", | |
| ":toggle(my-toggle named-state)", | |
| ], | |
| }, | |
| { | |
| specifier: [ | |
| "my-toggle [a b c d] at unnamed-state", | |
| ], | |
| matching_selectors: [ | |
| ":toggle(my-toggle)", | |
| ":toggle(my-toggle unnamed-state)", | |
| ], | |
| not_matching_selectors: [ | |
| ":toggle(my-toggle 0)", | |
| ":toggle(my-toggle a)", | |
| ":toggle(my-toggle 1)", | |
| ":toggle(my-toggle c)", | |
| ":toggle(my-toggle 3)", | |
| ], | |
| }, | |
| ]; | |
| for (let t of selector_match_tests) { | |
| for (let specifier of t.specifier) { | |
| promise_test(async function() { | |
| container.innerHTML = `<div style="toggle-root: ${specifier}"></div>`; | |
| let e = container.firstChild; | |
| await wait_for_toggle_creation(e); | |
| for (let sel of t.matching_selectors) { | |
| assert_true(e.matches(sel), `${sel} matches`); | |
| } | |
| for (let sel of t.not_matching_selectors) { | |
| assert_false(e.matches(sel), `${sel} does not match`); | |
| } | |
| }, `:toggle() selector matching tests for ${specifier}`); | |
| } | |
| } | |
| </script> |