| 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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 name = nullAtom; | 334 name = nullAtom; |
| 335 namespacePrefix = nullAtom; | 335 namespacePrefix = nullAtom; |
| 336 return false; | 336 return false; |
| 337 } | 337 } |
| 338 | 338 |
| 339 return true; | 339 return true; |
| 340 } | 340 } |
| 341 | 341 |
| 342 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumeId( | 342 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumeId( |
| 343 CSSParserTokenRange& range) { | 343 CSSParserTokenRange& range) { |
| 344 ASSERT(range.peek().type() == HashToken); | 344 DCHECK_EQ(range.peek().type(), HashToken); |
| 345 if (range.peek().getHashTokenType() != HashTokenId) | 345 if (range.peek().getHashTokenType() != HashTokenId) |
| 346 return nullptr; | 346 return nullptr; |
| 347 std::unique_ptr<CSSParserSelector> selector = CSSParserSelector::create(); | 347 std::unique_ptr<CSSParserSelector> selector = CSSParserSelector::create(); |
| 348 selector->setMatch(CSSSelector::Id); | 348 selector->setMatch(CSSSelector::Id); |
| 349 AtomicString value = range.consume().value().toAtomicString(); | 349 AtomicString value = range.consume().value().toAtomicString(); |
| 350 selector->setValue(value, isQuirksModeBehavior(m_context->matchMode())); | 350 selector->setValue(value, isQuirksModeBehavior(m_context->matchMode())); |
| 351 return selector; | 351 return selector; |
| 352 } | 352 } |
| 353 | 353 |
| 354 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumeClass( | 354 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumeClass( |
| 355 CSSParserTokenRange& range) { | 355 CSSParserTokenRange& range) { |
| 356 ASSERT(range.peek().type() == DelimiterToken); | 356 DCHECK_EQ(range.peek().type(), DelimiterToken); |
| 357 ASSERT(range.peek().delimiter() == '.'); | 357 DCHECK_EQ(range.peek().delimiter(), '.'); |
| 358 range.consume(); | 358 range.consume(); |
| 359 if (range.peek().type() != IdentToken) | 359 if (range.peek().type() != IdentToken) |
| 360 return nullptr; | 360 return nullptr; |
| 361 std::unique_ptr<CSSParserSelector> selector = CSSParserSelector::create(); | 361 std::unique_ptr<CSSParserSelector> selector = CSSParserSelector::create(); |
| 362 selector->setMatch(CSSSelector::Class); | 362 selector->setMatch(CSSSelector::Class); |
| 363 AtomicString value = range.consume().value().toAtomicString(); | 363 AtomicString value = range.consume().value().toAtomicString(); |
| 364 selector->setValue(value, isQuirksModeBehavior(m_context->matchMode())); | 364 selector->setValue(value, isQuirksModeBehavior(m_context->matchMode())); |
| 365 return selector; | 365 return selector; |
| 366 } | 366 } |
| 367 | 367 |
| 368 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumeAttribute( | 368 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumeAttribute( |
| 369 CSSParserTokenRange& range) { | 369 CSSParserTokenRange& range) { |
| 370 ASSERT(range.peek().type() == LeftBracketToken); | 370 DCHECK_EQ(range.peek().type(), LeftBracketToken); |
| 371 CSSParserTokenRange block = range.consumeBlock(); | 371 CSSParserTokenRange block = range.consumeBlock(); |
| 372 block.consumeWhitespace(); | 372 block.consumeWhitespace(); |
| 373 | 373 |
| 374 AtomicString namespacePrefix; | 374 AtomicString namespacePrefix; |
| 375 AtomicString attributeName; | 375 AtomicString attributeName; |
| 376 if (!consumeName(block, attributeName, namespacePrefix)) | 376 if (!consumeName(block, attributeName, namespacePrefix)) |
| 377 return nullptr; | 377 return nullptr; |
| 378 if (attributeName == starAtom) | 378 if (attributeName == starAtom) |
| 379 return nullptr; | 379 return nullptr; |
| 380 block.consumeWhitespace(); | 380 block.consumeWhitespace(); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 408 selector->setValue(attributeValue.value().toAtomicString()); | 408 selector->setValue(attributeValue.value().toAtomicString()); |
| 409 selector->setAttribute(qualifiedName, consumeAttributeFlags(block)); | 409 selector->setAttribute(qualifiedName, consumeAttributeFlags(block)); |
| 410 | 410 |
| 411 if (!block.atEnd()) | 411 if (!block.atEnd()) |
| 412 return nullptr; | 412 return nullptr; |
| 413 return selector; | 413 return selector; |
| 414 } | 414 } |
| 415 | 415 |
| 416 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumePseudo( | 416 std::unique_ptr<CSSParserSelector> CSSSelectorParser::consumePseudo( |
| 417 CSSParserTokenRange& range) { | 417 CSSParserTokenRange& range) { |
| 418 ASSERT(range.peek().type() == ColonToken); | 418 DCHECK_EQ(range.peek().type(), ColonToken); |
| 419 range.consume(); | 419 range.consume(); |
| 420 | 420 |
| 421 int colons = 1; | 421 int colons = 1; |
| 422 if (range.peek().type() == ColonToken) { | 422 if (range.peek().type() == ColonToken) { |
| 423 range.consume(); | 423 range.consume(); |
| 424 colons++; | 424 colons++; |
| 425 } | 425 } |
| 426 | 426 |
| 427 const CSSParserToken& token = range.peek(); | 427 const CSSParserToken& token = range.peek(); |
| 428 if (token.type() != IdentToken && token.type() != FunctionToken) | 428 if (token.type() != IdentToken && token.type() != FunctionToken) |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 885 } | 885 } |
| 886 if (current->relation() == CSSSelector::IndirectAdjacent) | 886 if (current->relation() == CSSSelector::IndirectAdjacent) |
| 887 m_context->count(UseCounter::CSSSelectorIndirectAdjacent); | 887 m_context->count(UseCounter::CSSSelectorIndirectAdjacent); |
| 888 if (current->selectorList()) | 888 if (current->selectorList()) |
| 889 recordUsageAndDeprecations(*current->selectorList()); | 889 recordUsageAndDeprecations(*current->selectorList()); |
| 890 } | 890 } |
| 891 } | 891 } |
| 892 } | 892 } |
| 893 | 893 |
| 894 } // namespace blink | 894 } // namespace blink |
| OLD | NEW |