Remove excessive include directives from WebCore/css
[WebKit-https.git] / Source / WebCore / css / parser / CSSParserSelector.h
1 /*
2  * Copyright (C) 2003 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010, 2014 Apple Inc. All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #pragma once
22
23 #include "CSSSelector.h"
24 #include "CSSValueKeywords.h"
25 #include <wtf/text/AtomicString.h>
26 #include <wtf/text/AtomicStringHash.h>
27 #include <wtf/text/WTFString.h>
28
29 namespace WebCore {
30
31 class CSSValue;
32 class QualifiedName;
33
34 enum class CSSParserSelectorCombinator {
35     Child,
36     DescendantSpace,
37 #if ENABLE(CSS_SELECTORS_LEVEL4)
38     DescendantDoubleChild,
39 #endif
40     DirectAdjacent,
41     IndirectAdjacent
42 };
43
44 class CSSParserSelector {
45     WTF_MAKE_FAST_ALLOCATED;
46 public:
47     static CSSParserSelector* parsePseudoClassSelectorFromStringView(StringView&);
48     static CSSParserSelector* parsePseudoElementSelectorFromStringView(StringView&);
49     static CSSParserSelector* parsePagePseudoSelector(const AtomicString&);
50     
51     CSSParserSelector();
52     explicit CSSParserSelector(const QualifiedName&);
53     ~CSSParserSelector();
54
55     std::unique_ptr<CSSSelector> releaseSelector() { return WTFMove(m_selector); }
56
57     void setValue(const AtomicString& value, bool matchLowerCase = false) { m_selector->setValue(value, matchLowerCase); }
58     
59     // FIXME-NEWPARSER: These two methods can go away once old parser is gone.
60     void setAttribute(const QualifiedName& value, bool isCaseInsensitive) { m_selector->setAttribute(value, isCaseInsensitive); }
61     void setAttributeValueMatchingIsCaseInsensitive(bool isCaseInsensitive) { m_selector->setAttributeValueMatchingIsCaseInsensitive(isCaseInsensitive); }
62     
63     void setAttribute(const QualifiedName& value, bool convertToLowercase, CSSSelector::AttributeMatchType type) { m_selector->setAttribute(value, convertToLowercase, type); }
64     
65     void setArgument(const AtomicString& value) { m_selector->setArgument(value); }
66     void setNth(int a, int b) { m_selector->setNth(a, b); }
67     void setMatch(CSSSelector::Match value) { m_selector->setMatch(value); }
68     void setRelation(CSSSelector::RelationType value) { m_selector->setRelation(value); }
69     void setForPage() { m_selector->setForPage(); }
70
71     CSSSelector::Match match() const { return m_selector->match(); }
72     CSSSelector::PseudoElementType pseudoElementType() const { return m_selector->pseudoElementType(); }
73     const CSSSelectorList* selectorList() const { return m_selector->selectorList(); }
74     
75     void setPseudoElementType(CSSSelector::PseudoElementType type) { m_selector->setPseudoElementType(type); }
76
77     void adoptSelectorVector(Vector<std::unique_ptr<CSSParserSelector>>& selectorVector);
78     void setLangArgumentList(std::unique_ptr<Vector<AtomicString>>);
79     void setSelectorList(std::unique_ptr<CSSSelectorList>);
80
81     CSSSelector::PseudoClassType pseudoClassType() const { return m_selector->pseudoClassType(); }
82     bool isCustomPseudoElement() const { return m_selector->isCustomPseudoElement(); }
83
84     bool isPseudoElementCueFunction() const
85     {
86 #if ENABLE(VIDEO_TRACK)
87         return m_selector->match() == CSSSelector::PseudoElement && m_selector->pseudoElementType() == CSSSelector::PseudoElementCue;
88 #else
89         return false;
90 #endif
91     }
92
93     bool hasShadowDescendant() const;
94     bool matchesPseudoElement() const;
95
96     bool isHostPseudoSelector() const;
97
98     // FIXME-NEWPARSER: "slotted" was removed here for now, since it leads to a combinator
99     // connection of ShadowDescendant, and the current shadow DOM code doesn't expect this. When
100     // we do fix this issue, make sure to patch the namespace prependTag code to remove the slotted
101     // special case, since it will be covered by this function once again.
102     bool needsImplicitShadowCombinatorForMatching() const;
103
104     CSSParserSelector* tagHistory() const { return m_tagHistory.get(); }
105     void setTagHistory(std::unique_ptr<CSSParserSelector> selector) { m_tagHistory = WTFMove(selector); }
106     void clearTagHistory() { m_tagHistory.reset(); }
107     void insertTagHistory(CSSSelector::RelationType before, std::unique_ptr<CSSParserSelector>, CSSSelector::RelationType after);
108     void appendTagHistory(CSSSelector::RelationType, std::unique_ptr<CSSParserSelector>);
109     void appendTagHistory(CSSParserSelectorCombinator, std::unique_ptr<CSSParserSelector>);
110     void prependTagSelector(const QualifiedName&, bool tagIsForNamespaceRule = false);
111     std::unique_ptr<CSSParserSelector> releaseTagHistory();
112
113 private:
114     std::unique_ptr<CSSSelector> m_selector;
115     std::unique_ptr<CSSParserSelector> m_tagHistory;
116 };
117
118 inline bool CSSParserSelector::hasShadowDescendant() const
119 {
120     return m_selector->relation() == CSSSelector::ShadowDescendant;
121 }
122
123 inline bool CSSParserSelector::needsImplicitShadowCombinatorForMatching() const
124 {
125     return match() == CSSSelector::PseudoElement
126         && (pseudoElementType() == CSSSelector::PseudoElementWebKitCustom
127             || pseudoElementType() == CSSSelector::PseudoElementUserAgentCustom
128 #if ENABLE(VIDEO_TRACK)
129             || pseudoElementType() == CSSSelector::PseudoElementCue
130 #endif
131             || pseudoElementType() == CSSSelector::PseudoElementWebKitCustomLegacyPrefixed);
132 }
133
134 }