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