Replace PassRef with Ref/Ref&& across the board.
[WebKit-https.git] / Source / WebCore / css / StyleSheetContents.h
1 /*
2  * (C) 1999-2003 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010, 2012 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 #ifndef StyleSheetContents_h
22 #define StyleSheetContents_h
23
24 #include "CSSParserMode.h"
25 #include "URL.h"
26 #include <wtf/HashMap.h>
27 #include <wtf/ListHashSet.h>
28 #include <wtf/RefCounted.h>
29 #include <wtf/Vector.h>
30 #include <wtf/text/AtomicStringHash.h>
31
32 namespace WebCore {
33
34 class CSSStyleSheet;
35 class CachedCSSStyleSheet;
36 class Document;
37 class Node;
38 class SecurityOrigin;
39 class StyleRuleBase;
40 class StyleRuleImport;
41
42 class StyleSheetContents : public RefCounted<StyleSheetContents> {
43 public:
44     static Ref<StyleSheetContents> create(const CSSParserContext& context = CSSParserContext(CSSStrictMode))
45     {
46         return adoptRef(*new StyleSheetContents(0, String(), context));
47     }
48     static Ref<StyleSheetContents> create(const String& originalURL, const CSSParserContext& context)
49     {
50         return adoptRef(*new StyleSheetContents(0, originalURL, context));
51     }
52     static Ref<StyleSheetContents> create(StyleRuleImport* ownerRule, const String& originalURL, const CSSParserContext& context)
53     {
54         return adoptRef(*new StyleSheetContents(ownerRule, originalURL, context));
55     }
56
57     WEBCORE_EXPORT ~StyleSheetContents();
58     
59     const CSSParserContext& parserContext() const { return m_parserContext; }
60
61     const AtomicString& determineNamespace(const AtomicString& prefix);
62
63     void parseAuthorStyleSheet(const CachedCSSStyleSheet*, const SecurityOrigin*);
64     WEBCORE_EXPORT bool parseString(const String&);
65     bool parseStringAtLine(const String&, int startLineNumber, bool);
66
67     bool isCacheable() const;
68
69     bool isLoading() const;
70
71     void checkLoaded();
72     void startLoadingDynamicSheet();
73
74     StyleSheetContents* rootStyleSheet() const;
75     Node* singleOwnerNode() const;
76     Document* singleOwnerDocument() const;
77
78     const String& charset() const { return m_parserContext.charset; }
79
80     bool loadCompleted() const { return m_loadCompleted; }
81     bool hasFailedOrCanceledSubresources() const;
82
83     URL completeURL(const String& url) const;
84     void addSubresourceStyleURLs(ListHashSet<URL>&);
85
86     void setIsUserStyleSheet(bool b) { m_isUserStyleSheet = b; }
87     bool isUserStyleSheet() const { return m_isUserStyleSheet; }
88     void setHasSyntacticallyValidCSSHeader(bool b) { m_hasSyntacticallyValidCSSHeader = b; }
89     bool hasSyntacticallyValidCSSHeader() const { return m_hasSyntacticallyValidCSSHeader; }
90
91     void parserAddNamespace(const AtomicString& prefix, const AtomicString& uri);
92     void parserAppendRule(PassRefPtr<StyleRuleBase>);
93     void parserSetEncodingFromCharsetRule(const String& encoding); 
94     void parserSetUsesRemUnits(bool b) { m_usesRemUnits = b; }
95
96     void clearRules();
97
98     bool hasCharsetRule() const { return !m_encodingFromCharsetRule.isNull(); }
99     String encodingFromCharsetRule() const { return m_encodingFromCharsetRule; }
100     // Rules other than @charset and @import.
101     const Vector<RefPtr<StyleRuleBase>>& childRules() const { return m_childRules; }
102     const Vector<RefPtr<StyleRuleImport>>& importRules() const { return m_importRules; }
103
104     void notifyLoadedSheet(const CachedCSSStyleSheet*);
105     
106     StyleSheetContents* parentStyleSheet() const;
107     StyleRuleImport* ownerRule() const { return m_ownerRule; }
108     void clearOwnerRule() { m_ownerRule = 0; }
109     
110     // Note that href is the URL that started the redirect chain that led to
111     // this style sheet. This property probably isn't useful for much except
112     // the JavaScript binding (which needs to use this value for security).
113     String originalURL() const { return m_originalURL; }
114     const URL& baseURL() const { return m_parserContext.baseURL; }
115
116     unsigned ruleCount() const;
117     StyleRuleBase* ruleAt(unsigned index) const;
118
119     bool usesRemUnits() const { return m_usesRemUnits; }
120
121     unsigned estimatedSizeInBytes() const;
122     
123     bool wrapperInsertRule(PassRefPtr<StyleRuleBase>, unsigned index);
124     void wrapperDeleteRule(unsigned index);
125
126     Ref<StyleSheetContents> copy() const { return adoptRef(*new StyleSheetContents(*this)); }
127
128     void registerClient(CSSStyleSheet*);
129     void unregisterClient(CSSStyleSheet*);
130     bool hasOneClient() { return m_clients.size() == 1; }
131
132     bool isMutable() const { return m_isMutable; }
133     void setMutable() { m_isMutable = true; }
134
135     bool isInMemoryCache() const { return m_isInMemoryCache; }
136     void addedToMemoryCache();
137     void removedFromMemoryCache();
138
139     void shrinkToFit();
140
141 private:
142     WEBCORE_EXPORT StyleSheetContents(StyleRuleImport* ownerRule, const String& originalURL, const CSSParserContext&);
143     StyleSheetContents(const StyleSheetContents&);
144
145     void clearCharsetRule();
146
147     StyleRuleImport* m_ownerRule;
148
149     String m_originalURL;
150
151     String m_encodingFromCharsetRule;
152     Vector<RefPtr<StyleRuleImport>> m_importRules;
153     Vector<RefPtr<StyleRuleBase>> m_childRules;
154     typedef HashMap<AtomicString, AtomicString> PrefixNamespaceURIMap;
155     PrefixNamespaceURIMap m_namespaces;
156
157     bool m_loadCompleted : 1;
158     bool m_isUserStyleSheet : 1;
159     bool m_hasSyntacticallyValidCSSHeader : 1;
160     bool m_didLoadErrorOccur : 1;
161     bool m_usesRemUnits : 1;
162     bool m_isMutable : 1;
163     bool m_isInMemoryCache : 1;
164     
165     CSSParserContext m_parserContext;
166
167     Vector<CSSStyleSheet*> m_clients;
168 };
169
170 } // namespace
171
172 #endif