2007-10-22 Eric Seidel <eric@webkit.org>
[WebKit-https.git] / WebCore / bindings / js / JSSVGElementWrapperFactory.cpp
1 /*
2  *  Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
3  *
4  *  This library is free software; you can redistribute it and/or
5  *  modify it under the terms of the GNU Lesser General Public
6  *  License as published by the Free Software Foundation; either
7  *  version 2 of the License, or (at your option) any later version.
8  *
9  *  This library is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  Lesser General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public
15  *  License along with this library; if not, write to the Free Software
16  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #include "config.h"
20
21 #if ENABLE(SVG)
22
23 #include "JSSVGElementWrapperFactory.h"
24
25 #include "JSSVGAElement.h"
26 #include "JSSVGAnimateColorElement.h"
27 #include "JSSVGAnimateElement.h"
28 #include "JSSVGAnimateTransformElement.h"
29 #include "JSSVGCircleElement.h"
30 #include "JSSVGClipPathElement.h"
31 #include "JSSVGCursorElement.h"
32 #include "JSSVGDefsElement.h"
33 #include "JSSVGDefinitionSrcElement.h"
34 #include "JSSVGDescElement.h"
35 #include "JSSVGEllipseElement.h"
36 #include "JSSVGFEBlendElement.h"
37 #include "JSSVGFEColorMatrixElement.h"
38 #include "JSSVGFEComponentTransferElement.h"
39 #include "JSSVGFECompositeElement.h"
40 #include "JSSVGFEDiffuseLightingElement.h"
41 #include "JSSVGFEDisplacementMapElement.h"
42 #include "JSSVGFEDistantLightElement.h"
43 #include "JSSVGFEFloodElement.h"
44 #include "JSSVGFEFuncAElement.h"
45 #include "JSSVGFEFuncBElement.h"
46 #include "JSSVGFEFuncGElement.h"
47 #include "JSSVGFEFuncRElement.h"
48 #include "JSSVGFEGaussianBlurElement.h"
49 #include "JSSVGFEImageElement.h"
50 #include "JSSVGFEMergeElement.h"
51 #include "JSSVGFEMergeNodeElement.h"
52 #include "JSSVGFEOffsetElement.h"
53 #include "JSSVGFEPointLightElement.h"
54 #include "JSSVGFESpecularLightingElement.h"
55 #include "JSSVGFESpotLightElement.h"
56 #include "JSSVGFETileElement.h"
57 #include "JSSVGFETurbulenceElement.h"
58 #include "JSSVGFilterElement.h"
59 #include "JSSVGForeignObjectElement.h"
60 #include "JSSVGFontFaceElement.h"
61 #include "JSSVGFontFaceFormatElement.h"
62 #include "JSSVGFontFaceNameElement.h"
63 #include "JSSVGFontFaceSrcElement.h"
64 #include "JSSVGFontFaceUriElement.h"
65 #include "JSSVGGElement.h"
66 #include "JSSVGImageElement.h"
67 #include "JSSVGLinearGradientElement.h"
68 #include "JSSVGLineElement.h"
69 #include "JSSVGMarkerElement.h"
70 #include "JSSVGMaskElement.h"
71 #include "JSSVGMetadataElement.h"
72 #include "JSSVGPathElement.h"
73 #include "JSSVGPatternElement.h"
74 #include "JSSVGPolygonElement.h"
75 #include "JSSVGPolylineElement.h"
76 #include "JSSVGRadialGradientElement.h"
77 #include "JSSVGRectElement.h"
78 #include "JSSVGScriptElement.h"
79 #include "JSSVGSetElement.h"
80 #include "JSSVGStopElement.h"
81 #include "JSSVGStyleElement.h"
82 #include "JSSVGSVGElement.h"
83 #include "JSSVGSwitchElement.h"
84 #include "JSSVGSymbolElement.h"
85 #include "JSSVGTextElement.h"
86 #include "JSSVGTextPathElement.h"
87 #include "JSSVGTitleElement.h"
88 #include "JSSVGTRefElement.h"
89 #include "JSSVGTSpanElement.h"
90 #include "JSSVGUseElement.h"
91 #include "JSSVGViewElement.h"
92
93 #include "SVGNames.h"
94
95 #include "SVGAElement.h"
96 #include "SVGAnimateColorElement.h"
97 #include "SVGAnimateElement.h"
98 #include "SVGAnimateTransformElement.h"
99 #include "SVGCircleElement.h"
100 #include "SVGClipPathElement.h"
101 #include "SVGCursorElement.h"
102 #include "SVGDefsElement.h"
103 #include "SVGDefinitionSrcElement.h"
104 #include "SVGDescElement.h"
105 #include "SVGEllipseElement.h"
106 #include "SVGFEBlendElement.h"
107 #include "SVGFEColorMatrixElement.h"
108 #include "SVGFEComponentTransferElement.h"
109 #include "SVGFECompositeElement.h"
110 #include "SVGFEDiffuseLightingElement.h"
111 #include "SVGFEDisplacementMapElement.h"
112 #include "SVGFEDistantLightElement.h"
113 #include "SVGFEFloodElement.h"
114 #include "SVGFEFuncAElement.h"
115 #include "SVGFEFuncBElement.h"
116 #include "SVGFEFuncGElement.h"
117 #include "SVGFEFuncRElement.h"
118 #include "SVGFEGaussianBlurElement.h"
119 #include "SVGFEImageElement.h"
120 #include "SVGFEMergeElement.h"
121 #include "SVGFEMergeNodeElement.h"
122 #include "SVGFEOffsetElement.h"
123 #include "SVGFEPointLightElement.h"
124 #include "SVGFESpecularLightingElement.h"
125 #include "SVGFESpotLightElement.h"
126 #include "SVGFETileElement.h"
127 #include "SVGFETurbulenceElement.h"
128 #include "SVGFilterElement.h"
129 #include "SVGForeignObjectElement.h"
130 #include "SVGFontFaceElement.h"
131 #include "SVGFontFaceFormatElement.h"
132 #include "SVGFontFaceNameElement.h"
133 #include "SVGFontFaceSrcElement.h"
134 #include "SVGFontFaceUriElement.h"
135 #include "SVGGElement.h"
136 #include "SVGImageElement.h"
137 #include "SVGLinearGradientElement.h"
138 #include "SVGLineElement.h"
139 #include "SVGMarkerElement.h"
140 #include "SVGMaskElement.h"
141 #include "SVGMetadataElement.h"
142 #include "SVGPathElement.h"
143 #include "SVGPatternElement.h"
144 #include "SVGPolygonElement.h"
145 #include "SVGPolylineElement.h"
146 #include "SVGRadialGradientElement.h"
147 #include "SVGRectElement.h"
148 #include "SVGScriptElement.h"
149 #include "SVGSetElement.h"
150 #include "SVGStopElement.h"
151 #include "SVGStyleElement.h"
152 #include "SVGSVGElement.h"
153 #include "SVGSwitchElement.h"
154 #include "SVGSymbolElement.h"
155 #include "SVGTextElement.h"
156 #include "SVGTextPathElement.h"
157 #include "SVGTitleElement.h"
158 #include "SVGTRefElement.h"
159 #include "SVGTSpanElement.h"
160 #include "SVGUseElement.h"
161 #include "SVGViewElement.h"
162
163 using namespace KJS;
164
165 // FIXME: Eventually this file should be autogenerated, just like SVGNames, SVGElementFactory, etc.
166
167 namespace WebCore {
168
169 using namespace SVGNames;
170
171 typedef JSNode* (*CreateSVGElementWrapperFunction)(ExecState*, PassRefPtr<SVGElement>);
172
173 #if ENABLE(SVG_EXPERIMENTAL_FEATURES)
174 #define FOR_EACH_TAG(macro) \
175     macro(a, A) \
176     macro(animateColor, AnimateColor) \
177     macro(animate, Animate) \
178     macro(animateTransform, AnimateTransform) \
179     macro(circle, Circle) \
180     macro(clipPath, ClipPath) \
181     macro(cursor, Cursor) \
182     macro(definition_src, DefinitionSrc) \
183     macro(defs, Defs) \
184     macro(desc, Desc) \
185     macro(ellipse, Ellipse) \
186     macro(feBlend, FEBlend) \
187     macro(feColorMatrix, FEColorMatrix) \
188     macro(feComponentTransfer, FEComponentTransfer) \
189     macro(feComposite, FEComposite) \
190     macro(feDiffuseLighting, FEDiffuseLighting) \
191     macro(feDisplacementMap, FEDisplacementMap) \
192     macro(feDistantLight, FEDistantLight) \
193     macro(feFlood, FEFlood) \
194     macro(feFuncA, FEFuncA) \
195     macro(feFuncB, FEFuncB) \
196     macro(feFuncG, FEFuncG) \
197     macro(feFuncR, FEFuncR) \
198     macro(feGaussianBlur, FEGaussianBlur) \
199     macro(feImage, FEImage) \
200     macro(feMerge, FEMerge) \
201     macro(feMergeNode, FEMergeNode) \
202     macro(feOffset, FEOffset) \
203     macro(fePointLight, FEPointLight) \
204     macro(feSpecularLighting, FESpecularLighting) \
205     macro(feSpotLight, FESpotLight) \
206     macro(feTile, FETile) \
207     macro(feTurbulence, FETurbulence) \
208     macro(font_face, FontFace) \
209     macro(font_face_format, FontFaceFormat) \
210     macro(font_face_name, FontFaceName) \
211     macro(font_face_src, FontFaceSrc) \
212     macro(font_face_uri, FontFaceUri) \
213     macro(filter, Filter) \
214     macro(foreignObject, ForeignObject) \
215     macro(g, G) \
216     macro(image, Image) \
217     macro(linearGradient, LinearGradient) \
218     macro(line, Line) \
219     macro(marker, Marker) \
220     macro(mask, Mask) \
221     macro(metadata, Metadata) \
222     macro(path, Path) \
223     macro(pattern, Pattern) \
224     macro(polyline, Polyline) \
225     macro(polygon, Polygon) \
226     macro(radialGradient, RadialGradient) \
227     macro(rect, Rect) \
228     macro(script, Script) \
229     macro(set, Set) \
230     macro(stop, Stop) \
231     macro(style, Style) \
232     macro(svg, SVG) \
233     macro(switch, Switch) \
234     macro(symbol, Symbol) \
235     macro(text, Text) \
236     macro(textPath, TextPath) \
237     macro(title, Title) \
238     macro(tref, TRef) \
239     macro(tspan, TSpan) \
240     macro(use, Use) \
241     macro(view, View) \
242     // end of macro
243
244 #else
245
246 #define FOR_EACH_TAG(macro) \
247     macro(a, A) \
248     macro(circle, Circle) \
249     macro(clipPath, ClipPath) \
250     macro(cursor, Cursor) \
251     macro(defs, Defs) \
252     macro(desc, Desc) \
253     macro(ellipse, Ellipse) \
254     macro(foreignObject, ForeignObject) \
255     macro(g, G) \
256     macro(image, Image) \
257     macro(linearGradient, LinearGradient) \
258     macro(line, Line) \
259     macro(marker, Marker) \
260     macro(mask, Mask) \
261     macro(metadata, Metadata) \
262     macro(path, Path) \
263     macro(pattern, Pattern) \
264     macro(polyline, Polyline) \
265     macro(polygon, Polygon) \
266     macro(radialGradient, RadialGradient) \
267     macro(rect, Rect) \
268     macro(script, Script) \
269     macro(set, Set) \
270     macro(stop, Stop) \
271     macro(style, Style) \
272     macro(svg, SVG) \
273     macro(switch, Switch) \
274     macro(symbol, Symbol) \
275     macro(text, Text) \
276     macro(textPath, TextPath) \
277     macro(title, Title) \
278     macro(tref, TRef) \
279     macro(tspan, TSpan) \
280     macro(use, Use) \
281     macro(view, View) \
282     // end of macro
283
284 #endif
285
286 #define CREATE_WRAPPER_FUNCTION(tag, name) \
287 static JSNode* create##name##Wrapper(ExecState* exec, PassRefPtr<SVGElement> element) \
288 { \
289     return new JSSVG##name##Element(exec, static_cast<SVG##name##Element*>(element.get())); \
290 }
291 FOR_EACH_TAG(CREATE_WRAPPER_FUNCTION)
292 #undef CREATE_WRAPPER_FUNCTION
293
294 JSNode* createJSSVGWrapper(ExecState* exec, PassRefPtr<SVGElement> element)
295 {
296     static HashMap<WebCore::AtomicStringImpl*, CreateSVGElementWrapperFunction> map;
297     if (map.isEmpty()) {
298 #define ADD_TO_HASH_MAP(tag, name) map.set(tag##Tag.localName().impl(), create##name##Wrapper);
299 FOR_EACH_TAG(ADD_TO_HASH_MAP)
300 #undef ADD_TO_HASH_MAP
301     }
302     CreateSVGElementWrapperFunction createWrapperFunction = map.get(element->localName().impl());
303     if (createWrapperFunction)
304         return createWrapperFunction(exec, element);
305     return new JSSVGElement(exec, element.get());
306 }
307
308 }
309
310 #endif // ENABLE(SVG)