2007-02-09 Nicholas Shanks <webkit@nickshanks.com>
[WebKit-https.git] / WebCore / css / CSSSelector.h
1 /*
2  * This file is part of the CSS implementation for KDE.
3  *
4  * Copyright (C) 1999-2003 Lars Knoll (knoll@kde.org)
5  *               1999 Waldo Bastian (bastian@kde.org)
6  * Copyright (C) 2004, 2006 Apple Computer, Inc.
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23
24 #ifndef CSSSelector_h
25 #define CSSSelector_h
26
27 #include "QualifiedName.h"
28
29 namespace WebCore {
30
31     // this class represents a selector for a StyleRule
32     class CSSSelector {
33     public:
34         CSSSelector()
35             : m_tagHistory(0)
36             , m_simpleSelector(0)
37             , m_nextSelector(0)
38             , m_argument(nullAtom)
39             , m_attr(anyQName())
40             , m_tag(anyQName())
41             , m_relation(Descendant)
42             , m_match(None)
43             , m_pseudoType(PseudoNotParsed)
44         {
45         }
46
47         CSSSelector(const QualifiedName& qName)
48             : m_tagHistory(0)
49             , m_simpleSelector(0)
50             , m_nextSelector(0)
51             , m_argument(nullAtom)
52             , m_attr(anyQName())
53             , m_tag(qName)
54             , m_relation(Descendant)
55             , m_match(None)
56             , m_pseudoType(PseudoNotParsed)
57         {
58         }
59
60         ~CSSSelector()
61         {
62             delete m_tagHistory;
63             delete m_simpleSelector;
64             delete m_nextSelector;
65         }
66
67         void append(CSSSelector* n)
68         {
69             CSSSelector* end = this;
70             while (end->m_nextSelector)
71                 end = end->m_nextSelector;
72             end->m_nextSelector = n;
73         }
74
75         CSSSelector* next() { return m_nextSelector; }
76
77         /**
78          * Print debug output for this selector
79          */
80         void print();
81
82         /**
83          * Re-create selector text from selector's data
84          */
85         String selectorText() const;
86
87         // checks if the 2 selectors (including sub selectors) agree.
88         bool operator==(const CSSSelector&);
89
90         // tag == -1 means apply to all elements (Selector = *)
91
92         unsigned specificity();
93
94         /* how the attribute value has to match.... Default is Exact */
95         enum Match {
96             None = 0,
97             Id,
98             Class,
99             Exact,
100             Set,
101             List,
102             Hyphen,
103             PseudoClass,
104             PseudoElement,
105             Contain,   // css3: E[foo*="bar"]
106             Begin,     // css3: E[foo^="bar"]
107             End        // css3: E[foo$="bar"]
108         };
109
110         enum Relation {
111             Descendant = 0,
112             Child,
113             DirectAdjacent,
114             IndirectAdjacent,
115             SubSelector
116         };
117
118         enum PseudoType {
119             PseudoNotParsed = 0,
120             PseudoUnknown,
121             PseudoEmpty,
122             PseudoFirstChild,
123             PseudoFirstOfType,
124             PseudoFirstLine,
125             PseudoFirstLetter,
126             PseudoLink,
127             PseudoVisited,
128             PseudoAnyLink,
129             PseudoAutofill,
130             PseudoHover,
131             PseudoDrag,
132             PseudoFocus,
133             PseudoActive,
134             PseudoChecked,
135             PseudoEnabled,
136             PseudoDisabled,
137             PseudoIndeterminate,
138             PseudoTarget,
139             PseudoBefore,
140             PseudoAfter,
141             PseudoLang,
142             PseudoNot,
143             PseudoRoot,
144             PseudoSelection,
145             PseudoFileUploadButton,
146             PseudoSliderThumb,
147             PseudoSearchCancelButton,
148             PseudoSearchDecoration,
149             PseudoSearchResultsDecoration,
150             PseudoSearchResultsButton
151         };
152
153         PseudoType pseudoType() const
154         {
155             if (m_pseudoType == PseudoNotParsed)
156                 extractPseudoType();
157             return static_cast<PseudoType>(m_pseudoType);
158         }
159
160         bool hasTag() const { return m_tag != anyQName(); }
161         bool hasAttribute() const { return m_attr != anyQName(); }
162
163         Relation relation() const { return static_cast<Relation>(m_relation); }
164
165         mutable AtomicString m_value;
166         CSSSelector* m_tagHistory;
167         CSSSelector* m_simpleSelector; // Used for :not.
168         CSSSelector* m_nextSelector; // used for ,-chained selectors
169         AtomicString m_argument; // Used for :contains, :lang and :nth-*
170
171         QualifiedName m_attr;
172         QualifiedName m_tag;
173
174         unsigned m_relation           : 3; // enum Relation
175         mutable unsigned m_match      : 4; // enum Match
176         mutable unsigned m_pseudoType : 6; // PseudoType
177
178     private:
179         void extractPseudoType() const;
180     };
181
182 } // namespace WebCore
183
184 #endif // CSSSelector_h