blob: c7fee2869fa9227eed4965d39d7cfa57bc38f209 [file] [log] [blame]
darinb9481ed2006-03-20 02:57:59 +00001/*
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
ddkilzerc8eccec2007-09-26 02:29:57 +000018 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
darinb9481ed2006-03-20 02:57:59 +000020 *
21 */
22
23#include "config.h"
24#include "HTMLElementFactory.h"
25
eseidel84943622006-05-15 23:23:42 +000026#include "HTMLAnchorElement.h"
eseideld2f36a12006-05-12 18:14:17 +000027#include "HTMLAppletElement.h"
eseidel84943622006-05-15 23:23:42 +000028#include "HTMLAreaElement.h"
antti76787a82007-10-31 01:03:35 +000029#include "HTMLAudioElement.h"
darin@apple.com46dbd852007-12-07 18:44:05 +000030#include "HTMLBRElement.h"
eseidel1bdb6f52006-05-12 20:44:25 +000031#include "HTMLBaseElement.h"
darin@apple.com46dbd852007-12-07 18:44:05 +000032#include "HTMLBaseFontElement.h"
eseidela781b6a2006-05-15 21:57:01 +000033#include "HTMLBlockquoteElement.h"
eseidel409f4302006-05-12 22:56:41 +000034#include "HTMLBodyElement.h"
darinfa25c302006-03-21 23:52:24 +000035#include "HTMLButtonElement.h"
darinb9481ed2006-03-20 02:57:59 +000036#include "HTMLCanvasElement.h"
eseidele34973b2006-05-15 21:16:29 +000037#include "HTMLDListElement.h"
eseidele34973b2006-05-15 21:16:29 +000038#include "HTMLDirectoryElement.h"
darin@apple.com46dbd852007-12-07 18:44:05 +000039#include "HTMLDivElement.h"
40#include "HTMLDocument.h"
eseideld2f36a12006-05-12 18:14:17 +000041#include "HTMLEmbedElement.h"
darinfa25c302006-03-21 23:52:24 +000042#include "HTMLFieldSetElement.h"
darin@apple.com46dbd852007-12-07 18:44:05 +000043#include "HTMLFontElement.h"
darinb9481ed2006-03-20 02:57:59 +000044#include "HTMLFormElement.h"
darin@apple.com46dbd852007-12-07 18:44:05 +000045#include "HTMLFrameElement.h"
46#include "HTMLFrameSetElement.h"
47#include "HTMLHRElement.h"
eseidel409f4302006-05-12 22:56:41 +000048#include "HTMLHeadElement.h"
eseidela781b6a2006-05-15 21:57:01 +000049#include "HTMLHeadingElement.h"
eseidel409f4302006-05-12 22:56:41 +000050#include "HTMLHtmlElement.h"
eseidel409f4302006-05-12 22:56:41 +000051#include "HTMLIFrameElement.h"
eseidel84943622006-05-15 23:23:42 +000052#include "HTMLImageElement.h"
darinb9481ed2006-03-20 02:57:59 +000053#include "HTMLIsIndexElement.h"
kdeckerb42fb662007-03-06 22:38:17 +000054#include "HTMLKeygenElement.h"
darin@apple.com46dbd852007-12-07 18:44:05 +000055#include "HTMLLIElement.h"
darinb9481ed2006-03-20 02:57:59 +000056#include "HTMLLabelElement.h"
57#include "HTMLLegendElement.h"
eseidel1bdb6f52006-05-12 20:44:25 +000058#include "HTMLLinkElement.h"
eseidel84943622006-05-15 23:23:42 +000059#include "HTMLMapElement.h"
eseidela781b6a2006-05-15 21:57:01 +000060#include "HTMLMarqueeElement.h"
eseidele34973b2006-05-15 21:16:29 +000061#include "HTMLMenuElement.h"
eseidel1bdb6f52006-05-12 20:44:25 +000062#include "HTMLMetaElement.h"
eseidel62bd68c2006-05-13 01:36:36 +000063#include "HTMLModElement.h"
eseidele34973b2006-05-15 21:16:29 +000064#include "HTMLNames.h"
eseidele34973b2006-05-15 21:16:29 +000065#include "HTMLOListElement.h"
darin@apple.com46dbd852007-12-07 18:44:05 +000066#include "HTMLObjectElement.h"
darinb9481ed2006-03-20 02:57:59 +000067#include "HTMLOptGroupElement.h"
darinfa25c302006-03-21 23:52:24 +000068#include "HTMLOptionElement.h"
eseidela781b6a2006-05-15 21:57:01 +000069#include "HTMLParagraphElement.h"
eseideld2f36a12006-05-12 18:14:17 +000070#include "HTMLParamElement.h"
eseidela781b6a2006-05-15 21:57:01 +000071#include "HTMLPreElement.h"
darin@apple.com46dbd852007-12-07 18:44:05 +000072#include "HTMLQuoteElement.h"
eseidel1bdb6f52006-05-12 20:44:25 +000073#include "HTMLScriptElement.h"
darinb9481ed2006-03-20 02:57:59 +000074#include "HTMLSelectElement.h"
antti76787a82007-10-31 01:03:35 +000075#include "HTMLSourceElement.h"
eseidel1bdb6f52006-05-12 20:44:25 +000076#include "HTMLStyleElement.h"
eseidel1bdb6f52006-05-12 20:44:25 +000077#include "HTMLTableCaptionElement.h"
78#include "HTMLTableCellElement.h"
79#include "HTMLTableColElement.h"
darin@apple.com46dbd852007-12-07 18:44:05 +000080#include "HTMLTableElement.h"
eseidel1bdb6f52006-05-12 20:44:25 +000081#include "HTMLTableRowElement.h"
82#include "HTMLTableSectionElement.h"
darin@apple.com46dbd852007-12-07 18:44:05 +000083#include "HTMLTextAreaElement.h"
eseidel1bdb6f52006-05-12 20:44:25 +000084#include "HTMLTitleElement.h"
eseidele34973b2006-05-15 21:16:29 +000085#include "HTMLUListElement.h"
darin@apple.com46dbd852007-12-07 18:44:05 +000086#include "HTMLVideoElement.h"
darinb9481ed2006-03-20 02:57:59 +000087
darinfa25c302006-03-21 23:52:24 +000088namespace WebCore {
darinb9481ed2006-03-20 02:57:59 +000089
90using namespace HTMLNames;
91
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +000092typedef PassRefPtr<HTMLElement> (*ConstructorFunc)(const QualifiedName& tagName, Document*, HTMLFormElement*, bool createdByParser);
darinb9481ed2006-03-20 02:57:59 +000093typedef HashMap<AtomicStringImpl*, ConstructorFunc> FunctionMap;
94static FunctionMap* gFunctionMap;
95
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +000096static PassRefPtr<HTMLElement> htmlConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +000097{
jchaffraix@webkit.orgd7f08592008-11-26 00:33:56 +000098 return new HTMLHtmlElement(htmlTag, doc);
darinb9481ed2006-03-20 02:57:59 +000099}
100
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000101static PassRefPtr<HTMLElement> headConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000102{
jchaffraix@webkit.orgd7f08592008-11-26 00:33:56 +0000103 return new HTMLHeadElement(headTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000104}
105
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000106static PassRefPtr<HTMLElement> bodyConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000107{
jchaffraix@webkit.orgd7f08592008-11-26 00:33:56 +0000108 return new HTMLBodyElement(bodyTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000109}
110
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000111static PassRefPtr<HTMLElement> baseConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000112{
jchaffraix@webkit.orgd7f08592008-11-26 00:33:56 +0000113 return new HTMLBaseElement(baseTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000114}
115
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000116static PassRefPtr<HTMLElement> linkConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool createdByParser)
darinb9481ed2006-03-20 02:57:59 +0000117{
jchaffraix@webkit.orgade1c042008-12-10 19:18:58 +0000118 return new HTMLLinkElement(linkTag, doc, createdByParser);
darinb9481ed2006-03-20 02:57:59 +0000119}
120
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000121static PassRefPtr<HTMLElement> metaConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000122{
jchaffraix@webkit.orgd7f08592008-11-26 00:33:56 +0000123 return new HTMLMetaElement(metaTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000124}
125
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000126static PassRefPtr<HTMLElement> styleConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool createdByParser)
darinb9481ed2006-03-20 02:57:59 +0000127{
jchaffraix@webkit.orgade1c042008-12-10 19:18:58 +0000128 return new HTMLStyleElement(styleTag, doc, createdByParser);
darinb9481ed2006-03-20 02:57:59 +0000129}
130
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000131static PassRefPtr<HTMLElement> titleConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000132{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000133 return new HTMLTitleElement(titleTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000134}
135
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000136static PassRefPtr<HTMLElement> frameConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool createdByParser)
darinb9481ed2006-03-20 02:57:59 +0000137{
jchaffraix@webkit.org321ee182008-12-14 11:46:36 +0000138 return new HTMLFrameElement(frameTag, doc, createdByParser);
darinb9481ed2006-03-20 02:57:59 +0000139}
140
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000141static PassRefPtr<HTMLElement> framesetConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000142{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000143 return new HTMLFrameSetElement(framesetTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000144}
145
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000146static PassRefPtr<HTMLElement> iframeConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool createdByParser)
darinb9481ed2006-03-20 02:57:59 +0000147{
jchaffraix@webkit.org321ee182008-12-14 11:46:36 +0000148 return new HTMLIFrameElement(iframeTag, doc, createdByParser);
darinb9481ed2006-03-20 02:57:59 +0000149}
150
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000151static PassRefPtr<HTMLElement> formConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000152{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000153 return new HTMLFormElement(formTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000154}
155
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000156static PassRefPtr<HTMLElement> buttonConstructor(const QualifiedName&, Document* doc, HTMLFormElement* form, bool)
darinb9481ed2006-03-20 02:57:59 +0000157{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000158 return new HTMLButtonElement(buttonTag, doc, form);
darinb9481ed2006-03-20 02:57:59 +0000159}
160
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000161static PassRefPtr<HTMLElement> inputConstructor(const QualifiedName&, Document* doc, HTMLFormElement* form, bool)
darinb9481ed2006-03-20 02:57:59 +0000162{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000163 return new HTMLInputElement(inputTag, doc, form);
darinb9481ed2006-03-20 02:57:59 +0000164}
165
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000166static PassRefPtr<HTMLElement> isindexConstructor(const QualifiedName&, Document* doc, HTMLFormElement* form, bool)
darinb9481ed2006-03-20 02:57:59 +0000167{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000168 return new HTMLIsIndexElement(isindexTag, doc, form);
darinb9481ed2006-03-20 02:57:59 +0000169}
170
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000171static PassRefPtr<HTMLElement> fieldsetConstructor(const QualifiedName&, Document* doc, HTMLFormElement* form, bool)
darinb9481ed2006-03-20 02:57:59 +0000172{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000173 return new HTMLFieldSetElement(fieldsetTag, doc, form);
darinb9481ed2006-03-20 02:57:59 +0000174}
175
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000176static PassRefPtr<HTMLElement> keygenConstructor(const QualifiedName&, Document* doc, HTMLFormElement* form, bool)
kdeckerb42fb662007-03-06 22:38:17 +0000177{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000178 return new HTMLKeygenElement(keygenTag, doc, form);
kdeckerb42fb662007-03-06 22:38:17 +0000179}
180
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000181static PassRefPtr<HTMLElement> labelConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000182{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000183 return new HTMLLabelElement(labelTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000184}
185
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000186static PassRefPtr<HTMLElement> legendConstructor(const QualifiedName&, Document* doc, HTMLFormElement* form, bool)
darinb9481ed2006-03-20 02:57:59 +0000187{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000188 return new HTMLLegendElement(legendTag, doc, form);
darinb9481ed2006-03-20 02:57:59 +0000189}
190
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000191static PassRefPtr<HTMLElement> optgroupConstructor(const QualifiedName&, Document* doc, HTMLFormElement* form, bool)
darinb9481ed2006-03-20 02:57:59 +0000192{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000193 return new HTMLOptGroupElement(optgroupTag, doc, form);
darinb9481ed2006-03-20 02:57:59 +0000194}
195
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000196static PassRefPtr<HTMLElement> optionConstructor(const QualifiedName&, Document* doc, HTMLFormElement* form, bool)
darinb9481ed2006-03-20 02:57:59 +0000197{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000198 return new HTMLOptionElement(optionTag, doc, form);
darinb9481ed2006-03-20 02:57:59 +0000199}
200
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000201static PassRefPtr<HTMLElement> selectConstructor(const QualifiedName&, Document* doc, HTMLFormElement* form, bool)
darinb9481ed2006-03-20 02:57:59 +0000202{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000203 return new HTMLSelectElement(selectTag, doc, form);
darinb9481ed2006-03-20 02:57:59 +0000204}
205
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000206static PassRefPtr<HTMLElement> textareaConstructor(const QualifiedName&, Document* doc, HTMLFormElement* form, bool)
darinb9481ed2006-03-20 02:57:59 +0000207{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000208 return new HTMLTextAreaElement(textareaTag, doc, form);
darinb9481ed2006-03-20 02:57:59 +0000209}
210
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000211static PassRefPtr<HTMLElement> dlConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000212{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000213 return new HTMLDListElement(dlTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000214}
215
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000216static PassRefPtr<HTMLElement> ulConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000217{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000218 return new HTMLUListElement(ulTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000219}
220
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000221static PassRefPtr<HTMLElement> olConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000222{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000223 return new HTMLOListElement(olTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000224}
225
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000226static PassRefPtr<HTMLElement> dirConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000227{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000228 return new HTMLDirectoryElement(dirTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000229}
230
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000231static PassRefPtr<HTMLElement> menuConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000232{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000233 return new HTMLMenuElement(menuTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000234}
235
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000236static PassRefPtr<HTMLElement> liConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000237{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000238 return new HTMLLIElement(liTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000239}
240
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000241static PassRefPtr<HTMLElement> blockquoteConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000242{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000243 return new HTMLBlockquoteElement(blockquoteTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000244}
245
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000246static PassRefPtr<HTMLElement> divConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000247{
jchaffraix@webkit.org6a27e012008-11-26 23:07:45 +0000248 return new HTMLDivElement(divTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000249}
250
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000251static PassRefPtr<HTMLElement> headingConstructor(const QualifiedName& tagName, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000252{
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000253 return new HTMLHeadingElement(tagName, doc);
darinb9481ed2006-03-20 02:57:59 +0000254}
255
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000256static PassRefPtr<HTMLElement> hrConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000257{
jchaffraix@webkit.org94d95b02008-12-04 22:39:05 +0000258 return new HTMLHRElement(hrTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000259}
260
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000261static PassRefPtr<HTMLElement> paragraphConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000262{
jchaffraix@webkit.org94d95b02008-12-04 22:39:05 +0000263 return new HTMLParagraphElement(pTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000264}
265
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000266static PassRefPtr<HTMLElement> preConstructor(const QualifiedName& tagName, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000267{
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000268 return new HTMLPreElement(tagName, doc);
darinb9481ed2006-03-20 02:57:59 +0000269}
270
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000271static PassRefPtr<HTMLElement> basefontConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000272{
jchaffraix@webkit.org94d95b02008-12-04 22:39:05 +0000273 return new HTMLBaseFontElement(basefontTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000274}
275
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000276static PassRefPtr<HTMLElement> fontConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000277{
jchaffraix@webkit.org94d95b02008-12-04 22:39:05 +0000278 return new HTMLFontElement(fontTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000279}
280
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000281static PassRefPtr<HTMLElement> modConstructor(const QualifiedName& tagName, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000282{
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000283 return new HTMLModElement(tagName, doc);
darinb9481ed2006-03-20 02:57:59 +0000284}
285
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000286static PassRefPtr<HTMLElement> anchorConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000287{
jchaffraix@webkit.org94d95b02008-12-04 22:39:05 +0000288 return new HTMLAnchorElement(aTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000289}
290
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000291static PassRefPtr<HTMLElement> imageConstructor(const QualifiedName&, Document* doc, HTMLFormElement* form, bool)
darinb9481ed2006-03-20 02:57:59 +0000292{
jchaffraix@webkit.org94d95b02008-12-04 22:39:05 +0000293 return new HTMLImageElement(imgTag, doc, form);
darinb9481ed2006-03-20 02:57:59 +0000294}
295
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000296static PassRefPtr<HTMLElement> mapConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000297{
jchaffraix@webkit.org94d95b02008-12-04 22:39:05 +0000298 return new HTMLMapElement(mapTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000299}
300
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000301static PassRefPtr<HTMLElement> areaConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000302{
jchaffraix@webkit.org94d95b02008-12-04 22:39:05 +0000303 return new HTMLAreaElement(areaTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000304}
305
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000306static PassRefPtr<HTMLElement> canvasConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000307{
jchaffraix@webkit.org94d95b02008-12-04 22:39:05 +0000308 return new HTMLCanvasElement(canvasTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000309}
310
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000311static PassRefPtr<HTMLElement> appletConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000312{
jchaffraix@webkit.org94d95b02008-12-04 22:39:05 +0000313 return new HTMLAppletElement(appletTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000314}
315
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000316static PassRefPtr<HTMLElement> embedConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000317{
jchaffraix@webkit.org94d95b02008-12-04 22:39:05 +0000318 return new HTMLEmbedElement(embedTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000319}
320
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000321static PassRefPtr<HTMLElement> objectConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool createdByParser)
darinb9481ed2006-03-20 02:57:59 +0000322{
jchaffraix@webkit.org321ee182008-12-14 11:46:36 +0000323 return new HTMLObjectElement(objectTag, doc, createdByParser);
darinb9481ed2006-03-20 02:57:59 +0000324}
325
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000326static PassRefPtr<HTMLElement> paramConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000327{
jchaffraix@webkit.org94d95b02008-12-04 22:39:05 +0000328 return new HTMLParamElement(paramTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000329}
330
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000331static PassRefPtr<HTMLElement> scriptConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool createdByParser)
darinb9481ed2006-03-20 02:57:59 +0000332{
jchaffraix@webkit.org4cc683b2008-12-09 00:06:41 +0000333 return new HTMLScriptElement(scriptTag, doc, createdByParser);
darinb9481ed2006-03-20 02:57:59 +0000334}
335
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000336static PassRefPtr<HTMLElement> tableConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000337{
jchaffraix@webkit.org94d95b02008-12-04 22:39:05 +0000338 return new HTMLTableElement(tableTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000339}
340
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000341static PassRefPtr<HTMLElement> tableCaptionConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000342{
jchaffraix@webkit.org94d95b02008-12-04 22:39:05 +0000343 return new HTMLTableCaptionElement(captionTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000344}
345
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000346static PassRefPtr<HTMLElement> tableColConstructor(const QualifiedName& tagName, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000347{
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000348 return new HTMLTableColElement(tagName, doc);
darinb9481ed2006-03-20 02:57:59 +0000349}
350
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000351static PassRefPtr<HTMLElement> tableRowConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000352{
jchaffraix@webkit.org94d95b02008-12-04 22:39:05 +0000353 return new HTMLTableRowElement(trTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000354}
355
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000356static PassRefPtr<HTMLElement> tableCellConstructor(const QualifiedName& tagName, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000357{
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000358 return new HTMLTableCellElement(tagName, doc);
darinb9481ed2006-03-20 02:57:59 +0000359}
360
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000361static PassRefPtr<HTMLElement> tableSectionConstructor(const QualifiedName& tagName, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000362{
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000363 return new HTMLTableSectionElement(tagName, doc);
darinb9481ed2006-03-20 02:57:59 +0000364}
365
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000366static PassRefPtr<HTMLElement> brConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000367{
jchaffraix@webkit.org0e8f0492008-12-02 00:10:33 +0000368 return new HTMLBRElement(brTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000369}
370
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000371static PassRefPtr<HTMLElement> quoteConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000372{
jchaffraix@webkit.org0e8f0492008-12-02 00:10:33 +0000373 return new HTMLQuoteElement(qTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000374}
375
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000376static PassRefPtr<HTMLElement> marqueeConstructor(const QualifiedName&, Document* doc, HTMLFormElement*, bool)
darinb9481ed2006-03-20 02:57:59 +0000377{
jchaffraix@webkit.org0e8f0492008-12-02 00:10:33 +0000378 return new HTMLMarqueeElement(marqueeTag, doc);
darinb9481ed2006-03-20 02:57:59 +0000379}
380
antti76787a82007-10-31 01:03:35 +0000381#if ENABLE(VIDEO)
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000382static PassRefPtr<HTMLElement> audioConstructor(const QualifiedName& tagName, Document* doc, HTMLFormElement*, bool)
antti76787a82007-10-31 01:03:35 +0000383{
antti@apple.coma7f9c3d2008-01-04 21:44:52 +0000384 if (!MediaPlayer::isAvailable())
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000385 return new HTMLElement(tagName, doc);
jchaffraix@webkit.org0e8f0492008-12-02 00:10:33 +0000386 return new HTMLAudioElement(audioTag, doc);
antti76787a82007-10-31 01:03:35 +0000387}
388
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000389static PassRefPtr<HTMLElement> videoConstructor(const QualifiedName& tagName, Document* doc, HTMLFormElement*, bool)
antti76787a82007-10-31 01:03:35 +0000390{
antti@apple.coma7f9c3d2008-01-04 21:44:52 +0000391 if (!MediaPlayer::isAvailable())
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000392 return new HTMLElement(tagName, doc);
jchaffraix@webkit.org0e8f0492008-12-02 00:10:33 +0000393 return new HTMLVideoElement(videoTag, doc);
antti76787a82007-10-31 01:03:35 +0000394}
395
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000396static PassRefPtr<HTMLElement> sourceConstructor(const QualifiedName& tagName, Document* doc, HTMLFormElement*, bool)
antti76787a82007-10-31 01:03:35 +0000397{
antti@apple.coma7f9c3d2008-01-04 21:44:52 +0000398 if (!MediaPlayer::isAvailable())
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000399 return new HTMLElement(tagName, doc);
jchaffraix@webkit.org0e8f0492008-12-02 00:10:33 +0000400 return new HTMLSourceElement(sourceTag, doc);
antti76787a82007-10-31 01:03:35 +0000401}
402#endif
403
darinfa25c302006-03-21 23:52:24 +0000404static void addTag(const QualifiedName& tag, ConstructorFunc func)
405{
406 gFunctionMap->set(tag.localName().impl(), func);
407}
408
409static void createFunctionMap()
410{
411 // Create the table.
412 gFunctionMap = new FunctionMap;
413
414 // Populate it with constructor functions.
415 addTag(aTag, anchorConstructor);
416 addTag(appletTag, appletConstructor);
417 addTag(areaTag, areaConstructor);
418 addTag(baseTag, baseConstructor);
419 addTag(basefontTag, basefontConstructor);
420 addTag(blockquoteTag, blockquoteConstructor);
421 addTag(bodyTag, bodyConstructor);
422 addTag(brTag, brConstructor);
423 addTag(buttonTag, buttonConstructor);
424 addTag(canvasTag, canvasConstructor);
425 addTag(captionTag, tableCaptionConstructor);
426 addTag(colTag, tableColConstructor);
427 addTag(colgroupTag, tableColConstructor);
428 addTag(delTag, modConstructor);
429 addTag(dirTag, dirConstructor);
430 addTag(divTag, divConstructor);
431 addTag(dlTag, dlConstructor);
432 addTag(embedTag, embedConstructor);
433 addTag(fieldsetTag, fieldsetConstructor);
434 addTag(fontTag, fontConstructor);
435 addTag(formTag, formConstructor);
436 addTag(frameTag, frameConstructor);
437 addTag(framesetTag, framesetConstructor);
438 addTag(h1Tag, headingConstructor);
439 addTag(h2Tag, headingConstructor);
440 addTag(h3Tag, headingConstructor);
441 addTag(h4Tag, headingConstructor);
442 addTag(h5Tag, headingConstructor);
443 addTag(h6Tag, headingConstructor);
444 addTag(headTag, headConstructor);
445 addTag(hrTag, hrConstructor);
446 addTag(htmlTag, htmlConstructor);
447 addTag(iframeTag, iframeConstructor);
448 addTag(imageTag, imageConstructor);
449 addTag(imgTag, imageConstructor);
450 addTag(inputTag, inputConstructor);
451 addTag(insTag, modConstructor);
452 addTag(isindexTag, isindexConstructor);
kdeckerb42fb662007-03-06 22:38:17 +0000453 addTag(keygenTag, keygenConstructor);
darinfa25c302006-03-21 23:52:24 +0000454 addTag(labelTag, labelConstructor);
455 addTag(legendTag, legendConstructor);
456 addTag(liTag, liConstructor);
457 addTag(linkTag, linkConstructor);
458 addTag(listingTag, preConstructor);
459 addTag(mapTag, mapConstructor);
460 addTag(marqueeTag, marqueeConstructor);
461 addTag(menuTag, menuConstructor);
462 addTag(metaTag, metaConstructor);
463 addTag(objectTag, objectConstructor);
464 addTag(olTag, olConstructor);
465 addTag(optgroupTag, optgroupConstructor);
466 addTag(optionTag, optionConstructor);
467 addTag(pTag, paragraphConstructor);
468 addTag(paramTag, paramConstructor);
469 addTag(preTag, preConstructor);
470 addTag(qTag, quoteConstructor);
471 addTag(scriptTag, scriptConstructor);
472 addTag(selectTag, selectConstructor);
473 addTag(styleTag, styleConstructor);
474 addTag(tableTag, tableConstructor);
475 addTag(tbodyTag, tableSectionConstructor);
476 addTag(tdTag, tableCellConstructor);
477 addTag(textareaTag, textareaConstructor);
478 addTag(tfootTag, tableSectionConstructor);
479 addTag(thTag, tableCellConstructor);
480 addTag(theadTag, tableSectionConstructor);
481 addTag(titleTag, titleConstructor);
482 addTag(trTag, tableRowConstructor);
483 addTag(ulTag, ulConstructor);
484 addTag(xmpTag, preConstructor);
antti76787a82007-10-31 01:03:35 +0000485#if ENABLE(VIDEO)
486 addTag(audioTag, audioConstructor);
487 addTag(sourceTag, sourceConstructor);
488 addTag(videoTag, videoConstructor);
489#endif
darinfa25c302006-03-21 23:52:24 +0000490}
491
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000492PassRefPtr<HTMLElement> HTMLElementFactory::createHTMLElement(const QualifiedName& tagName, Document* doc, HTMLFormElement* form, bool createdByParser)
darinb9481ed2006-03-20 02:57:59 +0000493{
494 if (!doc)
495 return 0; // Don't allow elements to ever be made without having a doc.
496
darinfa25c302006-03-21 23:52:24 +0000497 if (!gFunctionMap)
498 createFunctionMap();
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000499
500 ConstructorFunc func = gFunctionMap->get(tagName.localName().impl());
darinb9481ed2006-03-20 02:57:59 +0000501 if (func)
502 return func(tagName, doc, form, createdByParser);
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000503
darinb9481ed2006-03-20 02:57:59 +0000504 // elements with no special representation in the DOM
jchaffraix@webkit.org6d046192008-11-24 19:29:39 +0000505 return new HTMLElement(tagName, doc);
darinb9481ed2006-03-20 02:57:59 +0000506}
507
508}
509