summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/css/css-cascade/scope-visited.html
blob: 392aeb667b201072ff1a70aec745f75019cff54b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
<!DOCTYPE html>
<title>@scope - :visited</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">
<link rel="match" href="scope-visited-ref.html">

<!-- Sub-tests use ShadowDOM to stay isolated from eachother. -->

<!-- :visited via :scope in subject -->
<div>
  <template shadowrootmode=open>
    <a id=visited href="">
      Visited <span>Span</span>
    </a>
    <style>
      /* The visited background-color magically gets the alpha of the
         unvisited color, which by default is rgba(0, 0, 0, 0). Set alpha to
         255 so that visited colors also gets this alpha. */
      * { background-color: rgba(255, 255, 255, 255); }

      @scope (:visited) {
        :scope { background-color: coral; }
      }
      @scope (:link) {
        :scope { background-color: skyblue; } /* Does not match. */
      }
    </style>
  </template>
</div>

<!-- :link via :scope in subject -->
<div>
  <template shadowrootmode=open>
    <a id=unvisited href="x">
      Unvisited <span>Span</span>
    </a>
    <style>
      * { background-color: rgba(255, 255, 255, 255); }

      @scope (:link) {
        :scope { background-color: skyblue; }
      }
      @scope (:visited) {
        :scope { background-color: coral; } /* Does not match. */
      }
    </style>
  </template>
</div>

<!-- :visited via :scope in non-subject -->
<div>
  <template shadowrootmode=open>
    <a id=visited href="">
      Visited <span>Span</span>
    </a>
    <style>
      * { background-color: rgba(255, 255, 255, 255); }

      @scope (:visited) {
        :scope span { background-color: coral; }
      }
      @scope (:link) {
        :scope span { background-color: skyblue; } /* Does not match. */
      }
    </style>
  </template>
</div>

<!-- :link via :scope in non-subject -->
<div>
  <template shadowrootmode=open>
    <a id=unvisited href="x">
      Unvisited <span>Span</span>
    </a>
    <style>
      * { background-color: rgba(255, 255, 255, 255); }

      @scope (:link) {
        :scope span { background-color: skyblue; }
      }
      @scope (:visited) {
        :scope span { background-color: coral; } /* Does not match. */
      }
    </style>
  </template>
</div>

<!-- :visited in scope-end -->
<div>
  <template shadowrootmode=open>
    <main>
      Main
      <a id=visited href="">
        Visited <span>Span</span>
      </a>
    </main>
    <style>
      * { background-color: rgba(255, 255, 255, 255); }

      @scope (main) to (:visited) {
        /* Does not match, because #visited is not in scope. */
        :scope :visited { background-color: coral; }
      }
      @scope (main) {
        :scope :link { background-color: skyblue; } /* Also doesn't match. */
      }
    </style>
  </template>
</div>

<!-- :visited in scope-end, unvisited link -->
<div>
  <template shadowrootmode=open>
    <main>
      Main
      <a id=unvisited href="x">
        Unvisited <span>Span</span>
      </a>
    </main>
    <style>
      * { background-color: rgba(255, 255, 255, 255); }

      @scope (main) to (:visited) {
        /* Does not match, because #unvisited does not match it. */
        :scope :visited { background-color: coral; }
      }
      @scope (main) {
        /* Should match, because the scope-end selector (:visited) does not
           match anything, hence we are in-scope. */
        :scope :link { background-color: skyblue; }
      }
    </style>
  </template>
</div>

<!-- :link in scope-end -->
<div>
  <template shadowrootmode=open>
    <main>
      Main
    <a id=unvisited href="x">
      Unvisited <span>Span</span>
    </a>
    </main>
    <style>
      * { background-color: rgba(255, 255, 255, 255); }

      @scope (main) to (:link) {
        /* Does not match, because #unvisited is not in scope. */
        :scope :link { background-color: skyblue; }
      }
      @scope (main) {
        :scope :visited { background-color: coral; } /* Also doesn't match. */
      }
    </style>
  </template>
</div>

<!-- :link in scope-end, visited link -->
<div>
  <template shadowrootmode=open>
    <main>
      Main
      <a id=visited href="">
        Visited <span>Span</span>
      </a>
    </main>
    <style>
      * { background-color: rgba(255, 255, 255, 255); }

      @scope (main) to (:link) {
        /* Does not match, because #visited does not match it. */
        :scope :link { background-color: skyblue; }
      }
      @scope (main) {
        /* Should match, because the scope-end selector (:visited) does not
           match anything, hence we are in-scope. */
        :scope :visited { background-color: coral; }
      }
    </style>
  </template>
</div>

<!-- :visited within :visited -->
<div id=visited_in_visited>
  <template shadowrootmode=open>
    <main>
      Main
      <a href="">
        Visited1
      </a>
    </main>
    <style>
      * { background-color: rgba(255, 255, 255, 255); }

      /* Should not match since visited-link matching stops applying
         once a link is seen. */
      @scope (:visited) {
        :scope > :visited { background-color: coral; }
      }
    </style>
  </template>
</div>

<script>
  window.onload = () => {
    // Insert the inner :visited link with JS, since the parser
    // can't produce this.
    let outer_a = visited_in_visited.shadowRoot.querySelector('main > a');
    let inner_a = document.createElement('a');
    inner_a.setAttribute('href', '');
    inner_a.textContent = 'Visited2';
    outer_a.append(inner_a);
  }
</script>