Use #pragma once in WebCore
[WebKit-https.git] / Source / WebCore / css / ElementRuleCollector.h
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2013, 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
22 #pragma once
23
24 #include "MediaQueryEvaluator.h"
25 #include "SelectorChecker.h"
26 #include "StyleResolver.h"
27 #include <memory>
28 #include <wtf/RefPtr.h>
29 #include <wtf/Vector.h>
30
31 namespace WebCore {
32
33 class DocumentRuleSets;
34 class MatchRequest;
35 class RenderRegion;
36 class RuleData;
37 class RuleSet;
38 class SelectorFilter;
39
40 struct MatchedRule {
41     const RuleData* ruleData;
42     unsigned specificity;   
43     int treeContextOrdinal;
44 };
45
46 class ElementRuleCollector {
47 public:
48     ElementRuleCollector(const Element&, const DocumentRuleSets&, const SelectorFilter*);
49     ElementRuleCollector(const Element&, const RuleSet& authorStyle, const SelectorFilter*);
50
51     void matchAllRules(bool matchAuthorAndUserStyles, bool includeSMILProperties);
52     void matchUARules();
53     void matchAuthorRules(bool includeEmptyRules);
54     void matchUserRules(bool includeEmptyRules);
55
56     void setMode(SelectorChecker::Mode mode) { m_mode = mode; }
57     void setPseudoStyleRequest(const PseudoStyleRequest& request) { m_pseudoStyleRequest = request; }
58     void setSameOriginOnly(bool f) { m_sameOriginOnly = f; } 
59     void setRegionForStyling(const RenderRegion* regionForStyling) { m_regionForStyling = regionForStyling; }
60     void setMedium(const MediaQueryEvaluator* medium) { m_isPrintStyle = medium->mediaTypeMatchSpecific("print"); }
61
62     bool hasAnyMatchingRules(const RuleSet*);
63
64     StyleResolver::MatchResult& matchedResult();
65     const Vector<RefPtr<StyleRule>>& matchedRuleList() const;
66
67     bool hasMatchedRules() const { return !m_matchedRules.isEmpty(); }
68     void clearMatchedRules();
69
70     const PseudoIdSet& matchedPseudoElementIds() const { return m_matchedPseudoElementIds; }
71     const Style::Relations& styleRelations() const { return m_styleRelations; }
72     bool didMatchUncommonAttributeSelector() const { return m_didMatchUncommonAttributeSelector; }
73
74 private:
75     void addElementStyleProperties(const StyleProperties*, bool isCacheable = true);
76
77     void matchUARules(RuleSet*);
78     void matchAuthorShadowPseudoElementRules(const MatchRequest&, StyleResolver::RuleRange&);
79     void matchHostPseudoClassRules(MatchRequest&, StyleResolver::RuleRange&);
80     void matchSlottedPseudoElementRules(MatchRequest&, StyleResolver::RuleRange&);
81
82     void collectMatchingShadowPseudoElementRules(const MatchRequest&, StyleResolver::RuleRange&);
83     std::unique_ptr<RuleSet::RuleDataVector> collectSlottedPseudoElementRulesForSlot(bool includeEmptyRules);
84
85     void collectMatchingRules(const MatchRequest&, StyleResolver::RuleRange&);
86     void collectMatchingRulesForRegion(const MatchRequest&, StyleResolver::RuleRange&);
87     void collectMatchingRulesForList(const RuleSet::RuleDataVector*, const MatchRequest&, StyleResolver::RuleRange&);
88     bool ruleMatches(const RuleData&, unsigned &specificity);
89
90     void sortMatchedRules();
91     void sortAndTransferMatchedRules();
92
93     void addMatchedRule(const RuleData&, unsigned specificity, int treeContextOrdinal, StyleResolver::RuleRange&);
94
95     const Element& m_element;
96     const RuleSet& m_authorStyle;
97     const RuleSet* m_userStyle { nullptr };
98     const SelectorFilter* m_selectorFilter { nullptr };
99
100     bool m_isPrintStyle { false };
101     const RenderRegion* m_regionForStyling { nullptr };
102     PseudoStyleRequest m_pseudoStyleRequest { NOPSEUDO };
103     bool m_sameOriginOnly { false };
104     SelectorChecker::Mode m_mode { SelectorChecker::Mode::ResolvingStyle };
105     bool m_isMatchingSlottedPseudoElements { false };
106     Vector<std::unique_ptr<RuleSet::RuleDataVector>> m_keepAliveSlottedPseudoElementRules;
107
108     Vector<MatchedRule, 64> m_matchedRules;
109
110     // Output.
111     Vector<RefPtr<StyleRule>> m_matchedRuleList;
112     bool m_didMatchUncommonAttributeSelector { false };
113     StyleResolver::MatchResult m_result;
114     Style::Relations m_styleRelations;
115     PseudoIdSet m_matchedPseudoElementIds;
116 };
117
118 } // namespace WebCore