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

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

Issue 747283003: CSS Parser: Implement selector parsing (attributes) [2/3] (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@selectorparsing
Patch Set: Created 6 years 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
« no previous file with comments | « Source/core/css/parser/CSSSelectorParser.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "platform/RuntimeEnabledFeatures.h" 10 #include "platform/RuntimeEnabledFeatures.h"
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 const String& value = m_tokenRange.consumeIncludingComments().value(); 210 const String& value = m_tokenRange.consumeIncludingComments().value();
211 if (isQuirksModeBehavior(m_context.mode())) 211 if (isQuirksModeBehavior(m_context.mode()))
212 selector->setValue(AtomicString(value.lower())); 212 selector->setValue(AtomicString(value.lower()));
213 else 213 else
214 selector->setValue(AtomicString(value)); 214 selector->setValue(AtomicString(value));
215 return selector.release(); 215 return selector.release();
216 } 216 }
217 217
218 PassOwnPtr<CSSParserSelector> CSSSelectorParser::consumeAttribute() 218 PassOwnPtr<CSSParserSelector> CSSSelectorParser::consumeAttribute()
219 { 219 {
220 // FIXME: Implement attribute parsing 220 ASSERT(m_tokenRange.peek().type() == LeftBracketToken);
221 return nullptr; 221 m_tokenRange.consumeIncludingWhitespaceAndComments();
222
223 AtomicString namespacePrefix;
224 AtomicString attributeName;
225 bool hasNamespace;
226 if (!consumeName(attributeName, namespacePrefix, hasNamespace))
227 return nullptr;
228
229 if (m_context.isHTMLDocument())
230 attributeName = attributeName.lower();
231
232 QualifiedName qualifiedName = hasNamespace
233 ? determineNameInNamespace(namespacePrefix, attributeName)
234 : QualifiedName(nullAtom, attributeName, nullAtom);
235
236 OwnPtr<CSSParserSelector> selector = CSSParserSelector::create();
237
238 if (m_tokenRange.atEnd() || m_tokenRange.peek().type() == RightBracketToken) {
239 m_tokenRange.consumeIncludingComments();
240 selector->setAttribute(qualifiedName, CSSSelector::CaseSensitive);
241 selector->setMatch(CSSSelector::AttributeSet);
242 return selector.release();
243 }
244
245 selector->setMatch(consumeAttributeMatch());
246
247 const CSSParserToken& attributeValue = m_tokenRange.consumeIncludingWhitespa ceAndComments();
248 if (attributeValue.type() != IdentToken && attributeValue.type() != StringTo ken)
249 return nullptr;
250 selector->setValue(AtomicString(attributeValue.value()));
251 selector->setAttribute(qualifiedName, consumeAttributeFlags());
252
253 if (!m_tokenRange.atEnd() && m_tokenRange.consumeIncludingComments().type() != RightBracketToken)
254 return nullptr;
255
256 return selector.release();
222 } 257 }
223 258
224 PassOwnPtr<CSSParserSelector> CSSSelectorParser::consumePseudo() 259 PassOwnPtr<CSSParserSelector> CSSSelectorParser::consumePseudo()
225 { 260 {
226 // FIXME: Implement pseudo-element and pseudo-class parsing 261 // FIXME: Implement pseudo-element and pseudo-class parsing
227 return nullptr; 262 return nullptr;
228 } 263 }
229 264
230 CSSSelector::Relation CSSSelectorParser::consumeCombinator() 265 CSSSelector::Relation CSSSelectorParser::consumeCombinator()
231 { 266 {
(...skipping 23 matching lines...) Expand all
255 m_tokenRange.consumeIncludingComments(); 290 m_tokenRange.consumeIncludingComments();
256 const CSSParserToken& ident = m_tokenRange.consumeIncludingComments(); 291 const CSSParserToken& ident = m_tokenRange.consumeIncludingComments();
257 if (ident.type() != IdentToken || !equalIgnoringCase(ident.value(), "deep")) 292 if (ident.type() != IdentToken || !equalIgnoringCase(ident.value(), "deep"))
258 m_failedParsing = true; 293 m_failedParsing = true;
259 const CSSParserToken& slash = m_tokenRange.consumeIncludingWhitespaceAndComm ents(); 294 const CSSParserToken& slash = m_tokenRange.consumeIncludingWhitespaceAndComm ents();
260 if (slash.type() != DelimiterToken || slash.delimiter() != '/') 295 if (slash.type() != DelimiterToken || slash.delimiter() != '/')
261 m_failedParsing = true; 296 m_failedParsing = true;
262 return CSSSelector::ShadowDeep; 297 return CSSSelector::ShadowDeep;
263 } 298 }
264 299
300 CSSSelector::Match CSSSelectorParser::consumeAttributeMatch()
301 {
302 const CSSParserToken& token = m_tokenRange.consumeIncludingWhitespaceAndComm ents();
303 switch (token.type()) {
304 case IncludeMatchToken:
305 return CSSSelector::AttributeList;
306 case DashMatchToken:
307 return CSSSelector::AttributeHyphen;
308 case PrefixMatchToken:
309 return CSSSelector::AttributeBegin;
310 case SuffixMatchToken:
311 return CSSSelector::AttributeEnd;
312 case SubstringMatchToken:
313 return CSSSelector::AttributeContain;
314 case DelimiterToken:
315 if (token.delimiter() == '=')
316 return CSSSelector::AttributeExact;
317 default:
318 m_failedParsing = true;
319 return CSSSelector::AttributeExact;
320 }
321 }
322
323 CSSSelector::AttributeMatchType CSSSelectorParser::consumeAttributeFlags()
324 {
325 if (m_tokenRange.peek().type() != IdentToken)
326 return CSSSelector::CaseSensitive;
327 const CSSParserToken& flag = m_tokenRange.consumeIncludingWhitespaceAndComme nts();
328 if (flag.value() == "i") {
329 if (RuntimeEnabledFeatures::cssAttributeCaseSensitivityEnabled() || isUA SheetBehavior(m_context.mode()))
330 return CSSSelector::CaseInsensitive;
331 }
332 m_failedParsing = true;
333 return CSSSelector::CaseSensitive;
334 }
335
265 QualifiedName CSSSelectorParser::determineNameInNamespace(const AtomicString& pr efix, const AtomicString& localName) 336 QualifiedName CSSSelectorParser::determineNameInNamespace(const AtomicString& pr efix, const AtomicString& localName)
266 { 337 {
267 if (!m_styleSheet) 338 if (!m_styleSheet)
268 return QualifiedName(prefix, localName, m_defaultNamespace); 339 return QualifiedName(prefix, localName, m_defaultNamespace);
269 return QualifiedName(prefix, localName, m_styleSheet->determineNamespace(pre fix)); 340 return QualifiedName(prefix, localName, m_styleSheet->determineNamespace(pre fix));
270 } 341 }
271 342
272 void CSSSelectorParser::rewriteSpecifiersWithNamespaceIfNeeded(CSSParserSelector * specifiers) 343 void CSSSelectorParser::rewriteSpecifiersWithNamespaceIfNeeded(CSSParserSelector * specifiers)
273 { 344 {
274 if (m_defaultNamespace != starAtom || specifiers->crossesTreeScopes()) 345 if (m_defaultNamespace != starAtom || specifiers->crossesTreeScopes())
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 } 428 }
358 if (specifiers->isContentPseudoElement()) { 429 if (specifiers->isContentPseudoElement()) {
359 specifiers->insertTagHistory(CSSSelector::SubSelector, newSpecifier, CSS Selector::SubSelector); 430 specifiers->insertTagHistory(CSSSelector::SubSelector, newSpecifier, CSS Selector::SubSelector);
360 return specifiers; 431 return specifiers;
361 } 432 }
362 specifiers->appendTagHistory(CSSSelector::SubSelector, newSpecifier); 433 specifiers->appendTagHistory(CSSSelector::SubSelector, newSpecifier);
363 return specifiers; 434 return specifiers;
364 } 435 }
365 436
366 } // namespace blink 437 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/css/parser/CSSSelectorParser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698