| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/frame/Deprecation.h" | 10 #include "core/frame/Deprecation.h" |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 const CSSParserSelector& simpleSelector, | 205 const CSSParserSelector& simpleSelector, |
| 206 CSSSelector::PseudoType compoundPseudoElement) { | 206 CSSSelector::PseudoType compoundPseudoElement) { |
| 207 if (compoundPseudoElement == CSSSelector::PseudoUnknown) | 207 if (compoundPseudoElement == CSSSelector::PseudoUnknown) |
| 208 return true; | 208 return true; |
| 209 if (compoundPseudoElement == CSSSelector::PseudoContent) | 209 if (compoundPseudoElement == CSSSelector::PseudoContent) |
| 210 return simpleSelector.match() != CSSSelector::PseudoElement; | 210 return simpleSelector.match() != CSSSelector::PseudoElement; |
| 211 if (simpleSelector.match() != CSSSelector::PseudoClass) | 211 if (simpleSelector.match() != CSSSelector::PseudoClass) |
| 212 return false; | 212 return false; |
| 213 CSSSelector::PseudoType pseudo = simpleSelector.pseudoType(); | 213 CSSSelector::PseudoType pseudo = simpleSelector.pseudoType(); |
| 214 if (pseudo == CSSSelector::PseudoNot) { | 214 if (pseudo == CSSSelector::PseudoNot) { |
| 215 ASSERT(simpleSelector.selectorList()); | 215 DCHECK(simpleSelector.selectorList()); |
| 216 ASSERT(simpleSelector.selectorList()->first()); | 216 DCHECK(simpleSelector.selectorList()->first()); |
| 217 ASSERT(!simpleSelector.selectorList()->first()->tagHistory()); | 217 DCHECK(!simpleSelector.selectorList()->first()->tagHistory()); |
| 218 pseudo = simpleSelector.selectorList()->first()->getPseudoType(); | 218 pseudo = simpleSelector.selectorList()->first()->getPseudoType(); |
| 219 } | 219 } |
| 220 return isPseudoClassValidAfterPseudoElement(pseudo, compoundPseudoElement); | 220 return isPseudoClassValidAfterPseudoElement(pseudo, compoundPseudoElement); |
| 221 } | 221 } |
| 222 | 222 |
| 223 } // namespace | 223 } // namespace |
| 224 | 224 |
| 225 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumeCompoundSelector( | 225 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumeCompoundSelector( |
| 226 CSSParserTokenRange& range) { | 226 CSSParserTokenRange& range) { |
| 227 std::unique_ptr<CSSParserSelector> compoundSelector; | 227 std::unique_ptr<CSSParserSelector> compoundSelector; |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 name = nullAtom; | 339 name = nullAtom; |
| 340 namespacePrefix = nullAtom; | 340 namespacePrefix = nullAtom; |
| 341 return false; | 341 return false; |
| 342 } | 342 } |
| 343 | 343 |
| 344 return true; | 344 return true; |
| 345 } | 345 } |
| 346 | 346 |
| 347 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumeId( | 347 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumeId( |
| 348 CSSParserTokenRange& range) { | 348 CSSParserTokenRange& range) { |
| 349 ASSERT(range.peek().type() == HashToken); | 349 DCHECK_EQ(range.peek().type(), HashToken); |
| 350 if (range.peek().getHashTokenType() != HashTokenId) | 350 if (range.peek().getHashTokenType() != HashTokenId) |
| 351 return nullptr; | 351 return nullptr; |
| 352 std::unique_ptr<CSSParserSelector> selector = CSSParserSelector::create(); | 352 std::unique_ptr<CSSParserSelector> selector = CSSParserSelector::create(); |
| 353 selector->setMatch(CSSSelector::Id); | 353 selector->setMatch(CSSSelector::Id); |
| 354 AtomicString value = range.consume().value().toAtomicString(); | 354 AtomicString value = range.consume().value().toAtomicString(); |
| 355 selector->setValue(value, isQuirksModeBehavior(m_context->matchMode())); | 355 selector->setValue(value, isQuirksModeBehavior(m_context->matchMode())); |
| 356 return selector; | 356 return selector; |
| 357 } | 357 } |
| 358 | 358 |
| 359 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumeClass( | 359 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumeClass( |
| 360 CSSParserTokenRange& range) { | 360 CSSParserTokenRange& range) { |
| 361 ASSERT(range.peek().type() == DelimiterToken); | 361 DCHECK_EQ(range.peek().type(), DelimiterToken); |
| 362 ASSERT(range.peek().delimiter() == '.'); | 362 DCHECK_EQ(range.peek().delimiter(), '.'); |
| 363 range.consume(); | 363 range.consume(); |
| 364 if (range.peek().type() != IdentToken) | 364 if (range.peek().type() != IdentToken) |
| 365 return nullptr; | 365 return nullptr; |
| 366 std::unique_ptr<CSSParserSelector> selector = CSSParserSelector::create(); | 366 std::unique_ptr<CSSParserSelector> selector = CSSParserSelector::create(); |
| 367 selector->setMatch(CSSSelector::Class); | 367 selector->setMatch(CSSSelector::Class); |
| 368 AtomicString value = range.consume().value().toAtomicString(); | 368 AtomicString value = range.consume().value().toAtomicString(); |
| 369 selector->setValue(value, isQuirksModeBehavior(m_context->matchMode())); | 369 selector->setValue(value, isQuirksModeBehavior(m_context->matchMode())); |
| 370 return selector; | 370 return selector; |
| 371 } | 371 } |
| 372 | 372 |
| 373 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumeAttribute( | 373 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumeAttribute( |
| 374 CSSParserTokenRange& range) { | 374 CSSParserTokenRange& range) { |
| 375 ASSERT(range.peek().type() == LeftBracketToken); | 375 DCHECK_EQ(range.peek().type(), LeftBracketToken); |
| 376 CSSParserTokenRange block = range.consumeBlock(); | 376 CSSParserTokenRange block = range.consumeBlock(); |
| 377 block.consumeWhitespace(); | 377 block.consumeWhitespace(); |
| 378 | 378 |
| 379 AtomicString namespacePrefix; | 379 AtomicString namespacePrefix; |
| 380 AtomicString attributeName; | 380 AtomicString attributeName; |
| 381 if (!consumeName(block, attributeName, namespacePrefix)) | 381 if (!consumeName(block, attributeName, namespacePrefix)) |
| 382 return nullptr; | 382 return nullptr; |
| 383 if (attributeName == starAtom) | 383 if (attributeName == starAtom) |
| 384 return nullptr; | 384 return nullptr; |
| 385 block.consumeWhitespace(); | 385 block.consumeWhitespace(); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 413 selector->setValue(attributeValue.value().toAtomicString()); | 413 selector->setValue(attributeValue.value().toAtomicString()); |
| 414 selector->setAttribute(qualifiedName, consumeAttributeFlags(block)); | 414 selector->setAttribute(qualifiedName, consumeAttributeFlags(block)); |
| 415 | 415 |
| 416 if (!block.atEnd()) | 416 if (!block.atEnd()) |
| 417 return nullptr; | 417 return nullptr; |
| 418 return selector; | 418 return selector; |
| 419 } | 419 } |
| 420 | 420 |
| 421 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumePseudo( | 421 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumePseudo( |
| 422 CSSParserTokenRange& range) { | 422 CSSParserTokenRange& range) { |
| 423 ASSERT(range.peek().type() == ColonToken); | 423 DCHECK_EQ(range.peek().type(), ColonToken); |
| 424 range.consume(); | 424 range.consume(); |
| 425 | 425 |
| 426 int colons = 1; | 426 int colons = 1; |
| 427 if (range.peek().type() == ColonToken) { | 427 if (range.peek().type() == ColonToken) { |
| 428 range.consume(); | 428 range.consume(); |
| 429 colons++; | 429 colons++; |
| 430 } | 430 } |
| 431 | 431 |
| 432 const CSSParserToken& token = range.peek(); | 432 const CSSParserToken& token = range.peek(); |
| 433 if (token.type() != IdentToken && token.type() != FunctionToken) | 433 if (token.type() != IdentToken && token.type() != FunctionToken) |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 890 } | 890 } |
| 891 if (current->relation() == CSSSelector::IndirectAdjacent) | 891 if (current->relation() == CSSSelector::IndirectAdjacent) |
| 892 m_context->count(UseCounter::CSSSelectorIndirectAdjacent); | 892 m_context->count(UseCounter::CSSSelectorIndirectAdjacent); |
| 893 if (current->selectorList()) | 893 if (current->selectorList()) |
| 894 recordUsageAndDeprecations(*current->selectorList()); | 894 recordUsageAndDeprecations(*current->selectorList()); |
| 895 } | 895 } |
| 896 } | 896 } |
| 897 } | 897 } |
| 898 | 898 |
| 899 } // namespace blink | 899 } // namespace blink |
| OLD | NEW |