| <!DOCTYPE html> |
| <title>@scope - :visited and CSSOM</title> |
| <link rel="help" href="https://drafts.csswg.org/css-cascade-6/#scoped-styles"> |
| <link rel="help" href="https://drafts.csswg.org/selectors-4/#link"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <main id=main></main> |
| |
| <style> |
| :where(:visited, :link), :where(div) { |
| background-color: white; |
| } |
| </style> |
| |
| <!-- |
| Both #visited and #unvisited should appear to be in an unvisited state |
| through getComputedStyle. |
| --> |
| |
| <!-- :visited/:link in scoped selector --> |
| |
| <template id=test_link> |
| <style> |
| @scope (main) { |
| :link { background-color: green; } |
| } |
| </style> |
| <a id=visited href=""></a> |
| <a id=unvisited href="x"></a> |
| </template> |
| <script> |
| test((t) => { |
| main.append(test_link.content.cloneNode(true)); |
| t.add_cleanup(() => main.replaceChildren()); |
| assert_equals(getComputedStyle(visited).backgroundColor, 'rgb(0, 128, 0)'); |
| assert_equals(getComputedStyle(unvisited).backgroundColor, 'rgb(0, 128, 0)'); |
| }, ':link as scoped selector'); |
| </script> |
| |
| <template id=test_visited> |
| <style> |
| @scope (main) { |
| :visited { background-color: green; } |
| } |
| </style> |
| <a id=visited href=""></a> |
| <a id=unvisited href="x"></a> |
| </template> |
| <script> |
| test((t) => { |
| main.append(test_visited.content.cloneNode(true)); |
| t.add_cleanup(() => main.replaceChildren()); |
| assert_equals(getComputedStyle(visited).backgroundColor, 'rgb(255, 255, 255)'); |
| assert_equals(getComputedStyle(unvisited).backgroundColor, 'rgb(255, 255, 255)'); |
| }, ':visited as scoped selector'); |
| </script> |
| |
| <template id=test_not_link> |
| <style> |
| @scope (main) { |
| :not(:link) { background-color: green; } |
| } |
| </style> |
| <a id=visited href=""></a> |
| <a id=unvisited href="x"></a> |
| </template> |
| <script> |
| test((t) => { |
| main.append(test_not_link.content.cloneNode(true)); |
| t.add_cleanup(() => main.replaceChildren()); |
| assert_equals(getComputedStyle(visited).backgroundColor, 'rgb(255, 255, 255)'); |
| assert_equals(getComputedStyle(unvisited).backgroundColor, 'rgb(255, 255, 255)'); |
| }, ':not(:link) as scoped selector'); |
| </script> |
| |
| <template id=test_not_visited> |
| <style> |
| @scope (main) { |
| :not(:visited) { background-color: green; } |
| } |
| </style> |
| <a id=visited href=""></a> |
| <a id=unvisited href="x"></a> |
| </template> |
| <script> |
| test((t) => { |
| main.append(test_not_visited.content.cloneNode(true)); |
| t.add_cleanup(() => main.replaceChildren()); |
| assert_equals(getComputedStyle(visited).backgroundColor, 'rgb(0, 128, 0)'); |
| assert_equals(getComputedStyle(unvisited).backgroundColor, 'rgb(0, 128, 0)'); |
| }, ':not(:visited) as scoped selector'); |
| </script> |
| |
| <!-- :visited/:link in root --> |
| |
| <template id=test_link_root> |
| <style> |
| @scope (main :link) { |
| div { background-color: green; } |
| } |
| </style> |
| <a id=visited href=""><div></div></a> |
| <a id=unvisited href="x"><div></div></a> |
| </template> |
| <script> |
| test((t) => { |
| main.append(test_link_root.content.cloneNode(true)); |
| t.add_cleanup(() => main.replaceChildren()); |
| assert_equals(getComputedStyle(visited.firstElementChild).backgroundColor, 'rgb(0, 128, 0)'); |
| assert_equals(getComputedStyle(unvisited.firstElementChild).backgroundColor, 'rgb(0, 128, 0)'); |
| }, ':link as scoping root'); |
| </script> |
| |
| <template id=test_visited_root> |
| <style> |
| @scope (main :visited) { |
| div { background-color: green; } |
| } |
| </style> |
| <a id=visited href=""><div></div></a> |
| <a id=unvisited href="x"><div></div></a> |
| </template> |
| <script> |
| test((t) => { |
| main.append(test_visited_root.content.cloneNode(true)); |
| t.add_cleanup(() => main.replaceChildren()); |
| assert_equals(getComputedStyle(visited.firstElementChild).backgroundColor, 'rgb(255, 255, 255)'); |
| assert_equals(getComputedStyle(unvisited.firstElementChild).backgroundColor, 'rgb(255, 255, 255)'); |
| }, ':visited as scoping root'); |
| </script> |
| |
| <template id=test_not_visited_root> |
| <style> |
| @scope (main :not(:visited)) { |
| div { background-color: green; } |
| } |
| </style> |
| <a id=visited href=""><div></div></a> |
| <a id=unvisited href="x"><div></div></a> |
| </template> |
| <script> |
| test((t) => { |
| main.append(test_not_visited_root.content.cloneNode(true)); |
| t.add_cleanup(() => main.replaceChildren()); |
| assert_equals(getComputedStyle(visited.firstElementChild).backgroundColor, 'rgb(0, 128, 0)'); |
| assert_equals(getComputedStyle(unvisited.firstElementChild).backgroundColor, 'rgb(0, 128, 0)'); |
| }, ':not(:visited) as scoping root'); |
| </script> |
| |
| <template id=test_not_link_root> |
| <style> |
| @scope (main :not(:link)) { |
| div { background-color: green; } |
| } |
| </style> |
| <a id=visited href=""><div></div></a> |
| <a id=unvisited href="x"><div></div></a> |
| </template> |
| <script> |
| test((t) => { |
| main.append(test_not_link_root.content.cloneNode(true)); |
| t.add_cleanup(() => main.replaceChildren()); |
| assert_equals(getComputedStyle(visited.firstElementChild).backgroundColor, 'rgb(255, 255, 255)'); |
| assert_equals(getComputedStyle(unvisited.firstElementChild).backgroundColor, 'rgb(255, 255, 255)'); |
| }, ':not(:link) as scoping root'); |
| </script> |
| |
| <!-- :visited/:link in scoping root, with inner :scope --> |
| |
| <template id=test_link_root_scope> |
| <style> |
| @scope (main :link) { |
| :scope { background-color: green; } |
| } |
| </style> |
| <a id=visited href=""></a> |
| <a id=unvisited href="x"></a> |
| </template> |
| <script> |
| test((t) => { |
| main.append(test_link_root_scope.content.cloneNode(true)); |
| t.add_cleanup(() => main.replaceChildren()); |
| assert_equals(getComputedStyle(visited).backgroundColor, 'rgb(0, 128, 0)'); |
| assert_equals(getComputedStyle(unvisited).backgroundColor, 'rgb(0, 128, 0)'); |
| }, ':link as scoping root, :scope'); |
| </script> |
| |
| <template id=test_visited_root_scope> |
| <style> |
| @scope (main :visited) { |
| :scope { background-color: green; } |
| } |
| </style> |
| <a id=visited href=""></a> |
| <a id=unvisited href="x"></a> |
| </template> |
| <script> |
| test((t) => { |
| main.append(test_visited_root_scope.content.cloneNode(true)); |
| t.add_cleanup(() => main.replaceChildren()); |
| assert_equals(getComputedStyle(visited).backgroundColor, 'rgb(255, 255, 255)'); |
| assert_equals(getComputedStyle(unvisited).backgroundColor, 'rgb(255, 255, 255)'); |
| }, ':visited as scoping root, :scope'); |
| </script> |
| |
| <template id=test_not_visited_root_scope> |
| <style> |
| @scope (main :not(:visited)) { |
| :scope { background-color: green; } |
| } |
| </style> |
| <a id=visited href=""></a> |
| <a id=unvisited href="x"></a> |
| </template> |
| <script> |
| test((t) => { |
| main.append(test_not_visited_root_scope.content.cloneNode(true)); |
| t.add_cleanup(() => main.replaceChildren()); |
| assert_equals(getComputedStyle(visited).backgroundColor, 'rgb(0, 128, 0)'); |
| assert_equals(getComputedStyle(unvisited).backgroundColor, 'rgb(0, 128, 0)'); |
| }, ':not(:visited) as scoping root, :scope'); |
| </script> |
| |
| <template id=test_not_link_root_scope> |
| <style> |
| @scope (main :not(:link)) { |
| :scope { background-color: green; } |
| } |
| </style> |
| <a id=visited href=""></a> |
| <a id=unvisited href="x"></a> |
| </template> |
| <script> |
| test((t) => { |
| main.append(test_not_link_root_scope.content.cloneNode(true)); |
| t.add_cleanup(() => main.replaceChildren()); |
| assert_equals(getComputedStyle(visited).backgroundColor, 'rgb(255, 255, 255)'); |
| assert_equals(getComputedStyle(unvisited).backgroundColor, 'rgb(255, 255, 255)'); |
| }, ':not(:link) as scoping root, :scope'); |
| </script> |
| |
| <!-- :visited/:link in scoping limit --> |
| |
| <template id=test_link_scoping_limit> |
| <style> |
| @scope (main) to (:link) { |
| * { background-color: green; } |
| } |
| </style> |
| <a id=visited href=""></a> |
| <a id=unvisited href="x"></a> |
| </template> |
| <script> |
| test((t) => { |
| main.append(test_link_scoping_limit.content.cloneNode(true)); |
| t.add_cleanup(() => main.replaceChildren()); |
| assert_equals(getComputedStyle(visited).backgroundColor, 'rgb(255, 255, 255)'); |
| assert_equals(getComputedStyle(unvisited).backgroundColor, 'rgb(255, 255, 255)'); |
| }, ':link as scoping limit'); |
| </script> |
| |
| <template id=test_visited_scoping_limit> |
| <style> |
| @scope (main) to (:visited) { |
| * { background-color: green; } |
| } |
| </style> |
| <a id=visited href=""></a> |
| <a id=unvisited href="x"></a> |
| </template> |
| <script> |
| test((t) => { |
| main.append(test_visited_scoping_limit.content.cloneNode(true)); |
| t.add_cleanup(() => main.replaceChildren()); |
| assert_equals(getComputedStyle(visited).backgroundColor, 'rgb(0, 128, 0)'); |
| assert_equals(getComputedStyle(unvisited).backgroundColor, 'rgb(0, 128, 0)'); |
| }, ':visited as scoping limit'); |
| </script> |
| |
| <template id=test_not_link_scoping_limit> |
| <style> |
| @scope (main) to (:not(:link)) { |
| * { background-color: green; } |
| } |
| </style> |
| <a id=visited href=""></a> |
| <a id=unvisited href="x"></a> |
| </template> |
| <script> |
| test((t) => { |
| main.append(test_not_link_scoping_limit.content.cloneNode(true)); |
| t.add_cleanup(() => main.replaceChildren()); |
| assert_equals(getComputedStyle(visited).backgroundColor, 'rgb(0, 128, 0)'); |
| assert_equals(getComputedStyle(unvisited).backgroundColor, 'rgb(0, 128, 0)'); |
| }, ':not(:link) as scoping limit'); |
| </script> |
| |
| <template id=test_not_visited_scoping_limit> |
| <style> |
| @scope (main) to (:not(:visited)) { |
| * { background-color: green; } |
| } |
| </style> |
| <a id=visited href=""></a> |
| <a id=unvisited href="x"></a> |
| </template> |
| <script> |
| test((t) => { |
| main.append(test_not_visited_scoping_limit.content.cloneNode(true)); |
| t.add_cleanup(() => main.replaceChildren()); |
| assert_equals(getComputedStyle(visited).backgroundColor, 'rgb(255, 255, 255)'); |
| assert_equals(getComputedStyle(unvisited).backgroundColor, 'rgb(255, 255, 255)'); |
| }, ':not(:visited) as scoping limit'); |
| </script> |