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 {
322bde8e466a4451c7319e3a072d118917957d6554Steve Block    class CSSSelectorList;
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // this class represents a selector for a StyleRule
35ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    class CSSSelector {
36ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        WTF_MAKE_NONCOPYABLE(CSSSelector); WTF_MAKE_FAST_ALLOCATED;
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)
442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            , m_isLastInTagHistory(true)
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            , m_hasRareData(false)
4606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            , m_isForPage(false)
4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            , m_deleted(false)
486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            , m_tag(anyQName())
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSSelector(const QualifiedName& qName)
536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            : m_relation(Descendant)
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            , m_match(None)
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            , m_pseudoType(PseudoNotParsed)
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            , m_parsedNth(false)
57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            , m_isLastInSelectorList(false)
582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            , m_isLastInTagHistory(true)
59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            , m_hasRareData(false)
6006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            , m_isForPage(false)
6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            , m_deleted(false)
626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            , m_tag(qName)
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
660617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        ~CSSSelector()
670617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        {
6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (m_deleted)
6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                CRASH();
7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_deleted = true;
712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (m_hasRareData)
722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                delete m_data.m_rareData;
732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            else if (m_data.m_value)
742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                m_data.m_value->deref();
750617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        }
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /**
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         * Re-create selector text from selector's data
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        String selectorText() const;
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // checks if the 2 selectors (including sub selectors) agree.
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool operator==(const CSSSelector&);
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // tag == -1 means apply to all elements (Selector = *)
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
87f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        unsigned specificity() const;
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* how the attribute value has to match.... Default is Exact */
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        enum Match {
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            None = 0,
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Id,
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Class,
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Exact,
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Set,
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            List,
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Hyphen,
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoClass,
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoElement,
100e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            Contain, // css3: E[foo*="bar"]
101e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            Begin, // css3: E[foo^="bar"]
102e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            End, // css3: E[foo$="bar"]
103e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            PagePseudoClass
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        };
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        enum Relation {
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Descendant = 0,
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Child,
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DirectAdjacent,
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            IndirectAdjacent,
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            SubSelector,
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ShadowDescendant
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,
1332bde8e466a4451c7319e3a072d118917957d6554Steve Block            PseudoAny,
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoAnyLink,
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoAutofill,
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoHover,
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoDrag,
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoFocus,
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoActive,
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoChecked,
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoEnabled,
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoFullPageMedia,
143231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            PseudoDefault,
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoDisabled,
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoInputPlaceholder,
1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            PseudoOptional,
1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            PseudoRequired,
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoReadOnly,
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoReadWrite,
150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            PseudoValid,
151231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            PseudoInvalid,
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoIndeterminate,
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoTarget,
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoBefore,
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoAfter,
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoLang,
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoNot,
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoResizer,
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoRoot,
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoScrollbar,
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoScrollbarBack,
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoScrollbarButton,
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoScrollbarCorner,
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoScrollbarForward,
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoScrollbarThumb,
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoScrollbarTrack,
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoScrollbarTrackPiece,
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoWindowInactive,
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoCornerPresent,
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoDecrement,
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoIncrement,
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoHorizontal,
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoVertical,
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoStart,
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoEnd,
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoDoubleButton,
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoSingleButton,
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoNoButton,
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoSelection,
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoFileUploadButton,
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoSearchCancelButton,
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoSearchDecoration,
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoSearchResultsDecoration,
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PseudoSearchResultsButton,
185d0825bca7fe65beaee391d30da42e937db621564Steve Block            PseudoInputListButton,
18606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(INPUT_SPEECH)
18706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            PseudoInputSpeechButton,
18806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
189d0825bca7fe65beaee391d30da42e937db621564Steve Block            PseudoInnerSpinButton,
190d0825bca7fe65beaee391d30da42e937db621564Steve Block            PseudoOuterSpinButton,
19121939df44de1705786c545cd1bf519d47250322dBen Murdoch            PseudoLeftPage,
19221939df44de1705786c545cd1bf519d47250322dBen Murdoch            PseudoRightPage,
19321939df44de1705786c545cd1bf519d47250322dBen Murdoch            PseudoFirstPage,
1945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(FULLSCREEN_API)
1955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            PseudoFullScreen,
1965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            PseudoFullScreenDocument,
1975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
198cad810f21b803229eb11403f9209855525a25d57Steve Block            PseudoInRange,
199cad810f21b803229eb11403f9209855525a25d57Steve Block            PseudoOutOfRange,
20021939df44de1705786c545cd1bf519d47250322dBen Murdoch        };
20121939df44de1705786c545cd1bf519d47250322dBen Murdoch
20221939df44de1705786c545cd1bf519d47250322dBen Murdoch        enum MarginBoxType {
20321939df44de1705786c545cd1bf519d47250322dBen Murdoch            TopLeftCornerMarginBox,
20421939df44de1705786c545cd1bf519d47250322dBen Murdoch            TopLeftMarginBox,
20521939df44de1705786c545cd1bf519d47250322dBen Murdoch            TopCenterMarginBox,
20621939df44de1705786c545cd1bf519d47250322dBen Murdoch            TopRightMarginBox,
20721939df44de1705786c545cd1bf519d47250322dBen Murdoch            TopRightCornerMarginBox,
20821939df44de1705786c545cd1bf519d47250322dBen Murdoch            BottomLeftCornerMarginBox,
20921939df44de1705786c545cd1bf519d47250322dBen Murdoch            BottomLeftMarginBox,
21021939df44de1705786c545cd1bf519d47250322dBen Murdoch            BottomCenterMarginBox,
21121939df44de1705786c545cd1bf519d47250322dBen Murdoch            BottomRightMarginBox,
21221939df44de1705786c545cd1bf519d47250322dBen Murdoch            BottomRightCornerMarginBox,
21321939df44de1705786c545cd1bf519d47250322dBen Murdoch            LeftTopMarginBox,
21421939df44de1705786c545cd1bf519d47250322dBen Murdoch            LeftMiddleMarginBox,
21521939df44de1705786c545cd1bf519d47250322dBen Murdoch            LeftBottomMarginBox,
21621939df44de1705786c545cd1bf519d47250322dBen Murdoch            RightTopMarginBox,
21721939df44de1705786c545cd1bf519d47250322dBen Murdoch            RightMiddleMarginBox,
21821939df44de1705786c545cd1bf519d47250322dBen Murdoch            RightBottomMarginBox,
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        };
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PseudoType pseudoType() const
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_pseudoType == PseudoNotParsed)
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                extractPseudoType();
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return static_cast<PseudoType>(m_pseudoType);
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static PseudoType parsePseudoType(const AtomicString&);
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static PseudoId pseudoId(PseudoType);
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // Selectors are kept in an array by CSSSelectorList. The next component of the selector is
2322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // the next item in the array.
2332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        CSSSelector* tagHistory() const { return m_isLastInTagHistory ? 0 : const_cast<CSSSelector*>(this + 1); }
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool hasTag() const { return m_tag != anyQName(); }
236635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool hasAttribute() const { return m_match == Id || m_match == Class || (m_hasRareData && m_data.m_rareData->m_attribute != anyQName()); }
237635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const QualifiedName& tag() const { return m_tag; }
2392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // AtomicString is really just an AtomicStringImpl* so the cast below is safe.
2402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // FIXME: Perhaps call sites could be changed to accept AtomicStringImpl?
2412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const AtomicString& value() const { return *reinterpret_cast<const AtomicString*>(m_hasRareData ? &m_data.m_rareData->m_value : &m_data.m_value); }
242635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        const QualifiedName& attribute() const;
243635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        const AtomicString& argument() const { return m_hasRareData ? m_data.m_rareData->m_argument : nullAtom; }
2442bde8e466a4451c7319e3a072d118917957d6554Steve Block        CSSSelectorList* selectorList() const { return m_hasRareData ? m_data.m_rareData->m_selectorList.get() : 0; }
245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        void setTag(const QualifiedName& value) { m_tag = value; }
2472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        void setValue(const AtomicString&);
2482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        void setAttribute(const QualifiedName&);
2492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        void setArgument(const AtomicString&);
2502bde8e466a4451c7319e3a072d118917957d6554Steve Block        void setSelectorList(PassOwnPtr<CSSSelectorList>);
251635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
252635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool parseNth();
253635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool matchNth(int count);
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        bool matchesPseudoElement() const;
25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        bool isUnknownPseudoElement() const;
257ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        bool isSiblingSelector() const;
258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Relation relation() const { return static_cast<Relation>(m_relation); }
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
261635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool isLastInSelectorList() const { return m_isLastInSelectorList; }
262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void setLastInSelectorList() { m_isLastInSelectorList = true; }
2632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        bool isLastInTagHistory() const { return m_isLastInTagHistory; }
2642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        void setNotLastInTagHistory() { m_isLastInTagHistory = false; }
2652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        bool isSimple() const;
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        bool isForPage() const { return m_isForPage; }
26906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        void setForPage() { m_isForPage = true; }
27006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned m_relation           : 3; // enum Relation
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        mutable unsigned m_match      : 4; // enum Match
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        mutable unsigned m_pseudoType : 8; // PseudoType
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    private:
276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool m_parsedNth              : 1; // Used for :nth-*
277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool m_isLastInSelectorList   : 1;
2782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        bool m_isLastInTagHistory     : 1;
279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool m_hasRareData            : 1;
28006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        bool m_isForPage              : 1;
2812bde8e466a4451c7319e3a072d118917957d6554Steve Block        // FIXME: Remove once http://webkit.org/b/56124 is fixed.
28281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        bool m_deleted                : 1;
283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
284f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        unsigned specificityForOneSelector() const;
285f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        unsigned specificityForPage() const;
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void extractPseudoType() const;
287635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
288ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        struct RareData {
289ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            WTF_MAKE_NONCOPYABLE(RareData); WTF_MAKE_FAST_ALLOCATED;
290ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        public:
2912bde8e466a4451c7319e3a072d118917957d6554Steve Block            RareData(PassRefPtr<AtomicStringImpl> value);
2922bde8e466a4451c7319e3a072d118917957d6554Steve Block            ~RareData();
293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            bool parseNth();
295635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            bool matchNth(int count);
296635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            AtomicStringImpl* m_value; // Plain pointer to keep things uniform with the union.
2986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            int m_a; // Used for :nth-*
2996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            int m_b; // Used for :nth-*
300635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            QualifiedName m_attribute; // used for attribute selector
301635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            AtomicString m_argument; // Used for :contains, :lang and :nth-*
3022bde8e466a4451c7319e3a072d118917957d6554Steve Block            OwnPtr<CSSSelectorList> m_selectorList; // Used for :-webkit-any and :not
303635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        };
3042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        void createRareData();
305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
306635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        union DataUnion {
3072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            DataUnion() : m_value(0) { }
3082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            AtomicStringImpl* m_value;
309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            RareData* m_rareData;
310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        } m_data;
3116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
3126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        QualifiedName m_tag;
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
3142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3152fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline bool CSSSelector::matchesPseudoElement() const
3162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_pseudoType == PseudoUnknown)
3182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        extractPseudoType();
3192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return m_match == PseudoElement;
3202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochinline bool CSSSelector::isUnknownPseudoElement() const
32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_match == PseudoElement && m_pseudoType == PseudoUnknown;
32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
327ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochinline bool CSSSelector::isSiblingSelector() const
328ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
329ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PseudoType type = pseudoType();
330ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return m_relation == DirectAdjacent
331ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        || m_relation == IndirectAdjacent
332ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        || type == PseudoEmpty
333ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        || type == PseudoFirstChild
334ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        || type == PseudoFirstOfType
335ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        || type == PseudoLastChild
336ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        || type == PseudoLastOfType
337ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        || type == PseudoOnlyChild
338ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        || type == PseudoOnlyOfType
339ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        || type == PseudoNthChild
340ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        || type == PseudoNthOfType
341ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        || type == PseudoNthLastChild
342ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        || type == PseudoNthLastOfType;
343ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
3442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3452fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline void CSSSelector::setValue(const AtomicString& value)
3462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Need to do ref counting manually for the union.
3482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_hasRareData) {
3492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_data.m_rareData->m_value = value.impl();
3502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_data.m_rareData->m_value->ref();
3512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
3522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
3532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_data.m_value = value.impl();
3542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_data.m_value->ref();
3552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3572fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline void move(PassOwnPtr<CSSSelector> from, CSSSelector* to)
3582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    memcpy(to, from.get(), sizeof(CSSSelector));
3602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // We want to free the memory (which was allocated with fastNew), but we
3612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // don't want the destructor to run since it will affect the copy we've just made.
3622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    fastDeleteSkippingDestructor(from.leakPtr());
3632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
364ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // CSSSelector_h
368