Remove excessive include directives from WebCore/css
[WebKit-https.git] / Source / WebCore / css / CSSStyleSheet.h
1 /*
2  * (C) 1999-2003 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010, 2012, 2013 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 #pragma once
22
23 #include "CSSParserMode.h"
24 #include "ExceptionOr.h"
25 #include "StyleSheet.h"
26 #include <memory>
27 #include <wtf/Noncopyable.h>
28 #include <wtf/TypeCasts.h>
29 #include <wtf/text/AtomicStringHash.h>
30 #include <wtf/text/TextPosition.h>
31
32 namespace WebCore {
33
34 class CSSImportRule;
35 class CSSParser;
36 class CSSRule;
37 class CSSRuleList;
38 class CSSStyleSheet;
39 class CachedCSSStyleSheet;
40 class Document;
41 class Element;
42 class MediaQuerySet;
43 class StyleRuleKeyframes;
44 class StyleSheetContents;
45
46 namespace Style {
47 class Scope;
48 }
49
50 class CSSStyleSheet final : public StyleSheet {
51 public:
52     static Ref<CSSStyleSheet> create(Ref<StyleSheetContents>&&, CSSImportRule* ownerRule = 0);
53     static Ref<CSSStyleSheet> create(Ref<StyleSheetContents>&&, Node& ownerNode, const std::optional<bool>& isOriginClean = std::nullopt);
54     static Ref<CSSStyleSheet> createInline(Ref<StyleSheetContents>&&, Element& owner, const TextPosition& startPosition);
55
56     virtual ~CSSStyleSheet();
57
58     CSSStyleSheet* parentStyleSheet() const final;
59     Node* ownerNode() const final { return m_ownerNode; }
60     MediaList* media() const final;
61     String href() const final;
62     String title() const final { return m_title; }
63     bool disabled() const final { return m_isDisabled; }
64     void setDisabled(bool) final;
65     
66     WEBCORE_EXPORT RefPtr<CSSRuleList> cssRules();
67     WEBCORE_EXPORT ExceptionOr<unsigned> insertRule(const String& rule, unsigned index);
68     WEBCORE_EXPORT ExceptionOr<void> deleteRule(unsigned index);
69     
70     WEBCORE_EXPORT RefPtr<CSSRuleList> rules();
71     WEBCORE_EXPORT ExceptionOr<int> addRule(const String& selector, const String& style, std::optional<unsigned> index);
72     ExceptionOr<void> removeRule(unsigned index) { return deleteRule(index); }
73     
74     // For CSSRuleList.
75     unsigned length() const;
76     CSSRule* item(unsigned index);
77
78     void clearOwnerNode() final;
79     CSSImportRule* ownerRule() const final { return m_ownerRule; }
80     URL baseURL() const final;
81     bool isLoading() const final;
82     
83     void clearOwnerRule() { m_ownerRule = 0; }
84
85     Document* ownerDocument() const;
86     CSSStyleSheet& rootStyleSheet();
87     const CSSStyleSheet& rootStyleSheet() const;
88     Style::Scope* styleScope();
89
90     MediaQuerySet* mediaQueries() const { return m_mediaQueries.get(); }
91     void setMediaQueries(Ref<MediaQuerySet>&&);
92     void setTitle(const String& title) { m_title = title; }
93
94     bool hadRulesMutation() const { return m_mutatedRules; }
95     void clearHadRulesMutation() { m_mutatedRules = false; }
96
97     enum RuleMutationType { OtherMutation, RuleInsertion };
98     enum WhetherContentsWereClonedForMutation { ContentsWereNotClonedForMutation = 0, ContentsWereClonedForMutation };
99
100     class RuleMutationScope {
101         WTF_MAKE_NONCOPYABLE(RuleMutationScope);
102     public:
103         RuleMutationScope(CSSStyleSheet*, RuleMutationType = OtherMutation, StyleRuleKeyframes* insertedKeyframesRule = nullptr);
104         RuleMutationScope(CSSRule*);
105         ~RuleMutationScope();
106
107     private:
108         CSSStyleSheet* m_styleSheet;
109         RuleMutationType m_mutationType;
110         WhetherContentsWereClonedForMutation m_contentsWereClonedForMutation;
111         StyleRuleKeyframes* m_insertedKeyframesRule;
112     };
113
114     WhetherContentsWereClonedForMutation willMutateRules();
115     void didMutateRules(RuleMutationType, WhetherContentsWereClonedForMutation, StyleRuleKeyframes* insertedKeyframesRule);
116     void didMutateRuleFromCSSStyleDeclaration();
117     void didMutate();
118     
119     void clearChildRuleCSSOMWrappers();
120     void reattachChildRuleCSSOMWrappers();
121
122     StyleSheetContents& contents() { return m_contents; }
123
124     bool isInline() const { return m_isInlineStylesheet; }
125     TextPosition startPosition() const { return m_startPosition; }
126
127     void detachFromDocument() { m_ownerNode = nullptr; }
128
129 private:
130     CSSStyleSheet(Ref<StyleSheetContents>&&, CSSImportRule* ownerRule);
131     CSSStyleSheet(Ref<StyleSheetContents>&&, Node* ownerNode, const TextPosition& startPosition, bool isInlineStylesheet);
132     CSSStyleSheet(Ref<StyleSheetContents>&&, Node& ownerNode, const TextPosition& startPosition, bool isInlineStylesheet, const std::optional<bool>&);
133
134     bool isCSSStyleSheet() const final { return true; }
135     String type() const final { return ASCIILiteral("text/css"); }
136
137     bool canAccessRules() const;
138
139     Ref<StyleSheetContents> m_contents;
140     bool m_isInlineStylesheet;
141     bool m_isDisabled;
142     bool m_mutatedRules;
143     std::optional<bool> m_isOriginClean;
144     String m_title;
145     RefPtr<MediaQuerySet> m_mediaQueries;
146
147     Node* m_ownerNode;
148     CSSImportRule* m_ownerRule;
149
150     TextPosition m_startPosition;
151
152     mutable RefPtr<MediaList> m_mediaCSSOMWrapper;
153     mutable Vector<RefPtr<CSSRule>> m_childRuleCSSOMWrappers;
154     mutable std::unique_ptr<CSSRuleList> m_ruleListCSSOMWrapper;
155 };
156
157 } // namespace WebCore
158
159 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::CSSStyleSheet)
160     static bool isType(const WebCore::StyleSheet& styleSheet) { return styleSheet.isCSSStyleSheet(); }
161 SPECIALIZE_TYPE_TRAITS_END()