summaryrefslogtreecommitdiffstats
path: root/WebCore/css/CSSSelector.h
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/css/CSSSelector.h')
-rw-r--r--WebCore/css/CSSSelector.h111
1 files changed, 74 insertions, 37 deletions
diff --git a/WebCore/css/CSSSelector.h b/WebCore/css/CSSSelector.h
index 4f82877..728c34d 100644
--- a/WebCore/css/CSSSelector.h
+++ b/WebCore/css/CSSSelector.h
@@ -25,57 +25,44 @@
#define CSSSelector_h
#include "QualifiedName.h"
+#include <wtf/Noncopyable.h>
+#include <wtf/OwnPtr.h>
namespace WebCore {
// this class represents a selector for a StyleRule
- class CSSSelector {
+ class CSSSelector : Noncopyable {
public:
CSSSelector()
- : m_tagHistory(0)
- , m_simpleSelector(0)
- , m_nextSelector(0)
- , m_argument(nullAtom)
- , m_attr(anyQName())
- , m_tag(anyQName())
+ : m_tag(anyQName())
, m_relation(Descendant)
, m_match(None)
, m_pseudoType(PseudoNotParsed)
, m_parsedNth(false)
+ , m_isLastInSelectorList(false)
+ , m_hasRareData(false)
{
}
CSSSelector(const QualifiedName& qName)
- : m_tagHistory(0)
- , m_simpleSelector(0)
- , m_nextSelector(0)
- , m_argument(nullAtom)
- , m_attr(anyQName())
- , m_tag(qName)
+ : m_tag(qName)
, m_relation(Descendant)
, m_match(None)
, m_pseudoType(PseudoNotParsed)
, m_parsedNth(false)
+ , m_isLastInSelectorList(false)
+ , m_hasRareData(false)
{
}
~CSSSelector()
{
- delete m_tagHistory;
- delete m_simpleSelector;
- delete m_nextSelector;
+ if (m_hasRareData)
+ delete m_data.m_rareData;
+ else
+ delete m_data.m_tagHistory;
}
- void append(CSSSelector* n)
- {
- CSSSelector* end = this;
- while (end->m_nextSelector)
- end = end->m_nextSelector;
- end->m_nextSelector = n;
- }
-
- CSSSelector* next() { return m_nextSelector; }
-
/**
* Re-create selector text from selector's data
*/
@@ -180,7 +167,9 @@ namespace WebCore {
PseudoMediaControlsPanel,
PseudoMediaControlsMuteButton,
PseudoMediaControlsPlayButton,
- PseudoMediaControlsTimeDisplay,
+ PseudoMediaControlsTimelineContainer,
+ PseudoMediaControlsCurrentTimeDisplay,
+ PseudoMediaControlsTimeRemainingDisplay,
PseudoMediaControlsTimeline,
PseudoMediaControlsSeekBackButton,
PseudoMediaControlsSeekForwardButton,
@@ -193,30 +182,78 @@ namespace WebCore {
extractPseudoType();
return static_cast<PseudoType>(m_pseudoType);
}
+
+ CSSSelector* tagHistory() const { return m_hasRareData ? m_data.m_rareData->m_tagHistory.get() : m_data.m_tagHistory; }
+ void setTagHistory(CSSSelector* tagHistory);
bool hasTag() const { return m_tag != anyQName(); }
- bool hasAttribute() const { return m_attr != anyQName(); }
+ bool hasAttribute() const { return m_match == Id || m_match == Class || (m_hasRareData && m_data.m_rareData->m_attribute != anyQName()); }
+
+ const QualifiedName& attribute() const;
+ const AtomicString& argument() const { return m_hasRareData ? m_data.m_rareData->m_argument : nullAtom; }
+ CSSSelector* simpleSelector() const { return m_hasRareData ? m_data.m_rareData->m_simpleSelector.get() : 0; }
+
+ void setAttribute(const QualifiedName& value);
+ void setArgument(const AtomicString& value);
+ void setSimpleSelector(CSSSelector* value);
+
+ bool parseNth();
+ bool matchNth(int count);
Relation relation() const { return static_cast<Relation>(m_relation); }
- mutable AtomicString m_value;
- CSSSelector* m_tagHistory;
- CSSSelector* m_simpleSelector; // Used for :not.
- CSSSelector* m_nextSelector; // used for ,-chained selectors
- AtomicString m_argument; // Used for :contains, :lang and :nth-*
+ bool isLastInSelectorList() const { return m_isLastInSelectorList; }
+ void setLastInSelectorList() { m_isLastInSelectorList = true; }
- QualifiedName m_attr;
+ mutable AtomicString m_value;
QualifiedName m_tag;
unsigned m_relation : 3; // enum Relation
mutable unsigned m_match : 4; // enum Match
mutable unsigned m_pseudoType : 8; // PseudoType
- protected:
- bool m_parsedNth : 1; // used in CSSNthSelector
-
private:
+ bool m_parsedNth : 1; // Used for :nth-*
+ bool m_isLastInSelectorList : 1;
+ bool m_hasRareData : 1;
+
void extractPseudoType() const;
+
+ struct RareData {
+ RareData(CSSSelector* tagHistory)
+ : m_tagHistory(tagHistory)
+ , m_simpleSelector(0)
+ , m_attribute(anyQName())
+ , m_argument(nullAtom)
+ , m_a(0)
+ , m_b(0)
+ {
+ }
+
+ bool parseNth();
+ bool matchNth(int count);
+
+ OwnPtr<CSSSelector> m_tagHistory;
+ OwnPtr<CSSSelector> m_simpleSelector; // Used for :not.
+ QualifiedName m_attribute; // used for attribute selector
+ AtomicString m_argument; // Used for :contains, :lang and :nth-*
+ int m_a; // Used for :nth-*
+ int m_b; // Used for :nth-*
+ };
+
+ void createRareData()
+ {
+ if (m_hasRareData)
+ return;
+ m_data.m_rareData = new RareData(m_data.m_tagHistory);
+ m_hasRareData = true;
+ }
+
+ union DataUnion {
+ DataUnion() : m_tagHistory(0) { }
+ CSSSelector* m_tagHistory;
+ RareData* m_rareData;
+ } m_data;
};
} // namespace WebCore