Reviewed by Adele.
[WebKit-https.git] / WebCore / html / HTMLElementFactory.cpp
1 /*
2  * This file is part of the HTML DOM implementation for KDE.
3  *
4  * Copyright (C) 2005 Apple Computer, Inc.
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., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  *
21  */
22
23 #include "config.h"
24 #include "HTMLElementFactory.h"
25
26 #include "HTMLAnchorElement.h"
27 #include "HTMLAppletElement.h"
28 #include "HTMLAreaElement.h"
29 #include "HTMLBaseFontElement.h"
30 #include "HTMLBaseElement.h"
31 #include "HTMLBlockquoteElement.h"
32 #include "HTMLBodyElement.h"
33 #include "HTMLBRElement.h"
34 #include "HTMLButtonElement.h"
35 #include "HTMLCanvasElement.h"
36 #include "HTMLDivElement.h"
37 #include "HTMLDListElement.h"
38 #include "HTMLDocument.h"
39 #include "HTMLDirectoryElement.h"
40 #include "HTMLEmbedElement.h"
41 #include "HTMLFontElement.h"
42 #include "HTMLFrameSetElement.h"
43 #include "HTMLFieldSetElement.h"
44 #include "HTMLFormElement.h"
45 #include "HTMLHeadElement.h"
46 #include "HTMLHeadingElement.h"
47 #include "HTMLHRElement.h"
48 #include "HTMLHtmlElement.h"
49 #include "HTMLFrameElement.h"
50 #include "HTMLIFrameElement.h"
51 #include "HTMLImageElement.h"
52 #include "HTMLIsIndexElement.h"
53 #include "HTMLKeygenElement.h"
54 #include "HTMLLabelElement.h"
55 #include "HTMLLegendElement.h"
56 #include "HTMLLIElement.h"
57 #include "HTMLLinkElement.h"
58 #include "HTMLMapElement.h"
59 #include "HTMLMarqueeElement.h"
60 #include "HTMLMenuElement.h"
61 #include "HTMLMetaElement.h"
62 #include "HTMLModElement.h"
63 #include "HTMLNames.h"
64 #include "HTMLObjectElement.h"
65 #include "HTMLOListElement.h"
66 #include "HTMLOptGroupElement.h"
67 #include "HTMLOptionElement.h"
68 #include "HTMLParagraphElement.h"
69 #include "HTMLParamElement.h"
70 #include "HTMLPreElement.h"
71 #include "HTMLScriptElement.h"
72 #include "HTMLSelectElement.h"
73 #include "HTMLStyleElement.h"
74 #include "HTMLTextAreaElement.h"
75 #include "HTMLTableElement.h"
76 #include "HTMLTableCaptionElement.h"
77 #include "HTMLTableCellElement.h"
78 #include "HTMLTableColElement.h"
79 #include "HTMLTableRowElement.h"
80 #include "HTMLTableSectionElement.h"
81 #include "HTMLTitleElement.h"
82 #include "HTMLUListElement.h"
83 #include "HTMLQuoteElement.h"
84
85 namespace WebCore {
86
87 using namespace HTMLNames;
88
89 typedef PassRefPtr<HTMLElement> (*ConstructorFunc)(const AtomicString& tagName, Document*, HTMLFormElement*, bool createdByParser);
90 typedef HashMap<AtomicStringImpl*, ConstructorFunc> FunctionMap;
91 static FunctionMap* gFunctionMap;
92
93 static PassRefPtr<HTMLElement> htmlConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
94 {
95     return new HTMLHtmlElement(doc);
96 }
97
98 static PassRefPtr<HTMLElement> headConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
99 {
100     return new HTMLHeadElement(doc);
101 }
102
103 static PassRefPtr<HTMLElement> bodyConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
104 {
105     return new HTMLBodyElement(doc);
106 }
107
108 static PassRefPtr<HTMLElement> baseConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
109 {
110     return new HTMLBaseElement(doc);
111 }
112
113 static PassRefPtr<HTMLElement> linkConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
114 {
115     return new HTMLLinkElement(doc);
116 }
117
118 static PassRefPtr<HTMLElement> metaConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
119 {
120     return new HTMLMetaElement(doc);
121 }
122
123 static PassRefPtr<HTMLElement> styleConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
124 {
125     return new HTMLStyleElement(doc);
126 }
127
128 static PassRefPtr<HTMLElement> titleConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
129 {
130     return new HTMLTitleElement(doc);
131 }
132
133 static PassRefPtr<HTMLElement> frameConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
134 {
135     return new HTMLFrameElement(doc);
136 }
137
138 static PassRefPtr<HTMLElement> framesetConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
139 {
140     return new HTMLFrameSetElement(doc);
141 }
142
143 static PassRefPtr<HTMLElement> iframeConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
144 {
145     return new HTMLIFrameElement(doc);
146 }
147
148 static PassRefPtr<HTMLElement> formConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
149 {
150     return new HTMLFormElement(doc);
151 }
152
153 static PassRefPtr<HTMLElement> buttonConstructor(const AtomicString&, Document* doc, HTMLFormElement* form, bool)
154 {
155     return new HTMLButtonElement(doc, form);
156 }
157
158 static PassRefPtr<HTMLElement> inputConstructor(const AtomicString&, Document* doc, HTMLFormElement* form, bool)
159 {
160     return new HTMLInputElement(doc, form);
161 }
162
163 static PassRefPtr<HTMLElement> isindexConstructor(const AtomicString&, Document* doc, HTMLFormElement* form, bool)
164 {
165     return new HTMLIsIndexElement(doc, form);
166 }
167
168 static PassRefPtr<HTMLElement> fieldsetConstructor(const AtomicString&, Document* doc, HTMLFormElement* form, bool)
169 {
170     return new HTMLFieldSetElement(doc, form);
171 }
172
173 static PassRefPtr<HTMLElement> keygenConstructor(const AtomicString&, Document* doc, HTMLFormElement* form, bool)
174 {
175     return new HTMLKeygenElement(doc, form);
176 }
177
178 static PassRefPtr<HTMLElement> labelConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
179 {
180     return new HTMLLabelElement(doc);
181 }
182
183 static PassRefPtr<HTMLElement> legendConstructor(const AtomicString&, Document* doc, HTMLFormElement* form, bool)
184 {
185     return new HTMLLegendElement(doc, form);
186 }
187
188 static PassRefPtr<HTMLElement> optgroupConstructor(const AtomicString&, Document* doc, HTMLFormElement* form, bool)
189 {
190     return new HTMLOptGroupElement(doc, form);
191 }
192
193 static PassRefPtr<HTMLElement> optionConstructor(const AtomicString&, Document* doc, HTMLFormElement* form, bool)
194 {
195     return new HTMLOptionElement(doc, form);
196 }
197
198 static PassRefPtr<HTMLElement> selectConstructor(const AtomicString&, Document* doc, HTMLFormElement* form, bool)
199 {
200     return new HTMLSelectElement(doc, form);
201 }
202
203 static PassRefPtr<HTMLElement> textareaConstructor(const AtomicString&, Document* doc, HTMLFormElement* form, bool)
204 {
205     return new HTMLTextAreaElement(doc, form);
206 }
207
208 static PassRefPtr<HTMLElement> dlConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
209 {
210     return new HTMLDListElement(doc);
211 }
212
213 static PassRefPtr<HTMLElement> ulConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
214 {
215     return new HTMLUListElement(doc);
216 }
217
218 static PassRefPtr<HTMLElement> olConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
219 {
220     return new HTMLOListElement(doc);
221 }
222
223 static PassRefPtr<HTMLElement> dirConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
224 {
225     return new HTMLDirectoryElement(doc);
226 }
227
228 static PassRefPtr<HTMLElement> menuConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
229 {
230     return new HTMLMenuElement(doc);
231 }
232
233 static PassRefPtr<HTMLElement> liConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
234 {
235     return new HTMLLIElement(doc);
236 }
237
238 static PassRefPtr<HTMLElement> blockquoteConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
239 {
240     return new HTMLBlockquoteElement(doc);
241 }
242
243 static PassRefPtr<HTMLElement> divConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
244 {
245     return new HTMLDivElement(doc);
246 }
247
248 static PassRefPtr<HTMLElement> headingConstructor(const AtomicString& tagName, Document* doc, HTMLFormElement*, bool)
249 {
250     return new HTMLHeadingElement(QualifiedName(nullAtom, tagName, xhtmlNamespaceURI), doc);
251 }
252
253 static PassRefPtr<HTMLElement> hrConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
254 {
255     return new HTMLHRElement(doc);
256 }
257
258 static PassRefPtr<HTMLElement> paragraphConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
259 {
260     return new HTMLParagraphElement(doc);
261 }
262
263 static PassRefPtr<HTMLElement> preConstructor(const AtomicString& tagName, Document* doc, HTMLFormElement*, bool)
264 {
265     return new HTMLPreElement(QualifiedName(nullAtom, tagName, xhtmlNamespaceURI), doc);
266 }
267
268 static PassRefPtr<HTMLElement> basefontConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
269 {
270     return new HTMLBaseFontElement(doc);
271 }
272
273 static PassRefPtr<HTMLElement> fontConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
274 {
275     return new HTMLFontElement(doc);
276 }
277
278 static PassRefPtr<HTMLElement> modConstructor(const AtomicString& tagName, Document* doc, HTMLFormElement*, bool)
279 {
280     return new HTMLModElement(QualifiedName(nullAtom, tagName, xhtmlNamespaceURI), doc);
281 }
282
283 static PassRefPtr<HTMLElement> anchorConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
284 {
285     return new HTMLAnchorElement(doc);
286 }
287
288 static PassRefPtr<HTMLElement> imageConstructor(const AtomicString&, Document* doc, HTMLFormElement* form, bool)
289 {
290     return new HTMLImageElement(doc, form);
291 }
292
293 static PassRefPtr<HTMLElement> mapConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
294 {
295     return new HTMLMapElement(doc);
296 }
297
298 static PassRefPtr<HTMLElement> areaConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
299 {
300     return new HTMLAreaElement(doc);
301 }
302
303 static PassRefPtr<HTMLElement> canvasConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
304 {
305     return new HTMLCanvasElement(doc);
306 }
307
308 static PassRefPtr<HTMLElement> appletConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
309 {
310     return new HTMLAppletElement(doc);
311 }
312
313 static PassRefPtr<HTMLElement> embedConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
314 {
315     return new HTMLEmbedElement(doc);
316 }
317
318 static PassRefPtr<HTMLElement> objectConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool createdByParser)
319 {
320     RefPtr<HTMLObjectElement> object = new HTMLObjectElement(doc);
321     object->setComplete(!createdByParser);
322     return object.release();
323 }
324
325 static PassRefPtr<HTMLElement> paramConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
326 {
327     return new HTMLParamElement(doc);
328 }
329
330 static PassRefPtr<HTMLElement> scriptConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool createdByParser)
331 {
332     RefPtr<HTMLScriptElement> script = new HTMLScriptElement(doc);
333     script->setCreatedByParser(createdByParser);
334     return script.release();
335 }
336
337 static PassRefPtr<HTMLElement> tableConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
338 {
339     return new HTMLTableElement(doc);
340 }
341
342 static PassRefPtr<HTMLElement> tableCaptionConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
343 {
344     return new HTMLTableCaptionElement(doc);
345 }
346
347 static PassRefPtr<HTMLElement> tableColConstructor(const AtomicString& tagName, Document* doc, HTMLFormElement*, bool)
348 {
349     return new HTMLTableColElement(QualifiedName(nullAtom, tagName, xhtmlNamespaceURI), doc);
350 }
351
352 static PassRefPtr<HTMLElement> tableRowConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
353 {
354     return new HTMLTableRowElement(doc);
355 }
356
357 static PassRefPtr<HTMLElement> tableCellConstructor(const AtomicString& tagName, Document* doc, HTMLFormElement*, bool)
358 {
359     return new HTMLTableCellElement(QualifiedName(nullAtom, tagName, xhtmlNamespaceURI), doc);
360 }
361
362 static PassRefPtr<HTMLElement> tableSectionConstructor(const AtomicString& tagName, Document* doc, HTMLFormElement*, bool)
363 {
364     return new HTMLTableSectionElement(QualifiedName(nullAtom, tagName, xhtmlNamespaceURI), doc, false);
365 }
366
367 static PassRefPtr<HTMLElement> brConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
368 {
369     return new HTMLBRElement(doc);
370 }
371
372 static PassRefPtr<HTMLElement> quoteConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
373 {
374     return new HTMLQuoteElement(doc);
375 }
376
377 static PassRefPtr<HTMLElement> marqueeConstructor(const AtomicString&, Document* doc, HTMLFormElement*, bool)
378 {
379     return new HTMLMarqueeElement(doc);
380 }
381
382 static void addTag(const QualifiedName& tag, ConstructorFunc func)
383 {
384     gFunctionMap->set(tag.localName().impl(), func);
385 }
386
387 static void createFunctionMap()
388 {
389     // Create the table.
390     gFunctionMap = new FunctionMap;
391     
392     // Populate it with constructor functions.
393     addTag(aTag, anchorConstructor);
394     addTag(appletTag, appletConstructor);
395     addTag(areaTag, areaConstructor);
396     addTag(baseTag, baseConstructor);
397     addTag(basefontTag, basefontConstructor);
398     addTag(blockquoteTag, blockquoteConstructor);
399     addTag(bodyTag, bodyConstructor);
400     addTag(brTag, brConstructor);
401     addTag(buttonTag, buttonConstructor);
402     addTag(canvasTag, canvasConstructor);
403     addTag(captionTag, tableCaptionConstructor);
404     addTag(colTag, tableColConstructor);
405     addTag(colgroupTag, tableColConstructor);
406     addTag(delTag, modConstructor);
407     addTag(dirTag, dirConstructor);
408     addTag(divTag, divConstructor);
409     addTag(dlTag, dlConstructor);
410     addTag(embedTag, embedConstructor);
411     addTag(fieldsetTag, fieldsetConstructor);
412     addTag(fontTag, fontConstructor);
413     addTag(formTag, formConstructor);
414     addTag(frameTag, frameConstructor);
415     addTag(framesetTag, framesetConstructor);
416     addTag(h1Tag, headingConstructor);
417     addTag(h2Tag, headingConstructor);
418     addTag(h3Tag, headingConstructor);
419     addTag(h4Tag, headingConstructor);
420     addTag(h5Tag, headingConstructor);
421     addTag(h6Tag, headingConstructor);
422     addTag(headTag, headConstructor);
423     addTag(hrTag, hrConstructor);
424     addTag(htmlTag, htmlConstructor);
425     addTag(iframeTag, iframeConstructor);
426     addTag(imageTag, imageConstructor);
427     addTag(imgTag, imageConstructor);
428     addTag(inputTag, inputConstructor);
429     addTag(insTag, modConstructor);
430     addTag(isindexTag, isindexConstructor);
431     addTag(keygenTag, keygenConstructor);
432     addTag(labelTag, labelConstructor);
433     addTag(legendTag, legendConstructor);
434     addTag(liTag, liConstructor);
435     addTag(linkTag, linkConstructor);
436     addTag(listingTag, preConstructor);
437     addTag(mapTag, mapConstructor);
438     addTag(marqueeTag, marqueeConstructor);
439     addTag(menuTag, menuConstructor);
440     addTag(metaTag, metaConstructor);
441     addTag(objectTag, objectConstructor);
442     addTag(olTag, olConstructor);
443     addTag(optgroupTag, optgroupConstructor);
444     addTag(optionTag, optionConstructor);
445     addTag(pTag, paragraphConstructor);
446     addTag(paramTag, paramConstructor);
447     addTag(preTag, preConstructor);
448     addTag(qTag, quoteConstructor);
449     addTag(scriptTag, scriptConstructor);
450     addTag(selectTag, selectConstructor);
451     addTag(styleTag, styleConstructor);
452     addTag(tableTag, tableConstructor);
453     addTag(tbodyTag, tableSectionConstructor);
454     addTag(tdTag, tableCellConstructor);
455     addTag(textareaTag, textareaConstructor);
456     addTag(tfootTag, tableSectionConstructor);
457     addTag(thTag, tableCellConstructor);
458     addTag(theadTag, tableSectionConstructor);
459     addTag(titleTag, titleConstructor);
460     addTag(trTag, tableRowConstructor);
461     addTag(ulTag, ulConstructor);
462     addTag(xmpTag, preConstructor);
463 }
464
465 PassRefPtr<HTMLElement> HTMLElementFactory::createHTMLElement(const AtomicString& tagName, Document* doc, HTMLFormElement* form, bool createdByParser)
466 {
467     if (!doc)
468         return 0; // Don't allow elements to ever be made without having a doc.
469
470     if (!gFunctionMap)
471         createFunctionMap();
472     
473     ConstructorFunc func = gFunctionMap->get(tagName.impl());
474     if (func)
475         return func(tagName, doc, form, createdByParser);
476  
477     // elements with no special representation in the DOM
478     return new HTMLElement(QualifiedName(nullAtom, tagName, xhtmlNamespaceURI), doc);
479 }
480
481 }
482