| 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 13 matching lines...) Expand all Loading... |
| 24 | 24 |
| 25 #include "core/CoreExport.h" | 25 #include "core/CoreExport.h" |
| 26 #include "core/dom/QualifiedName.h" | 26 #include "core/dom/QualifiedName.h" |
| 27 #include "core/style/ComputedStyleConstants.h" | 27 #include "core/style/ComputedStyleConstants.h" |
| 28 #include "wtf/OwnPtr.h" | 28 #include "wtf/OwnPtr.h" |
| 29 #include "wtf/PassOwnPtr.h" | 29 #include "wtf/PassOwnPtr.h" |
| 30 | 30 |
| 31 namespace blink { | 31 namespace blink { |
| 32 class CSSSelectorList; | 32 class CSSSelectorList; |
| 33 | 33 |
| 34 enum TagSelectorCase { TagLowerCase, TagCamelCase }; |
| 35 |
| 34 // This class represents a selector for a StyleRule. | 36 // This class represents a selector for a StyleRule. |
| 35 | 37 |
| 36 // CSS selector representation is somewhat complicated and subtle. A represe
ntative list of selectors is | 38 // CSS selector representation is somewhat complicated and subtle. A represe
ntative list of selectors is |
| 37 // in CSSSelectorTest; run it in a debug build to see useful debugging outpu
t. | 39 // in CSSSelectorTest; run it in a debug build to see useful debugging outpu
t. |
| 38 // | 40 // |
| 39 // ** tagHistory() and relation(): | 41 // ** tagHistory() and relation(): |
| 40 // | 42 // |
| 41 // Selectors are represented as a linked list of simple selectors (defined m
ore or less according to | 43 // Selectors are represented as a linked list of simple selectors (defined m
ore or less according to |
| 42 // http://www.w3.org/TR/css3-selectors/#simple-selectors-dfn). The tagHistor
y() method returns the next | 44 // http://www.w3.org/TR/css3-selectors/#simple-selectors-dfn). The tagHistor
y() method returns the next |
| 43 // simple selector in the list. The relation() method returns the relationsh
ip of the current simple selector to | 45 // simple selector in the list. The relation() method returns the relationsh
ip of the current simple selector to |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 // ** isCustomPseudoElement(): | 79 // ** isCustomPseudoElement(): |
| 78 // | 80 // |
| 79 // It appears this is used only for pseudo elements that appear in user-agen
t shadow DOM. They are not exposed to author-created | 81 // It appears this is used only for pseudo elements that appear in user-agen
t shadow DOM. They are not exposed to author-created |
| 80 // shadow DOM. | 82 // shadow DOM. |
| 81 | 83 |
| 82 class CORE_EXPORT CSSSelector { | 84 class CORE_EXPORT CSSSelector { |
| 83 WTF_MAKE_FAST_ALLOCATED(CSSSelector); | 85 WTF_MAKE_FAST_ALLOCATED(CSSSelector); |
| 84 public: | 86 public: |
| 85 CSSSelector(); | 87 CSSSelector(); |
| 86 CSSSelector(const CSSSelector&); | 88 CSSSelector(const CSSSelector&); |
| 87 explicit CSSSelector(const QualifiedName&, bool tagIsImplicit = false); | 89 explicit CSSSelector(const QualifiedName&, bool tagIsImplicit = false, T
agSelectorCase = TagLowerCase); |
| 88 | 90 |
| 89 ~CSSSelector(); | 91 ~CSSSelector(); |
| 90 | 92 |
| 91 /** | 93 /** |
| 92 * Re-create selector text from selector's data | 94 * Re-create selector text from selector's data |
| 93 */ | 95 */ |
| 94 String selectorText(const String& = "") const; | 96 String selectorText(const String& = "") const; |
| 95 | 97 |
| 96 // checks if the 2 selectors (including sub selectors) agree. | 98 // checks if the 2 selectors (including sub selectors) agree. |
| 97 bool operator==(const CSSSelector&) const; | 99 bool operator==(const CSSSelector&) const; |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 void setNotLastInTagHistory() { m_isLastInTagHistory = false; } | 315 void setNotLastInTagHistory() { m_isLastInTagHistory = false; } |
| 314 | 316 |
| 315 // http://dev.w3.org/csswg/selectors4/#compound | 317 // http://dev.w3.org/csswg/selectors4/#compound |
| 316 bool isCompound() const; | 318 bool isCompound() const; |
| 317 | 319 |
| 318 bool isForPage() const { return m_isForPage; } | 320 bool isForPage() const { return m_isForPage; } |
| 319 void setForPage() { m_isForPage = true; } | 321 void setForPage() { m_isForPage = true; } |
| 320 | 322 |
| 321 bool relationIsAffectedByPseudoContent() const { return m_relationIsAffe
ctedByPseudoContent; } | 323 bool relationIsAffectedByPseudoContent() const { return m_relationIsAffe
ctedByPseudoContent; } |
| 322 void setRelationIsAffectedByPseudoContent() { m_relationIsAffectedByPseu
doContent = true; } | 324 void setRelationIsAffectedByPseudoContent() { m_relationIsAffectedByPseu
doContent = true; } |
| 325 bool tagIsCamelCase() const { return m_tagSelectorCase == TagCamelCase;
} |
| 326 void setTagIsCamelCase() { m_tagSelectorCase = TagCamelCase; } |
| 323 | 327 |
| 324 private: | 328 private: |
| 325 unsigned m_relation : 3; // enum Relation | 329 unsigned m_relation : 3; // enum Relation |
| 326 mutable unsigned m_match : 4; // enum Match | 330 mutable unsigned m_match : 4; // enum Match |
| 327 mutable unsigned m_pseudoType : 8; // PseudoType | 331 mutable unsigned m_pseudoType : 8; // PseudoType |
| 328 mutable unsigned m_parsedNth : 1; // Used for :nth-* | 332 mutable unsigned m_parsedNth : 1; // Used for :nth-* |
| 329 unsigned m_isLastInSelectorList : 1; | 333 unsigned m_isLastInSelectorList : 1; |
| 330 unsigned m_isLastInTagHistory : 1; | 334 unsigned m_isLastInTagHistory : 1; |
| 331 unsigned m_hasRareData : 1; | 335 unsigned m_hasRareData : 1; |
| 332 unsigned m_isForPage : 1; | 336 unsigned m_isForPage : 1; |
| 333 unsigned m_tagIsImplicit : 1; | 337 unsigned m_tagIsImplicit : 1; |
| 338 unsigned m_tagSelectorCase : 1; // enum TagSelectorCase |
| 334 unsigned m_relationIsAffectedByPseudoContent : 1; | 339 unsigned m_relationIsAffectedByPseudoContent : 1; |
| 335 | 340 |
| 336 unsigned specificityForOneSelector() const; | 341 unsigned specificityForOneSelector() const; |
| 337 unsigned specificityForPage() const; | 342 unsigned specificityForPage() const; |
| 338 void extractPseudoType() const; | 343 void extractPseudoType() const; |
| 339 | 344 |
| 340 // Hide. | 345 // Hide. |
| 341 CSSSelector& operator=(const CSSSelector&); | 346 CSSSelector& operator=(const CSSSelector&); |
| 342 | 347 |
| 343 struct RareData : public RefCounted<RareData> { | 348 struct RareData : public RefCounted<RareData> { |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 inline CSSSelector::CSSSelector() | 474 inline CSSSelector::CSSSelector() |
| 470 : m_relation(SubSelector) | 475 : m_relation(SubSelector) |
| 471 , m_match(Unknown) | 476 , m_match(Unknown) |
| 472 , m_pseudoType(PseudoNotParsed) | 477 , m_pseudoType(PseudoNotParsed) |
| 473 , m_parsedNth(false) | 478 , m_parsedNth(false) |
| 474 , m_isLastInSelectorList(false) | 479 , m_isLastInSelectorList(false) |
| 475 , m_isLastInTagHistory(true) | 480 , m_isLastInTagHistory(true) |
| 476 , m_hasRareData(false) | 481 , m_hasRareData(false) |
| 477 , m_isForPage(false) | 482 , m_isForPage(false) |
| 478 , m_tagIsImplicit(false) | 483 , m_tagIsImplicit(false) |
| 484 , m_tagSelectorCase(TagLowerCase) |
| 479 , m_relationIsAffectedByPseudoContent(false) | 485 , m_relationIsAffectedByPseudoContent(false) |
| 480 { | 486 { |
| 481 } | 487 } |
| 482 | 488 |
| 483 inline CSSSelector::CSSSelector(const QualifiedName& tagQName, bool tagIsImplici
t) | 489 inline CSSSelector::CSSSelector(const QualifiedName& tagQName, bool tagIsImplici
t, TagSelectorCase tagSelectorCase) |
| 484 : m_relation(SubSelector) | 490 : m_relation(SubSelector) |
| 485 , m_match(Tag) | 491 , m_match(Tag) |
| 486 , m_pseudoType(PseudoNotParsed) | 492 , m_pseudoType(PseudoNotParsed) |
| 487 , m_parsedNth(false) | 493 , m_parsedNth(false) |
| 488 , m_isLastInSelectorList(false) | 494 , m_isLastInSelectorList(false) |
| 489 , m_isLastInTagHistory(true) | 495 , m_isLastInTagHistory(true) |
| 490 , m_hasRareData(false) | 496 , m_hasRareData(false) |
| 491 , m_isForPage(false) | 497 , m_isForPage(false) |
| 492 , m_tagIsImplicit(tagIsImplicit) | 498 , m_tagIsImplicit(tagIsImplicit) |
| 499 , m_tagSelectorCase(tagSelectorCase) |
| 493 , m_relationIsAffectedByPseudoContent(false) | 500 , m_relationIsAffectedByPseudoContent(false) |
| 494 { | 501 { |
| 495 m_data.m_tagQName = tagQName.impl(); | 502 m_data.m_tagQName = tagQName.impl(); |
| 496 m_data.m_tagQName->ref(); | 503 m_data.m_tagQName->ref(); |
| 497 } | 504 } |
| 498 | 505 |
| 499 inline CSSSelector::CSSSelector(const CSSSelector& o) | 506 inline CSSSelector::CSSSelector(const CSSSelector& o) |
| 500 : m_relation(o.m_relation) | 507 : m_relation(o.m_relation) |
| 501 , m_match(o.m_match) | 508 , m_match(o.m_match) |
| 502 , m_pseudoType(o.m_pseudoType) | 509 , m_pseudoType(o.m_pseudoType) |
| 503 , m_parsedNth(o.m_parsedNth) | 510 , m_parsedNth(o.m_parsedNth) |
| 504 , m_isLastInSelectorList(o.m_isLastInSelectorList) | 511 , m_isLastInSelectorList(o.m_isLastInSelectorList) |
| 505 , m_isLastInTagHistory(o.m_isLastInTagHistory) | 512 , m_isLastInTagHistory(o.m_isLastInTagHistory) |
| 506 , m_hasRareData(o.m_hasRareData) | 513 , m_hasRareData(o.m_hasRareData) |
| 507 , m_isForPage(o.m_isForPage) | 514 , m_isForPage(o.m_isForPage) |
| 508 , m_tagIsImplicit(o.m_tagIsImplicit) | 515 , m_tagIsImplicit(o.m_tagIsImplicit) |
| 516 , m_tagSelectorCase(o.m_tagSelectorCase) |
| 509 , m_relationIsAffectedByPseudoContent(o.m_relationIsAffectedByPseudoContent) | 517 , m_relationIsAffectedByPseudoContent(o.m_relationIsAffectedByPseudoContent) |
| 510 { | 518 { |
| 511 if (o.m_match == Tag) { | 519 if (o.m_match == Tag) { |
| 512 m_data.m_tagQName = o.m_data.m_tagQName; | 520 m_data.m_tagQName = o.m_data.m_tagQName; |
| 513 m_data.m_tagQName->ref(); | 521 m_data.m_tagQName->ref(); |
| 514 } else if (o.m_hasRareData) { | 522 } else if (o.m_hasRareData) { |
| 515 m_data.m_rareData = o.m_data.m_rareData; | 523 m_data.m_rareData = o.m_data.m_rareData; |
| 516 m_data.m_rareData->ref(); | 524 m_data.m_rareData->ref(); |
| 517 } else if (o.m_data.m_value) { | 525 } else if (o.m_data.m_value) { |
| 518 m_data.m_value = o.m_data.m_value; | 526 m_data.m_value = o.m_data.m_value; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 542 if (m_hasRareData) | 550 if (m_hasRareData) |
| 543 return m_data.m_rareData->m_value; | 551 return m_data.m_rareData->m_value; |
| 544 // AtomicString is really just a StringImpl* so the cast below is safe. | 552 // AtomicString is really just a StringImpl* so the cast below is safe. |
| 545 // FIXME: Perhaps call sites could be changed to accept StringImpl? | 553 // FIXME: Perhaps call sites could be changed to accept StringImpl? |
| 546 return *reinterpret_cast<const AtomicString*>(&m_data.m_value); | 554 return *reinterpret_cast<const AtomicString*>(&m_data.m_value); |
| 547 } | 555 } |
| 548 | 556 |
| 549 } // namespace blink | 557 } // namespace blink |
| 550 | 558 |
| 551 #endif // CSSSelector_h | 559 #endif // CSSSelector_h |
| OLD | NEW |