CSSSelector.h revision cad810f21b803229eb11403f9209855525a25d57
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) 4e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful, 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details. 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA. 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef CSSSelector_h 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define CSSSelector_h 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "QualifiedName.h" 26967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "RenderStyleConstants.h" 27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/Noncopyable.h> 28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/OwnPtr.h> 29e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <wtf/PassOwnPtr.h> 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 330617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen class CSSSelectorBag; 340617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this class represents a selector for a StyleRule 360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class CSSSelector : public Noncopyable { 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project public: 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CSSSelector() 396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen : m_relation(Descendant) 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_match(None) 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_pseudoType(PseudoNotParsed) 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_parsedNth(false) 43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_isLastInSelectorList(false) 44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_hasRareData(false) 4506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , m_isForPage(false) 466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_tag(anyQName()) 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CSSSelector(const QualifiedName& qName) 516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen : m_relation(Descendant) 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_match(None) 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_pseudoType(PseudoNotParsed) 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_parsedNth(false) 55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_isLastInSelectorList(false) 56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_hasRareData(false) 5706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , m_isForPage(false) 586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_tag(qName) 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 620617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen ~CSSSelector() 630617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen { 640617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen // Exit if this selector does not own any objects to be deleted. 650617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen if (m_hasRareData) { 660617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen if (!m_data.m_rareData) 670617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return; 680617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen } else if (!m_data.m_tagHistory) 690617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen return; 700617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen 710617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen // We can not delete the owned object(s) by simply calling delete 720617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen // directly on them. That would lead to recursive destructor calls 730617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen // which might cause stack overflow. We have to delete them 740617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen // iteratively. 750617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen deleteReachableSelectors(); 760617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen } 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /** 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Re-create selector text from selector's data 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String selectorText() const; 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // checks if the 2 selectors (including sub selectors) agree. 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool operator==(const CSSSelector&); 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // tag == -1 means apply to all elements (Selector = *) 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 88f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick unsigned specificity() const; 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* how the attribute value has to match.... Default is Exact */ 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project enum Match { 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project None = 0, 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Id, 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Class, 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Exact, 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Set, 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project List, 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Hyphen, 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoClass, 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoElement, 101e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block Contain, // css3: E[foo*="bar"] 102e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block Begin, // css3: E[foo^="bar"] 103e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block End, // css3: E[foo$="bar"] 104e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block PagePseudoClass 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project enum Relation { 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Descendant = 0, 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Child, 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DirectAdjacent, 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IndirectAdjacent, 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SubSelector 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project enum PseudoType { 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoNotParsed = 0, 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoUnknown, 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoEmpty, 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoFirstChild, 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoFirstOfType, 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoLastChild, 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoLastOfType, 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoOnlyChild, 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoOnlyOfType, 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoFirstLine, 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoFirstLetter, 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoNthChild, 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoNthOfType, 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoNthLastChild, 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoNthLastOfType, 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoLink, 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoVisited, 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoAnyLink, 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoAutofill, 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoHover, 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoDrag, 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoFocus, 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoActive, 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoChecked, 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoEnabled, 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoFullPageMedia, 142231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block PseudoDefault, 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoDisabled, 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoInputPlaceholder, 1450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch PseudoOptional, 1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch PseudoRequired, 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoReadOnly, 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoReadWrite, 149231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block PseudoValid, 150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block PseudoInvalid, 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoIndeterminate, 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoTarget, 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoBefore, 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoAfter, 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoLang, 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoNot, 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoResizer, 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoRoot, 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoScrollbar, 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoScrollbarBack, 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoScrollbarButton, 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoScrollbarCorner, 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoScrollbarForward, 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoScrollbarThumb, 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoScrollbarTrack, 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoScrollbarTrackPiece, 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoWindowInactive, 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoCornerPresent, 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoDecrement, 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoIncrement, 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoHorizontal, 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoVertical, 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoStart, 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoEnd, 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoDoubleButton, 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoSingleButton, 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoNoButton, 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoSelection, 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoFileUploadButton, 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoSliderThumb, 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoSearchCancelButton, 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoSearchDecoration, 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoSearchResultsDecoration, 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoSearchResultsButton, 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoMediaControlsPanel, 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoMediaControlsMuteButton, 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoMediaControlsPlayButton, 188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project PseudoMediaControlsTimelineContainer, 189231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block PseudoMediaControlsVolumeSliderContainer, 190e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke PseudoMediaControlsVolumeSliderMuteButton, 191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project PseudoMediaControlsCurrentTimeDisplay, 192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project PseudoMediaControlsTimeRemainingDisplay, 193643ca7872b450ea4efacab6188849e5aac2ba161Steve Block PseudoMediaControlsToggleClosedCaptions, 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoMediaControlsTimeline, 195231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block PseudoMediaControlsVolumeSlider, 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoMediaControlsSeekBackButton, 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoMediaControlsSeekForwardButton, 1980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch PseudoMediaControlsRewindButton, 1990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch PseudoMediaControlsReturnToRealtimeButton, 2000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch PseudoMediaControlsStatusDisplay, 201231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block PseudoMediaControlsFullscreenButton, 20206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PseudoMeterHorizontalBar, 20306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PseudoMeterVerticalBar, 20406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PseudoMeterHorizontalOptimum, 20506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PseudoMeterHorizontalSuboptimal, 20606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PseudoMeterHorizontalEvenLessGood, 20706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PseudoMeterVerticalOptimum, 20806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PseudoMeterVerticalSuboptimal, 20906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PseudoMeterVerticalEvenLessGood, 210d0825bca7fe65beaee391d30da42e937db621564Steve Block PseudoInputListButton, 21106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(INPUT_SPEECH) 21206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PseudoInputSpeechButton, 21306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif 214d0825bca7fe65beaee391d30da42e937db621564Steve Block PseudoInnerSpinButton, 215d0825bca7fe65beaee391d30da42e937db621564Steve Block PseudoOuterSpinButton, 21621939df44de1705786c545cd1bf519d47250322dBen Murdoch PseudoProgressBarValue, 21721939df44de1705786c545cd1bf519d47250322dBen Murdoch PseudoLeftPage, 21821939df44de1705786c545cd1bf519d47250322dBen Murdoch PseudoRightPage, 21921939df44de1705786c545cd1bf519d47250322dBen Murdoch PseudoFirstPage, 2205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(FULLSCREEN_API) 2215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen PseudoFullScreen, 2225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen PseudoFullScreenDocument, 2235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif 224cad810f21b803229eb11403f9209855525a25d57Steve Block PseudoInRange, 225cad810f21b803229eb11403f9209855525a25d57Steve Block PseudoOutOfRange, 22621939df44de1705786c545cd1bf519d47250322dBen Murdoch }; 22721939df44de1705786c545cd1bf519d47250322dBen Murdoch 22821939df44de1705786c545cd1bf519d47250322dBen Murdoch enum MarginBoxType { 22921939df44de1705786c545cd1bf519d47250322dBen Murdoch TopLeftCornerMarginBox, 23021939df44de1705786c545cd1bf519d47250322dBen Murdoch TopLeftMarginBox, 23121939df44de1705786c545cd1bf519d47250322dBen Murdoch TopCenterMarginBox, 23221939df44de1705786c545cd1bf519d47250322dBen Murdoch TopRightMarginBox, 23321939df44de1705786c545cd1bf519d47250322dBen Murdoch TopRightCornerMarginBox, 23421939df44de1705786c545cd1bf519d47250322dBen Murdoch BottomLeftCornerMarginBox, 23521939df44de1705786c545cd1bf519d47250322dBen Murdoch BottomLeftMarginBox, 23621939df44de1705786c545cd1bf519d47250322dBen Murdoch BottomCenterMarginBox, 23721939df44de1705786c545cd1bf519d47250322dBen Murdoch BottomRightMarginBox, 23821939df44de1705786c545cd1bf519d47250322dBen Murdoch BottomRightCornerMarginBox, 23921939df44de1705786c545cd1bf519d47250322dBen Murdoch LeftTopMarginBox, 24021939df44de1705786c545cd1bf519d47250322dBen Murdoch LeftMiddleMarginBox, 24121939df44de1705786c545cd1bf519d47250322dBen Murdoch LeftBottomMarginBox, 24221939df44de1705786c545cd1bf519d47250322dBen Murdoch RightTopMarginBox, 24321939df44de1705786c545cd1bf519d47250322dBen Murdoch RightMiddleMarginBox, 24421939df44de1705786c545cd1bf519d47250322dBen Murdoch RightBottomMarginBox, 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoType pseudoType() const 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_pseudoType == PseudoNotParsed) 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project extractPseudoType(); 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return static_cast<PseudoType>(m_pseudoType); 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static PseudoType parsePseudoType(const AtomicString&); 255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static PseudoId pseudoId(PseudoType); 256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 257635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CSSSelector* tagHistory() const { return m_hasRareData ? m_data.m_rareData->m_tagHistory.get() : m_data.m_tagHistory; } 258635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void setTagHistory(CSSSelector* tagHistory); 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool hasTag() const { return m_tag != anyQName(); } 261635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool hasAttribute() const { return m_match == Id || m_match == Class || (m_hasRareData && m_data.m_rareData->m_attribute != anyQName()); } 262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project const QualifiedName& attribute() const; 264635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project const AtomicString& argument() const { return m_hasRareData ? m_data.m_rareData->m_argument : nullAtom; } 265635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CSSSelector* simpleSelector() const { return m_hasRareData ? m_data.m_rareData->m_simpleSelector.get() : 0; } 266635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 267635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void setAttribute(const QualifiedName& value); 268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void setArgument(const AtomicString& value); 269635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void setSimpleSelector(CSSSelector* value); 270635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool parseNth(); 272635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool matchNth(int count); 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool matchesPseudoElement() const 275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_pseudoType == PseudoUnknown) 277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block extractPseudoType(); 278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_match == PseudoElement; 279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Relation relation() const { return static_cast<Relation>(m_relation); } 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool isLastInSelectorList() const { return m_isLastInSelectorList; } 284635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void setLastInSelectorList() { m_isLastInSelectorList = true; } 285dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool isSimple() const; 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen bool isForPage() const { return m_isForPage; } 28806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen void setForPage() { m_isForPage = true; } 28906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned m_relation : 3; // enum Relation 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mutable unsigned m_match : 4; // enum Match 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mutable unsigned m_pseudoType : 8; // PseudoType 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project private: 295635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool m_parsedNth : 1; // Used for :nth-* 296635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool m_isLastInSelectorList : 1; 297635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool m_hasRareData : 1; 29806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen bool m_isForPage : 1; 299635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3000617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen void releaseOwnedSelectorsToBag(CSSSelectorBag&); 3010617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen void deleteReachableSelectors(); 3020617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen 303f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick unsigned specificityForOneSelector() const; 304f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick unsigned specificityForPage() const; 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void extractPseudoType() const; 306635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 307643ca7872b450ea4efacab6188849e5aac2ba161Steve Block struct RareData : Noncopyable { 308e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke RareData(PassOwnPtr<CSSSelector> tagHistory) 3096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen : m_a(0) 3106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_b(0) 3116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_tagHistory(tagHistory) 312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_attribute(anyQName()) 313635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_argument(nullAtom) 314635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 315635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 316635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 317635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool parseNth(); 318635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool matchNth(int count); 319635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int m_a; // Used for :nth-* 3216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int m_b; // Used for :nth-* 322635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project OwnPtr<CSSSelector> m_tagHistory; 323635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project OwnPtr<CSSSelector> m_simpleSelector; // Used for :not. 324635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project QualifiedName m_attribute; // used for attribute selector 325635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project AtomicString m_argument; // Used for :contains, :lang and :nth-* 326635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project }; 327635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 328635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void createRareData() 329635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 330635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_hasRareData) 331635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 332e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke m_data.m_rareData = new RareData(adoptPtr(m_data.m_tagHistory)); 333635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_hasRareData = true; 334635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 335635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 336635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project union DataUnion { 337635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project DataUnion() : m_tagHistory(0) { } 338635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CSSSelector* m_tagHistory; 339635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RareData* m_rareData; 340635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } m_data; 3416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen public: 3436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen mutable AtomicString m_value; 3446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen QualifiedName m_tag; 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // CSSSelector_h 350