1/*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
4 * Copyright (C) 2013 Google Inc. All rights reserved.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU Library General Public License
17 * along with this library; see the file COPYING.LIB. If not, write to
18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
20 *
21 */
22
23#pragma once
24
25#include "CSSDefaultStyleSheets.h"
26#include "RuleFeature.h"
27#include "RuleSet.h"
28#include <memory>
29#include <wtf/HashMap.h>
30#include <wtf/RefPtr.h>
31#include <wtf/Vector.h>
32
33namespace WebCore {
34
35class CSSStyleRule;
36class CSSStyleSheet;
37class ExtensionStyleSheets;
38class InspectorCSSOMWrappers;
39class MediaQueryEvaluator;
40
41struct InvalidationRuleSet {
42 MatchElement matchElement;
43 std::unique_ptr<RuleSet> ruleSet;
44 Vector<const CSSSelector*> invalidationSelectors;
45
46 WTF_MAKE_FAST_ALLOCATED;
47};
48
49class DocumentRuleSets {
50public:
51 DocumentRuleSets(StyleResolver&);
52 ~DocumentRuleSets();
53
54 bool isAuthorStyleDefined() const { return m_isAuthorStyleDefined; }
55 RuleSet* userAgentMediaQueryStyle() const;
56 RuleSet& authorStyle() const { return *m_authorStyle.get(); }
57 RuleSet* userStyle() const;
58 const RuleFeatureSet& features() const;
59 RuleSet* sibling() const { return m_siblingRuleSet.get(); }
60 RuleSet* uncommonAttribute() const { return m_uncommonAttributeRuleSet.get(); }
61
62 const Vector<InvalidationRuleSet>* classInvalidationRuleSets(const AtomString& className) const;
63 const Vector<InvalidationRuleSet>* attributeInvalidationRuleSets(const AtomString& attributeName) const;
64
65 bool hasComplexSelectorsForStyleAttribute() const;
66
67 void setIsForShadowScope() { m_isForShadowScope = true; }
68
69 void setUsesSharedUserStyle(bool b) { m_usesSharedUserStyle = b; }
70 void initializeUserStyle();
71
72 void resetAuthorStyle();
73 void appendAuthorStyleSheets(const Vector<RefPtr<CSSStyleSheet>>&, MediaQueryEvaluator*, InspectorCSSOMWrappers&, StyleResolver*);
74
75 void resetUserAgentMediaQueryStyle();
76
77 RuleFeatureSet& mutableFeatures();
78
79private:
80 void collectFeatures() const;
81 void collectRulesFromUserStyleSheets(const Vector<RefPtr<CSSStyleSheet>>&, RuleSet& userStyle, const MediaQueryEvaluator&, StyleResolver&);
82 void updateUserAgentMediaQueryStyleIfNeeded() const;
83
84 std::unique_ptr<RuleSet> m_authorStyle;
85 mutable std::unique_ptr<RuleSet> m_userAgentMediaQueryStyle;
86 std::unique_ptr<RuleSet> m_userStyle;
87
88 StyleResolver& m_styleResolver;
89 mutable RuleFeatureSet m_features;
90 mutable std::unique_ptr<RuleSet> m_siblingRuleSet;
91 mutable std::unique_ptr<RuleSet> m_uncommonAttributeRuleSet;
92 mutable HashMap<AtomString, std::unique_ptr<Vector<InvalidationRuleSet>>> m_classInvalidationRuleSets;
93 mutable HashMap<AtomString, std::unique_ptr<Vector<InvalidationRuleSet>>> m_attributeInvalidationRuleSets;
94
95 mutable Optional<bool> m_cachedHasComplexSelectorsForStyleAttribute;
96
97 mutable unsigned m_defaultStyleVersionOnFeatureCollection { 0 };
98 mutable unsigned m_userAgentMediaQueryRuleCountOnUpdate { 0 };
99
100 bool m_usesSharedUserStyle { false };
101 bool m_isForShadowScope { false };
102 bool m_isAuthorStyleDefined { false };
103};
104
105inline const RuleFeatureSet& DocumentRuleSets::features() const
106{
107 if (m_defaultStyleVersionOnFeatureCollection < CSSDefaultStyleSheets::defaultStyleVersion)
108 collectFeatures();
109 return m_features;
110}
111
112// FIXME: There should be just the const version.
113inline RuleFeatureSet& DocumentRuleSets::mutableFeatures()
114{
115 if (m_defaultStyleVersionOnFeatureCollection < CSSDefaultStyleSheets::defaultStyleVersion)
116 collectFeatures();
117 return m_features;
118}
119
120} // namespace WebCore
121