Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Side by Side Diff: Source/core/css/parser/CSSSelectorParser.cpp

Issue 1322543004: CSSStyleSheet::insertRule should respect the default namespace (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "config.h" 5 #include "config.h"
6 #include "core/css/parser/CSSSelectorParser.h" 6 #include "core/css/parser/CSSSelectorParser.h"
7 7
8 #include "core/css/CSSSelectorList.h" 8 #include "core/css/CSSSelectorList.h"
9 #include "core/css/StyleSheetContents.h" 9 #include "core/css/StyleSheetContents.h"
10 #include "core/frame/UseCounter.h" 10 #include "core/frame/UseCounter.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 break; 43 break;
44 } 44 }
45 if (feature != UseCounter::NumberOfFeatures) 45 if (feature != UseCounter::NumberOfFeatures)
46 context.useCounter()->count(feature); 46 context.useCounter()->count(feature);
47 if (current->selectorList()) 47 if (current->selectorList())
48 recordSelectorStats(context, *current->selectorList()); 48 recordSelectorStats(context, *current->selectorList());
49 } 49 }
50 } 50 }
51 } 51 }
52 52
53 void CSSSelectorParser::parseSelector(CSSParserTokenRange range, const CSSParser Context& context, const AtomicString& defaultNamespace, StyleSheetContents* styl eSheet, CSSSelectorList& output) 53 void CSSSelectorParser::parseSelector(CSSParserTokenRange range, const CSSParser Context& context, StyleSheetContents* styleSheet, CSSSelectorList& output)
54 { 54 {
55 CSSSelectorParser parser(context, defaultNamespace, styleSheet); 55 CSSSelectorParser parser(context, styleSheet);
56 range.consumeWhitespace(); 56 range.consumeWhitespace();
57 CSSSelectorList result; 57 CSSSelectorList result;
58 parser.consumeComplexSelectorList(range, result); 58 parser.consumeComplexSelectorList(range, result);
59 if (range.atEnd()) { 59 if (range.atEnd()) {
60 output.adopt(result); 60 output.adopt(result);
61 recordSelectorStats(context, output); 61 recordSelectorStats(context, output);
62 } 62 }
63 ASSERT(!(output.isValid() && parser.m_failedParsing)); 63 ASSERT(!(output.isValid() && parser.m_failedParsing));
64 } 64 }
65 65
66 CSSSelectorParser::CSSSelectorParser(const CSSParserContext& context, const Atom icString& defaultNamespace, StyleSheetContents* styleSheet) 66 CSSSelectorParser::CSSSelectorParser(const CSSParserContext& context, StyleSheet Contents* styleSheet)
67 : m_context(context) 67 : m_context(context)
68 , m_defaultNamespace(defaultNamespace)
69 , m_styleSheet(styleSheet) 68 , m_styleSheet(styleSheet)
70 , m_failedParsing(false) 69 , m_failedParsing(false)
71 { 70 {
72 } 71 }
73 72
74 void CSSSelectorParser::consumeComplexSelectorList(CSSParserTokenRange& range, C SSSelectorList& output) 73 void CSSSelectorParser::consumeComplexSelectorList(CSSParserTokenRange& range, C SSSelectorList& output)
75 { 74 {
76 Vector<OwnPtr<CSSParserSelector>> selectorList; 75 Vector<OwnPtr<CSSParserSelector>> selectorList;
77 OwnPtr<CSSParserSelector> selector = consumeComplexSelector(range); 76 OwnPtr<CSSParserSelector> selector = consumeComplexSelector(range);
78 if (!selector) 77 if (!selector)
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 while (OwnPtr<CSSParserSelector> simpleSelector = consumeSimpleSelector(rang e)) { 154 while (OwnPtr<CSSParserSelector> simpleSelector = consumeSimpleSelector(rang e)) {
156 if (compoundSelector) 155 if (compoundSelector)
157 compoundSelector = addSimpleSelectorToCompound(compoundSelector.rele ase(), simpleSelector.release()); 156 compoundSelector = addSimpleSelectorToCompound(compoundSelector.rele ase(), simpleSelector.release());
158 else 157 else
159 compoundSelector = simpleSelector.release(); 158 compoundSelector = simpleSelector.release();
160 } 159 }
161 160
162 if (!compoundSelector) { 161 if (!compoundSelector) {
163 if (hasNamespace) 162 if (hasNamespace)
164 return CSSParserSelector::create(determineNameInNamespace(namespaceP refix, elementName)); 163 return CSSParserSelector::create(determineNameInNamespace(namespaceP refix, elementName));
165 return CSSParserSelector::create(QualifiedName(nullAtom, elementName, m_ defaultNamespace)); 164 return CSSParserSelector::create(QualifiedName(nullAtom, elementName, de faultNamespace()));
166 } 165 }
167 prependTypeSelectorIfNeeded(namespacePrefix, elementName, compoundSelector.g et()); 166 prependTypeSelectorIfNeeded(namespacePrefix, elementName, compoundSelector.g et());
168 return compoundSelector.release(); 167 return compoundSelector.release();
169 } 168 }
170 169
171 PassOwnPtr<CSSParserSelector> CSSSelectorParser::consumeSimpleSelector(CSSParser TokenRange& range) 170 PassOwnPtr<CSSParserSelector> CSSSelectorParser::consumeSimpleSelector(CSSParser TokenRange& range)
172 { 171 {
173 const CSSParserToken& token = range.peek(); 172 const CSSParserToken& token = range.peek();
174 OwnPtr<CSSParserSelector> selector; 173 OwnPtr<CSSParserSelector> selector;
175 if (token.type() == HashToken) 174 if (token.type() == HashToken)
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 if (b.type() != NumberToken || b.numericValueType() != IntegerValueType) 528 if (b.type() != NumberToken || b.numericValueType() != IntegerValueType)
530 return false; 529 return false;
531 if ((b.numericSign() == NoSign) == (sign == NoSign)) 530 if ((b.numericSign() == NoSign) == (sign == NoSign))
532 return false; 531 return false;
533 result.second = b.numericValue(); 532 result.second = b.numericValue();
534 if (sign == MinusSign) 533 if (sign == MinusSign)
535 result.second = -result.second; 534 result.second = -result.second;
536 return true; 535 return true;
537 } 536 }
538 537
538 const AtomicString& CSSSelectorParser::defaultNamespace() const
539 {
540 if (!m_styleSheet)
541 return starAtom;
542 return m_styleSheet->defaultNamespace();
543 }
544
539 QualifiedName CSSSelectorParser::determineNameInNamespace(const AtomicString& pr efix, const AtomicString& localName) 545 QualifiedName CSSSelectorParser::determineNameInNamespace(const AtomicString& pr efix, const AtomicString& localName)
540 { 546 {
541 if (!m_styleSheet) 547 if (!m_styleSheet)
542 return QualifiedName(prefix, localName, m_defaultNamespace); 548 return QualifiedName(prefix, localName, defaultNamespace());
543 return QualifiedName(prefix, localName, m_styleSheet->determineNamespace(pre fix)); 549 return QualifiedName(prefix, localName, m_styleSheet->determineNamespace(pre fix));
544 } 550 }
545 551
546 void CSSSelectorParser::prependTypeSelectorIfNeeded(const AtomicString& namespac ePrefix, const AtomicString& elementName, CSSParserSelector* compoundSelector) 552 void CSSSelectorParser::prependTypeSelectorIfNeeded(const AtomicString& namespac ePrefix, const AtomicString& elementName, CSSParserSelector* compoundSelector)
547 { 553 {
548 if (elementName.isNull() && m_defaultNamespace == starAtom && !compoundSelec tor->crossesTreeScopes()) 554 if (elementName.isNull() && defaultNamespace() == starAtom && !compoundSelec tor->crossesTreeScopes())
549 return; 555 return;
550 556
551 AtomicString determinedElementName = elementName.isNull() ? starAtom : eleme ntName; 557 AtomicString determinedElementName = elementName.isNull() ? starAtom : eleme ntName;
552 AtomicString determinedNamespace = namespacePrefix != nullAtom && m_styleShe et ? m_styleSheet->determineNamespace(namespacePrefix) : m_defaultNamespace; 558 AtomicString determinedNamespace = namespacePrefix != nullAtom && m_styleShe et ? m_styleSheet->determineNamespace(namespacePrefix) : defaultNamespace();
553 QualifiedName tag(namespacePrefix, determinedElementName, determinedNamespac e); 559 QualifiedName tag(namespacePrefix, determinedElementName, determinedNamespac e);
554 560
555 if (compoundSelector->crossesTreeScopes()) 561 if (compoundSelector->crossesTreeScopes())
556 return rewriteSpecifiersWithElementNameForCustomPseudoElement(tag, compo undSelector, elementName.isNull()); 562 return rewriteSpecifiersWithElementNameForCustomPseudoElement(tag, compo undSelector, elementName.isNull());
557 563
558 if (compoundSelector->pseudoType() == CSSSelector::PseudoContent) 564 if (compoundSelector->pseudoType() == CSSSelector::PseudoContent)
559 return rewriteSpecifiersWithElementNameForContentPseudoElement(tag, comp oundSelector, elementName.isNull()); 565 return rewriteSpecifiersWithElementNameForContentPseudoElement(tag, comp oundSelector, elementName.isNull());
560 566
561 // *:host never matches, so we can't discard the * otherwise we can't tell t he 567 // *:host never matches, so we can't discard the * otherwise we can't tell t he
562 // difference between *:host and just :host. 568 // difference between *:host and just :host.
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 compoundSelector->insertTagHistory(CSSSelector::SubSelector, simpleSelec tor, relation); 660 compoundSelector->insertTagHistory(CSSSelector::SubSelector, simpleSelec tor, relation);
655 return compoundSelector; 661 return compoundSelector;
656 } 662 }
657 663
658 // All other simple selectors are added to the end of the compound. 664 // All other simple selectors are added to the end of the compound.
659 compoundSelector->appendTagHistory(CSSSelector::SubSelector, simpleSelector) ; 665 compoundSelector->appendTagHistory(CSSSelector::SubSelector, simpleSelector) ;
660 return compoundSelector; 666 return compoundSelector;
661 } 667 }
662 668
663 } // namespace blink 669 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/css/parser/CSSSelectorParser.h ('k') | Source/core/css/parser/CSSSelectorParserTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698