| Index: third_party/WebKit/Source/core/css/parser/CSSSelectorParserTest.cpp
|
| diff --git a/third_party/WebKit/Source/core/css/parser/CSSSelectorParserTest.cpp b/third_party/WebKit/Source/core/css/parser/CSSSelectorParserTest.cpp
|
| index 8f4f59abf5192f960390a6d0c968b06a4426206d..eda8efffeade6539327ad6e8cc91563fdbd92e02 100644
|
| --- a/third_party/WebKit/Source/core/css/parser/CSSSelectorParserTest.cpp
|
| +++ b/third_party/WebKit/Source/core/css/parser/CSSSelectorParserTest.cpp
|
| @@ -70,16 +70,16 @@ TEST(CSSSelectorParserTest, ValidANPlusB)
|
| {"-N - 88", -1, -88},
|
| };
|
|
|
| - for (unsigned i = 0; i < WTF_ARRAY_LENGTH(testCases); ++i) {
|
| - SCOPED_TRACE(testCases[i].input);
|
| + for (auto testCase : testCases) {
|
| + SCOPED_TRACE(testCase.input);
|
|
|
| std::pair<int, int> ab;
|
| - CSSTokenizer::Scope scope(testCases[i].input);
|
| + CSSTokenizer::Scope scope(testCase.input);
|
| CSSParserTokenRange range = scope.tokenRange();
|
| bool passed = CSSSelectorParser::consumeANPlusB(range, ab);
|
| EXPECT_TRUE(passed);
|
| - EXPECT_EQ(ab.first, testCases[i].a);
|
| - EXPECT_EQ(ab.second, testCases[i].b);
|
| + EXPECT_EQ(ab.first, testCase.a);
|
| + EXPECT_EQ(ab.second, testCase.b);
|
| }
|
| }
|
|
|
| @@ -101,11 +101,11 @@ TEST(CSSSelectorParserTest, InvalidANPlusB)
|
| "10n + -5",
|
| };
|
|
|
| - for (unsigned i = 0; i < WTF_ARRAY_LENGTH(testCases); ++i) {
|
| - SCOPED_TRACE(testCases[i]);
|
| + for (auto testCase : testCases) {
|
| + SCOPED_TRACE(testCase);
|
|
|
| std::pair<int, int> ab;
|
| - CSSTokenizer::Scope scope(testCases[i]);
|
| + CSSTokenizer::Scope scope(testCase);
|
| CSSParserTokenRange range = scope.tokenRange();
|
| bool passed = CSSSelectorParser::consumeANPlusB(range, ab);
|
| EXPECT_FALSE(passed);
|
| @@ -119,17 +119,14 @@ TEST(CSSSelectorParserTest, ShadowDomPseudoInCompound)
|
| { ".a::shadow", ".a::shadow" },
|
| { "::content", "::content" },
|
| { ".a::content", ".a::content" },
|
| - { "::content.a", "::content.a" },
|
| - { "::content.a.b", "::content.a.b" },
|
| - { ".a::content.b", ".a::content.b" },
|
| };
|
|
|
| - for (unsigned i = 0; i < WTF_ARRAY_LENGTH(testCases); ++i) {
|
| - SCOPED_TRACE(testCases[i][0]);
|
| - CSSTokenizer::Scope scope(testCases[i][0]);
|
| + for (auto testCase : testCases) {
|
| + SCOPED_TRACE(testCase[0]);
|
| + CSSTokenizer::Scope scope(testCase[0]);
|
| CSSParserTokenRange range = scope.tokenRange();
|
| CSSSelectorList list = CSSSelectorParser::parseSelector(range, CSSParserContext(HTMLStandardMode, nullptr), nullptr);
|
| - EXPECT_STREQ(testCases[i][1], list.selectorsText().ascii().data());
|
| + EXPECT_STREQ(testCase[1], list.selectorsText().ascii().data());
|
| }
|
| }
|
|
|
| @@ -158,4 +155,58 @@ TEST(CSSSelectorParserTest, PseudoElementsInCompoundLists)
|
| }
|
| }
|
|
|
| +TEST(CSSSelectorParserTest, ValidSimpleAfterPseudoElementInCompound)
|
| +{
|
| + const char* testCases[] = {
|
| + "::-webkit-volume-slider:hover",
|
| + "::selection:window-inactive",
|
| + "::-webkit-scrollbar:disabled",
|
| + "::-webkit-volume-slider:not(:hover)",
|
| + "::-webkit-scrollbar:not(:horizontal)"
|
| + };
|
| +
|
| + for (auto testCase : testCases) {
|
| + CSSTokenizer::Scope scope(testCase);
|
| + CSSParserTokenRange range = scope.tokenRange();
|
| + CSSSelectorList list = CSSSelectorParser::parseSelector(range, CSSParserContext(HTMLStandardMode, nullptr), nullptr);
|
| + EXPECT_TRUE(list.isValid());
|
| + }
|
| +}
|
| +
|
| +TEST(CSSSelectorParserTest, InvalidSimpleAfterPseudoElementInCompound)
|
| +{
|
| + const char* testCases[] = {
|
| + "::before#id",
|
| + "::after:hover",
|
| + ".class::content::before",
|
| + "::shadow.class",
|
| + "::selection:window-inactive::before",
|
| + "::-webkit-volume-slider.class",
|
| + "::content.a",
|
| + "::content.a.b",
|
| + ".a::content.b",
|
| + "::before:not(.a)",
|
| + "::shadow:not(::after)",
|
| + "::content:not(#id)",
|
| + "::-webkit-scrollbar:vertical:not(:first-child)",
|
| + "video::-webkit-media-text-track-region-container.scrolling"
|
| + };
|
| +
|
| + for (auto testCase : testCases) {
|
| + CSSTokenizer::Scope scope(testCase);
|
| + CSSParserTokenRange range = scope.tokenRange();
|
| + CSSSelectorList list = CSSSelectorParser::parseSelector(range, CSSParserContext(HTMLStandardMode, nullptr), nullptr);
|
| + EXPECT_FALSE(list.isValid());
|
| + }
|
| +}
|
| +
|
| +TEST(CSSSelectorParserTest, WorkaroundForInvalidCustomPseudoInUAStyle)
|
| +{
|
| + // See crbug.com/578131
|
| + CSSTokenizer::Scope scope("video::-webkit-media-text-track-region-container.scrolling");
|
| + CSSParserTokenRange range = scope.tokenRange();
|
| + CSSSelectorList list = CSSSelectorParser::parseSelector(range, CSSParserContext(UASheetMode, nullptr), nullptr);
|
| + EXPECT_TRUE(list.isValid());
|
| +}
|
| +
|
| } // namespace
|
|
|