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