LayoutTests:
[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     {
34     public:
35         CSSSelector()
36             : tagHistory(0)
37             , simpleSelector(0)
38             , nextSelector(0)
39             , argument(nullAtom)
40             , attr(anyQName())
41             , tag(anyQName())
42             , m_relation(Descendant)
43             , match(None)
44             , pseudoId(0)
45             , _pseudoType(PseudoNotParsed)
46         {}
47         
48         CSSSelector(const QualifiedName& qName)
49             : tagHistory(0)
50             , simpleSelector(0)
51             , nextSelector(0)
52             , argument(nullAtom)
53             , attr(anyQName())
54             , tag(qName)
55             , m_relation(Descendant)
56             , match(None)
57             , pseudoId(0)
58             , _pseudoType(PseudoNotParsed)
59         {}
60
61         ~CSSSelector() {
62             delete tagHistory;
63             delete simpleSelector;
64             delete nextSelector;
65         }
66
67         void append(CSSSelector* n) {
68             CSSSelector* end = this;
69             while (end->nextSelector)
70                 end = end->nextSelector;
71             end->nextSelector = n;
72         }
73         CSSSelector* next() { return nextSelector; }
74
75         /**
76          * Print debug output for this selector
77          */
78         void print();
79
80         /**
81          * Re-create selector text from selector's data
82          */
83         String selectorText() const;
84
85         // checks if the 2 selectors (including sub selectors) agree.
86         bool operator ==(const CSSSelector&);
87
88         // tag == -1 means apply to all elements (Selector = *)
89
90         unsigned specificity();
91
92         /* how the attribute value has to match.... Default is Exact */
93         enum Match {
94             None = 0,
95             Id,
96             Class,
97             Exact,
98             Set,
99             List,
100             Hyphen,
101             PseudoClass,
102             PseudoElement,
103             Contain,   // css3: E[foo*="bar"]
104             Begin,     // css3: E[foo^="bar"]
105             End        // css3: E[foo$="bar"]
106         };
107
108         enum Relation {
109             Descendant = 0,
110             Child,
111             DirectAdjacent,
112             IndirectAdjacent,
113             SubSelector
114         };
115
116         enum PseudoType {
117             PseudoNotParsed = 0,
118             PseudoOther,
119             PseudoEmpty,
120             PseudoFirstChild,
121             PseudoFirstOfType,
122             PseudoLastChild,
123             PseudoLastOfType,
124             PseudoOnlyChild,
125             PseudoOnlyOfType,
126             PseudoFirstLine,
127             PseudoFirstLetter,
128             PseudoLink,
129             PseudoVisited,
130             PseudoAnyLink,
131             PseudoAutofill,
132             PseudoHover,
133             PseudoDrag,
134             PseudoFocus,
135             PseudoActive,
136             PseudoChecked,
137             PseudoEnabled,
138             PseudoDisabled,
139             PseudoIndeterminate,
140             PseudoTarget,
141             PseudoBefore,
142             PseudoAfter,
143             PseudoLang,
144             PseudoNot,
145             PseudoRoot,
146             PseudoSelection,
147             PseudoFileUploadButton,
148             PseudoSliderThumb
149         };
150
151         PseudoType pseudoType() const
152         {
153             if (_pseudoType == PseudoNotParsed)
154                 extractPseudoType();
155             return static_cast<PseudoType>(_pseudoType);
156         }
157
158         bool hasTag() const { return tag != anyQName(); }
159         bool hasAttribute() const { return attr != anyQName(); }
160
161         mutable AtomicString value;
162         CSSSelector* tagHistory;
163         CSSSelector* simpleSelector; // Used for :not.
164         CSSSelector* nextSelector; // used for ,-chained selectors
165         AtomicString argument; // Used for :contains, :lang and :nth-*
166         
167         QualifiedName attr;
168         QualifiedName tag;
169         
170         Relation relation() const { return static_cast<Relation>(m_relation); }
171
172         unsigned m_relation          : 3; // enum Relation
173         mutable unsigned match       : 4; // enum Match
174         unsigned pseudoId            : 3;
175         mutable unsigned _pseudoType : 5; // PseudoType
176
177     private:
178         void extractPseudoType() const;
179     };
180 }
181
182 #endif