| OLD | NEW |
| 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 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 End, // css3: E[foo$="bar"] | 72 End, // css3: E[foo$="bar"] |
| 73 PagePseudoClass | 73 PagePseudoClass |
| 74 }; | 74 }; |
| 75 | 75 |
| 76 enum Relation { | 76 enum Relation { |
| 77 Descendant = 0, | 77 Descendant = 0, |
| 78 Child, | 78 Child, |
| 79 DirectAdjacent, | 79 DirectAdjacent, |
| 80 IndirectAdjacent, | 80 IndirectAdjacent, |
| 81 SubSelector, | 81 SubSelector, |
| 82 ShadowPseudo, | 82 ShadowPseudo |
| 83 ShadowDistributed | |
| 84 }; | 83 }; |
| 85 | 84 |
| 86 enum PseudoType { | 85 enum PseudoType { |
| 87 PseudoNotParsed = 0, | 86 PseudoNotParsed = 0, |
| 88 PseudoUnknown, | 87 PseudoUnknown, |
| 89 PseudoEmpty, | 88 PseudoEmpty, |
| 90 PseudoFirstChild, | 89 PseudoFirstChild, |
| 91 PseudoFirstOfType, | 90 PseudoFirstOfType, |
| 92 PseudoLastChild, | 91 PseudoLastChild, |
| 93 PseudoLastOfType, | 92 PseudoLastOfType, |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 | 212 |
| 214 bool parseNth() const; | 213 bool parseNth() const; |
| 215 bool matchNth(int count) const; | 214 bool matchNth(int count) const; |
| 216 | 215 |
| 217 bool matchesPseudoElement() const; | 216 bool matchesPseudoElement() const; |
| 218 bool isUnknownPseudoElement() const; | 217 bool isUnknownPseudoElement() const; |
| 219 bool isCustomPseudoElement() const; | 218 bool isCustomPseudoElement() const; |
| 220 bool isSiblingSelector() const; | 219 bool isSiblingSelector() const; |
| 221 bool isAttributeSelector() const; | 220 bool isAttributeSelector() const; |
| 222 bool isDistributedPseudoElement() const; | 221 bool isDistributedPseudoElement() const; |
| 223 bool isShadowDistributed() const; | |
| 224 | 222 |
| 225 Relation relation() const { return static_cast<Relation>(m_relation); } | 223 Relation relation() const { return static_cast<Relation>(m_relation); } |
| 226 | 224 |
| 227 bool isLastInSelectorList() const { return m_isLastInSelectorList; } | 225 bool isLastInSelectorList() const { return m_isLastInSelectorList; } |
| 228 void setLastInSelectorList() { m_isLastInSelectorList = true; } | 226 void setLastInSelectorList() { m_isLastInSelectorList = true; } |
| 229 bool isLastInTagHistory() const { return m_isLastInTagHistory; } | 227 bool isLastInTagHistory() const { return m_isLastInTagHistory; } |
| 230 void setNotLastInTagHistory() { m_isLastInTagHistory = false; } | 228 void setNotLastInTagHistory() { m_isLastInTagHistory = false; } |
| 231 | 229 |
| 232 bool isSimple() const; | 230 bool isSimple() const; |
| 233 | 231 |
| 234 bool isForPage() const { return m_isForPage; } | 232 bool isForPage() const { return m_isForPage; } |
| 235 void setForPage() { m_isForPage = true; } | 233 void setForPage() { m_isForPage = true; } |
| 236 | 234 |
| 235 bool relationIsForShadowDistributed() const { return m_relationIsForShad
owDistributed; } |
| 236 void setRelationIsForShadowDistributed() { m_relationIsForShadowDistribu
ted = true; } |
| 237 |
| 237 unsigned m_relation : 3; // enum Relation | 238 unsigned m_relation : 3; // enum Relation |
| 238 mutable unsigned m_match : 4; // enum Match | 239 mutable unsigned m_match : 4; // enum Match |
| 239 mutable unsigned m_pseudoType : 8; // PseudoType | 240 mutable unsigned m_pseudoType : 8; // PseudoType |
| 240 | 241 |
| 241 private: | 242 private: |
| 242 mutable unsigned m_parsedNth : 1; // Used for :nth-* | 243 mutable unsigned m_parsedNth : 1; // Used for :nth-* |
| 243 unsigned m_isLastInSelectorList : 1; | 244 unsigned m_isLastInSelectorList : 1; |
| 244 unsigned m_isLastInTagHistory : 1; | 245 unsigned m_isLastInTagHistory : 1; |
| 245 unsigned m_hasRareData : 1; | 246 unsigned m_hasRareData : 1; |
| 246 unsigned m_isForPage : 1; | 247 unsigned m_isForPage : 1; |
| 247 unsigned m_tagIsForNamespaceRule : 1; | 248 unsigned m_tagIsForNamespaceRule : 1; |
| 249 unsigned m_relationIsForShadowDistributed : 1; |
| 248 | 250 |
| 249 unsigned specificityForOneSelector() const; | 251 unsigned specificityForOneSelector() const; |
| 250 unsigned specificityForPage() const; | 252 unsigned specificityForPage() const; |
| 251 void extractPseudoType() const; | 253 void extractPseudoType() const; |
| 252 | 254 |
| 253 // Hide. | 255 // Hide. |
| 254 CSSSelector& operator=(const CSSSelector&); | 256 CSSSelector& operator=(const CSSSelector&); |
| 255 | 257 |
| 256 struct RareData : public RefCounted<RareData> { | 258 struct RareData : public RefCounted<RareData> { |
| 257 static PassRefPtr<RareData> create(PassRefPtr<AtomicStringImpl> valu
e) { return adoptRef(new RareData(value)); } | 259 static PassRefPtr<RareData> create(PassRefPtr<AtomicStringImpl> valu
e) { return adoptRef(new RareData(value)); } |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 331 || m_match == CSSSelector::Contain | 333 || m_match == CSSSelector::Contain |
| 332 || m_match == CSSSelector::Begin | 334 || m_match == CSSSelector::Begin |
| 333 || m_match == CSSSelector::End; | 335 || m_match == CSSSelector::End; |
| 334 } | 336 } |
| 335 | 337 |
| 336 inline bool CSSSelector::isDistributedPseudoElement() const | 338 inline bool CSSSelector::isDistributedPseudoElement() const |
| 337 { | 339 { |
| 338 return m_match == PseudoElement && pseudoType() == PseudoDistributed; | 340 return m_match == PseudoElement && pseudoType() == PseudoDistributed; |
| 339 } | 341 } |
| 340 | 342 |
| 341 inline bool CSSSelector::isShadowDistributed() const | |
| 342 { | |
| 343 return m_relation == CSSSelector::ShadowDistributed; | |
| 344 } | |
| 345 | |
| 346 inline void CSSSelector::setValue(const AtomicString& value) | 343 inline void CSSSelector::setValue(const AtomicString& value) |
| 347 { | 344 { |
| 348 ASSERT(m_match != Tag); | 345 ASSERT(m_match != Tag); |
| 349 ASSERT(m_pseudoType == PseudoNotParsed); | 346 ASSERT(m_pseudoType == PseudoNotParsed); |
| 350 // Need to do ref counting manually for the union. | 347 // Need to do ref counting manually for the union. |
| 351 if (m_hasRareData) { | 348 if (m_hasRareData) { |
| 352 if (m_data.m_rareData->m_value) | 349 if (m_data.m_rareData->m_value) |
| 353 m_data.m_rareData->m_value->deref(); | 350 m_data.m_rareData->m_value->deref(); |
| 354 m_data.m_rareData->m_value = value.impl(); | 351 m_data.m_rareData->m_value = value.impl(); |
| 355 m_data.m_rareData->m_value->ref(); | 352 m_data.m_rareData->m_value->ref(); |
| 356 return; | 353 return; |
| 357 } | 354 } |
| 358 if (m_data.m_value) | 355 if (m_data.m_value) |
| 359 m_data.m_value->deref(); | 356 m_data.m_value->deref(); |
| 360 m_data.m_value = value.impl(); | 357 m_data.m_value = value.impl(); |
| 361 m_data.m_value->ref(); | 358 m_data.m_value->ref(); |
| 362 } | 359 } |
| 363 | 360 |
| 364 inline CSSSelector::CSSSelector() | 361 inline CSSSelector::CSSSelector() |
| 365 : m_relation(Descendant) | 362 : m_relation(Descendant) |
| 366 , m_match(Unknown) | 363 , m_match(Unknown) |
| 367 , m_pseudoType(PseudoNotParsed) | 364 , m_pseudoType(PseudoNotParsed) |
| 368 , m_parsedNth(false) | 365 , m_parsedNth(false) |
| 369 , m_isLastInSelectorList(false) | 366 , m_isLastInSelectorList(false) |
| 370 , m_isLastInTagHistory(true) | 367 , m_isLastInTagHistory(true) |
| 371 , m_hasRareData(false) | 368 , m_hasRareData(false) |
| 372 , m_isForPage(false) | 369 , m_isForPage(false) |
| 373 , m_tagIsForNamespaceRule(false) | 370 , m_tagIsForNamespaceRule(false) |
| 371 , m_relationIsForShadowDistributed(false) |
| 374 { | 372 { |
| 375 } | 373 } |
| 376 | 374 |
| 377 inline CSSSelector::CSSSelector(const QualifiedName& tagQName, bool tagIsForName
spaceRule) | 375 inline CSSSelector::CSSSelector(const QualifiedName& tagQName, bool tagIsForName
spaceRule) |
| 378 : m_relation(Descendant) | 376 : m_relation(Descendant) |
| 379 , m_match(Tag) | 377 , m_match(Tag) |
| 380 , m_pseudoType(PseudoNotParsed) | 378 , m_pseudoType(PseudoNotParsed) |
| 381 , m_parsedNth(false) | 379 , m_parsedNth(false) |
| 382 , m_isLastInSelectorList(false) | 380 , m_isLastInSelectorList(false) |
| 383 , m_isLastInTagHistory(true) | 381 , m_isLastInTagHistory(true) |
| 384 , m_hasRareData(false) | 382 , m_hasRareData(false) |
| 385 , m_isForPage(false) | 383 , m_isForPage(false) |
| 386 , m_tagIsForNamespaceRule(tagIsForNamespaceRule) | 384 , m_tagIsForNamespaceRule(tagIsForNamespaceRule) |
| 385 , m_relationIsForShadowDistributed(false) |
| 387 { | 386 { |
| 388 m_data.m_tagQName = tagQName.impl(); | 387 m_data.m_tagQName = tagQName.impl(); |
| 389 m_data.m_tagQName->ref(); | 388 m_data.m_tagQName->ref(); |
| 390 } | 389 } |
| 391 | 390 |
| 392 inline CSSSelector::CSSSelector(const CSSSelector& o) | 391 inline CSSSelector::CSSSelector(const CSSSelector& o) |
| 393 : m_relation(o.m_relation) | 392 : m_relation(o.m_relation) |
| 394 , m_match(o.m_match) | 393 , m_match(o.m_match) |
| 395 , m_pseudoType(o.m_pseudoType) | 394 , m_pseudoType(o.m_pseudoType) |
| 396 , m_parsedNth(o.m_parsedNth) | 395 , m_parsedNth(o.m_parsedNth) |
| 397 , m_isLastInSelectorList(o.m_isLastInSelectorList) | 396 , m_isLastInSelectorList(o.m_isLastInSelectorList) |
| 398 , m_isLastInTagHistory(o.m_isLastInTagHistory) | 397 , m_isLastInTagHistory(o.m_isLastInTagHistory) |
| 399 , m_hasRareData(o.m_hasRareData) | 398 , m_hasRareData(o.m_hasRareData) |
| 400 , m_isForPage(o.m_isForPage) | 399 , m_isForPage(o.m_isForPage) |
| 401 , m_tagIsForNamespaceRule(o.m_tagIsForNamespaceRule) | 400 , m_tagIsForNamespaceRule(o.m_tagIsForNamespaceRule) |
| 401 , m_relationIsForShadowDistributed(o.m_relationIsForShadowDistributed) |
| 402 { | 402 { |
| 403 if (o.m_match == Tag) { | 403 if (o.m_match == Tag) { |
| 404 m_data.m_tagQName = o.m_data.m_tagQName; | 404 m_data.m_tagQName = o.m_data.m_tagQName; |
| 405 m_data.m_tagQName->ref(); | 405 m_data.m_tagQName->ref(); |
| 406 } else if (o.m_hasRareData) { | 406 } else if (o.m_hasRareData) { |
| 407 m_data.m_rareData = o.m_data.m_rareData; | 407 m_data.m_rareData = o.m_data.m_rareData; |
| 408 m_data.m_rareData->ref(); | 408 m_data.m_rareData->ref(); |
| 409 } else if (o.m_data.m_value) { | 409 } else if (o.m_data.m_value) { |
| 410 m_data.m_value = o.m_data.m_value; | 410 m_data.m_value = o.m_data.m_value; |
| 411 m_data.m_value->ref(); | 411 m_data.m_value->ref(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 433 ASSERT(m_match != Tag); | 433 ASSERT(m_match != Tag); |
| 434 // AtomicString is really just an AtomicStringImpl* so the cast below is saf
e. | 434 // AtomicString is really just an AtomicStringImpl* so the cast below is saf
e. |
| 435 // FIXME: Perhaps call sites could be changed to accept AtomicStringImpl? | 435 // FIXME: Perhaps call sites could be changed to accept AtomicStringImpl? |
| 436 return *reinterpret_cast<const AtomicString*>(m_hasRareData ? &m_data.m_rare
Data->m_value : &m_data.m_value); | 436 return *reinterpret_cast<const AtomicString*>(m_hasRareData ? &m_data.m_rare
Data->m_value : &m_data.m_value); |
| 437 } | 437 } |
| 438 | 438 |
| 439 | 439 |
| 440 } // namespace WebCore | 440 } // namespace WebCore |
| 441 | 441 |
| 442 #endif // CSSSelector_h | 442 #endif // CSSSelector_h |
| OLD | NEW |