| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>CSS Selectors Invalidation: attribute</title> |
| <link rel="help" href="https://drafts.csswg.org/selectors-4/#attribute-selectors"> |
| <meta name="assert" content="This tests that the attribute selectors are effective"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <style> |
| div { |
| color: gray; |
| } |
| |
| #a1[style] { |
| color: blue; |
| } |
| #a1[style] > #b1 { |
| color: green; |
| } |
| #a1[style] #c1 { |
| color: red; |
| } |
| #a1[style] + #d1 { |
| color: yellow; |
| } |
| |
| [id=a2] { |
| color: blue; |
| } |
| [id=a2] > #b2 { |
| color: green; |
| } |
| [id=a2] #c2 { |
| color: red; |
| } |
| [id=a2] + #d2 { |
| color: yellow; |
| } |
| |
| #a3[class~=q] { |
| color: blue; |
| } |
| #a3[class~=q] > #b3 { |
| color: green; |
| } |
| #a3[class~=q] #c3 { |
| color: red; |
| } |
| #a3[class~=q] + #d3 { |
| color: yellow; |
| } |
| |
| #a4[run|=one] { |
| color: blue; |
| } |
| #a4[run|=one] > #b4 { |
| color: green; |
| } |
| #a4[run|=one] #c4 { |
| color: red; |
| } |
| #a4[run|=one] + #d4 { |
| color: yellow; |
| } |
| |
| #a5 { |
| color: blue; |
| } |
| #a5 > #b5 { |
| color: green; |
| } |
| #a5 #c5 { |
| color: red; |
| } |
| #a5 + #d5 { |
| color: yellow; |
| } |
| |
| #a6.q { |
| color: blue; |
| } |
| #a6.q > #b6 { |
| color: green; |
| } |
| #a6.q #c6 { |
| color: red; |
| } |
| #a6.q + #d6 { |
| color: yellow; |
| } |
| |
| </style> |
| </head> |
| <body> |
| |
| <div id="a1"> |
| <div id="b1"> |
| <div id="c1"> |
| </div> |
| </div> |
| </div> |
| <div id="d1"> |
| </div> |
| |
| <div> |
| <div id="b2"> |
| <div id="c2"> |
| </div> |
| </div> |
| </div> |
| <div id="d2"> |
| </div> |
| |
| <div id="a3"> |
| <div id="b3"> |
| <div id="c3"> |
| </div> |
| </div> |
| </div> |
| <div id="d3"> |
| </div> |
| |
| <div id="a4"> |
| <div id="b4"> |
| <div id="c4"> |
| </div> |
| </div> |
| </div> |
| <div id="d4"> |
| </div> |
| |
| <div> |
| <div id="b5"> |
| <div id="c5"> |
| </div> |
| </div> |
| </div> |
| <div id="d5"> |
| </div> |
| |
| <div id="a6"> |
| <div id="b6"> |
| <div id="c6"> |
| </div> |
| </div> |
| </div> |
| <div id="d6"> |
| </div> |
| |
| <script> |
| const gray = "rgb(128, 128, 128)"; |
| const blue = "rgb(0, 0, 255)"; |
| const green = "rgb(0, 128, 0)"; |
| const red = "rgb(255, 0, 0)"; |
| const yellow = "rgb(255, 255, 0)"; |
| |
| function assertGray(a, b, c, d) { |
| assert_equals(getComputedStyle(a).color, gray); |
| assert_equals(getComputedStyle(b).color, gray); |
| assert_equals(getComputedStyle(c).color, gray); |
| assert_equals(getComputedStyle(d).color, gray); |
| } |
| |
| function assertColorful(a, b, c, d) { |
| assert_equals(getComputedStyle(a).color, blue); |
| assert_equals(getComputedStyle(b).color, green); |
| assert_equals(getComputedStyle(c).color, red); |
| assert_equals(getComputedStyle(d).color, yellow); |
| } |
| |
| test(() => { |
| assertGray(a1, b1, c1, d1); |
| a1.style.visibility = "visible"; |
| assertColorful(a1, b1, c1, d1); |
| a1.removeAttribute('style'); |
| assertGray(a1, b1, c1, d1); |
| }, "[att] selector is effective"); |
| |
| test(() => { |
| const a2 = b2.parentElement; |
| assertGray(a2, b2, c2, d2); |
| a2.id = 'x-a2'; |
| assertGray(a2, b2, c2, d2); |
| a2.id = 'a2'; |
| assertColorful(a2, b2, c2, d2); |
| a2.id = 'a2-y'; |
| assertGray(a2, b2, c2, d2); |
| }, "[att=val] selector is effective"); |
| |
| test(() => { |
| assertGray(a3, b3, c3, d3); |
| a3.setAttribute('class', 'p q r'); |
| assertColorful(a3, b3, c3, d3); |
| a3.setAttribute('class', 'q-r'); |
| assertGray(a3, b3, c3, d3); |
| }, "[att~=val] selector is effective"); |
| |
| test(() => { |
| assertGray(a4, b4, c4, d4); |
| a4.setAttribute('run', 'one'); |
| assertColorful(a4, b4, c4, d4); |
| a4.setAttribute('run', 'one two three'); |
| assertGray(a4, b4, c4, d4); |
| a4.setAttribute('run', 'one-two-three'); |
| assertColorful(a4, b4, c4, d4); |
| a4.setAttribute('run', 'zero-one'); |
| assertGray(a4, b4, c4, d4); |
| }, "[att|=val] selector is effective"); |
| |
| test(() => { |
| const a5 = b5.parentElement; |
| assertGray(a5, b5, c5, d5); |
| a5.setAttribute('id', 'x-a5'); |
| assertGray(a5, b5, c5, d5); |
| a5.setAttribute('id', 'a5'); |
| assertColorful(a5, b5, c5, d5); |
| a5.setAttribute('id', 'a5-y'); |
| assertGray(a5, b5, c5, d5); |
| }, "#id selector is effective"); |
| |
| test(() => { |
| assertGray(a6, b6, c6, d6); |
| a6.classList.add('p'); |
| a6.classList.add('q'); |
| a6.classList.add('r'); |
| assertColorful(a6, b6, c6, d6); |
| a6.classList.remove('q'); |
| a6.classList.add('q-r'); |
| assertGray(a6, b6, c6, d6); |
| }, ".class selector is effective"); |
| |
| </script> |
| </body> |
| </html> |