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