Add feature defines for web-facing parts of CSS Regions and Exclusions
[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 #if ENABLE(CSS_REGIONS)
64     case Region:
65         delete static_cast<StyleRuleRegion*>(this);
66         return;
67 #endif
68     case Import:
69         delete static_cast<StyleRuleImport*>(this);
70         return;
71     case Keyframes:
72         delete static_cast<StyleRuleKeyframes*>(this);
73         return;
74     case Unknown:
75     case Charset:
76     case Keyframe:
77 #if !ENABLE(CSS_REGIONS)
78     case Region:
79 #endif
80         ASSERT_NOT_REACHED();
81         return;
82     }
83     ASSERT_NOT_REACHED();
84 }
85
86 PassRefPtr<StyleRuleBase> StyleRuleBase::copy() const
87 {
88     switch (type()) {
89     case Style:
90         return static_cast<const StyleRule*>(this)->copy();
91     case Page:
92         return static_cast<const StyleRulePage*>(this)->copy();
93     case FontFace:
94         return static_cast<const StyleRuleFontFace*>(this)->copy();
95     case Media:
96         return static_cast<const StyleRuleMedia*>(this)->copy();
97 #if ENABLE(CSS_REGIONS)
98     case Region:
99         return static_cast<const StyleRuleRegion*>(this)->copy();
100 #endif
101     case Import:
102         // FIXME: Copy import rules.
103         ASSERT_NOT_REACHED();
104         return 0;
105     case Keyframes:
106         return static_cast<const StyleRuleKeyframes*>(this)->copy();
107     case Unknown:
108     case Charset:
109     case Keyframe:
110 #if !ENABLE(CSS_REGIONS)
111     case Region:
112 #endif
113         ASSERT_NOT_REACHED();
114         return 0;
115     }
116     ASSERT_NOT_REACHED();
117     return 0;
118 }
119
120 PassRefPtr<CSSRule> StyleRuleBase::createCSSOMWrapper(CSSStyleSheet* parentSheet, CSSRule* parentRule) const
121 {
122     RefPtr<CSSRule> rule;
123     StyleRuleBase* self = const_cast<StyleRuleBase*>(this);
124     switch (type()) {
125     case Style:
126         rule = CSSStyleRule::create(static_cast<StyleRule*>(self), parentSheet);
127         break;
128     case Page:
129         rule = CSSPageRule::create(static_cast<StyleRulePage*>(self), parentSheet);
130         break;
131     case FontFace:
132         rule = CSSFontFaceRule::create(static_cast<StyleRuleFontFace*>(self), parentSheet);
133         break;
134     case Media:
135         rule = CSSMediaRule::create(static_cast<StyleRuleMedia*>(self), parentSheet);
136         break;
137 #if ENABLE(CSS_REGIONS)
138     case Region:
139         rule = WebKitCSSRegionRule::create(static_cast<StyleRuleRegion*>(self), parentSheet);
140         break;
141 #endif
142     case Import:
143         rule = CSSImportRule::create(static_cast<StyleRuleImport*>(self), parentSheet);
144         break;
145     case Keyframes:
146         rule = WebKitCSSKeyframesRule::create(static_cast<StyleRuleKeyframes*>(self), parentSheet);
147         break;
148     case Unknown:
149     case Charset:
150     case Keyframe:
151 #if !ENABLE(CSS_REGIONS)
152     case Region:
153 #endif
154         ASSERT_NOT_REACHED();
155         return 0;
156     }
157     if (parentRule)
158         rule->setParentRule(parentRule);
159     return rule.release();
160 }
161
162 unsigned StyleRule::averageSizeInBytes()
163 {
164     return sizeof(StyleRule) + StylePropertySet::averageSizeInBytes();
165 }
166
167 StyleRule::StyleRule(int sourceLine)
168     : StyleRuleBase(Style, sourceLine)
169 {
170 }
171
172 StyleRule::StyleRule(const StyleRule& o)
173     : StyleRuleBase(o)
174     , m_properties(o.m_properties->copy())
175     , m_selectorList(o.m_selectorList)
176 {
177 }
178
179 StyleRule::~StyleRule()
180 {
181 }
182
183 void StyleRule::setProperties(PassRefPtr<StylePropertySet> properties)
184
185     m_properties = properties;
186 }
187
188 StyleRulePage::StyleRulePage()
189     : StyleRuleBase(Page)
190 {
191 }
192
193 StyleRulePage::StyleRulePage(const StyleRulePage& o)
194     : StyleRuleBase(o)
195     , m_properties(o.m_properties->copy())
196     , m_selectorList(o.m_selectorList)
197 {
198 }
199
200 StyleRulePage::~StyleRulePage()
201 {
202 }
203
204 void StyleRulePage::setProperties(PassRefPtr<StylePropertySet> properties)
205
206     m_properties = properties;
207 }
208
209 StyleRuleFontFace::StyleRuleFontFace()
210     : StyleRuleBase(FontFace, 0)
211 {
212 }
213
214 StyleRuleFontFace::StyleRuleFontFace(const StyleRuleFontFace& o)
215     : StyleRuleBase(o)
216     , m_properties(o.m_properties->copy())
217 {
218 }
219
220 StyleRuleFontFace::~StyleRuleFontFace()
221 {
222 }
223
224 void StyleRuleFontFace::setProperties(PassRefPtr<StylePropertySet> properties)
225
226     m_properties = properties;
227 }
228
229 StyleRuleBlock::StyleRuleBlock(Type type, Vector<RefPtr<StyleRuleBase> >& adoptRule)
230     : StyleRuleBase(type, 0)
231 {
232     m_childRules.swap(adoptRule);
233 }
234
235 StyleRuleBlock::StyleRuleBlock(const StyleRuleBlock& o)
236     : StyleRuleBase(o)
237     , m_childRules(o.m_childRules.size())
238 {
239     for (unsigned i = 0; i < m_childRules.size(); ++i)
240         m_childRules[i] = o.m_childRules[i]->copy();
241 }
242
243 void StyleRuleBlock::wrapperInsertRule(unsigned index, PassRefPtr<StyleRuleBase> rule)
244 {
245     m_childRules.insert(index, rule);
246 }
247     
248 void StyleRuleBlock::wrapperRemoveRule(unsigned index)
249 {
250     m_childRules.remove(index);
251 }
252
253 StyleRuleMedia::StyleRuleMedia(PassRefPtr<MediaQuerySet> media, Vector<RefPtr<StyleRuleBase> >& adoptRules)
254     : StyleRuleBlock(Media, adoptRules)
255     , m_mediaQueries(media)
256 {
257 }
258
259 StyleRuleMedia::StyleRuleMedia(const StyleRuleMedia& o)
260     : StyleRuleBlock(o)
261     , m_mediaQueries(o.m_mediaQueries->copy())
262 {
263 }
264
265 StyleRuleRegion::StyleRuleRegion(Vector<OwnPtr<CSSParserSelector> >* selectors, Vector<RefPtr<StyleRuleBase> >& adoptRules)
266     : StyleRuleBlock(Region, adoptRules)
267 {
268     m_selectorList.adoptSelectorVector(*selectors);
269 }
270
271 StyleRuleRegion::StyleRuleRegion(const StyleRuleRegion& o)
272     : StyleRuleBlock(o)
273     , m_selectorList(o.m_selectorList)
274 {
275 }
276
277 } // namespace WebCore