Use separate style resolver for user agent shadow trees
[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 };
45
46 class ElementRuleCollector {
47 public:
48     ElementRuleCollector(Element& element, RenderStyle* style, const DocumentRuleSets& ruleSets, const SelectorFilter& selectorFilter)
49         : m_element(element)
50         , m_style(style)
51         , m_ruleSets(ruleSets)
52         , m_selectorFilter(selectorFilter)
53         , m_canUseFastReject(m_selectorFilter.parentStackIsConsistent(element.parentNode()))
54     {
55     }
56
57     void matchAllRules(bool matchAuthorAndUserStyles, bool includeSMILProperties);
58     void matchUARules();
59     void matchAuthorRules(bool includeEmptyRules);
60     void matchUserRules(bool includeEmptyRules);
61
62     void setMode(SelectorChecker::Mode mode) { m_mode = mode; }
63     void setPseudoStyleRequest(const PseudoStyleRequest& request) { m_pseudoStyleRequest = request; }
64     void setSameOriginOnly(bool f) { m_sameOriginOnly = f; } 
65     void setRegionForStyling(const RenderRegion* regionForStyling) { m_regionForStyling = regionForStyling; }
66     void setMedium(const MediaQueryEvaluator* medium) { m_isPrintStyle = medium->mediaTypeMatchSpecific("print"); }
67
68     bool hasAnyMatchingRules(RuleSet*);
69
70     StyleResolver::MatchResult& matchedResult();
71     const Vector<RefPtr<StyleRule>>& matchedRuleList() const;
72
73     bool hasMatchedRules() const { return m_matchedRules && !m_matchedRules->isEmpty(); }
74     void clearMatchedRules();
75
76 private:
77     void addElementStyleProperties(const StyleProperties*, bool isCacheable = true);
78
79     void matchUARules(RuleSet*);
80
81     void collectMatchingRules(const MatchRequest&, StyleResolver::RuleRange&);
82     void collectMatchingRulesForRegion(const MatchRequest&, StyleResolver::RuleRange&);
83     void collectMatchingRulesForList(const RuleSet::RuleDataVector*, const MatchRequest&, StyleResolver::RuleRange&);
84     bool ruleMatches(const RuleData&, unsigned &specificity);
85
86     void sortMatchedRules();
87     void sortAndTransferMatchedRules();
88
89     void addMatchedRule(const MatchedRule&);
90
91     Element& m_element;
92     RenderStyle* m_style;
93     const DocumentRuleSets& m_ruleSets;
94     const SelectorFilter& m_selectorFilter;
95
96     bool m_isPrintStyle { false };
97     const RenderRegion* m_regionForStyling { nullptr };
98     PseudoStyleRequest m_pseudoStyleRequest { NOPSEUDO };
99     bool m_sameOriginOnly { false };
100     SelectorChecker::Mode m_mode { SelectorChecker::Mode::ResolvingStyle };
101     bool m_canUseFastReject;
102
103     std::unique_ptr<Vector<MatchedRule, 32>> m_matchedRules;
104
105     // Output.
106     Vector<RefPtr<StyleRule>> m_matchedRuleList;
107     StyleResolver::MatchResult m_result;
108 };
109
110 } // namespace WebCore
111
112 #endif // ElementRuleCollector_h