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

Side by Side Diff: third_party/WebKit/Source/core/css/CSSSelector.h

Issue 1523843004: Add support for new CSS ::slotted() pseudo element (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase / fix comments for tests (FYI) Created 4 years, 11 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 /* 1 /*
2 * Copyright (C) 1999-2003 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999-2003 Lars Knoll (knoll@kde.org)
3 * 1999 Waldo Bastian (bastian@kde.org) 3 * 1999 Waldo Bastian (bastian@kde.org)
4 * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010, 2013 Apple Inc. All rights reserved. 4 * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010, 2013 Apple Inc. All rights reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 FirstAttributeSelectorMatch = AttributeExact, 110 FirstAttributeSelectorMatch = AttributeExact,
111 }; 111 };
112 112
113 enum Relation { 113 enum Relation {
114 SubSelector, // No combinator 114 SubSelector, // No combinator
115 Descendant, // "Space" combinator 115 Descendant, // "Space" combinator
116 Child, // > combinator 116 Child, // > combinator
117 DirectAdjacent, // + combinator 117 DirectAdjacent, // + combinator
118 IndirectAdjacent, // ~ combinator 118 IndirectAdjacent, // ~ combinator
119 ShadowPseudo, // Special case of shadow DOM pseudo elements / shadow pse udo element 119 ShadowPseudo, // Special case of shadow DOM pseudo elements / shadow pse udo element
120 ShadowDeep // /deep/ combinator 120 ShadowDeep, // /deep/ combinator
121 ShadowSlot // slotted to <slot> element
121 }; 122 };
122 123
123 enum PseudoType { 124 enum PseudoType {
124 PseudoUnknown, 125 PseudoUnknown,
125 PseudoEmpty, 126 PseudoEmpty,
126 PseudoFirstChild, 127 PseudoFirstChild,
127 PseudoFirstOfType, 128 PseudoFirstOfType,
128 PseudoLastChild, 129 PseudoLastChild,
129 PseudoLastOfType, 130 PseudoLastOfType,
130 PseudoOnlyChild, 131 PseudoOnlyChild,
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 PseudoWebKitCustomElement, 195 PseudoWebKitCustomElement,
195 PseudoCue, 196 PseudoCue,
196 PseudoFutureCue, 197 PseudoFutureCue,
197 PseudoPastCue, 198 PseudoPastCue,
198 PseudoUnresolved, 199 PseudoUnresolved,
199 PseudoContent, 200 PseudoContent,
200 PseudoHost, 201 PseudoHost,
201 PseudoHostContext, 202 PseudoHostContext,
202 PseudoShadow, 203 PseudoShadow,
203 PseudoSpatialNavigationFocus, 204 PseudoSpatialNavigationFocus,
204 PseudoListBox 205 PseudoListBox,
206 PseudoSlotted
205 }; 207 };
206 208
207 enum AttributeMatchType { 209 enum AttributeMatchType {
208 CaseSensitive, 210 CaseSensitive,
209 CaseInsensitive, 211 CaseInsensitive,
210 }; 212 };
211 213
212 PseudoType pseudoType() const { return static_cast<PseudoType>(m_pseudoType) ; } 214 PseudoType pseudoType() const { return static_cast<PseudoType>(m_pseudoType) ; }
213 void updatePseudoType(const AtomicString&, bool hasArguments); 215 void updatePseudoType(const AtomicString&, bool hasArguments);
214 216
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 250
249 void setNth(int a, int b); 251 void setNth(int a, int b);
250 bool matchNth(int count) const; 252 bool matchNth(int count) const;
251 253
252 bool isAdjacentSelector() const { return m_relation == DirectAdjacent || m_r elation == IndirectAdjacent; } 254 bool isAdjacentSelector() const { return m_relation == DirectAdjacent || m_r elation == IndirectAdjacent; }
253 bool isShadowSelector() const { return m_relation == ShadowPseudo || m_relat ion == ShadowDeep; } 255 bool isShadowSelector() const { return m_relation == ShadowPseudo || m_relat ion == ShadowDeep; }
254 bool isSiblingSelector() const; 256 bool isSiblingSelector() const;
255 bool isAttributeSelector() const { return m_match >= FirstAttributeSelectorM atch; } 257 bool isAttributeSelector() const { return m_match >= FirstAttributeSelectorM atch; }
256 bool isHostPseudoClass() const { return m_pseudoType == PseudoHost || m_pseu doType == PseudoHostContext; } 258 bool isHostPseudoClass() const { return m_pseudoType == PseudoHost || m_pseu doType == PseudoHostContext; }
257 bool isInsertionPointCrossing() const { return m_pseudoType == PseudoHostCon text || m_pseudoType == PseudoContent; } 259 bool isInsertionPointCrossing() const { return m_pseudoType == PseudoHostCon text || m_pseudoType == PseudoContent; }
260 bool isSlottedPseudoElement() const { return m_pseudoType == PseudoSlotted; }
258 261
259 Relation relation() const { return static_cast<Relation>(m_relation); } 262 Relation relation() const { return static_cast<Relation>(m_relation); }
260 void setRelation(Relation relation) 263 void setRelation(Relation relation)
261 { 264 {
262 m_relation = relation; 265 m_relation = relation;
263 ASSERT(static_cast<Relation>(m_relation) == relation); // using a bitfie ld. 266 ASSERT(static_cast<Relation>(m_relation) == relation); // using a bitfie ld.
264 } 267 }
265 268
266 Match match() const { return static_cast<Match>(m_match); } 269 Match match() const { return static_cast<Match>(m_match); }
267 void setMatch(Match match) 270 void setMatch(Match match)
(...skipping 12 matching lines...) Expand all
280 283
281 enum LinkMatchMask { MatchLink = 1, MatchVisited = 2, MatchAll = MatchLink | MatchVisited }; 284 enum LinkMatchMask { MatchLink = 1, MatchVisited = 2, MatchAll = MatchLink | MatchVisited };
282 unsigned computeLinkMatchType() const; 285 unsigned computeLinkMatchType() const;
283 286
284 bool isForPage() const { return m_isForPage; } 287 bool isForPage() const { return m_isForPage; }
285 void setForPage() { m_isForPage = true; } 288 void setForPage() { m_isForPage = true; }
286 289
287 bool relationIsAffectedByPseudoContent() const { return m_relationIsAffected ByPseudoContent; } 290 bool relationIsAffectedByPseudoContent() const { return m_relationIsAffected ByPseudoContent; }
288 void setRelationIsAffectedByPseudoContent() { m_relationIsAffectedByPseudoCo ntent = true; } 291 void setRelationIsAffectedByPseudoContent() { m_relationIsAffectedByPseudoCo ntent = true; }
289 292
293 bool relationIsAffectedByPseudoSlotted() const { return m_relationIsAffected ByPseudoSlotted; }
294 void setRelationIsAffectedByPseudoSlotted() { m_relationIsAffectedByPseudoSl otted = true; }
295
290 private: 296 private:
291 unsigned m_relation : 3; // enum Relation 297 unsigned m_relation : 3; // enum Relation
292 unsigned m_match : 4; // enum Match 298 unsigned m_match : 4; // enum Match
293 unsigned m_pseudoType : 8; // enum PseudoType 299 unsigned m_pseudoType : 8; // enum PseudoType
294 unsigned m_isLastInSelectorList : 1; 300 unsigned m_isLastInSelectorList : 1;
295 unsigned m_isLastInTagHistory : 1; 301 unsigned m_isLastInTagHistory : 1;
296 unsigned m_hasRareData : 1; 302 unsigned m_hasRareData : 1;
297 unsigned m_isForPage : 1; 303 unsigned m_isForPage : 1;
298 unsigned m_tagIsImplicit : 1; 304 unsigned m_tagIsImplicit : 1;
299 unsigned m_relationIsAffectedByPseudoContent : 1; 305 unsigned m_relationIsAffectedByPseudoContent : 1;
306 unsigned m_relationIsAffectedByPseudoSlotted : 1;
300 307
301 void setPseudoType(PseudoType pseudoType) 308 void setPseudoType(PseudoType pseudoType)
302 { 309 {
303 m_pseudoType = pseudoType; 310 m_pseudoType = pseudoType;
304 ASSERT(static_cast<PseudoType>(m_pseudoType) == pseudoType); // using a bitfield. 311 ASSERT(static_cast<PseudoType>(m_pseudoType) == pseudoType); // using a bitfield.
305 } 312 }
306 313
307 unsigned specificityForOneSelector() const; 314 unsigned specificityForOneSelector() const;
308 unsigned specificityForPage() const; 315 unsigned specificityForPage() const;
309 316
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 inline CSSSelector::CSSSelector() 416 inline CSSSelector::CSSSelector()
410 : m_relation(SubSelector) 417 : m_relation(SubSelector)
411 , m_match(Unknown) 418 , m_match(Unknown)
412 , m_pseudoType(PseudoUnknown) 419 , m_pseudoType(PseudoUnknown)
413 , m_isLastInSelectorList(false) 420 , m_isLastInSelectorList(false)
414 , m_isLastInTagHistory(true) 421 , m_isLastInTagHistory(true)
415 , m_hasRareData(false) 422 , m_hasRareData(false)
416 , m_isForPage(false) 423 , m_isForPage(false)
417 , m_tagIsImplicit(false) 424 , m_tagIsImplicit(false)
418 , m_relationIsAffectedByPseudoContent(false) 425 , m_relationIsAffectedByPseudoContent(false)
426 , m_relationIsAffectedByPseudoSlotted(false)
419 { 427 {
420 } 428 }
421 429
422 inline CSSSelector::CSSSelector(const QualifiedName& tagQName, bool tagIsImplici t) 430 inline CSSSelector::CSSSelector(const QualifiedName& tagQName, bool tagIsImplici t)
423 : m_relation(SubSelector) 431 : m_relation(SubSelector)
424 , m_match(Tag) 432 , m_match(Tag)
425 , m_pseudoType(PseudoUnknown) 433 , m_pseudoType(PseudoUnknown)
426 , m_isLastInSelectorList(false) 434 , m_isLastInSelectorList(false)
427 , m_isLastInTagHistory(true) 435 , m_isLastInTagHistory(true)
428 , m_hasRareData(false) 436 , m_hasRareData(false)
429 , m_isForPage(false) 437 , m_isForPage(false)
430 , m_tagIsImplicit(tagIsImplicit) 438 , m_tagIsImplicit(tagIsImplicit)
431 , m_relationIsAffectedByPseudoContent(false) 439 , m_relationIsAffectedByPseudoContent(false)
440 , m_relationIsAffectedByPseudoSlotted(false)
432 { 441 {
433 m_data.m_tagQName = tagQName.impl(); 442 m_data.m_tagQName = tagQName.impl();
434 m_data.m_tagQName->ref(); 443 m_data.m_tagQName->ref();
435 } 444 }
436 445
437 inline CSSSelector::CSSSelector(const CSSSelector& o) 446 inline CSSSelector::CSSSelector(const CSSSelector& o)
438 : m_relation(o.m_relation) 447 : m_relation(o.m_relation)
439 , m_match(o.m_match) 448 , m_match(o.m_match)
440 , m_pseudoType(o.m_pseudoType) 449 , m_pseudoType(o.m_pseudoType)
441 , m_isLastInSelectorList(o.m_isLastInSelectorList) 450 , m_isLastInSelectorList(o.m_isLastInSelectorList)
442 , m_isLastInTagHistory(o.m_isLastInTagHistory) 451 , m_isLastInTagHistory(o.m_isLastInTagHistory)
443 , m_hasRareData(o.m_hasRareData) 452 , m_hasRareData(o.m_hasRareData)
444 , m_isForPage(o.m_isForPage) 453 , m_isForPage(o.m_isForPage)
445 , m_tagIsImplicit(o.m_tagIsImplicit) 454 , m_tagIsImplicit(o.m_tagIsImplicit)
446 , m_relationIsAffectedByPseudoContent(o.m_relationIsAffectedByPseudoContent) 455 , m_relationIsAffectedByPseudoContent(o.m_relationIsAffectedByPseudoContent)
456 , m_relationIsAffectedByPseudoSlotted(o.m_relationIsAffectedByPseudoSlotted)
447 { 457 {
448 if (o.m_match == Tag) { 458 if (o.m_match == Tag) {
449 m_data.m_tagQName = o.m_data.m_tagQName; 459 m_data.m_tagQName = o.m_data.m_tagQName;
450 m_data.m_tagQName->ref(); 460 m_data.m_tagQName->ref();
451 } else if (o.m_hasRareData) { 461 } else if (o.m_hasRareData) {
452 m_data.m_rareData = o.m_data.m_rareData; 462 m_data.m_rareData = o.m_data.m_rareData;
453 m_data.m_rareData->ref(); 463 m_data.m_rareData->ref();
454 } else if (o.m_data.m_value) { 464 } else if (o.m_data.m_value) {
455 m_data.m_value = o.m_data.m_value; 465 m_data.m_value = o.m_data.m_value;
456 m_data.m_value->ref(); 466 m_data.m_value->ref();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 if (m_hasRareData) 499 if (m_hasRareData)
490 return m_data.m_rareData->m_serializingValue; 500 return m_data.m_rareData->m_serializingValue;
491 // AtomicString is really just a StringImpl* so the cast below is safe. 501 // AtomicString is really just a StringImpl* so the cast below is safe.
492 // FIXME: Perhaps call sites could be changed to accept StringImpl? 502 // FIXME: Perhaps call sites could be changed to accept StringImpl?
493 return *reinterpret_cast<const AtomicString*>(&m_data.m_value); 503 return *reinterpret_cast<const AtomicString*>(&m_data.m_value);
494 } 504 }
495 505
496 } // namespace blink 506 } // namespace blink
497 507
498 #endif // CSSSelector_h 508 #endif // CSSSelector_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698