OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/css/parser/CSSSelectorParser.h" | 5 #include "core/css/parser/CSSSelectorParser.h" |
6 | 6 |
7 #include "core/css/CSSSelectorList.h" | 7 #include "core/css/CSSSelectorList.h" |
8 #include "core/css/StyleSheetContents.h" | 8 #include "core/css/StyleSheetContents.h" |
9 #include "core/css/parser/CSSParserContext.h" | 9 #include "core/css/parser/CSSParserContext.h" |
10 #include "core/css/parser/CSSTokenizer.h" | 10 #include "core/css/parser/CSSTokenizer.h" |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 | 98 |
99 std::pair<int, int> ab; | 99 std::pair<int, int> ab; |
100 CSSTokenizer tokenizer(test_case); | 100 CSSTokenizer tokenizer(test_case); |
101 CSSParserTokenRange range = tokenizer.TokenRange(); | 101 CSSParserTokenRange range = tokenizer.TokenRange(); |
102 bool passed = CSSSelectorParser::ConsumeANPlusB(range, ab); | 102 bool passed = CSSSelectorParser::ConsumeANPlusB(range, ab); |
103 EXPECT_FALSE(passed); | 103 EXPECT_FALSE(passed); |
104 } | 104 } |
105 } | 105 } |
106 | 106 |
107 TEST(CSSSelectorParserTest, ShadowDomPseudoInCompound) { | 107 TEST(CSSSelectorParserTest, ShadowDomPseudoInCompound) { |
108 const char* test_cases[][2] = {{"::shadow", "::shadow"}, | 108 const char* test_cases[][2] = {{"::content", "::content"}, |
109 {".a::shadow", ".a::shadow"}, | |
110 {"::content", "::content"}, | |
111 {".a::content", ".a::content"}, | 109 {".a::content", ".a::content"}, |
112 {"::content.a", "::content.a"}, | 110 {"::content.a", "::content.a"}, |
113 {"::content.a.b", "::content.a.b"}, | 111 {"::content.a.b", "::content.a.b"}, |
114 {".a::content.b", ".a::content.b"}, | 112 {".a::content.b", ".a::content.b"}, |
115 {"::content:not(#id)", "::content:not(#id)"}}; | 113 {"::content:not(#id)", "::content:not(#id)"}}; |
116 | 114 |
117 for (auto test_case : test_cases) { | 115 for (auto test_case : test_cases) { |
118 SCOPED_TRACE(test_case[0]); | 116 SCOPED_TRACE(test_case[0]); |
119 CSSTokenizer tokenizer(test_case[0]); | 117 CSSTokenizer tokenizer(test_case[0]); |
120 CSSParserTokenRange range = tokenizer.TokenRange(); | 118 CSSParserTokenRange range = tokenizer.TokenRange(); |
121 CSSSelectorList list = CSSSelectorParser::ParseSelector( | 119 CSSSelectorList list = CSSSelectorParser::ParseSelector( |
122 range, CSSParserContext::Create(kHTMLStandardMode), nullptr); | 120 range, CSSParserContext::Create(kHTMLStandardMode), nullptr); |
123 EXPECT_STREQ(test_case[1], list.SelectorsText().Ascii().data()); | 121 EXPECT_STREQ(test_case[1], list.SelectorsText().Ascii().data()); |
124 } | 122 } |
125 } | 123 } |
126 | 124 |
127 TEST(CSSSelectorParserTest, PseudoElementsInCompoundLists) { | 125 TEST(CSSSelectorParserTest, PseudoElementsInCompoundLists) { |
128 const char* test_cases[] = {":not(::before)", | 126 const char* test_cases[] = {":not(::before)", |
129 ":not(::content)", | 127 ":not(::content)", |
130 ":not(::shadow)", | |
131 ":host(::before)", | 128 ":host(::before)", |
132 ":host(::content)", | 129 ":host(::content)", |
133 ":host(::shadow)", | |
134 ":host-context(::before)", | 130 ":host-context(::before)", |
135 ":host-context(::content)", | 131 ":host-context(::content)", |
136 ":host-context(::shadow)", | |
137 ":-webkit-any(::after, ::before)", | 132 ":-webkit-any(::after, ::before)", |
138 ":-webkit-any(::content, span)", | 133 ":-webkit-any(::content, span)"}; |
139 ":-webkit-any(div, ::shadow)"}; | |
140 | 134 |
141 for (auto test_case : test_cases) { | 135 for (auto test_case : test_cases) { |
142 CSSTokenizer tokenizer(test_case); | 136 CSSTokenizer tokenizer(test_case); |
143 CSSParserTokenRange range = tokenizer.TokenRange(); | 137 CSSParserTokenRange range = tokenizer.TokenRange(); |
144 CSSSelectorList list = CSSSelectorParser::ParseSelector( | 138 CSSSelectorList list = CSSSelectorParser::ParseSelector( |
145 range, CSSParserContext::Create(kHTMLStandardMode), nullptr); | 139 range, CSSParserContext::Create(kHTMLStandardMode), nullptr); |
146 EXPECT_FALSE(list.IsValid()); | 140 EXPECT_FALSE(list.IsValid()); |
147 } | 141 } |
148 } | 142 } |
149 | 143 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 for (auto test_case : test_cases) { | 188 for (auto test_case : test_cases) { |
195 CSSTokenizer tokenizer(test_case); | 189 CSSTokenizer tokenizer(test_case); |
196 CSSParserTokenRange range = tokenizer.TokenRange(); | 190 CSSParserTokenRange range = tokenizer.TokenRange(); |
197 CSSSelectorList list = CSSSelectorParser::ParseSelector( | 191 CSSSelectorList list = CSSSelectorParser::ParseSelector( |
198 range, CSSParserContext::Create(kUASheetMode), nullptr); | 192 range, CSSParserContext::Create(kUASheetMode), nullptr); |
199 EXPECT_TRUE(list.IsValid()); | 193 EXPECT_TRUE(list.IsValid()); |
200 } | 194 } |
201 } | 195 } |
202 | 196 |
203 TEST(CSSSelectorParserTest, ValidPseudoElementInNonRightmostCompound) { | 197 TEST(CSSSelectorParserTest, ValidPseudoElementInNonRightmostCompound) { |
204 const char* test_cases[] = {"::content *", "::shadow *", | 198 const char* test_cases[] = {"::content *", "::content div::before"}; |
205 "::content div::before", | |
206 "::shadow ::first-letter"}; | |
207 | 199 |
208 for (auto test_case : test_cases) { | 200 for (auto test_case : test_cases) { |
209 CSSTokenizer tokenizer(test_case); | 201 CSSTokenizer tokenizer(test_case); |
210 CSSParserTokenRange range = tokenizer.TokenRange(); | 202 CSSParserTokenRange range = tokenizer.TokenRange(); |
211 CSSSelectorList list = CSSSelectorParser::ParseSelector( | 203 CSSSelectorList list = CSSSelectorParser::ParseSelector( |
212 range, CSSParserContext::Create(kHTMLStandardMode), nullptr); | 204 range, CSSParserContext::Create(kHTMLStandardMode), nullptr); |
213 EXPECT_TRUE(list.IsValid()); | 205 EXPECT_TRUE(list.IsValid()); |
214 } | 206 } |
215 } | 207 } |
216 | 208 |
(...skipping 23 matching lines...) Expand all Loading... |
240 CSSSelectorList list = | 232 CSSSelectorList list = |
241 CSSSelectorParser::ParseSelector(range, context, sheet); | 233 CSSSelectorParser::ParseSelector(range, context, sheet); |
242 EXPECT_FALSE(list.IsValid()); | 234 EXPECT_FALSE(list.IsValid()); |
243 } | 235 } |
244 } | 236 } |
245 | 237 |
246 TEST(CSSSelectorParserTest, SerializedUniversal) { | 238 TEST(CSSSelectorParserTest, SerializedUniversal) { |
247 const char* test_cases[][2] = { | 239 const char* test_cases[][2] = { |
248 {"*::-webkit-volume-slider", "::-webkit-volume-slider"}, | 240 {"*::-webkit-volume-slider", "::-webkit-volume-slider"}, |
249 {"*::cue(i)", "::cue(i)"}, | 241 {"*::cue(i)", "::cue(i)"}, |
250 {"*::shadow", "::shadow"}, | |
251 {"*:host-context(.x)", "*:host-context(.x)"}, | 242 {"*:host-context(.x)", "*:host-context(.x)"}, |
252 {"*:host", "*:host"}, | 243 {"*:host", "*:host"}, |
253 {"|*::-webkit-volume-slider", "|*::-webkit-volume-slider"}, | 244 {"|*::-webkit-volume-slider", "|*::-webkit-volume-slider"}, |
254 {"|*::cue(i)", "|*::cue(i)"}, | 245 {"|*::cue(i)", "|*::cue(i)"}, |
255 {"|*::shadow", "|*::shadow"}, | |
256 {"*|*::-webkit-volume-slider", "::-webkit-volume-slider"}, | 246 {"*|*::-webkit-volume-slider", "::-webkit-volume-slider"}, |
257 {"*|*::cue(i)", "::cue(i)"}, | 247 {"*|*::cue(i)", "::cue(i)"}, |
258 {"*|*::shadow", "::shadow"}, | |
259 {"ns|*::-webkit-volume-slider", "ns|*::-webkit-volume-slider"}, | 248 {"ns|*::-webkit-volume-slider", "ns|*::-webkit-volume-slider"}, |
260 {"ns|*::cue(i)", "ns|*::cue(i)"}, | 249 {"ns|*::cue(i)", "ns|*::cue(i)"}}; |
261 {"ns|*::shadow", "ns|*::shadow"}}; | |
262 | 250 |
263 CSSParserContext* context = CSSParserContext::Create(kHTMLStandardMode); | 251 CSSParserContext* context = CSSParserContext::Create(kHTMLStandardMode); |
264 StyleSheetContents* sheet = StyleSheetContents::Create(context); | 252 StyleSheetContents* sheet = StyleSheetContents::Create(context); |
265 sheet->ParserAddNamespace("ns", "http://ns.org"); | 253 sheet->ParserAddNamespace("ns", "http://ns.org"); |
266 | 254 |
267 for (auto test_case : test_cases) { | 255 for (auto test_case : test_cases) { |
268 SCOPED_TRACE(test_case[0]); | 256 SCOPED_TRACE(test_case[0]); |
269 CSSTokenizer tokenizer(test_case[0]); | 257 CSSTokenizer tokenizer(test_case[0]); |
270 CSSParserTokenRange range = tokenizer.TokenRange(); | 258 CSSParserTokenRange range = tokenizer.TokenRange(); |
271 CSSSelectorList list = | 259 CSSSelectorList list = |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 SCOPED_TRACE(test_case); | 329 SCOPED_TRACE(test_case); |
342 CSSTokenizer tokenizer(test_case); | 330 CSSTokenizer tokenizer(test_case); |
343 CSSParserTokenRange range = tokenizer.TokenRange(); | 331 CSSParserTokenRange range = tokenizer.TokenRange(); |
344 CSSSelectorList list = | 332 CSSSelectorList list = |
345 CSSSelectorParser::ParseSelector(range, context, sheet); | 333 CSSSelectorParser::ParseSelector(range, context, sheet); |
346 EXPECT_FALSE(list.IsValid()); | 334 EXPECT_FALSE(list.IsValid()); |
347 } | 335 } |
348 } | 336 } |
349 | 337 |
350 } // namespace blink | 338 } // namespace blink |
OLD | NEW |