5a7272149b7212a7a68f6a934e6a6d13a7f263e9
[WebKit-https.git] / Source / WebCore / css / StyleRule.cpp
1 /*
2  * (C) 1999-2003 Lars Knoll (knoll@kde.org)
3  * (C) 2002-2003 Dirk Mueller (mueller@kde.org)
4  * Copyright (C) 2002, 2005, 2006, 2008, 2012 Apple 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 #include "config.h"
23 #include "StyleRule.h"
24
25 #include "CSSCharsetRule.h"
26 #include "CSSFontFaceRule.h"
27 #include "CSSImportRule.h"
28 #include "CSSMediaRule.h"
29 #include "CSSPageRule.h"
30 #include "CSSStyleRule.h"
31 #include "StyleRuleImport.h"
32 #include "WebKitCSSKeyframeRule.h"
33 #include "WebKitCSSKeyframesRule.h"
34 #include "WebKitCSSRegionRule.h"
35
36 namespace WebCore {
37
38 PassRefPtr<CSSRule> StyleRuleBase::createCSSOMWrapper(CSSStyleSheet* parentSheet) const
39 {
40     return createCSSOMWrapper(parentSheet, 0);
41 }
42
43 PassRefPtr<CSSRule> StyleRuleBase::createCSSOMWrapper(CSSRule* parentRule) const
44
45     return createCSSOMWrapper(0, parentRule);
46 }
47
48 void StyleRuleBase::destroy()
49 {
50     switch (type()) {
51     case Style:
52         delete static_cast<StyleRule*>(this);
53         return;
54     case Page:
55         delete static_cast<StyleRulePage*>(this);
56         return;
57     case FontFace:
58         delete static_cast<StyleRuleFontFace*>(this);
59         return;
60     case Media:
61         delete static_cast<StyleRuleMedia*>(this);
62         return;
63     case Region:
64         delete static_cast<StyleRuleRegion*>(this);
65         return;
66     case Import:
67         delete static_cast<StyleRuleImport*>(this);
68         return;
69     case Keyframes:
70         delete static_cast<StyleRuleKeyframes*>(this);
71         return;
72     case Unknown:
73     case Charset:
74     case Keyframe:
75         ASSERT_NOT_REACHED();
76         return;
77     }
78     ASSERT_NOT_REACHED();
79 }
80
81 PassRefPtr<StyleRuleBase> StyleRuleBase::copy() const
82 {
83     switch (type()) {
84     case Style:
85         return static_cast<const StyleRule*>(this)->copy();
86     case Page:
87         return static_cast<const StyleRulePage*>(this)->copy();
88     case FontFace:
89         return static_cast<const StyleRuleFontFace*>(this)->copy();
90     case Media:
91         return static_cast<const StyleRuleMedia*>(this)->copy();
92     case Region:
93         return static_cast<const StyleRuleRegion*>(this)->copy();
94     case Import:
95         // FIXME: Copy import rules.
96         ASSERT_NOT_REACHED();
97         return 0;
98     case Keyframes:
99         return static_cast<const StyleRuleKeyframes*>(this)->copy();
100     case Unknown:
101     case Charset:
102     case Keyframe:
103         ASSERT_NOT_REACHED();
104         return 0;
105     }
106     ASSERT_NOT_REACHED();
107     return 0;
108 }
109
110 PassRefPtr<CSSRule> StyleRuleBase::createCSSOMWrapper(CSSStyleSheet* parentSheet, CSSRule* parentRule) const
111 {
112     RefPtr<CSSRule> rule;
113     StyleRuleBase* self = const_cast<StyleRuleBase*>(this);
114     switch (type()) {
115     case Style:
116         rule = CSSStyleRule::create(static_cast<StyleRule*>(self), parentSheet);
117         break;
118     case Page:
119         rule = CSSPageRule::create(static_cast<StyleRulePage*>(self), parentSheet);
120         break;
121     case FontFace:
122         rule = CSSFontFaceRule::create(static_cast<StyleRuleFontFace*>(self), parentSheet);
123         break;
124     case Media:
125         rule = CSSMediaRule::create(static_cast<StyleRuleMedia*>(self), parentSheet);
126         break;
127     case Region:
128         rule = WebKitCSSRegionRule::create(static_cast<StyleRuleRegion*>(self), parentSheet);
129         break;
130     case Import:
131         rule = CSSImportRule::create(static_cast<StyleRuleImport*>(self), parentSheet);
132         break;
133     case Keyframes:
134         rule = WebKitCSSKeyframesRule::create(static_cast<StyleRuleKeyframes*>(self), parentSheet);
135         break;
136     case Unknown:
137     case Charset:
138     case Keyframe:
139         ASSERT_NOT_REACHED();
140         return 0;
141     }
142     if (parentRule)
143         rule->setParentRule(parentRule);
144     return rule.release();
145 }
146
147 unsigned StyleRule::averageSizeInBytes()
148 {
149     return sizeof(StyleRule) + StylePropertySet::averageSizeInBytes();
150 }
151
152 StyleRule::StyleRule(int sourceLine)
153     : StyleRuleBase(Style, sourceLine)
154 {
155 }
156
157 StyleRule::StyleRule(const StyleRule& o)
158     : StyleRuleBase(o)
159     , m_properties(o.m_properties->copy())
160     , m_selectorList(o.m_selectorList)
161 {
162 }
163
164 StyleRule::~StyleRule()
165 {
166 }
167
168 void StyleRule::setProperties(PassRefPtr<StylePropertySet> properties)
169
170     m_properties = properties;
171 }
172
173 StyleRulePage::StyleRulePage()
174     : StyleRuleBase(Page)
175 {
176 }
177
178 StyleRulePage::StyleRulePage(const StyleRulePage& o)
179     : StyleRuleBase(o)
180     , m_properties(o.m_properties->copy())
181     , m_selectorList(o.m_selectorList)
182 {
183 }
184
185 StyleRulePage::~StyleRulePage()
186 {
187 }
188
189 void StyleRulePage::setProperties(PassRefPtr<StylePropertySet> properties)
190
191     m_properties = properties;
192 }
193
194 StyleRuleFontFace::StyleRuleFontFace()
195     : StyleRuleBase(FontFace, 0)
196 {
197 }
198
199 StyleRuleFontFace::StyleRuleFontFace(const StyleRuleFontFace& o)
200     : StyleRuleBase(o)
201     , m_properties(o.m_properties->copy())
202 {
203 }
204
205 StyleRuleFontFace::~StyleRuleFontFace()
206 {
207 }
208
209 void StyleRuleFontFace::setProperties(PassRefPtr<StylePropertySet> properties)
210
211     m_properties = properties;
212 }
213
214 StyleRuleBlock::StyleRuleBlock(Type type, Vector<RefPtr<StyleRuleBase> >& adoptRule)
215     : StyleRuleBase(type, 0)
216 {
217     m_childRules.swap(adoptRule);
218 }
219
220 StyleRuleBlock::StyleRuleBlock(const StyleRuleBlock& o)
221     : StyleRuleBase(o)
222     , m_childRules(o.m_childRules.size())
223 {
224     for (unsigned i = 0; i < m_childRules.size(); ++i)
225         m_childRules[i] = o.m_childRules[i]->copy();
226 }
227
228 void StyleRuleBlock::wrapperInsertRule(unsigned index, PassRefPtr<StyleRuleBase> rule)
229 {
230     m_childRules.insert(index, rule);
231 }
232     
233 void StyleRuleBlock::wrapperRemoveRule(unsigned index)
234 {
235     m_childRules.remove(index);
236 }
237
238 StyleRuleMedia::StyleRuleMedia(PassRefPtr<MediaQuerySet> media, Vector<RefPtr<StyleRuleBase> >& adoptRules)
239     : StyleRuleBlock(Media, adoptRules)
240     , m_mediaQueries(media)
241 {
242 }
243
244 StyleRuleMedia::StyleRuleMedia(const StyleRuleMedia& o)
245     : StyleRuleBlock(o)
246     , m_mediaQueries(o.m_mediaQueries->copy())
247 {
248 }
249
250 StyleRuleRegion::StyleRuleRegion(Vector<OwnPtr<CSSParserSelector> >* selectors, Vector<RefPtr<StyleRuleBase> >& adoptRules)
251     : StyleRuleBlock(Region, adoptRules)
252 {
253     m_selectorList.adoptSelectorVector(*selectors);
254 }
255
256 StyleRuleRegion::StyleRuleRegion(const StyleRuleRegion& o)
257     : StyleRuleBlock(o)
258     , m_selectorList(o.m_selectorList)
259 {
260 }
261
262 } // namespace WebCore