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