18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999-2003 Lars Knoll (knoll@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *               1999 Waldo Bastian (bastian@kde.org)
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *               2001 Andreas Schlapbach (schlpbch@iam.unibe.ch)
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *               2001-2003 Dirk Mueller (mueller@kde.org)
6e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Copyright (C) 2002, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008 David Smith (catfish.man@gmail.com)
806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Copyright (C) 2010 Google Inc. All rights reserved.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSSelector.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "CSSOMUtils.h"
302bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "CSSSelectorList.h"
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "HTMLNames.h"
32545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include <wtf/Assertions.h>
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/HashMap.h>
34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/StdLibExtras.h>
35967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include <wtf/Vector.h>
36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
38dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing namespace HTMLNames;
402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
412fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSSelector::createRareData()
422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_hasRareData)
442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Move the value to the rare data stucture.
462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_data.m_rareData = new RareData(adoptRef(m_data.m_value));
472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_hasRareData = true;
482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
49967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
50f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickunsigned CSSSelector::specificity() const
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
52f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // make sure the result doesn't overflow
53f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    static const unsigned maxValueMask = 0xffffff;
54f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    unsigned total = 0;
55f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    for (const CSSSelector* selector = this; selector; selector = selector->tagHistory()) {
56f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (selector->m_isForPage)
57f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return (total + selector->specificityForPage()) & maxValueMask;
58f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        total = (total + selector->specificityForOneSelector()) & maxValueMask;
59f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
60f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return total;
61f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
6206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
63f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickinline unsigned CSSSelector::specificityForOneSelector() const
64f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Pseudo-elements and pseudo-classes do not have the same specificity. This function
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // isn't quite correct.
67f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    unsigned s = (m_tag.localName() == starAtom ? 0 : 1);
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (m_match) {
69f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    case Id:
70f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        s += 0x10000;
71f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        break;
72f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    case Exact:
73f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    case Class:
74f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    case Set:
75f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    case List:
76f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    case Hyphen:
77f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    case PseudoClass:
78f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    case PseudoElement:
79f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    case Contain:
80f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    case Begin:
81f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    case End:
822bde8e466a4451c7319e3a072d118917957d6554Steve Block        // FIXME: PsuedoAny should base the specificity on the sub-selectors.
832bde8e466a4451c7319e3a072d118917957d6554Steve Block        // See http://lists.w3.org/Archives/Public/www-style/2010Sep/0530.html
842bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (pseudoType() == PseudoNot) {
852bde8e466a4451c7319e3a072d118917957d6554Steve Block            ASSERT(selectorList());
862bde8e466a4451c7319e3a072d118917957d6554Steve Block            s += selectorList()->first()->specificityForOneSelector();
872bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            s += 0x100;
89f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    case None:
90f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        break;
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
92f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return s;
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
95f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickunsigned CSSSelector::specificityForPage() const
9606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
9706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // See http://dev.w3.org/csswg/css3-page/#cascading-and-page-context
9806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    unsigned s = (m_tag.localName() == starAtom ? 0 : 4);
9906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
10006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    switch (pseudoType()) {
10106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case PseudoFirstPage:
10206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        s += 2;
10306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
10406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case PseudoLeftPage:
10506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case PseudoRightPage:
10606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        s += 1;
10706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
10806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case PseudoNotParsed:
10906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
11006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    default:
11106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        ASSERT_NOT_REACHED();
11206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
11306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return s;
11406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
11506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockPseudoId CSSSelector::pseudoId(PseudoType type)
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    switch (type) {
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoFirstLine:
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return FIRST_LINE;
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoFirstLetter:
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return FIRST_LETTER;
123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoSelection:
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return SELECTION;
125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoBefore:
126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return BEFORE;
127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoAfter:
128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return AFTER;
129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoFileUploadButton:
130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return FILE_UPLOAD_BUTTON;
131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoInputPlaceholder:
132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return INPUT_PLACEHOLDER;
13306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(INPUT_SPEECH)
13406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case PseudoInputSpeechButton:
13506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return INPUT_SPEECH_BUTTON;
13606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoSearchCancelButton:
138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return SEARCH_CANCEL_BUTTON;
139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoSearchDecoration:
140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return SEARCH_DECORATION;
141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoSearchResultsDecoration:
142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return SEARCH_RESULTS_DECORATION;
143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoSearchResultsButton:
144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return SEARCH_RESULTS_BUTTON;
145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoScrollbar:
146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return SCROLLBAR;
147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoScrollbarButton:
148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return SCROLLBAR_BUTTON;
149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoScrollbarCorner:
150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return SCROLLBAR_CORNER;
151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoScrollbarThumb:
152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return SCROLLBAR_THUMB;
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoScrollbarTrack:
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return SCROLLBAR_TRACK;
155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoScrollbarTrackPiece:
156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return SCROLLBAR_TRACK_PIECE;
157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoResizer:
158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return RESIZER;
159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoInnerSpinButton:
160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return INNER_SPIN_BUTTON;
161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoOuterSpinButton:
162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return OUTER_SPIN_BUTTON;
1635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(FULLSCREEN_API)
1645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    case PseudoFullScreen:
1655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return FULL_SCREEN;
1665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    case PseudoFullScreenDocument:
1675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return FULL_SCREEN_DOCUMENT;
1685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
1695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoInputListButton:
171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(DATALIST)
172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return INPUT_LIST_BUTTON;
173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoUnknown:
175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoEmpty:
176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoFirstChild:
177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoFirstOfType:
178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoLastChild:
179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoLastOfType:
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoOnlyChild:
181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoOnlyOfType:
182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoNthChild:
183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoNthOfType:
184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoNthLastChild:
185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoNthLastOfType:
186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoLink:
187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoVisited:
1882bde8e466a4451c7319e3a072d118917957d6554Steve Block    case PseudoAny:
189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoAnyLink:
190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoAutofill:
191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoHover:
192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoDrag:
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoFocus:
194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoActive:
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoChecked:
196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoEnabled:
197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoFullPageMedia:
198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoDefault:
199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoDisabled:
200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoOptional:
201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoRequired:
202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoReadOnly:
203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoReadWrite:
204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoValid:
205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoInvalid:
206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoIndeterminate:
207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoTarget:
208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoLang:
209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoNot:
210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoRoot:
211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoScrollbarBack:
212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoScrollbarForward:
213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoWindowInactive:
214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoCornerPresent:
215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoDecrement:
216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoIncrement:
217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoHorizontal:
218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoVertical:
219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoStart:
220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoEnd:
221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoDoubleButton:
222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoSingleButton:
223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoNoButton:
22421939df44de1705786c545cd1bf519d47250322dBen Murdoch    case PseudoFirstPage:
22521939df44de1705786c545cd1bf519d47250322dBen Murdoch    case PseudoLeftPage:
22621939df44de1705786c545cd1bf519d47250322dBen Murdoch    case PseudoRightPage:
227cad810f21b803229eb11403f9209855525a25d57Steve Block    case PseudoInRange:
228cad810f21b803229eb11403f9209855525a25d57Steve Block    case PseudoOutOfRange:
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return NOPSEUDO;
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoNotParsed:
231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ASSERT_NOT_REACHED();
232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return NOPSEUDO;
233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT_NOT_REACHED();
236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return NOPSEUDO;
237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic HashMap<AtomicStringImpl*, CSSSelector::PseudoType>* nameToPseudoTypeMap()
240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
241635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, active, ("active"));
242635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, after, ("after"));
2432bde8e466a4451c7319e3a072d118917957d6554Steve Block    DEFINE_STATIC_LOCAL(AtomicString, any, ("-webkit-any("));
244635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, anyLink, ("-webkit-any-link"));
245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, autofill, ("-webkit-autofill"));
246635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, before, ("before"));
247635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, checked, ("checked"));
248635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, fileUploadButton, ("-webkit-file-upload-button"));
24906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(INPUT_SPEECH)
25006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    DEFINE_STATIC_LOCAL(AtomicString, inputSpeechButton, ("-webkit-input-speech-button"));
25106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
252231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(AtomicString, defaultString, ("default"));
253635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, disabled, ("disabled"));
254635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, readOnly, ("read-only"));
255635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, readWrite, ("read-write"));
256231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(AtomicString, valid, ("valid"));
257231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(AtomicString, invalid, ("invalid"));
258635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, drag, ("-webkit-drag"));
259635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, dragAlias, ("-khtml-drag")); // was documented with this name in Apple documentation, so keep an alia
260635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, empty, ("empty"));
261635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, enabled, ("enabled"));
262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, firstChild, ("first-child"));
263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, firstLetter, ("first-letter"));
264635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, firstLine, ("first-line"));
265635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, firstOfType, ("first-of-type"));
266635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, fullPageMedia, ("-webkit-full-page-media"));
267635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, nthChild, ("nth-child("));
268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, nthOfType, ("nth-of-type("));
269635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, nthLastChild, ("nth-last-child("));
270635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, nthLastOfType, ("nth-last-of-type("));
271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, focus, ("focus"));
272635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, hover, ("hover"));
273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, indeterminate, ("indeterminate"));
274d0825bca7fe65beaee391d30da42e937db621564Steve Block    DEFINE_STATIC_LOCAL(AtomicString, innerSpinButton, ("-webkit-inner-spin-button"));
275231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(DATALIST)
276231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(AtomicString, inputListButton, ("-webkit-input-list-button"));
277231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
278635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, inputPlaceholder, ("-webkit-input-placeholder"));
279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, lastChild, ("last-child"));
280635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, lastOfType, ("last-of-type"));
281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, link, ("link"));
282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, lang, ("lang("));
283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, notStr, ("not("));
284635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, onlyChild, ("only-child"));
285635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, onlyOfType, ("only-of-type"));
2860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DEFINE_STATIC_LOCAL(AtomicString, optional, ("optional"));
287d0825bca7fe65beaee391d30da42e937db621564Steve Block    DEFINE_STATIC_LOCAL(AtomicString, outerSpinButton, ("-webkit-outer-spin-button"));
2880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DEFINE_STATIC_LOCAL(AtomicString, required, ("required"));
289635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, resizer, ("-webkit-resizer"));
290635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, root, ("root"));
291635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, scrollbar, ("-webkit-scrollbar"));
292635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, scrollbarButton, ("-webkit-scrollbar-button"));
293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, scrollbarCorner, ("-webkit-scrollbar-corner"));
294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, scrollbarThumb, ("-webkit-scrollbar-thumb"));
295635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, scrollbarTrack, ("-webkit-scrollbar-track"));
296635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, scrollbarTrackPiece, ("-webkit-scrollbar-track-piece"));
297635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, searchCancelButton, ("-webkit-search-cancel-button"));
298635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, searchDecoration, ("-webkit-search-decoration"));
299635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, searchResultsDecoration, ("-webkit-search-results-decoration"));
300635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, searchResultsButton, ("-webkit-search-results-button"));
301635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, selection, ("selection"));
302635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, target, ("target"));
303635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, visited, ("visited"));
304635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, windowInactive, ("window-inactive"));
305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, decrement, ("decrement"));
306635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, increment, ("increment"));
307635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, start, ("start"));
308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, end, ("end"));
309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, horizontal, ("horizontal"));
310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, vertical, ("vertical"));
311635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, doubleButton, ("double-button"));
312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, singleButton, ("single-button"));
313635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, noButton, ("no-button"));
314635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(AtomicString, cornerPresent, ("corner-present"));
31521939df44de1705786c545cd1bf519d47250322dBen Murdoch    // Paged Media pseudo-classes
31621939df44de1705786c545cd1bf519d47250322dBen Murdoch    DEFINE_STATIC_LOCAL(AtomicString, firstPage, ("first"));
31721939df44de1705786c545cd1bf519d47250322dBen Murdoch    DEFINE_STATIC_LOCAL(AtomicString, leftPage, ("left"));
31821939df44de1705786c545cd1bf519d47250322dBen Murdoch    DEFINE_STATIC_LOCAL(AtomicString, rightPage, ("right"));
3195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(FULLSCREEN_API)
3205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    DEFINE_STATIC_LOCAL(AtomicString, fullScreen, ("-webkit-full-screen"));
3215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    DEFINE_STATIC_LOCAL(AtomicString, fullScreenDocument, ("-webkit-full-screen-document"));
3225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
323cad810f21b803229eb11403f9209855525a25d57Steve Block    DEFINE_STATIC_LOCAL(AtomicString, inRange, ("in-range"));
324cad810f21b803229eb11403f9209855525a25d57Steve Block    DEFINE_STATIC_LOCAL(AtomicString, outOfRange, ("out-of-range"));
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    static HashMap<AtomicStringImpl*, CSSSelector::PseudoType>* nameToPseudoType = 0;
327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!nameToPseudoType) {
328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType = new HashMap<AtomicStringImpl*, CSSSelector::PseudoType>;
329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(active.impl(), CSSSelector::PseudoActive);
330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(after.impl(), CSSSelector::PseudoAfter);
331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(anyLink.impl(), CSSSelector::PseudoAnyLink);
3322bde8e466a4451c7319e3a072d118917957d6554Steve Block        nameToPseudoType->set(any.impl(), CSSSelector::PseudoAny);
333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(autofill.impl(), CSSSelector::PseudoAutofill);
334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(before.impl(), CSSSelector::PseudoBefore);
335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(checked.impl(), CSSSelector::PseudoChecked);
336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(fileUploadButton.impl(), CSSSelector::PseudoFileUploadButton);
33706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(INPUT_SPEECH)
33806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        nameToPseudoType->set(inputSpeechButton.impl(), CSSSelector::PseudoInputSpeechButton);
33906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(defaultString.impl(), CSSSelector::PseudoDefault);
341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(disabled.impl(), CSSSelector::PseudoDisabled);
342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(readOnly.impl(), CSSSelector::PseudoReadOnly);
343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(readWrite.impl(), CSSSelector::PseudoReadWrite);
344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(valid.impl(), CSSSelector::PseudoValid);
345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(invalid.impl(), CSSSelector::PseudoInvalid);
346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(drag.impl(), CSSSelector::PseudoDrag);
347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(dragAlias.impl(), CSSSelector::PseudoDrag);
348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(enabled.impl(), CSSSelector::PseudoEnabled);
349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(empty.impl(), CSSSelector::PseudoEmpty);
350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(firstChild.impl(), CSSSelector::PseudoFirstChild);
351dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(fullPageMedia.impl(), CSSSelector::PseudoFullPageMedia);
352dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(DATALIST)
353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(inputListButton.impl(), CSSSelector::PseudoInputListButton);
354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(inputPlaceholder.impl(), CSSSelector::PseudoInputPlaceholder);
356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(lastChild.impl(), CSSSelector::PseudoLastChild);
357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(lastOfType.impl(), CSSSelector::PseudoLastOfType);
358dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(onlyChild.impl(), CSSSelector::PseudoOnlyChild);
359dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(onlyOfType.impl(), CSSSelector::PseudoOnlyOfType);
360dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(firstLetter.impl(), CSSSelector::PseudoFirstLetter);
361dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(firstLine.impl(), CSSSelector::PseudoFirstLine);
362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(firstOfType.impl(), CSSSelector::PseudoFirstOfType);
363dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(focus.impl(), CSSSelector::PseudoFocus);
364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(hover.impl(), CSSSelector::PseudoHover);
365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(indeterminate.impl(), CSSSelector::PseudoIndeterminate);
366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(innerSpinButton.impl(), CSSSelector::PseudoInnerSpinButton);
367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(link.impl(), CSSSelector::PseudoLink);
368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(lang.impl(), CSSSelector::PseudoLang);
369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(notStr.impl(), CSSSelector::PseudoNot);
370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(nthChild.impl(), CSSSelector::PseudoNthChild);
371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(nthOfType.impl(), CSSSelector::PseudoNthOfType);
372dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(nthLastChild.impl(), CSSSelector::PseudoNthLastChild);
373dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(nthLastOfType.impl(), CSSSelector::PseudoNthLastOfType);
374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(outerSpinButton.impl(), CSSSelector::PseudoOuterSpinButton);
375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(root.impl(), CSSSelector::PseudoRoot);
376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(windowInactive.impl(), CSSSelector::PseudoWindowInactive);
377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(decrement.impl(), CSSSelector::PseudoDecrement);
378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(increment.impl(), CSSSelector::PseudoIncrement);
379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(start.impl(), CSSSelector::PseudoStart);
380dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(end.impl(), CSSSelector::PseudoEnd);
381dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(horizontal.impl(), CSSSelector::PseudoHorizontal);
382dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(vertical.impl(), CSSSelector::PseudoVertical);
383dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(doubleButton.impl(), CSSSelector::PseudoDoubleButton);
384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(singleButton.impl(), CSSSelector::PseudoSingleButton);
385dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(noButton.impl(), CSSSelector::PseudoNoButton);
386dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(optional.impl(), CSSSelector::PseudoOptional);
387dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(required.impl(), CSSSelector::PseudoRequired);
388dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(resizer.impl(), CSSSelector::PseudoResizer);
389dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(scrollbar.impl(), CSSSelector::PseudoScrollbar);
390dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(scrollbarButton.impl(), CSSSelector::PseudoScrollbarButton);
391dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(scrollbarCorner.impl(), CSSSelector::PseudoScrollbarCorner);
392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(scrollbarThumb.impl(), CSSSelector::PseudoScrollbarThumb);
393dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(scrollbarTrack.impl(), CSSSelector::PseudoScrollbarTrack);
394dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(scrollbarTrackPiece.impl(), CSSSelector::PseudoScrollbarTrackPiece);
395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(cornerPresent.impl(), CSSSelector::PseudoCornerPresent);
396dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(searchCancelButton.impl(), CSSSelector::PseudoSearchCancelButton);
397dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(searchDecoration.impl(), CSSSelector::PseudoSearchDecoration);
398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(searchResultsDecoration.impl(), CSSSelector::PseudoSearchResultsDecoration);
399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(searchResultsButton.impl(), CSSSelector::PseudoSearchResultsButton);
400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(selection.impl(), CSSSelector::PseudoSelection);
401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(target.impl(), CSSSelector::PseudoTarget);
402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nameToPseudoType->set(visited.impl(), CSSSelector::PseudoVisited);
40321939df44de1705786c545cd1bf519d47250322dBen Murdoch        nameToPseudoType->set(firstPage.impl(), CSSSelector::PseudoFirstPage);
40421939df44de1705786c545cd1bf519d47250322dBen Murdoch        nameToPseudoType->set(leftPage.impl(), CSSSelector::PseudoLeftPage);
40521939df44de1705786c545cd1bf519d47250322dBen Murdoch        nameToPseudoType->set(rightPage.impl(), CSSSelector::PseudoRightPage);
4065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(FULLSCREEN_API)
4075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        nameToPseudoType->set(fullScreen.impl(), CSSSelector::PseudoFullScreen);
4085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        nameToPseudoType->set(fullScreenDocument.impl(), CSSSelector::PseudoFullScreenDocument);
4095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
410cad810f21b803229eb11403f9209855525a25d57Steve Block        nameToPseudoType->set(inRange.impl(), CSSSelector::PseudoInRange);
411cad810f21b803229eb11403f9209855525a25d57Steve Block        nameToPseudoType->set(outOfRange.impl(), CSSSelector::PseudoOutOfRange);
412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return nameToPseudoType;
414dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
415dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
416dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockCSSSelector::PseudoType CSSSelector::parsePseudoType(const AtomicString& name)
417dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (name.isNull())
419dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return PseudoUnknown;
420dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    HashMap<AtomicStringImpl*, CSSSelector::PseudoType>* nameToPseudoType = nameToPseudoTypeMap();
421dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    HashMap<AtomicStringImpl*, CSSSelector::PseudoType>::iterator slot = nameToPseudoType->find(name.impl());
422dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return slot == nameToPseudoType->end() ? PseudoUnknown : slot->second;
423dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
424dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
425dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid CSSSelector::extractPseudoType() const
426dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
427e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (m_match != PseudoClass && m_match != PseudoElement && m_match != PagePseudoClass)
428dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
429dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_pseudoType = parsePseudoType(value());
431dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool element = false; // pseudo-element
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool compat = false; // single colon compatbility mode
434e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    bool isPagePseudoClass = false; // Page pseudo-class
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
436dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    switch (m_pseudoType) {
437dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoAfter:
438dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoBefore:
439dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoFirstLetter:
440dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoFirstLine:
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        compat = true;
442dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoFileUploadButton:
443dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoInputListButton:
444dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoInputPlaceholder:
44506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(INPUT_SPEECH)
44606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case PseudoInputSpeechButton:
44706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
448dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoInnerSpinButton:
4492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case PseudoOuterSpinButton:
450dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoResizer:
451dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoScrollbar:
452dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoScrollbarCorner:
453dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoScrollbarButton:
454dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoScrollbarThumb:
455dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoScrollbarTrack:
456dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoScrollbarTrackPiece:
457dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoSearchCancelButton:
458dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoSearchDecoration:
459dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoSearchResultsDecoration:
460dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoSearchResultsButton:
461dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoSelection:
462dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        element = true;
463dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
464dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoUnknown:
465dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoEmpty:
466dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoFirstChild:
467dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoFirstOfType:
468dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoLastChild:
469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoLastOfType:
470dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoOnlyChild:
471dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoOnlyOfType:
472dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoNthChild:
473dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoNthOfType:
474dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoNthLastChild:
475dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoNthLastOfType:
476dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoLink:
477dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoVisited:
4782bde8e466a4451c7319e3a072d118917957d6554Steve Block    case PseudoAny:
479dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoAnyLink:
480dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoAutofill:
481dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoHover:
482dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoDrag:
483dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoFocus:
484dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoActive:
485dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoChecked:
486dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoEnabled:
487dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoFullPageMedia:
488dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoDefault:
489dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoDisabled:
490dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoOptional:
491dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoRequired:
492dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoReadOnly:
493dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoReadWrite:
494dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoValid:
495dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoInvalid:
496dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoIndeterminate:
497dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoTarget:
498dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoLang:
499dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoNot:
500dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoRoot:
501dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoScrollbarBack:
502dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoScrollbarForward:
503dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoWindowInactive:
504dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoCornerPresent:
505dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoDecrement:
506dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoIncrement:
507dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoHorizontal:
508dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoVertical:
509dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoStart:
510dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoEnd:
511dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoDoubleButton:
512dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoSingleButton:
513dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoNoButton:
514dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PseudoNotParsed:
5155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(FULLSCREEN_API)
5165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    case PseudoFullScreen:
5175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    case PseudoFullScreenDocument:
5185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
519cad810f21b803229eb11403f9209855525a25d57Steve Block    case PseudoInRange:
520cad810f21b803229eb11403f9209855525a25d57Steve Block    case PseudoOutOfRange:
521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
52221939df44de1705786c545cd1bf519d47250322dBen Murdoch    case PseudoFirstPage:
52321939df44de1705786c545cd1bf519d47250322dBen Murdoch    case PseudoLeftPage:
52421939df44de1705786c545cd1bf519d47250322dBen Murdoch    case PseudoRightPage:
525e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        isPagePseudoClass = true;
526e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        break;
527dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
529e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    bool matchPagePseudoClass = (m_match == PagePseudoClass);
530e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (matchPagePseudoClass != isPagePseudoClass)
531e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        m_pseudoType = PseudoUnknown;
532e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    else if (m_match == PseudoClass && element) {
533dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!compat)
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_pseudoType = PseudoUnknown;
535dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        else
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           m_match = PseudoElement;
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (m_match == PseudoElement && !element)
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_pseudoType = PseudoUnknown;
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSSelector::operator==(const CSSSelector& other)
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CSSSelector* sel1 = this;
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CSSSelector* sel2 = &other;
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (sel1 && sel2) {
547635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (sel1->m_tag != sel2->m_tag || sel1->attribute() != sel2->attribute() ||
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             sel1->relation() != sel2->relation() || sel1->m_match != sel2->m_match ||
5492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block             sel1->value() != sel2->value() ||
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             sel1->pseudoType() != sel2->pseudoType() ||
551635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project             sel1->argument() != sel2->argument())
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
553635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        sel1 = sel1->tagHistory();
554635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        sel2 = sel2->tagHistory();
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel1 || sel2)
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString CSSSelector::selectorText() const
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String str = "";
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const AtomicString& prefix = m_tag.prefix();
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const AtomicString& localName = m_tag.localName();
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_match == CSSSelector::None || !prefix.isNull() || localName != starAtom) {
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (prefix.isNull())
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            str = localName;
572dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        else {
573dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            str = prefix.string();
574dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            str.append("|");
575dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            str.append(localName);
576dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        }
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CSSSelector* cs = this;
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (true) {
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (cs->m_match == CSSSelector::Id) {
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            str += "#";
5832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            serializeIdentifier(cs->value(), str);
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (cs->m_match == CSSSelector::Class) {
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            str += ".";
5862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            serializeIdentifier(cs->value(), str);
587e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        } else if (cs->m_match == CSSSelector::PseudoClass || cs->m_match == CSSSelector::PagePseudoClass) {
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            str += ":";
5892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            str += cs->value();
5902bde8e466a4451c7319e3a072d118917957d6554Steve Block
5912bde8e466a4451c7319e3a072d118917957d6554Steve Block            switch (cs->pseudoType()) {
5922bde8e466a4451c7319e3a072d118917957d6554Steve Block            case PseudoNot:
5932bde8e466a4451c7319e3a072d118917957d6554Steve Block                ASSERT(cs->selectorList());
5942bde8e466a4451c7319e3a072d118917957d6554Steve Block                str += cs->selectorList()->first()->selectorText();
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                str += ")";
5962bde8e466a4451c7319e3a072d118917957d6554Steve Block                break;
5972bde8e466a4451c7319e3a072d118917957d6554Steve Block            case PseudoLang:
5982bde8e466a4451c7319e3a072d118917957d6554Steve Block            case PseudoNthChild:
5992bde8e466a4451c7319e3a072d118917957d6554Steve Block            case PseudoNthLastChild:
6002bde8e466a4451c7319e3a072d118917957d6554Steve Block            case PseudoNthOfType:
6012bde8e466a4451c7319e3a072d118917957d6554Steve Block            case PseudoNthLastOfType:
602635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                str += cs->argument();
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                str += ")";
6042bde8e466a4451c7319e3a072d118917957d6554Steve Block                break;
6052bde8e466a4451c7319e3a072d118917957d6554Steve Block            case PseudoAny: {
6062bde8e466a4451c7319e3a072d118917957d6554Steve Block                CSSSelector* firstSubSelector = cs->selectorList()->first();
6072bde8e466a4451c7319e3a072d118917957d6554Steve Block                for (CSSSelector* subSelector = firstSubSelector; subSelector; subSelector = CSSSelectorList::next(subSelector)) {
6082bde8e466a4451c7319e3a072d118917957d6554Steve Block                    if (subSelector != firstSubSelector)
6092bde8e466a4451c7319e3a072d118917957d6554Steve Block                        str += ",";
6102bde8e466a4451c7319e3a072d118917957d6554Steve Block                    str += subSelector->selectorText();
6112bde8e466a4451c7319e3a072d118917957d6554Steve Block                }
6122bde8e466a4451c7319e3a072d118917957d6554Steve Block                str += ")";
6132bde8e466a4451c7319e3a072d118917957d6554Steve Block                break;
6142bde8e466a4451c7319e3a072d118917957d6554Steve Block            }
6152bde8e466a4451c7319e3a072d118917957d6554Steve Block            default:
6162bde8e466a4451c7319e3a072d118917957d6554Steve Block                break;
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (cs->m_match == CSSSelector::PseudoElement) {
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            str += "::";
6202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            str += cs->value();
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (cs->hasAttribute()) {
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            str += "[";
623635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            const AtomicString& prefix = cs->attribute().prefix();
624dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            if (!prefix.isNull()) {
625dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                str.append(prefix);
626dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                str.append("|");
627dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            }
628635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            str += cs->attribute().localName();
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (cs->m_match) {
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSSelector::Exact:
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    str += "=";
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSSelector::Set:
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    // set has no operator or value, just the attrName
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    str += "]";
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSSelector::List:
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    str += "~=";
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSSelector::Hyphen:
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    str += "|=";
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSSelector::Begin:
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    str += "^=";
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSSelector::End:
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    str += "$=";
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSSelector::Contain:
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    str += "*=";
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                default:
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (cs->m_match != CSSSelector::Set) {
6562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                serializeString(cs->value(), str);
657545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                str += "]";
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
660635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (cs->relation() != CSSSelector::SubSelector || !cs->tagHistory())
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
662635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        cs = cs->tagHistory();
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
665635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (CSSSelector* tagHistory = cs->tagHistory()) {
666635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        String tagHistoryText = tagHistory->selectorText();
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (cs->relation() == CSSSelector::DirectAdjacent)
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            str = tagHistoryText + " + " + str;
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (cs->relation() == CSSSelector::IndirectAdjacent)
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            str = tagHistoryText + " ~ " + str;
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (cs->relation() == CSSSelector::Child)
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            str = tagHistoryText + " > " + str;
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Descendant
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            str = tagHistoryText + " " + str;
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return str;
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
680635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
681635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectconst QualifiedName& CSSSelector::attribute() const
682635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
683635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    switch (m_match) {
684635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    case Id:
685635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return idAttr;
686635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    case Class:
687635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return classAttr;
688635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    default:
689635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return m_hasRareData ? m_data.m_rareData->m_attribute : anyQName();
690635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
691635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
693635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CSSSelector::setAttribute(const QualifiedName& value)
694635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
695635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    createRareData();
696635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_data.m_rareData->m_attribute = value;
697635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
698635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
699635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CSSSelector::setArgument(const AtomicString& value)
700635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
701635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    createRareData();
702635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_data.m_rareData->m_argument = value;
703635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
7042bde8e466a4451c7319e3a072d118917957d6554Steve Block
7052bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid CSSSelector::setSelectorList(PassOwnPtr<CSSSelectorList> selectorList)
706635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
707635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    createRareData();
7082bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_data.m_rareData->m_selectorList = selectorList;
709635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
710635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
711635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool CSSSelector::parseNth()
712635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
713635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!m_hasRareData)
714635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return false;
715635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (m_parsedNth)
716635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return true;
717635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_parsedNth = m_data.m_rareData->parseNth();
718635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return m_parsedNth;
719635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
720635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
721635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool CSSSelector::matchNth(int count)
722635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
723635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(m_hasRareData);
724635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return m_data.m_rareData->matchNth(count);
725635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
726635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
727dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool CSSSelector::isSimple() const
728dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
7292bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (selectorList() || tagHistory() || matchesPseudoElement())
730dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
731dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
732dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int numConditions = 0;
733dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
734dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // hasTag() cannot be be used here because namespace may not be nullAtom.
735dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Example:
736dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    //     @namespace "http://www.w3.org/2000/svg";
737dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    //     svg:not(:root) { ...
738dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_tag != starAtom)
739dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        numConditions++;
740dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
741dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_match == Id || m_match == Class || m_match == PseudoClass)
742dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        numConditions++;
743dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
744dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_hasRareData && m_data.m_rareData->m_attribute != anyQName())
745dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        numConditions++;
746dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
747dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // numConditions is 0 for a universal selector.
748dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // numConditions is 1 for other simple selectors.
749dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return numConditions <= 1;
750dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
751dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
7522bde8e466a4451c7319e3a072d118917957d6554Steve BlockCSSSelector::RareData::RareData(PassRefPtr<AtomicStringImpl> value)
7532bde8e466a4451c7319e3a072d118917957d6554Steve Block    : m_value(value.leakRef())
7542bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_a(0)
7552bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_b(0)
7562bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_attribute(anyQName())
7572bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_argument(nullAtom)
7582bde8e466a4451c7319e3a072d118917957d6554Steve Block{
7592bde8e466a4451c7319e3a072d118917957d6554Steve Block}
7602bde8e466a4451c7319e3a072d118917957d6554Steve Block
7612bde8e466a4451c7319e3a072d118917957d6554Steve BlockCSSSelector::RareData::~RareData()
7622bde8e466a4451c7319e3a072d118917957d6554Steve Block{
7632bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_value)
7642bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_value->deref();
7652bde8e466a4451c7319e3a072d118917957d6554Steve Block}
7662bde8e466a4451c7319e3a072d118917957d6554Steve Block
767635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// a helper function for parsing nth-arguments
768635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool CSSSelector::RareData::parseNth()
769dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
770dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    String argument = m_argument.lower();
771635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
772635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (argument.isEmpty())
773635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return false;
774635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
775635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_a = 0;
776635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_b = 0;
777635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (argument == "odd") {
778635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_a = 2;
779635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_b = 1;
780635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    } else if (argument == "even") {
781635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_a = 2;
782635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_b = 0;
783635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    } else {
784f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        size_t n = argument.find('n');
785f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (n != notFound) {
786635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (argument[0] == '-') {
787635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (n == 1)
788635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    m_a = -1; // -n == -1n
789635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                else
790635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    m_a = argument.substring(0, n).toInt();
791635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            } else if (!n)
792635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                m_a = 1; // n == 1n
793635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            else
794635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                m_a = argument.substring(0, n).toInt();
795635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
796f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            size_t p = argument.find('+', n);
797f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            if (p != notFound)
798635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                m_b = argument.substring(p + 1, argument.length() - p - 1).toInt();
799635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            else {
800635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                p = argument.find('-', n);
801f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                if (p != notFound)
80221939df44de1705786c545cd1bf519d47250322dBen Murdoch                    m_b = -argument.substring(p + 1, argument.length() - p - 1).toInt();
803635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            }
804635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        } else
805635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_b = argument.toInt();
806635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
807635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return true;
808635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
809635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
810635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// a helper function for checking nth-arguments
811635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool CSSSelector::RareData::matchNth(int count)
812635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
813635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!m_a)
814635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return count == m_b;
815635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else if (m_a > 0) {
816635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (count < m_b)
817635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return false;
818635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return (count - m_b) % m_a == 0;
819635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    } else {
820635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (count > m_b)
821635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return false;
822635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return (m_b - count) % (-m_a) == 0;
823635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
824635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
825967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
827