1e184da9a27ffd08a9ca35cd4ef0475603b9859e
[WebKit-https.git] / WebCore / khtml / ecma / kjs_html.cpp
1 // -*- c-basic-offset: 4 -*-
2 /*
3  *  This file is part of the KDE libraries
4  *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
5  *  Copyright (C) 2004 Apple Computer, Inc.
6  *
7  *  This library is free software; you can redistribute it and/or
8  *  modify it under the terms of the GNU Lesser General Public
9  *  License as published by the Free Software Foundation; either
10  *  version 2 of the License, or (at your option) any later version.
11  *
12  *  This library is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  *  Lesser General Public License for more details.
16  *
17  *  You should have received a copy of the GNU Lesser General Public
18  *  License along with this library; if not, write to the Free Software
19  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21
22 #include "config.h"
23 #include "kjs_html.h"
24
25 #include "misc/loader.h"
26 #include "dom/dom_exception.h"
27 #include "xml/dom2_eventsimpl.h"
28
29 #include "xml/dom_textimpl.h"
30 #include "xml/EventNames.h"
31 #include "html/html_baseimpl.h"
32 #include "html/html_blockimpl.h"
33 #include "html/html_canvasimpl.h"
34 #include "html/html_documentimpl.h"
35 #include "html/html_formimpl.h"
36 #include "html/html_headimpl.h"
37 #include "html/html_imageimpl.h"
38 #include "html/html_inlineimpl.h"
39 #include "html/html_listimpl.h"
40 #include "html/html_objectimpl.h"
41 #include "html/html_tableimpl.h"
42
43 #include "khtml_part.h"
44 #include "khtmlview.h"
45
46 #include "kjs_css.h"
47 #include "kjs_window.h"
48 #include "kjs_events.h"
49 #include "kjs_proxy.h"
50
51 #include "rendering/render_canvasimage.h"
52 #include "rendering/render_object.h"
53 #include "rendering/render_layer.h"
54
55 #include <kdebug.h>
56
57 #include "css/cssparser.h"
58 #include "css/css_stylesheetimpl.h"
59 #include "css/css_ruleimpl.h"
60
61 #include <qcolor.h>
62 #include <qpixmap.h>
63 #include <qpainter.h>
64
65 #include <ApplicationServices/ApplicationServices.h>
66
67 using namespace DOM::HTMLNames;
68 using namespace DOM::EventNames;
69
70 using DOM::DOMString;
71 using DOM::DocumentImpl;
72 using DOM::ElementImpl;
73 using DOM::EventImpl;
74 using DOM::HTMLAnchorElementImpl;
75 using DOM::HTMLAppletElementImpl;
76 using DOM::HTMLAreaElementImpl;
77 using DOM::HTMLBRElementImpl;
78 using DOM::HTMLBaseElementImpl;
79 using DOM::HTMLBaseFontElementImpl;
80 using DOM::HTMLBlockquoteElementImpl;
81 using DOM::HTMLBodyElementImpl;
82 using DOM::HTMLButtonElementImpl;
83 using DOM::HTMLCanvasElementImpl;
84 using DOM::HTMLCollectionImpl;
85 using DOM::HTMLDListElementImpl;
86 using DOM::HTMLDirectoryElementImpl;
87 using DOM::HTMLDivElementImpl;
88 using DOM::HTMLDocumentImpl;
89 using DOM::HTMLElementImpl;
90 using DOM::HTMLFieldSetElementImpl;
91 using DOM::HTMLFontElementImpl;
92 using DOM::HTMLFormElementImpl;
93 using DOM::HTMLFrameElementImpl;
94 using DOM::HTMLFrameSetElementImpl;
95 using DOM::HTMLGenericFormElementImpl;
96 using DOM::HTMLHRElementImpl;
97 using DOM::HTMLHeadElementImpl;
98 using DOM::HTMLHeadingElementImpl;
99 using DOM::HTMLHtmlElementImpl;
100 using DOM::HTMLIFrameElementImpl;
101 using DOM::HTMLIFrameElementImpl;
102 using DOM::HTMLImageElementImpl;
103 using DOM::HTMLInputElementImpl;
104 using DOM::HTMLIsIndexElementImpl;
105 using DOM::HTMLLIElementImpl;
106 using DOM::HTMLLabelElementImpl;
107 using DOM::HTMLLegendElementImpl;
108 using DOM::HTMLLinkElementImpl;
109 using DOM::HTMLMapElementImpl;
110 using DOM::HTMLMenuElementImpl;
111 using DOM::HTMLMetaElementImpl;
112 using DOM::HTMLModElementImpl;
113 using DOM::HTMLOListElementImpl;
114 using DOM::HTMLObjectElementImpl;
115 using DOM::HTMLOptGroupElementImpl;
116 using DOM::HTMLOptionElementImpl;
117 using DOM::HTMLParagraphElementImpl;
118 using DOM::HTMLParamElementImpl;
119 using DOM::HTMLPreElementImpl;
120 using DOM::HTMLQuoteElementImpl;
121 using DOM::HTMLScriptElementImpl;
122 using DOM::HTMLSelectElementImpl;
123 using DOM::HTMLStyleElementImpl;
124 using DOM::HTMLTableCaptionElementImpl;
125 using DOM::HTMLTableCellElementImpl;
126 using DOM::HTMLTableColElementImpl;
127 using DOM::HTMLTableElementImpl;
128 using DOM::HTMLTableRowElementImpl;
129 using DOM::HTMLTableSectionElementImpl;
130 using DOM::HTMLTextAreaElementImpl;
131 using DOM::HTMLTitleElementImpl;
132 using DOM::HTMLUListElementImpl;
133 using DOM::NodeImpl;
134 using DOM::NodeListImpl;
135 using DOM::TextImpl;
136
137 using khtml::RenderCanvasImage;
138
139 #include "kjs_html.lut.h"
140
141 namespace KJS {
142
143 class HTMLElementFunction : public DOMFunction {
144 public:
145   HTMLElementFunction(ExecState *exec, int i, int len);
146   virtual ValueImp *callAsFunction(ExecState *exec, ObjectImp *thisObj, const List&args);
147 private:
148   int id;
149 };
150
151 IMPLEMENT_PROTOFUNC(HTMLDocFunction)
152
153 ValueImp *KJS::HTMLDocFunction::callAsFunction(ExecState *exec, ObjectImp *thisObj, const List &args)
154 {
155   if (!thisObj->inherits(&HTMLDocument::info))
156     return throwError(exec, TypeError);
157   HTMLDocumentImpl &doc = *static_cast<HTMLDocumentImpl *>(static_cast<HTMLDocument *>(thisObj)->impl());
158
159   switch (id) {
160   case HTMLDocument::Clear: // even IE doesn't support that one...
161     //doc.clear(); // TODO
162     return Undefined();
163   case HTMLDocument::Open:
164     // For compatibility with other browsers, pass open calls with more than 2 parameters to the window.
165     if (args.size() > 2) {
166       KHTMLPart *part = doc.part();
167       if (part) {
168         Window *window = Window::retrieveWindow(part);
169         if (window) {
170           ObjectImp *functionObject = window->get(exec, "open")->getObject();
171           if (!functionObject || !functionObject->implementsCall())
172             return throwError(exec, TypeError);
173           return functionObject->call(exec, window, args);
174         }
175       }
176       return Undefined();
177     }
178     // In the case of two parameters or fewer, do a normal document open.
179     doc.open();
180     return Undefined();
181   case HTMLDocument::Close:
182     // see khtmltests/ecma/tokenizer-script-recursion.html
183     doc.close();
184     return Undefined();
185   case HTMLDocument::Write:
186   case HTMLDocument::WriteLn: {
187     // DOM only specifies single string argument, but NS & IE allow multiple
188     // or no arguments
189     UString str = "";
190     for (int i = 0; i < args.size(); i++)
191       str += args[i]->toString(exec);
192     if (id == HTMLDocument::WriteLn)
193       str += "\n";
194     //kdDebug() << "document.write: " << str.ascii() << endl;
195     doc.write(str.domString());
196     return Undefined();
197   }
198   case HTMLDocument::GetElementsByName:
199     return getDOMNodeList(exec, doc.getElementsByName(args[0]->toString(exec).domString()).get());
200   case HTMLDocument::CaptureEvents:
201   case HTMLDocument::ReleaseEvents:
202     // Do nothing for now. These are NS-specific legacy calls.
203     break;
204   }
205
206   return Undefined();
207 }
208
209 const ClassInfo KJS::HTMLDocument::info =
210   { "HTMLDocument", &DOMDocument::info, &HTMLDocumentTable, 0 };
211 /* Source for HTMLDocumentTable. Use "make hashtables" to regenerate.
212 @begin HTMLDocumentTable 30
213   title                 HTMLDocument::Title             DontDelete
214   referrer              HTMLDocument::Referrer          DontDelete|ReadOnly
215   domain                HTMLDocument::Domain            DontDelete
216   URL                   HTMLDocument::URL               DontDelete|ReadOnly
217   body                  HTMLDocument::Body              DontDelete
218   location              HTMLDocument::Location          DontDelete
219   cookie                HTMLDocument::Cookie            DontDelete
220   images                HTMLDocument::Images            DontDelete|ReadOnly
221   embeds                HTMLDocument::Embeds            DontDelete|ReadOnly
222   applets               HTMLDocument::Applets           DontDelete|ReadOnly
223   links                 HTMLDocument::Links             DontDelete|ReadOnly
224   forms                 HTMLDocument::Forms             DontDelete|ReadOnly
225   anchors               HTMLDocument::Anchors           DontDelete|ReadOnly
226   scripts               HTMLDocument::Scripts           DontDelete|ReadOnly
227 # We want no document.all at all, not just a function that returns undefined.
228 # That means we lose the "document.all when spoofing as IE" feature, but we don't spoof in Safari.
229 # And this makes sites that set document.all explicitly work when they otherwise wouldn't, 
230 # e.g. https://corporateexchange.airborne.com
231 # (Not in APPLE_CHANGES since we can't do #if in KJS identifier lists.)
232 #  all                  HTMLDocument::All               DontDelete|ReadOnly
233   clear                 HTMLDocument::Clear             DontDelete|Function 0
234   open                  HTMLDocument::Open              DontDelete|Function 0
235   close                 HTMLDocument::Close             DontDelete|Function 0
236   write                 HTMLDocument::Write             DontDelete|Function 1
237   writeln               HTMLDocument::WriteLn           DontDelete|Function 1
238   getElementsByName     HTMLDocument::GetElementsByName DontDelete|Function 1
239   captureEvents         HTMLDocument::CaptureEvents     DontDelete|Function 0
240   releaseEvents         HTMLDocument::ReleaseEvents     DontDelete|Function 0
241   bgColor               HTMLDocument::BgColor           DontDelete
242   fgColor               HTMLDocument::FgColor           DontDelete
243   alinkColor            HTMLDocument::AlinkColor        DontDelete
244   linkColor             HTMLDocument::LinkColor         DontDelete
245   vlinkColor            HTMLDocument::VlinkColor        DontDelete
246   lastModified          HTMLDocument::LastModified      DontDelete|ReadOnly
247   height                HTMLDocument::Height            DontDelete|ReadOnly
248   width                 HTMLDocument::Width             DontDelete|ReadOnly
249   dir                   HTMLDocument::Dir               DontDelete
250   designMode            HTMLDocument::DesignMode        DontDelete
251 #potentially obsolete array properties
252 # layers
253 # plugins
254 # tags
255 #potentially obsolete properties
256 # embeds
257 # ids
258 @end
259 */
260
261 HTMLDocument::HTMLDocument(ExecState *exec, HTMLDocumentImpl *d)
262   : DOMDocument(exec, d)
263 {
264 }
265
266 ValueImp *HTMLDocument::namedItemGetter(ExecState *exec, const Identifier& propertyName, const PropertySlot& slot)
267 {
268   HTMLDocument *thisObj = static_cast<HTMLDocument *>(slot.slotBase());
269   HTMLDocumentImpl &doc = *static_cast<HTMLDocumentImpl *>(thisObj->impl());
270
271   DOMString name = propertyName.domString();
272   RefPtr<DOM::HTMLCollectionImpl> collection = doc.documentNamedItems(name);
273
274   if (collection->length() == 1) {
275     NodeImpl *node = collection->firstItem();
276     KHTMLPart *part;
277     if (node->hasTagName(iframeTag) && 
278         (part = static_cast<DOM::HTMLIFrameElementImpl *>(node)->contentPart()))
279       return Window::retrieve(part);
280
281     return getDOMNode(exec, node);
282   }
283
284   return getHTMLCollection(exec, collection.get());
285 }
286
287 ValueImp *HTMLDocument::getValueProperty(ExecState *exec, int token) const
288 {
289   HTMLDocumentImpl &doc = *static_cast<HTMLDocumentImpl *>(impl());
290
291   KHTMLView *view = doc.view();
292   KHTMLPart *part = doc.part();
293
294   HTMLElementImpl *body = doc.body();
295   HTMLBodyElementImpl *bodyElement = (body && body->hasTagName(bodyTag)) ? static_cast<HTMLBodyElementImpl *>(body) : 0;
296     
297   switch (token) {
298   case Title:
299     return String(doc.title());
300   case Referrer:
301     return String(doc.referrer());
302   case Domain:
303     return String(doc.domain());
304   case URL:
305     return String(doc.URL());
306   case Body:
307     return getDOMNode(exec, body);
308   case Location:
309     if (Window* win = Window::retrieveWindow(part))
310       return win->location();
311     return Undefined();
312   case Cookie:
313     return String(doc.cookie());
314   case Images:
315     return getHTMLCollection(exec, doc.images().get());
316   case Embeds:
317     return getHTMLCollection(exec, doc.embeds().get());
318   case Applets:
319     return getHTMLCollection(exec, doc.applets().get());
320   case Links:
321     return getHTMLCollection(exec, doc.links().get());
322   case Forms:
323     return getHTMLCollection(exec, doc.forms().get());
324   case Anchors:
325     return getHTMLCollection(exec, doc.anchors().get());
326   case Scripts: // TODO (IE-specific)
327     {
328       // To be implemented. Meanwhile, return an object with a length property set to 0
329       kdWarning() << "KJS::HTMLDocument document.scripts called - not implemented" << endl;
330       ObjectImp *obj = new ObjectImp;
331       obj->put(exec, lengthPropertyName, Number(0));
332       return obj;
333     }
334   case All:
335     // Disable document.all when we try to be Netscape-compatible
336     if (exec->dynamicInterpreter()->compatMode() == Interpreter::NetscapeCompat)
337       return Undefined();
338     return getHTMLCollection(exec, doc.all().get());
339   case BgColor:
340     if (!bodyElement)
341       return Undefined();
342     return String(bodyElement->bgColor());
343   case FgColor:
344     if (!bodyElement)
345       return Undefined();
346     return String(bodyElement->text());
347   case AlinkColor:
348     if (!bodyElement)
349       return Undefined();
350     return String(bodyElement->aLink());
351   case LinkColor:
352     if (!bodyElement)
353       return Undefined();
354     return String(bodyElement->link());
355   case VlinkColor:
356     if (!bodyElement)
357       return Undefined();
358     return String(bodyElement->vLink());
359   case LastModified:
360     return String(doc.lastModified());
361   case Height:
362     return Number(view ? view->contentsHeight() : 0);
363   case Width:
364     return Number(view ? view->contentsWidth() : 0);
365   case Dir:
366     if (!bodyElement)
367       return Undefined();
368     return String(bodyElement->dir());
369   case DesignMode:
370     return String(doc.inDesignMode() ? "on" : "off");
371   default:
372     assert(0);
373     return Undefined();
374   }
375 }
376
377 bool HTMLDocument::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot)
378 {
379   HTMLDocumentImpl &doc = *static_cast<HTMLDocumentImpl *>(impl());
380
381   DOMString name = propertyName.domString();
382   if (doc.hasNamedItem(name) || doc.hasDocExtraNamedItem(name)) {
383     slot.setCustom(this, namedItemGetter);
384     return true;
385   }
386
387   const HashEntry* entry = Lookup::findEntry(&HTMLDocumentTable, propertyName);
388   if (entry) {
389     if (entry->attr & Function)
390       slot.setStaticEntry(this, entry, staticFunctionGetter<HTMLDocFunction>);
391     else 
392       slot.setStaticEntry(this, entry, staticValueGetter<HTMLDocument>);
393     return true;
394   }
395
396   return DOMDocument::getOwnPropertySlot(exec, propertyName, slot);
397 }
398
399 void KJS::HTMLDocument::put(ExecState *exec, const Identifier &propertyName, ValueImp *value, int attr)
400 {
401 #ifdef KJS_VERBOSE
402   kdDebug(6070) << "KJS::HTMLDocument::put " << propertyName.qstring() << endl;
403 #endif
404   lookupPut<HTMLDocument, DOMDocument>( exec, propertyName, value, attr, &HTMLDocumentTable, this );
405 }
406
407 void KJS::HTMLDocument::putValueProperty(ExecState *exec, int token, ValueImp *value, int /*attr*/)
408 {
409   DOMExceptionTranslator exception(exec);
410   HTMLDocumentImpl &doc = *static_cast<HTMLDocumentImpl *>(impl());
411   HTMLElementImpl *body = doc.body();
412   HTMLBodyElementImpl *bodyElement = (body && body->hasTagName(bodyTag)) ? static_cast<HTMLBodyElementImpl *>(body) : 0;
413
414   switch (token) {
415   case Title:
416     doc.setTitle(value->toString(exec).domString());
417     break;
418   case Body:
419     doc.setBody(toHTMLElement(value), exception);
420     break;
421   case Domain: // not part of the DOM
422     doc.setDomain(value->toString(exec).domString());
423     break;
424   case Cookie:
425     doc.setCookie(value->toString(exec).domString());
426     break;
427   case Location: {
428     KHTMLPart *part = doc.part();
429     if (part)
430     {
431       QString str = value->toString(exec).qstring();
432
433       // When assigning location, IE and Mozilla both resolve the URL
434       // relative to the frame where the JavaScript is executing not
435       // the target frame.
436       KHTMLPart *activePart = static_cast<KJS::ScriptInterpreter *>( exec->dynamicInterpreter() )->part();
437       if (activePart)
438         str = activePart->xmlDocImpl()->completeURL(str);
439
440       // We want a new history item if this JS was called via a user gesture
441       bool userGesture = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter())->wasRunByUserGesture();
442       part->scheduleLocationChange(str, activePart->referrer(), !userGesture);
443     }
444     break;
445   }
446   case BgColor:
447     if (bodyElement)
448       bodyElement->setBgColor(value->toString(exec).domString());
449     break;
450   case FgColor:
451     if (bodyElement)
452       bodyElement->setText(value->toString(exec).domString());
453     break;
454   case AlinkColor:
455     if (bodyElement) {
456       // this check is a bit silly, but some benchmarks like to set the
457       // document's link colors over and over to the same value and we
458       // don't want to incur a style update each time.
459       DOMString newColor = value->toString(exec).domString();
460       if (bodyElement->aLink() != newColor)
461         bodyElement->setALink(newColor);
462     }
463     break;
464   case LinkColor:
465     if (bodyElement) {
466       // this check is a bit silly, but some benchmarks like to set the
467       // document's link colors over and over to the same value and we
468       // don't want to incur a style update each time.
469       DOMString newColor = value->toString(exec).domString();
470       if (bodyElement->link() != newColor)
471         bodyElement->setLink(newColor);
472     }
473     break;
474   case VlinkColor:
475     if (bodyElement) {
476       // this check is a bit silly, but some benchmarks like to set the
477       // document's link colors over and over to the same value and we
478       // don't want to incur a style update each time.
479       DOMString newColor = value->toString(exec).domString();
480       if (bodyElement->vLink() != newColor)
481         bodyElement->setVLink(newColor);
482     }
483     break;
484   case Dir:
485     body->setDir(value->toString(exec).domString());
486     break;
487   case DesignMode:
488     {
489       DOMString modeString = value->toString(exec).domString();
490       DocumentImpl::InheritedBool mode;
491       if (!strcasecmp(modeString, "on"))
492         mode = DocumentImpl::on;
493       else if (!strcasecmp(modeString, "off"))
494         mode = DocumentImpl::off;
495       else
496         mode = DocumentImpl::inherit;
497       doc.setDesignMode(mode);
498       break;
499     }
500   default:
501     kdWarning() << "HTMLDocument::putValueProperty unhandled token " << token << endl;
502   }
503 }
504
505 // -------------------------------------------------------------------------
506
507 const ClassInfo KJS::HTMLElement::info = { "HTMLElement", &DOMElement::info, &HTMLElementTable, 0 };
508 const ClassInfo KJS::HTMLElement::html_info = { "HTMLHtmlElement", &KJS::HTMLElement::info, &HTMLHtmlElementTable, 0 };
509 const ClassInfo KJS::HTMLElement::head_info = { "HTMLHeadElement", &KJS::HTMLElement::info, &HTMLHeadElementTable, 0 };
510 const ClassInfo KJS::HTMLElement::link_info = { "HTMLLinkElement", &KJS::HTMLElement::info, &HTMLLinkElementTable, 0 };
511 const ClassInfo KJS::HTMLElement::title_info = { "HTMLTitleElement", &KJS::HTMLElement::info, &HTMLTitleElementTable, 0 };
512 const ClassInfo KJS::HTMLElement::meta_info = { "HTMLMetaElement", &KJS::HTMLElement::info, &HTMLMetaElementTable, 0 };
513 const ClassInfo KJS::HTMLElement::base_info = { "HTMLBaseElement", &KJS::HTMLElement::info, &HTMLBaseElementTable, 0 };
514 const ClassInfo KJS::HTMLElement::isIndex_info = { "HTMLIsIndexElement", &KJS::HTMLElement::info, &HTMLIsIndexElementTable, 0 };
515 const ClassInfo KJS::HTMLElement::style_info = { "HTMLStyleElement", &KJS::HTMLElement::info, &HTMLStyleElementTable, 0 };
516 const ClassInfo KJS::HTMLElement::body_info = { "HTMLBodyElement", &KJS::HTMLElement::info, &HTMLBodyElementTable, 0 };
517 const ClassInfo KJS::HTMLElement::form_info = { "HTMLFormElement", &KJS::HTMLElement::info, &HTMLFormElementTable, 0 };
518 const ClassInfo KJS::HTMLElement::select_info = { "HTMLSelectElement", &KJS::HTMLElement::info, &HTMLSelectElementTable, 0 };
519 const ClassInfo KJS::HTMLElement::optGroup_info = { "HTMLOptGroupElement", &KJS::HTMLElement::info, &HTMLOptGroupElementTable, 0 };
520 const ClassInfo KJS::HTMLElement::option_info = { "HTMLOptionElement", &KJS::HTMLElement::info, &HTMLOptionElementTable, 0 };
521 const ClassInfo KJS::HTMLElement::input_info = { "HTMLInputElement", &KJS::HTMLElement::info, &HTMLInputElementTable, 0 };
522 const ClassInfo KJS::HTMLElement::textArea_info = { "HTMLTextAreaElement", &KJS::HTMLElement::info, &HTMLTextAreaElementTable, 0 };
523 const ClassInfo KJS::HTMLElement::button_info = { "HTMLButtonElement", &KJS::HTMLElement::info, &HTMLButtonElementTable, 0 };
524 const ClassInfo KJS::HTMLElement::label_info = { "HTMLLabelElement", &KJS::HTMLElement::info, &HTMLLabelElementTable, 0 };
525 const ClassInfo KJS::HTMLElement::fieldSet_info = { "HTMLFieldSetElement", &KJS::HTMLElement::info, &HTMLFieldSetElementTable, 0 };
526 const ClassInfo KJS::HTMLElement::legend_info = { "HTMLLegendElement", &KJS::HTMLElement::info, &HTMLLegendElementTable, 0 };
527 const ClassInfo KJS::HTMLElement::ul_info = { "HTMLUListElement", &KJS::HTMLElement::info, &HTMLUListElementTable, 0 };
528 const ClassInfo KJS::HTMLElement::ol_info = { "HTMLOListElement", &KJS::HTMLElement::info, &HTMLOListElementTable, 0 };
529 const ClassInfo KJS::HTMLElement::dl_info = { "HTMLDListElement", &KJS::HTMLElement::info, &HTMLDListElementTable, 0 };
530 const ClassInfo KJS::HTMLElement::dir_info = { "HTMLDirectoryElement", &KJS::HTMLElement::info, &HTMLDirectoryElementTable, 0 };
531 const ClassInfo KJS::HTMLElement::menu_info = { "HTMLMenuElement", &KJS::HTMLElement::info, &HTMLMenuElementTable, 0 };
532 const ClassInfo KJS::HTMLElement::li_info = { "HTMLLIElement", &KJS::HTMLElement::info, &HTMLLIElementTable, 0 };
533 const ClassInfo KJS::HTMLElement::div_info = { "HTMLDivElement", &KJS::HTMLElement::info, &HTMLDivElementTable, 0 };
534 const ClassInfo KJS::HTMLElement::p_info = { "HTMLParagraphElement", &KJS::HTMLElement::info, &HTMLParagraphElementTable, 0 };
535 const ClassInfo KJS::HTMLElement::heading_info = { "HTMLHeadingElement", &KJS::HTMLElement::info, &HTMLHeadingElementTable, 0 };
536 const ClassInfo KJS::HTMLElement::blockQuote_info = { "HTMLBlockQuoteElement", &KJS::HTMLElement::info, &HTMLBlockQuoteElementTable, 0 };
537 const ClassInfo KJS::HTMLElement::q_info = { "HTMLQuoteElement", &KJS::HTMLElement::info, &HTMLQuoteElementTable, 0 };
538 const ClassInfo KJS::HTMLElement::pre_info = { "HTMLPreElement", &KJS::HTMLElement::info, &HTMLPreElementTable, 0 };
539 const ClassInfo KJS::HTMLElement::br_info = { "HTMLBRElement", &KJS::HTMLElement::info, &HTMLBRElementTable, 0 };
540 const ClassInfo KJS::HTMLElement::baseFont_info = { "HTMLBaseFontElement", &KJS::HTMLElement::info, &HTMLBaseFontElementTable, 0 };
541 const ClassInfo KJS::HTMLElement::font_info = { "HTMLFontElement", &KJS::HTMLElement::info, &HTMLFontElementTable, 0 };
542 const ClassInfo KJS::HTMLElement::hr_info = { "HTMLHRElement", &KJS::HTMLElement::info, &HTMLHRElementTable, 0 };
543 const ClassInfo KJS::HTMLElement::mod_info = { "HTMLModElement", &KJS::HTMLElement::info, &HTMLModElementTable, 0 };
544 const ClassInfo KJS::HTMLElement::a_info = { "HTMLAnchorElement", &KJS::HTMLElement::info, &HTMLAnchorElementTable, 0 };
545 const ClassInfo KJS::HTMLElement::canvas_info = { "HTMLCanvasElement", &KJS::HTMLElement::info, &HTMLCanvasElementTable, 0 };
546 const ClassInfo KJS::HTMLElement::img_info = { "HTMLImageElement", &KJS::HTMLElement::info, &HTMLImageElementTable, 0 };
547 const ClassInfo KJS::HTMLElement::object_info = { "HTMLObjectElement", &KJS::HTMLElement::info, &HTMLObjectElementTable, 0 };
548 const ClassInfo KJS::HTMLElement::param_info = { "HTMLParamElement", &KJS::HTMLElement::info, &HTMLParamElementTable, 0 };
549 const ClassInfo KJS::HTMLElement::applet_info = { "HTMLAppletElement", &KJS::HTMLElement::info, &HTMLAppletElementTable, 0 };
550 const ClassInfo KJS::HTMLElement::map_info = { "HTMLMapElement", &KJS::HTMLElement::info, &HTMLMapElementTable, 0 };
551 const ClassInfo KJS::HTMLElement::area_info = { "HTMLAreaElement", &KJS::HTMLElement::info, &HTMLAreaElementTable, 0 };
552 const ClassInfo KJS::HTMLElement::script_info = { "HTMLScriptElement", &KJS::HTMLElement::info, &HTMLScriptElementTable, 0 };
553 const ClassInfo KJS::HTMLElement::table_info = { "HTMLTableElement", &KJS::HTMLElement::info, &HTMLTableElementTable, 0 };
554 const ClassInfo KJS::HTMLElement::caption_info = { "HTMLTableCaptionElement", &KJS::HTMLElement::info, &HTMLTableCaptionElementTable, 0 };
555 const ClassInfo KJS::HTMLElement::col_info = { "HTMLTableColElement", &KJS::HTMLElement::info, &HTMLTableColElementTable, 0 };
556 const ClassInfo KJS::HTMLElement::tablesection_info = { "HTMLTableSectionElement", &KJS::HTMLElement::info, &HTMLTableSectionElementTable, 0 };
557 const ClassInfo KJS::HTMLElement::tr_info = { "HTMLTableRowElement", &KJS::HTMLElement::info, &HTMLTableRowElementTable, 0 };
558 const ClassInfo KJS::HTMLElement::tablecell_info = { "HTMLTableCellElement", &KJS::HTMLElement::info, &HTMLTableCellElementTable, 0 };
559 const ClassInfo KJS::HTMLElement::frameSet_info = { "HTMLFrameSetElement", &KJS::HTMLElement::info, &HTMLFrameSetElementTable, 0 };
560 const ClassInfo KJS::HTMLElement::frame_info = { "HTMLFrameElement", &KJS::HTMLElement::info, &HTMLFrameElementTable, 0 };
561 const ClassInfo KJS::HTMLElement::iFrame_info = { "HTMLIFrameElement", &KJS::HTMLElement::info, &HTMLIFrameElementTable, 0 };
562 const ClassInfo KJS::HTMLElement::marquee_info = { "HTMLMarqueeElement", &KJS::HTMLElement::info, &HTMLMarqueeElementTable, 0 };
563
564 const ClassInfo* KJS::HTMLElement::classInfo() const
565 {
566     // FIXME: We want to use HashMap here, but there are compiler issues to deal with.
567     static QPtrDict<const ClassInfo> classInfoDict;
568     if (classInfoDict.isEmpty()) {
569         classInfoDict.insert(aTag.localName().impl(), &a_info);
570         classInfoDict.insert(appletTag.localName().impl(), &applet_info);
571         classInfoDict.insert(areaTag.localName().impl(), &area_info);
572         classInfoDict.insert(baseTag.localName().impl(), &base_info);
573         classInfoDict.insert(basefontTag.localName().impl(), &baseFont_info);
574         classInfoDict.insert(blockquoteTag.localName().impl(), &blockQuote_info);
575         classInfoDict.insert(bodyTag.localName().impl(), &body_info);
576         classInfoDict.insert(brTag.localName().impl(), &br_info);
577         classInfoDict.insert(buttonTag.localName().impl(), &button_info);
578         classInfoDict.insert(canvasTag.localName().impl(), &canvas_info);
579         classInfoDict.insert(captionTag.localName().impl(), &caption_info);
580         classInfoDict.insert(colTag.localName().impl(), &col_info);
581         classInfoDict.insert(colgroupTag.localName().impl(), &col_info);
582         classInfoDict.insert(delTag.localName().impl(), &mod_info);
583         classInfoDict.insert(dirTag.localName().impl(), &dir_info);
584         classInfoDict.insert(divTag.localName().impl(), &div_info);
585         classInfoDict.insert(dlTag.localName().impl(), &dl_info);
586         classInfoDict.insert(fieldsetTag.localName().impl(), &fieldSet_info);
587         classInfoDict.insert(fontTag.localName().impl(), &font_info);
588         classInfoDict.insert(formTag.localName().impl(), &form_info);
589         classInfoDict.insert(frameTag.localName().impl(), &frame_info);
590         classInfoDict.insert(framesetTag.localName().impl(), &frameSet_info);
591         classInfoDict.insert(h1Tag.localName().impl(), &heading_info);
592         classInfoDict.insert(h2Tag.localName().impl(), &heading_info);
593         classInfoDict.insert(h3Tag.localName().impl(), &heading_info);
594         classInfoDict.insert(h4Tag.localName().impl(), &heading_info);
595         classInfoDict.insert(h5Tag.localName().impl(), &heading_info);
596         classInfoDict.insert(h6Tag.localName().impl(), &heading_info);
597         classInfoDict.insert(headTag.localName().impl(), &head_info);
598         classInfoDict.insert(hrTag.localName().impl(), &hr_info);
599         classInfoDict.insert(htmlTag.localName().impl(), &html_info);
600         classInfoDict.insert(iframeTag.localName().impl(), &iFrame_info);
601         classInfoDict.insert(imgTag.localName().impl(), &img_info);
602         classInfoDict.insert(inputTag.localName().impl(), &input_info);
603         classInfoDict.insert(insTag.localName().impl(), &mod_info);
604         classInfoDict.insert(isindexTag.localName().impl(), &isIndex_info);
605         classInfoDict.insert(labelTag.localName().impl(), &label_info);
606         classInfoDict.insert(legendTag.localName().impl(), &legend_info);
607         classInfoDict.insert(liTag.localName().impl(), &li_info);
608         classInfoDict.insert(linkTag.localName().impl(), &link_info);
609         classInfoDict.insert(mapTag.localName().impl(), &map_info);
610         classInfoDict.insert(marqueeTag.localName().impl(), &marquee_info);
611         classInfoDict.insert(menuTag.localName().impl(), &menu_info);
612         classInfoDict.insert(metaTag.localName().impl(), &meta_info);
613         classInfoDict.insert(objectTag.localName().impl(), &object_info);
614         classInfoDict.insert(olTag.localName().impl(), &ol_info);
615         classInfoDict.insert(optionTag.localName().impl(), &option_info);
616         classInfoDict.insert(optgroupTag.localName().impl(), &optGroup_info);
617         classInfoDict.insert(pTag.localName().impl(), &p_info);
618         classInfoDict.insert(paramTag.localName().impl(), &param_info);
619         classInfoDict.insert(preTag.localName().impl(), &pre_info);
620         classInfoDict.insert(qTag.localName().impl(), &q_info);
621         classInfoDict.insert(scriptTag.localName().impl(), &script_info);
622         classInfoDict.insert(selectTag.localName().impl(), &select_info);
623         classInfoDict.insert(styleTag.localName().impl(), &style_info);
624         classInfoDict.insert(tableTag.localName().impl(), &table_info);
625         classInfoDict.insert(tbodyTag.localName().impl(), &tablesection_info);
626         classInfoDict.insert(tdTag.localName().impl(), &tablecell_info);
627         classInfoDict.insert(textareaTag.localName().impl(), &textArea_info);
628         classInfoDict.insert(thTag.localName().impl(), &tablecell_info);
629         classInfoDict.insert(theadTag.localName().impl(), &tablesection_info);
630         classInfoDict.insert(tfootTag.localName().impl(), &tablesection_info);
631         classInfoDict.insert(titleTag.localName().impl(), &title_info);
632         classInfoDict.insert(trTag.localName().impl(), &tr_info);
633         classInfoDict.insert(ulTag.localName().impl(), &ul_info);
634     }
635     
636     HTMLElementImpl* element = static_cast<HTMLElementImpl*>(impl());
637     const ClassInfo* result = classInfoDict.find(element->localName().impl());
638     if (result)
639         return result;
640     return &info;
641 }
642
643 const HTMLElement::Accessors HTMLElement::html_accessors = { &HTMLElement::htmlGetter, &HTMLElement::htmlSetter };
644 const HTMLElement::Accessors HTMLElement::head_accessors = { &HTMLElement::headGetter, &HTMLElement::headSetter };
645 const HTMLElement::Accessors HTMLElement::link_accessors = { &HTMLElement::linkGetter, &HTMLElement::linkSetter };
646 const HTMLElement::Accessors HTMLElement::title_accessors = { &HTMLElement::titleGetter, &HTMLElement::titleSetter };
647 const HTMLElement::Accessors HTMLElement::meta_accessors = { &HTMLElement::metaGetter, &HTMLElement::metaSetter };
648 const HTMLElement::Accessors HTMLElement::base_accessors = { &HTMLElement::baseGetter, &HTMLElement::baseSetter };
649 const HTMLElement::Accessors HTMLElement::isIndex_accessors = { &HTMLElement::isIndexGetter, &HTMLElement::isIndexSetter };
650 const HTMLElement::Accessors HTMLElement::style_accessors = { &HTMLElement::styleGetter, &HTMLElement::styleSetter };
651 const HTMLElement::Accessors HTMLElement::body_accessors = { &HTMLElement::bodyGetter, &HTMLElement::bodySetter };
652 const HTMLElement::Accessors HTMLElement::form_accessors = { &HTMLElement::formGetter, &HTMLElement::formSetter };
653 const HTMLElement::Accessors HTMLElement::select_accessors = { &HTMLElement::selectGetter, &HTMLElement::selectSetter };
654 const HTMLElement::Accessors HTMLElement::optGroup_accessors = { &HTMLElement::optGroupGetter, &HTMLElement::optGroupSetter };
655 const HTMLElement::Accessors HTMLElement::option_accessors = { &HTMLElement::optionGetter, &HTMLElement::optionSetter };
656 const HTMLElement::Accessors HTMLElement::input_accessors = { &HTMLElement::inputGetter, &HTMLElement::inputSetter };
657 const HTMLElement::Accessors HTMLElement::textArea_accessors = { &HTMLElement::textAreaGetter, &HTMLElement::textAreaSetter };
658 const HTMLElement::Accessors HTMLElement::button_accessors = { &HTMLElement::buttonGetter, &HTMLElement::buttonSetter };
659 const HTMLElement::Accessors HTMLElement::label_accessors = { &HTMLElement::labelGetter, &HTMLElement::labelSetter };
660 const HTMLElement::Accessors HTMLElement::fieldSet_accessors = { &HTMLElement::fieldSetGetter, &HTMLElement::fieldSetSetter };
661 const HTMLElement::Accessors HTMLElement::legend_accessors = { &HTMLElement::legendGetter, &HTMLElement::legendSetter };
662 const HTMLElement::Accessors HTMLElement::ul_accessors = { &HTMLElement::uListGetter, &HTMLElement::uListSetter };
663 const HTMLElement::Accessors HTMLElement::ol_accessors = { &HTMLElement::oListGetter, &HTMLElement::oListSetter };
664 const HTMLElement::Accessors HTMLElement::dl_accessors = { &HTMLElement::dListGetter, &HTMLElement::dListSetter };
665 const HTMLElement::Accessors HTMLElement::dir_accessors = { &HTMLElement::dirGetter, &HTMLElement::dirSetter };
666 const HTMLElement::Accessors HTMLElement::menu_accessors = { &HTMLElement::menuGetter, &HTMLElement::menuSetter };
667 const HTMLElement::Accessors HTMLElement::li_accessors = { &HTMLElement::liGetter, &HTMLElement::liSetter };
668 const HTMLElement::Accessors HTMLElement::div_accessors = { &HTMLElement::divGetter, &HTMLElement::divSetter };
669 const HTMLElement::Accessors HTMLElement::p_accessors = { &HTMLElement::paragraphGetter, &HTMLElement::paragraphSetter };
670 const HTMLElement::Accessors HTMLElement::heading_accessors = { &HTMLElement::headingGetter, &HTMLElement::headingSetter };
671 const HTMLElement::Accessors HTMLElement::blockQuote_accessors = { &HTMLElement::blockQuoteGetter, &HTMLElement::blockQuoteSetter };
672 const HTMLElement::Accessors HTMLElement::q_accessors = { &HTMLElement::quoteGetter, &HTMLElement::quoteSetter };
673 const HTMLElement::Accessors HTMLElement::pre_accessors = { &HTMLElement::preGetter, &HTMLElement::preSetter };
674 const HTMLElement::Accessors HTMLElement::br_accessors = { &HTMLElement::brGetter, &HTMLElement::brSetter };
675 const HTMLElement::Accessors HTMLElement::baseFont_accessors = { &HTMLElement::baseFontGetter, &HTMLElement::baseFontSetter };
676 const HTMLElement::Accessors HTMLElement::font_accessors = { &HTMLElement::fontGetter, &HTMLElement::fontSetter };
677 const HTMLElement::Accessors HTMLElement::hr_accessors = { &HTMLElement::hrGetter, &HTMLElement::hrSetter };
678 const HTMLElement::Accessors HTMLElement::mod_accessors = { &HTMLElement::modGetter, &HTMLElement::modSetter };
679 const HTMLElement::Accessors HTMLElement::a_accessors = { &HTMLElement::anchorGetter, &HTMLElement::anchorSetter };
680 const HTMLElement::Accessors HTMLElement::canvas_accessors = { &HTMLElement::imageGetter, &HTMLElement::imageSetter };
681 const HTMLElement::Accessors HTMLElement::img_accessors = { &HTMLElement::imageGetter, &HTMLElement::imageSetter };
682 const HTMLElement::Accessors HTMLElement::object_accessors = { &HTMLElement::objectGetter, &HTMLElement::objectSetter };
683 const HTMLElement::Accessors HTMLElement::param_accessors = { &HTMLElement::paramGetter, &HTMLElement::paramSetter };
684 const HTMLElement::Accessors HTMLElement::applet_accessors = { &HTMLElement::appletGetter, &HTMLElement::appletSetter };
685 const HTMLElement::Accessors HTMLElement::map_accessors = { &HTMLElement::mapGetter, &HTMLElement::mapSetter };
686 const HTMLElement::Accessors HTMLElement::area_accessors = { &HTMLElement::areaGetter, &HTMLElement::areaSetter };
687 const HTMLElement::Accessors HTMLElement::script_accessors = { &HTMLElement::scriptGetter, &HTMLElement::scriptSetter };
688 const HTMLElement::Accessors HTMLElement::table_accessors = { &HTMLElement::tableGetter, &HTMLElement::tableSetter };
689 const HTMLElement::Accessors HTMLElement::caption_accessors = { &HTMLElement::tableCaptionGetter, &HTMLElement::tableCaptionSetter };
690 const HTMLElement::Accessors HTMLElement::col_accessors = { &HTMLElement::tableColGetter, &HTMLElement::tableColSetter };
691 const HTMLElement::Accessors HTMLElement::tablesection_accessors = { &HTMLElement::tableSectionGetter, &HTMLElement::tableSectionSetter };
692 const HTMLElement::Accessors HTMLElement::tr_accessors = { &HTMLElement::tableRowGetter, &HTMLElement::tableRowSetter };
693 const HTMLElement::Accessors HTMLElement::tablecell_accessors = { &HTMLElement::tableCellGetter, &HTMLElement::tableCellSetter };
694 const HTMLElement::Accessors HTMLElement::frameSet_accessors = { &HTMLElement::frameSetGetter, &HTMLElement::frameSetSetter };
695 const HTMLElement::Accessors HTMLElement::frame_accessors = { &HTMLElement::frameGetter, &HTMLElement::frameSetter };
696 const HTMLElement::Accessors HTMLElement::iFrame_accessors = { &HTMLElement::iFrameGetter, &HTMLElement::iFrameSetter };
697 const HTMLElement::Accessors HTMLElement::marquee_accessors = { &HTMLElement::marqueeGetter, &HTMLElement::marqueeSetter };
698
699 const HTMLElement::Accessors* HTMLElement::getSetInfo() const
700 {
701     // FIXME: We want to use HashMap here, but there are compiler issues to deal with.
702     static QPtrDict<const HTMLElement::Accessors> getSetInfoDict;
703     if (getSetInfoDict.isEmpty()) {
704         getSetInfoDict.insert(aTag.localName().impl(), &a_accessors);
705         getSetInfoDict.insert(appletTag.localName().impl(), &applet_accessors);
706         getSetInfoDict.insert(areaTag.localName().impl(), &area_accessors);
707         getSetInfoDict.insert(baseTag.localName().impl(), &base_accessors);
708         getSetInfoDict.insert(basefontTag.localName().impl(), &baseFont_accessors);
709         getSetInfoDict.insert(blockquoteTag.localName().impl(), &blockQuote_accessors); 
710         getSetInfoDict.insert(bodyTag.localName().impl(), &body_accessors);
711         getSetInfoDict.insert(brTag.localName().impl(), &br_accessors);
712         getSetInfoDict.insert(buttonTag.localName().impl(), &button_accessors);
713         getSetInfoDict.insert(canvasTag.localName().impl(), &canvas_accessors);
714         getSetInfoDict.insert(captionTag.localName().impl(), &caption_accessors);
715         getSetInfoDict.insert(colTag.localName().impl(), &col_accessors);
716         getSetInfoDict.insert(colgroupTag.localName().impl(), &col_accessors);
717         getSetInfoDict.insert(delTag.localName().impl(), &mod_accessors);
718         getSetInfoDict.insert(dirTag.localName().impl(), &dir_accessors);
719         getSetInfoDict.insert(divTag.localName().impl(), &div_accessors);
720         getSetInfoDict.insert(dlTag.localName().impl(), &dl_accessors);
721         getSetInfoDict.insert(fieldsetTag.localName().impl(), &fieldSet_accessors);
722         getSetInfoDict.insert(fontTag.localName().impl(), &font_accessors);
723         getSetInfoDict.insert(formTag.localName().impl(), &form_accessors);
724         getSetInfoDict.insert(frameTag.localName().impl(), &frame_accessors);
725         getSetInfoDict.insert(framesetTag.localName().impl(), &frameSet_accessors);
726         getSetInfoDict.insert(h1Tag.localName().impl(), &heading_accessors);
727         getSetInfoDict.insert(h2Tag.localName().impl(), &heading_accessors);
728         getSetInfoDict.insert(h3Tag.localName().impl(), &heading_accessors);
729         getSetInfoDict.insert(h4Tag.localName().impl(), &heading_accessors);
730         getSetInfoDict.insert(h5Tag.localName().impl(), &heading_accessors);
731         getSetInfoDict.insert(h6Tag.localName().impl(), &heading_accessors);
732         getSetInfoDict.insert(headTag.localName().impl(), &head_accessors);
733         getSetInfoDict.insert(hrTag.localName().impl(), &hr_accessors); 
734         getSetInfoDict.insert(htmlTag.localName().impl(), &html_accessors);
735         getSetInfoDict.insert(iframeTag.localName().impl(), &iFrame_accessors);
736         getSetInfoDict.insert(imgTag.localName().impl(), &img_accessors);
737         getSetInfoDict.insert(inputTag.localName().impl(), &input_accessors);
738         getSetInfoDict.insert(insTag.localName().impl(), &mod_accessors);
739         getSetInfoDict.insert(isindexTag.localName().impl(), &isIndex_accessors);
740         getSetInfoDict.insert(labelTag.localName().impl(), &label_accessors);
741         getSetInfoDict.insert(legendTag.localName().impl(), &legend_accessors);
742         getSetInfoDict.insert(liTag.localName().impl(), &li_accessors);
743         getSetInfoDict.insert(linkTag.localName().impl(), &link_accessors);
744         getSetInfoDict.insert(mapTag.localName().impl(), &map_accessors);
745         getSetInfoDict.insert(marqueeTag.localName().impl(), &marquee_accessors);
746         getSetInfoDict.insert(menuTag.localName().impl(), &menu_accessors);
747         getSetInfoDict.insert(metaTag.localName().impl(), &meta_accessors);
748         getSetInfoDict.insert(objectTag.localName().impl(), &object_accessors);
749         getSetInfoDict.insert(olTag.localName().impl(), &ol_accessors);
750         getSetInfoDict.insert(optionTag.localName().impl(), &option_accessors);
751         getSetInfoDict.insert(optgroupTag.localName().impl(), &optGroup_accessors);
752         getSetInfoDict.insert(pTag.localName().impl(), &p_accessors);
753         getSetInfoDict.insert(paramTag.localName().impl(), &param_accessors);
754         getSetInfoDict.insert(preTag.localName().impl(), &pre_accessors);
755         getSetInfoDict.insert(qTag.localName().impl(), &q_accessors);
756         getSetInfoDict.insert(scriptTag.localName().impl(), &script_accessors);
757         getSetInfoDict.insert(selectTag.localName().impl(), &select_accessors);
758         getSetInfoDict.insert(styleTag.localName().impl(), &style_accessors);
759         getSetInfoDict.insert(tableTag.localName().impl(), &table_accessors);
760         getSetInfoDict.insert(tbodyTag.localName().impl(), &tablesection_accessors);
761         getSetInfoDict.insert(tdTag.localName().impl(), &tablecell_accessors);
762         getSetInfoDict.insert(textareaTag.localName().impl(), &textArea_accessors);
763         getSetInfoDict.insert(thTag.localName().impl(), &tablecell_accessors);
764         getSetInfoDict.insert(theadTag.localName().impl(), &tablesection_accessors);
765         getSetInfoDict.insert(tfootTag.localName().impl(), &tablesection_accessors);
766         getSetInfoDict.insert(titleTag.localName().impl(), &title_accessors);
767         getSetInfoDict.insert(trTag.localName().impl(), &tr_accessors);
768         getSetInfoDict.insert(ulTag.localName().impl(), &ul_accessors);
769     }
770     
771     HTMLElementImpl* element = static_cast<HTMLElementImpl*>(impl());
772     const HTMLElement::Accessors* result = getSetInfoDict.find(element->localName().impl());
773     if (result)
774         return result;
775     return 0;
776 }
777
778 /*
779 @begin HTMLElementTable 14
780   id            KJS::HTMLElement::ElementId     DontDelete
781   title         KJS::HTMLElement::ElementTitle  DontDelete
782   lang          KJS::HTMLElement::ElementLang   DontDelete
783   dir           KJS::HTMLElement::ElementDir    DontDelete
784 ### isn't this "class" in the HTML spec?
785   className     KJS::HTMLElement::ElementClassName DontDelete
786   innerHTML     KJS::HTMLElement::ElementInnerHTML DontDelete
787   innerText     KJS::HTMLElement::ElementInnerText DontDelete
788   outerHTML     KJS::HTMLElement::ElementOuterHTML DontDelete
789   outerText     KJS::HTMLElement::ElementOuterText DontDelete
790   document      KJS::HTMLElement::ElementDocument  DontDelete|ReadOnly
791 # IE extension
792   children      KJS::HTMLElement::ElementChildren  DontDelete|ReadOnly
793   contentEditable   KJS::HTMLElement::ElementContentEditable  DontDelete
794   isContentEditable KJS::HTMLElement::ElementIsContentEditable  DontDelete|ReadOnly
795 @end
796 @begin HTMLHtmlElementTable 1
797   version       KJS::HTMLElement::HtmlVersion   DontDelete
798 @end
799 @begin HTMLHeadElementTable 1
800   profile       KJS::HTMLElement::HeadProfile   DontDelete
801 @end
802 @begin HTMLLinkElementTable 11
803   disabled      KJS::HTMLElement::LinkDisabled  DontDelete
804   charset       KJS::HTMLElement::LinkCharset   DontDelete
805   href          KJS::HTMLElement::LinkHref      DontDelete
806   hreflang      KJS::HTMLElement::LinkHrefLang  DontDelete
807   media         KJS::HTMLElement::LinkMedia     DontDelete
808   rel           KJS::HTMLElement::LinkRel       DontDelete
809   rev           KJS::HTMLElement::LinkRev       DontDelete
810   target        KJS::HTMLElement::LinkTarget    DontDelete
811   type          KJS::HTMLElement::LinkType      DontDelete
812   sheet         KJS::HTMLElement::LinkSheet     DontDelete|ReadOnly
813 @end
814 @begin HTMLTitleElementTable 1
815   text          KJS::HTMLElement::TitleText     DontDelete
816 @end
817 @begin HTMLMetaElementTable 4
818   content       KJS::HTMLElement::MetaContent   DontDelete
819   httpEquiv     KJS::HTMLElement::MetaHttpEquiv DontDelete
820   name          KJS::HTMLElement::MetaName      DontDelete
821   scheme        KJS::HTMLElement::MetaScheme    DontDelete
822 @end
823 @begin HTMLBaseElementTable 2
824   href          KJS::HTMLElement::BaseHref      DontDelete
825   target        KJS::HTMLElement::BaseTarget    DontDelete
826 @end
827 @begin HTMLIsIndexElementTable 2
828   form          KJS::HTMLElement::IsIndexForm   DontDelete|ReadOnly
829   prompt        KJS::HTMLElement::IsIndexPrompt DontDelete
830 @end
831 @begin HTMLStyleElementTable 4
832   disabled      KJS::HTMLElement::StyleDisabled DontDelete
833   media         KJS::HTMLElement::StyleMedia    DontDelete
834   type          KJS::HTMLElement::StyleType     DontDelete
835   sheet         KJS::HTMLElement::StyleSheet    DontDelete|ReadOnly
836 @end
837 @begin HTMLBodyElementTable 10
838   aLink         KJS::HTMLElement::BodyALink     DontDelete
839   background    KJS::HTMLElement::BodyBackground        DontDelete
840   bgColor       KJS::HTMLElement::BodyBgColor   DontDelete
841   link          KJS::HTMLElement::BodyLink      DontDelete
842   text          KJS::HTMLElement::BodyText      DontDelete
843   vLink         KJS::HTMLElement::BodyVLink     DontDelete
844   scrollLeft    KJS::HTMLElement::BodyScrollLeft        DontDelete
845   scrollTop     KJS::HTMLElement::BodyScrollTop         DontDelete
846   scrollHeight  KJS::HTMLElement::BodyScrollHeight      DontDelete|ReadOnly
847   scrollWidth   KJS::HTMLElement::BodyScrollWidth       DontDelete|ReadOnly
848 @end
849 @begin HTMLFormElementTable 11
850 # Also supported, by name/index
851   elements      KJS::HTMLElement::FormElements  DontDelete|ReadOnly
852   length        KJS::HTMLElement::FormLength    DontDelete|ReadOnly
853   name          KJS::HTMLElement::FormName      DontDelete
854   acceptCharset KJS::HTMLElement::FormAcceptCharset     DontDelete
855   action        KJS::HTMLElement::FormAction    DontDelete
856   enctype       KJS::HTMLElement::FormEncType   DontDelete
857   method        KJS::HTMLElement::FormMethod    DontDelete
858   target        KJS::HTMLElement::FormTarget    DontDelete
859   submit        KJS::HTMLElement::FormSubmit    DontDelete|Function 0
860   reset         KJS::HTMLElement::FormReset     DontDelete|Function 0
861 @end
862 @begin HTMLSelectElementTable 11
863 # Also supported, by index
864   type          KJS::HTMLElement::SelectType    DontDelete|ReadOnly
865   selectedIndex KJS::HTMLElement::SelectSelectedIndex   DontDelete
866   value         KJS::HTMLElement::SelectValue   DontDelete
867   length        KJS::HTMLElement::SelectLength  DontDelete
868   form          KJS::HTMLElement::SelectForm    DontDelete|ReadOnly
869   options       KJS::HTMLElement::SelectOptions DontDelete|ReadOnly
870   disabled      KJS::HTMLElement::SelectDisabled        DontDelete
871   multiple      KJS::HTMLElement::SelectMultiple        DontDelete
872   name          KJS::HTMLElement::SelectName    DontDelete
873   size          KJS::HTMLElement::SelectSize    DontDelete
874   tabIndex      KJS::HTMLElement::SelectTabIndex        DontDelete
875   add           KJS::HTMLElement::SelectAdd     DontDelete|Function 2
876   remove        KJS::HTMLElement::SelectRemove  DontDelete|Function 1
877   blur          KJS::HTMLElement::SelectBlur    DontDelete|Function 0
878   focus         KJS::HTMLElement::SelectFocus   DontDelete|Function 0
879 @end
880 @begin HTMLOptGroupElementTable 2
881   disabled      KJS::HTMLElement::OptGroupDisabled      DontDelete
882   label         KJS::HTMLElement::OptGroupLabel         DontDelete
883 @end
884 @begin HTMLOptionElementTable 8
885   form          KJS::HTMLElement::OptionForm            DontDelete|ReadOnly
886   defaultSelected KJS::HTMLElement::OptionDefaultSelected       DontDelete
887   text          KJS::HTMLElement::OptionText            DontDelete
888   index         KJS::HTMLElement::OptionIndex           DontDelete|ReadOnly
889   disabled      KJS::HTMLElement::OptionDisabled        DontDelete
890   label         KJS::HTMLElement::OptionLabel           DontDelete
891   selected      KJS::HTMLElement::OptionSelected        DontDelete
892   value         KJS::HTMLElement::OptionValue           DontDelete
893 @end
894 @begin HTMLInputElementTable 24
895   defaultValue  KJS::HTMLElement::InputDefaultValue     DontDelete
896   defaultChecked KJS::HTMLElement::InputDefaultChecked  DontDelete
897   form          KJS::HTMLElement::InputForm             DontDelete|ReadOnly
898   accept        KJS::HTMLElement::InputAccept           DontDelete
899   accessKey     KJS::HTMLElement::InputAccessKey        DontDelete
900   align         KJS::HTMLElement::InputAlign            DontDelete
901   alt           KJS::HTMLElement::InputAlt              DontDelete
902   checked       KJS::HTMLElement::InputChecked          DontDelete
903   disabled      KJS::HTMLElement::InputDisabled         DontDelete
904   indeterminate KJS::HTMLElement::InputIndeterminate    DontDelete
905   maxLength     KJS::HTMLElement::InputMaxLength        DontDelete
906   name          KJS::HTMLElement::InputName             DontDelete
907   readOnly      KJS::HTMLElement::InputReadOnly         DontDelete
908   selectionStart        KJS::HTMLElement::InputSelectionStart   DontDelete
909   selectionEnd  KJS::HTMLElement::InputSelectionEnd     DontDelete
910   size          KJS::HTMLElement::InputSize             DontDelete
911   src           KJS::HTMLElement::InputSrc              DontDelete
912   tabIndex      KJS::HTMLElement::InputTabIndex         DontDelete
913   type          KJS::HTMLElement::InputType             DontDelete
914   useMap        KJS::HTMLElement::InputUseMap           DontDelete
915   value         KJS::HTMLElement::InputValue            DontDelete
916   blur          KJS::HTMLElement::InputBlur             DontDelete|Function 0
917   focus         KJS::HTMLElement::InputFocus            DontDelete|Function 0
918   select        KJS::HTMLElement::InputSelect           DontDelete|Function 0
919   click         KJS::HTMLElement::InputClick            DontDelete|Function 0
920   setSelectionRange     KJS::HTMLElement::InputSetSelectionRange        DontDelete|Function 2
921 @end
922 @begin HTMLTextAreaElementTable 17
923   defaultValue  KJS::HTMLElement::TextAreaDefaultValue  DontDelete
924   form          KJS::HTMLElement::TextAreaForm          DontDelete|ReadOnly
925   accessKey     KJS::HTMLElement::TextAreaAccessKey     DontDelete
926   cols          KJS::HTMLElement::TextAreaCols          DontDelete
927   disabled      KJS::HTMLElement::TextAreaDisabled      DontDelete
928   name          KJS::HTMLElement::TextAreaName          DontDelete
929   readOnly      KJS::HTMLElement::TextAreaReadOnly      DontDelete
930   rows          KJS::HTMLElement::TextAreaRows          DontDelete
931   selectionStart        KJS::HTMLElement::TextAreaSelectionStart        DontDelete
932   selectionEnd  KJS::HTMLElement::TextAreaSelectionEnd  DontDelete
933   tabIndex      KJS::HTMLElement::TextAreaTabIndex      DontDelete
934   type          KJS::HTMLElement::TextAreaType          DontDelete|ReadOnly
935   value         KJS::HTMLElement::TextAreaValue         DontDelete
936   blur          KJS::HTMLElement::TextAreaBlur          DontDelete|Function 0
937   focus         KJS::HTMLElement::TextAreaFocus         DontDelete|Function 0
938   select        KJS::HTMLElement::TextAreaSelect        DontDelete|Function 0
939   setSelectionRange     KJS::HTMLElement::TextAreaSetSelectionRange     DontDelete|Function 2
940 @end
941 @begin HTMLButtonElementTable 7
942   form          KJS::HTMLElement::ButtonForm            DontDelete|ReadOnly
943   accessKey     KJS::HTMLElement::ButtonAccessKey       DontDelete
944   disabled      KJS::HTMLElement::ButtonDisabled        DontDelete
945   name          KJS::HTMLElement::ButtonName            DontDelete
946   tabIndex      KJS::HTMLElement::ButtonTabIndex        DontDelete
947   type          KJS::HTMLElement::ButtonType            DontDelete|ReadOnly
948   value         KJS::HTMLElement::ButtonValue           DontDelete
949   blur          KJS::HTMLElement::ButtonBlur            DontDelete|Function 0
950   focus         KJS::HTMLElement::ButtonFocus           DontDelete|Function 0
951 @end
952 @begin HTMLLabelElementTable 4
953   form          KJS::HTMLElement::LabelForm             DontDelete|ReadOnly
954   accessKey     KJS::HTMLElement::LabelAccessKey        DontDelete
955   htmlFor       KJS::HTMLElement::LabelHtmlFor          DontDelete
956   focus     KJS::HTMLElement::LabelFocus        DontDelete|Function 0
957 @end
958 @begin HTMLFieldSetElementTable 1
959   form          KJS::HTMLElement::FieldSetForm          DontDelete|ReadOnly
960 @end
961 @begin HTMLLegendElementTable 4
962   form          KJS::HTMLElement::LegendForm            DontDelete|ReadOnly
963   accessKey     KJS::HTMLElement::LegendAccessKey       DontDelete
964   align         KJS::HTMLElement::LegendAlign           DontDelete
965   focus     KJS::HTMLElement::LegendFocus     DontDelete|Function 0
966 @end
967 @begin HTMLUListElementTable 2
968   compact       KJS::HTMLElement::UListCompact          DontDelete
969   type          KJS::HTMLElement::UListType             DontDelete
970 @end
971 @begin HTMLOListElementTable 3
972   compact       KJS::HTMLElement::OListCompact          DontDelete
973   start         KJS::HTMLElement::OListStart            DontDelete
974   type          KJS::HTMLElement::OListType             DontDelete
975 @end
976 @begin HTMLDListElementTable 1
977   compact       KJS::HTMLElement::DListCompact          DontDelete
978 @end
979 @begin HTMLDirectoryElementTable 1
980   compact       KJS::HTMLElement::DirectoryCompact      DontDelete
981 @end
982 @begin HTMLMenuElementTable 1
983   compact       KJS::HTMLElement::MenuCompact           DontDelete
984 @end
985 @begin HTMLLIElementTable 2
986   type          KJS::HTMLElement::LIType                DontDelete
987   value         KJS::HTMLElement::LIValue               DontDelete
988 @end
989 @begin HTMLDivElementTable 1
990   align         KJS::HTMLElement::DivAlign              DontDelete
991 @end
992 @begin HTMLParagraphElementTable 1
993   align         KJS::HTMLElement::ParagraphAlign        DontDelete
994 @end
995 @begin HTMLHeadingElementTable 1
996   align         KJS::HTMLElement::HeadingAlign          DontDelete
997 @end
998 @begin HTMLBlockQuoteElementTable 1
999   cite          KJS::HTMLElement::BlockQuoteCite        DontDelete
1000 @end
1001 @begin HTMLQuoteElementTable 1
1002   cite          KJS::HTMLElement::QuoteCite             DontDelete
1003 @end
1004 @begin HTMLPreElementTable 1
1005   width         KJS::HTMLElement::PreWidth              DontDelete
1006 @end
1007 @begin HTMLBRElementTable 1
1008   clear         KJS::HTMLElement::BRClear               DontDelete
1009 @end
1010 @begin HTMLBaseFontElementTable 3
1011   color         KJS::HTMLElement::BaseFontColor         DontDelete
1012   face          KJS::HTMLElement::BaseFontFace          DontDelete
1013   size          KJS::HTMLElement::BaseFontSize          DontDelete
1014 @end
1015 @begin HTMLFontElementTable 3
1016   color         KJS::HTMLElement::FontColor             DontDelete
1017   face          KJS::HTMLElement::FontFace              DontDelete
1018   size          KJS::HTMLElement::FontSize              DontDelete
1019 @end
1020 @begin HTMLHRElementTable 4
1021   align         KJS::HTMLElement::HRAlign               DontDelete
1022   noShade       KJS::HTMLElement::HRNoShade             DontDelete
1023   size          KJS::HTMLElement::HRSize                DontDelete
1024   width         KJS::HTMLElement::HRWidth               DontDelete
1025 @end
1026 @begin HTMLModElementTable 2
1027   cite          KJS::HTMLElement::ModCite               DontDelete
1028   dateTime      KJS::HTMLElement::ModDateTime           DontDelete
1029 @end
1030 @begin HTMLAnchorElementTable 24
1031   accessKey     KJS::HTMLElement::AnchorAccessKey       DontDelete
1032   charset       KJS::HTMLElement::AnchorCharset         DontDelete
1033   coords        KJS::HTMLElement::AnchorCoords          DontDelete
1034   href          KJS::HTMLElement::AnchorHref            DontDelete
1035   hreflang      KJS::HTMLElement::AnchorHrefLang        DontDelete
1036   hash          KJS::HTMLElement::AnchorHash            DontDelete|ReadOnly
1037   host          KJS::HTMLElement::AnchorHost            DontDelete|ReadOnly
1038   hostname      KJS::HTMLElement::AnchorHostname        DontDelete|ReadOnly
1039   name          KJS::HTMLElement::AnchorName            DontDelete
1040   pathname      KJS::HTMLElement::AnchorPathName        DontDelete|ReadOnly
1041   port          KJS::HTMLElement::AnchorPort            DontDelete|ReadOnly
1042   protocol      KJS::HTMLElement::AnchorProtocol        DontDelete|ReadOnly
1043   rel           KJS::HTMLElement::AnchorRel             DontDelete
1044   rev           KJS::HTMLElement::AnchorRev             DontDelete
1045   search        KJS::HTMLElement::AnchorSearch          DontDelete|ReadOnly
1046   shape         KJS::HTMLElement::AnchorShape           DontDelete
1047   tabIndex      KJS::HTMLElement::AnchorTabIndex        DontDelete
1048   target        KJS::HTMLElement::AnchorTarget          DontDelete
1049   text          KJS::HTMLElement::AnchorText            DontDelete|ReadOnly
1050   type          KJS::HTMLElement::AnchorType            DontDelete
1051   blur          KJS::HTMLElement::AnchorBlur            DontDelete|Function 0
1052   focus         KJS::HTMLElement::AnchorFocus           DontDelete|Function 0
1053   toString      KJS::HTMLElement::AnchorToString        DontDelete|Function 0
1054 @end
1055 @begin HTMLImageElementTable 14
1056   name          KJS::HTMLElement::ImageName             DontDelete
1057   align         KJS::HTMLElement::ImageAlign            DontDelete
1058   alt           KJS::HTMLElement::ImageAlt              DontDelete
1059   border        KJS::HTMLElement::ImageBorder           DontDelete
1060   height        KJS::HTMLElement::ImageHeight           DontDelete
1061   hspace        KJS::HTMLElement::ImageHspace           DontDelete
1062   isMap         KJS::HTMLElement::ImageIsMap            DontDelete
1063   longDesc      KJS::HTMLElement::ImageLongDesc         DontDelete
1064   src           KJS::HTMLElement::ImageSrc              DontDelete
1065   useMap        KJS::HTMLElement::ImageUseMap           DontDelete
1066   vspace        KJS::HTMLElement::ImageVspace           DontDelete
1067   width         KJS::HTMLElement::ImageWidth            DontDelete
1068   x         KJS::HTMLElement::ImageX            DontDelete|ReadOnly
1069   y         KJS::HTMLElement::ImageY            DontDelete|ReadOnly
1070 @end
1071 @begin HTMLObjectElementTable 20
1072   form            KJS::HTMLElement::ObjectForm            DontDelete|ReadOnly
1073   code            KJS::HTMLElement::ObjectCode            DontDelete
1074   align           KJS::HTMLElement::ObjectAlign           DontDelete
1075   archive         KJS::HTMLElement::ObjectArchive         DontDelete
1076   border          KJS::HTMLElement::ObjectBorder          DontDelete
1077   codeBase        KJS::HTMLElement::ObjectCodeBase        DontDelete
1078   codeType        KJS::HTMLElement::ObjectCodeType        DontDelete
1079   contentDocument KJS::HTMLElement::ObjectContentDocument DontDelete|ReadOnly
1080   data            KJS::HTMLElement::ObjectData            DontDelete
1081   declare         KJS::HTMLElement::ObjectDeclare         DontDelete
1082   height          KJS::HTMLElement::ObjectHeight          DontDelete
1083   hspace          KJS::HTMLElement::ObjectHspace          DontDelete
1084   name            KJS::HTMLElement::ObjectName            DontDelete
1085   standby         KJS::HTMLElement::ObjectStandby         DontDelete
1086   tabIndex        KJS::HTMLElement::ObjectTabIndex        DontDelete
1087   type            KJS::HTMLElement::ObjectType            DontDelete
1088   useMap          KJS::HTMLElement::ObjectUseMap          DontDelete
1089   vspace          KJS::HTMLElement::ObjectVspace          DontDelete
1090   width           KJS::HTMLElement::ObjectWidth           DontDelete
1091 @end
1092 @begin HTMLParamElementTable 4
1093   name          KJS::HTMLElement::ParamName             DontDelete
1094   type          KJS::HTMLElement::ParamType             DontDelete
1095   value         KJS::HTMLElement::ParamValue            DontDelete
1096   valueType     KJS::HTMLElement::ParamValueType        DontDelete
1097 @end
1098 @begin HTMLAppletElementTable 11
1099   align         KJS::HTMLElement::AppletAlign           DontDelete
1100   alt           KJS::HTMLElement::AppletAlt             DontDelete
1101   archive       KJS::HTMLElement::AppletArchive         DontDelete
1102   code          KJS::HTMLElement::AppletCode            DontDelete
1103   codeBase      KJS::HTMLElement::AppletCodeBase        DontDelete
1104   height        KJS::HTMLElement::AppletHeight          DontDelete
1105   hspace        KJS::HTMLElement::AppletHspace          DontDelete
1106   name          KJS::HTMLElement::AppletName            DontDelete
1107   object        KJS::HTMLElement::AppletObject          DontDelete
1108   vspace        KJS::HTMLElement::AppletVspace          DontDelete
1109   width         KJS::HTMLElement::AppletWidth           DontDelete
1110 @end
1111 @begin HTMLMapElementTable 2
1112   areas         KJS::HTMLElement::MapAreas              DontDelete|ReadOnly
1113   name          KJS::HTMLElement::MapName               DontDelete
1114 @end
1115 @begin HTMLAreaElementTable 15
1116   accessKey     KJS::HTMLElement::AreaAccessKey         DontDelete
1117   alt           KJS::HTMLElement::AreaAlt               DontDelete
1118   coords        KJS::HTMLElement::AreaCoords            DontDelete
1119   href          KJS::HTMLElement::AreaHref              DontDelete
1120   hash          KJS::HTMLElement::AreaHash              DontDelete|ReadOnly
1121   host          KJS::HTMLElement::AreaHost              DontDelete|ReadOnly
1122   hostname      KJS::HTMLElement::AreaHostName          DontDelete|ReadOnly
1123   pathname      KJS::HTMLElement::AreaPathName          DontDelete|ReadOnly
1124   port          KJS::HTMLElement::AreaPort              DontDelete|ReadOnly
1125   protocol      KJS::HTMLElement::AreaProtocol          DontDelete|ReadOnly
1126   search        KJS::HTMLElement::AreaSearch            DontDelete|ReadOnly
1127   noHref        KJS::HTMLElement::AreaNoHref            DontDelete
1128   shape         KJS::HTMLElement::AreaShape             DontDelete
1129   tabIndex      KJS::HTMLElement::AreaTabIndex          DontDelete
1130   target        KJS::HTMLElement::AreaTarget            DontDelete
1131 @end
1132 @begin HTMLScriptElementTable 7
1133   text          KJS::HTMLElement::ScriptText            DontDelete
1134   htmlFor       KJS::HTMLElement::ScriptHtmlFor         DontDelete
1135   event         KJS::HTMLElement::ScriptEvent           DontDelete
1136   charset       KJS::HTMLElement::ScriptCharset         DontDelete
1137   defer         KJS::HTMLElement::ScriptDefer           DontDelete
1138   src           KJS::HTMLElement::ScriptSrc             DontDelete
1139   type          KJS::HTMLElement::ScriptType            DontDelete
1140 @end
1141 @begin HTMLTableElementTable 23
1142   caption       KJS::HTMLElement::TableCaption          DontDelete
1143   tHead         KJS::HTMLElement::TableTHead            DontDelete
1144   tFoot         KJS::HTMLElement::TableTFoot            DontDelete
1145   rows          KJS::HTMLElement::TableRows             DontDelete|ReadOnly
1146   tBodies       KJS::HTMLElement::TableTBodies          DontDelete|ReadOnly
1147   align         KJS::HTMLElement::TableAlign            DontDelete
1148   bgColor       KJS::HTMLElement::TableBgColor          DontDelete
1149   border        KJS::HTMLElement::TableBorder           DontDelete
1150   cellPadding   KJS::HTMLElement::TableCellPadding      DontDelete
1151   cellSpacing   KJS::HTMLElement::TableCellSpacing      DontDelete
1152   frame         KJS::HTMLElement::TableFrame            DontDelete
1153   rules         KJS::HTMLElement::TableRules            DontDelete
1154   summary       KJS::HTMLElement::TableSummary          DontDelete
1155   width         KJS::HTMLElement::TableWidth            DontDelete
1156   createTHead   KJS::HTMLElement::TableCreateTHead      DontDelete|Function 0
1157   deleteTHead   KJS::HTMLElement::TableDeleteTHead      DontDelete|Function 0
1158   createTFoot   KJS::HTMLElement::TableCreateTFoot      DontDelete|Function 0
1159   deleteTFoot   KJS::HTMLElement::TableDeleteTFoot      DontDelete|Function 0
1160   createCaption KJS::HTMLElement::TableCreateCaption    DontDelete|Function 0
1161   deleteCaption KJS::HTMLElement::TableDeleteCaption    DontDelete|Function 0
1162   insertRow     KJS::HTMLElement::TableInsertRow        DontDelete|Function 1
1163   deleteRow     KJS::HTMLElement::TableDeleteRow        DontDelete|Function 1
1164 @end
1165 @begin HTMLTableCaptionElementTable 1
1166   align         KJS::HTMLElement::TableCaptionAlign     DontDelete
1167 @end
1168 @begin HTMLTableColElementTable 7
1169   align         KJS::HTMLElement::TableColAlign         DontDelete
1170   ch            KJS::HTMLElement::TableColCh            DontDelete
1171   chOff         KJS::HTMLElement::TableColChOff         DontDelete
1172   span          KJS::HTMLElement::TableColSpan          DontDelete
1173   vAlign        KJS::HTMLElement::TableColVAlign        DontDelete
1174   width         KJS::HTMLElement::TableColWidth         DontDelete
1175 @end
1176 @begin HTMLTableSectionElementTable 7
1177   align         KJS::HTMLElement::TableSectionAlign             DontDelete
1178   ch            KJS::HTMLElement::TableSectionCh                DontDelete
1179   chOff         KJS::HTMLElement::TableSectionChOff             DontDelete
1180   vAlign        KJS::HTMLElement::TableSectionVAlign            DontDelete
1181   rows          KJS::HTMLElement::TableSectionRows              DontDelete|ReadOnly
1182   insertRow     KJS::HTMLElement::TableSectionInsertRow         DontDelete|Function 1
1183   deleteRow     KJS::HTMLElement::TableSectionDeleteRow         DontDelete|Function 1
1184 @end
1185 @begin HTMLTableRowElementTable 11
1186   rowIndex      KJS::HTMLElement::TableRowRowIndex              DontDelete|ReadOnly
1187   sectionRowIndex KJS::HTMLElement::TableRowSectionRowIndex     DontDelete|ReadOnly
1188   cells         KJS::HTMLElement::TableRowCells                 DontDelete|ReadOnly
1189   align         KJS::HTMLElement::TableRowAlign                 DontDelete
1190   bgColor       KJS::HTMLElement::TableRowBgColor               DontDelete
1191   ch            KJS::HTMLElement::TableRowCh                    DontDelete
1192   chOff         KJS::HTMLElement::TableRowChOff                 DontDelete
1193   vAlign        KJS::HTMLElement::TableRowVAlign                DontDelete
1194   insertCell    KJS::HTMLElement::TableRowInsertCell            DontDelete|Function 1
1195   deleteCell    KJS::HTMLElement::TableRowDeleteCell            DontDelete|Function 1
1196 @end
1197 @begin HTMLTableCellElementTable 15
1198   cellIndex     KJS::HTMLElement::TableCellCellIndex            DontDelete|ReadOnly
1199   abbr          KJS::HTMLElement::TableCellAbbr                 DontDelete
1200   align         KJS::HTMLElement::TableCellAlign                DontDelete
1201   axis          KJS::HTMLElement::TableCellAxis                 DontDelete
1202   bgColor       KJS::HTMLElement::TableCellBgColor              DontDelete
1203   ch            KJS::HTMLElement::TableCellCh                   DontDelete
1204   chOff         KJS::HTMLElement::TableCellChOff                DontDelete
1205   colSpan       KJS::HTMLElement::TableCellColSpan              DontDelete
1206   headers       KJS::HTMLElement::TableCellHeaders              DontDelete
1207   height        KJS::HTMLElement::TableCellHeight               DontDelete
1208   noWrap        KJS::HTMLElement::TableCellNoWrap               DontDelete
1209   rowSpan       KJS::HTMLElement::TableCellRowSpan              DontDelete
1210   scope         KJS::HTMLElement::TableCellScope                DontDelete
1211   vAlign        KJS::HTMLElement::TableCellVAlign               DontDelete
1212   width         KJS::HTMLElement::TableCellWidth                DontDelete
1213 @end
1214 @begin HTMLFrameSetElementTable 2
1215   cols          KJS::HTMLElement::FrameSetCols                  DontDelete
1216   rows          KJS::HTMLElement::FrameSetRows                  DontDelete
1217 @end
1218 @begin HTMLFrameElementTable 9
1219   contentDocument KJS::HTMLElement::FrameContentDocument        DontDelete|ReadOnly
1220   contentWindow   KJS::HTMLElement::FrameContentWindow          DontDelete|ReadOnly
1221   frameBorder     KJS::HTMLElement::FrameFrameBorder            DontDelete
1222   longDesc        KJS::HTMLElement::FrameLongDesc               DontDelete
1223   marginHeight    KJS::HTMLElement::FrameMarginHeight           DontDelete
1224   marginWidth     KJS::HTMLElement::FrameMarginWidth            DontDelete
1225   name            KJS::HTMLElement::FrameName                   DontDelete
1226   noResize        KJS::HTMLElement::FrameNoResize               DontDelete
1227   scrolling       KJS::HTMLElement::FrameScrolling              DontDelete
1228   src             KJS::HTMLElement::FrameSrc                    DontDelete
1229   location        KJS::HTMLElement::FrameLocation               DontDelete
1230 @end
1231 @begin HTMLIFrameElementTable 12
1232   align           KJS::HTMLElement::IFrameAlign                 DontDelete
1233   contentDocument KJS::HTMLElement::IFrameContentDocument       DontDelete|ReadOnly
1234   contentWindow   KJS::HTMLElement::IFrameContentWindow         DontDelete|ReadOnly
1235   document        KJS::HTMLElement::IFrameDocument              DontDelete|ReadOnly
1236   frameBorder     KJS::HTMLElement::IFrameFrameBorder           DontDelete
1237   height          KJS::HTMLElement::IFrameHeight                DontDelete
1238   longDesc        KJS::HTMLElement::IFrameLongDesc              DontDelete
1239   marginHeight    KJS::HTMLElement::IFrameMarginHeight          DontDelete
1240   marginWidth     KJS::HTMLElement::IFrameMarginWidth           DontDelete
1241   name            KJS::HTMLElement::IFrameName                  DontDelete
1242   scrolling       KJS::HTMLElement::IFrameScrolling             DontDelete
1243   src             KJS::HTMLElement::IFrameSrc                   DontDelete
1244   width           KJS::HTMLElement::IFrameWidth                 DontDelete
1245 @end
1246
1247 @begin HTMLMarqueeElementTable 2
1248   start           KJS::HTMLElement::MarqueeStart                DontDelete|Function 0
1249   stop            KJS::HTMLElement::MarqueeStop                 DontDelete|Function 0
1250 @end
1251
1252 @begin HTMLCanvasElementTable 1
1253   getContext      KJS::HTMLElement::GetContext                  DontDelete|Function 1
1254 @end
1255 */
1256
1257 HTMLElement::HTMLElement(ExecState *exec, HTMLElementImpl *e)
1258     : DOMElement(exec, e)
1259 {
1260 }
1261
1262 ValueImp *HTMLElement::formIndexGetter(ExecState *exec, const Identifier& propertyName, const PropertySlot& slot)
1263 {
1264     HTMLElement *thisObj = static_cast<HTMLElement *>(slot.slotBase());
1265     HTMLFormElementImpl *form = static_cast<HTMLFormElementImpl *>(thisObj->impl());
1266
1267     return getDOMNode(exec, form->elements()->item(slot.index()));
1268 }
1269
1270 ValueImp *HTMLElement::formNameGetter(ExecState *exec, const Identifier& propertyName, const PropertySlot& slot)
1271 {
1272     HTMLElement *thisObj = static_cast<HTMLElement *>(slot.slotBase());
1273     HTMLFormElementImpl *form = static_cast<HTMLFormElementImpl *>(thisObj->impl());
1274     
1275     return HTMLCollection(exec, form->elements().get()).getNamedItems(exec, propertyName);
1276 }
1277
1278 ValueImp *HTMLElement::selectIndexGetter(ExecState *exec, const Identifier& propertyName, const PropertySlot& slot)
1279 {
1280     HTMLElement *thisObj = static_cast<HTMLElement *>(slot.slotBase());
1281     HTMLSelectElementImpl *select = static_cast<HTMLSelectElementImpl *>(thisObj->impl());
1282
1283     return getDOMNode(exec, select->optionsHTMLCollection()->item(slot.index()));
1284 }
1285
1286 ValueImp *HTMLElement::framesetNameGetter(ExecState *exec, const Identifier& propertyName, const PropertySlot& slot)
1287 {
1288     HTMLElement *thisObj = static_cast<HTMLElement *>(slot.slotBase());
1289     HTMLElementImpl *element = static_cast<HTMLElementImpl *>(thisObj->impl());
1290
1291     NodeImpl *frame = element->children()->namedItem(propertyName.domString());
1292     if (DocumentImpl* doc = static_cast<HTMLFrameElementImpl *>(frame)->contentDocument())
1293         if (Window *window = Window::retrieveWindow(doc->part()))
1294             return window;
1295
1296     return Undefined();
1297 }
1298
1299 ValueImp *HTMLElement::frameWindowPropertyGetter(ExecState *exec, const Identifier& propertyName, const PropertySlot& slot)
1300 {
1301     HTMLElement *thisObj = static_cast<HTMLElement *>(slot.slotBase());
1302
1303     if (DocumentImpl *doc = static_cast<HTMLFrameElementImpl *>(thisObj->impl())->contentDocument())
1304         if (Window *window = Window::retrieveWindow(doc->part()))
1305             return window->get(exec, propertyName);
1306
1307     return Undefined();
1308 }
1309
1310 ValueImp *HTMLElement::runtimeObjectGetter(ExecState *exec, const Identifier& propertyName, const PropertySlot& slot)
1311 {
1312     HTMLElement *thisObj = static_cast<HTMLElement *>(slot.slotBase());
1313     HTMLElementImpl *element = static_cast<HTMLElementImpl *>(thisObj->impl());
1314
1315     return getRuntimeObject(exec, element);
1316 }
1317
1318 ValueImp *HTMLElement::runtimeObjectPropertyGetter(ExecState *exec, const Identifier& propertyName, const PropertySlot& slot)
1319 {
1320     HTMLElement *thisObj = static_cast<HTMLElement *>(slot.slotBase());
1321     HTMLElementImpl *element = static_cast<HTMLElementImpl *>(thisObj->impl());
1322
1323     if (ValueImp *runtimeObject = getRuntimeObject(exec, element))
1324         return static_cast<ObjectImp *>(runtimeObject)->get(exec, propertyName);
1325     return Undefined();
1326 }
1327
1328 bool HTMLElement::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot)
1329 {
1330     HTMLElementImpl &element = *static_cast<HTMLElementImpl *>(impl());
1331
1332     // First look at dynamic properties
1333     if (element.hasLocalName(formTag)) {
1334         HTMLFormElementImpl &form = static_cast<HTMLFormElementImpl &>(element);
1335         // Check if we're retrieving an element (by index or by name)
1336         bool ok;
1337         uint u = propertyName.toUInt32(&ok);
1338         if (ok) {
1339             slot.setCustomIndex(this, u, formIndexGetter);
1340             return true;
1341         }
1342
1343         // FIXME: need faster way to check for a named item and/or a way to pass on the named items subcollection
1344         ValueImp *namedItems = HTMLCollection(exec, form.elements().get()).getNamedItems(exec, propertyName);
1345         if (!namedItems->isUndefined()) {
1346             slot.setCustom(this, formNameGetter);
1347             return true;
1348         }
1349     } else if (element.hasLocalName(selectTag)) {
1350         bool ok;
1351         uint u = propertyName.toUInt32(&ok);
1352         if (ok) {
1353             // not specified by DOM(?) but supported in netscape/IE
1354             slot.setCustomIndex(this, u, selectIndexGetter);
1355             return true;
1356         }
1357     } else if (element.hasLocalName(framesetTag)) {
1358         NodeImpl *frame = element.children()->namedItem(propertyName.domString());
1359         if (frame && frame->hasTagName(frameTag)) {
1360             slot.setCustom(this, framesetNameGetter);
1361         }
1362     } else if (element.hasLocalName(frameTag) || element.hasLocalName(iframeTag)) {
1363         if (DocumentImpl* doc = static_cast<HTMLFrameElementImpl &>(element).contentDocument()) {
1364             Window *window = Window::retrieveWindow(doc->part());
1365             if (window && window->hasProperty(exec, propertyName)) {
1366                 slot.setCustom(this, frameWindowPropertyGetter);
1367                 return true;
1368             }
1369         }
1370     }
1371     else if (element.hasLocalName(embedTag) || element.hasLocalName(objectTag) ||
1372              element.hasLocalName(appletTag)) {
1373         if (propertyName == "__apple_runtime_object") {
1374             slot.setCustom(this, runtimeObjectGetter);
1375             return true;
1376         }
1377         ValueImp *runtimeObject = getRuntimeObject(exec,&element);
1378         if (runtimeObject) {
1379             ObjectImp *imp = static_cast<ObjectImp *>(runtimeObject);
1380             if (imp->hasProperty(exec, propertyName)) {
1381                 slot.setCustom(this, runtimeObjectPropertyGetter);
1382                 return true;
1383             }
1384         }
1385     }
1386
1387     const HashTable* table = classInfo()->propHashTable; // get the right hashtable
1388     const HashEntry* entry = Lookup::findEntry(table, propertyName);
1389     if (entry) {
1390         // don't expose selection properties for input types that can't have a selection
1391         if (element.hasLocalName(inputTag) &&
1392             !static_cast<HTMLInputElementImpl *>(impl())->canHaveSelection()) {
1393             switch (entry->value) {
1394             case InputSetSelectionRange:
1395             case InputSelectionStart:
1396             case InputSelectionEnd:
1397                 break;
1398             default:
1399                 if (entry->attr & Function)
1400                     slot.setStaticEntry(this, entry, staticFunctionGetter<HTMLElementFunction>); 
1401                 else
1402                     slot.setStaticEntry(this, entry, staticValueGetter<HTMLElement>);
1403                 return true;
1404             }
1405         } else {
1406             if (entry->attr & Function)
1407                 slot.setStaticEntry(this, entry, staticFunctionGetter<HTMLElementFunction>); 
1408             else
1409                 slot.setStaticEntry(this, entry, staticValueGetter<HTMLElement>);
1410             return true;
1411         }
1412     }
1413
1414     // Base HTMLElement stuff or parent class forward, as usual
1415     return getStaticPropertySlot<HTMLElementFunction, HTMLElement, DOMElement>(exec, &HTMLElementTable, this, propertyName, slot);
1416 }
1417
1418 bool KJS::HTMLElement::implementsCall() const
1419 {
1420     HTMLElementImpl *element = static_cast<HTMLElementImpl *>(impl());
1421     if (element->hasTagName(embedTag) || element->hasTagName(objectTag) || element->hasTagName(appletTag)) {
1422         DocumentImpl* doc = element->getDocument();
1423         KJSProxy *proxy = KJSProxy::proxy(doc->part());
1424         ExecState *exec = proxy->interpreter()->globalExec();
1425         if (ValueImp *runtimeObject = getRuntimeObject(exec, element))
1426             return static_cast<ObjectImp *>(runtimeObject)->implementsCall();
1427     }
1428     return false;
1429 }
1430
1431 ValueImp *KJS::HTMLElement::callAsFunction(ExecState *exec, ObjectImp *thisObj, const List&args)
1432 {
1433     HTMLElementImpl *element = static_cast<HTMLElementImpl *>(impl());
1434     if (element->hasTagName(embedTag) || element->hasTagName(objectTag) || element->hasTagName(appletTag)) {
1435         if (ValueImp *runtimeObject = getRuntimeObject(exec, element))
1436             return static_cast<ObjectImp *>(runtimeObject)->call(exec, thisObj, args);
1437     }
1438     return Undefined();
1439 }
1440
1441 ValueImp *HTMLElement::htmlGetter(ExecState* exec, int token) const
1442 {
1443     HTMLHtmlElementImpl& html = *static_cast<HTMLHtmlElementImpl*>(impl());
1444     if (token == HtmlVersion)
1445         return String(html.version());
1446     return Undefined();
1447 }
1448
1449 ValueImp *HTMLElement::headGetter(ExecState* exec, int token) const
1450 {
1451     HTMLHeadElementImpl &head = *static_cast<HTMLHeadElementImpl*>(impl());
1452     if (token == HeadProfile)
1453         return String(head.profile());
1454     return Undefined();
1455 }
1456
1457 ValueImp *HTMLElement::linkGetter(ExecState* exec, int token) const
1458 {
1459     HTMLLinkElementImpl &link = *static_cast<HTMLLinkElementImpl*>(impl());
1460     switch (token) {
1461         case LinkDisabled:
1462             return Boolean(link.disabled());
1463         case LinkCharset:
1464             return String(link.charset());
1465         case LinkHref:
1466             return String(link.href());
1467         case LinkHrefLang:
1468             return String(link.hreflang());
1469         case LinkMedia:           
1470             return String(link.media());
1471         case LinkRel:             
1472             return String(link.rel());
1473         case LinkRev:            
1474             return String(link.rev());
1475         case LinkTarget:          
1476             return String(link.target());
1477         case LinkType:            
1478             return String(link.type());
1479         case LinkSheet:           
1480             return getDOMStyleSheet(exec, link.sheet());
1481     }
1482     return Undefined();
1483 }
1484
1485 ValueImp *HTMLElement::titleGetter(ExecState* exec, int token) const
1486 {
1487     HTMLTitleElementImpl& title = *static_cast<HTMLTitleElementImpl*>(impl());
1488     if (token == TitleText)
1489         return String(title.text());
1490     return Undefined();
1491 }
1492
1493 ValueImp *HTMLElement::metaGetter(ExecState* exec, int token) const
1494 {
1495     HTMLMetaElementImpl& meta = *static_cast<HTMLMetaElementImpl*>(impl());
1496     switch (token) {
1497         case MetaContent:         return String(meta.content());
1498         case MetaHttpEquiv:       return String(meta.httpEquiv());
1499         case MetaName:            return String(meta.name());
1500         case MetaScheme:          return String(meta.scheme());
1501     }
1502     return Undefined();
1503 }
1504
1505 ValueImp *HTMLElement::baseGetter(ExecState* exec, int token) const
1506 {
1507     HTMLBaseElementImpl& base = *static_cast<HTMLBaseElementImpl*>(impl());
1508     switch (token) {
1509         case BaseHref:            return String(base.href());
1510         case BaseTarget:          return String(base.target());
1511     }
1512     return Undefined();
1513 }
1514
1515 ValueImp *HTMLElement::isIndexGetter(ExecState* exec, int token) const
1516 {
1517     HTMLIsIndexElementImpl& isindex = *static_cast<HTMLIsIndexElementImpl*>(impl());
1518     switch (token) {
1519         case IsIndexForm:            return getDOMNode(exec, isindex.form()); // type HTMLFormElement
1520         case IsIndexPrompt:          return String(isindex.prompt());
1521     }
1522     return Undefined();
1523 }
1524
1525 ValueImp *HTMLElement::styleGetter(ExecState* exec, int token) const
1526 {
1527     HTMLStyleElementImpl& style = *static_cast<HTMLStyleElementImpl*>(impl());
1528     switch (token) {
1529         case StyleDisabled:        return Boolean(style.disabled());
1530         case StyleMedia:           return String(style.media());
1531         case StyleType:            return String(style.type());
1532         case StyleSheet:           return getDOMStyleSheet(exec, style.sheet());
1533     }
1534     return Undefined();
1535 }
1536
1537 ValueImp *HTMLElement::bodyGetter(ExecState* exec, int token) const
1538 {
1539     HTMLBodyElementImpl& body = *static_cast<HTMLBodyElementImpl*>(impl());
1540     switch (token) {
1541         case BodyALink:           return String(body.aLink());
1542         case BodyBackground:      return String(body.background());
1543         case BodyBgColor:         return String(body.bgColor());
1544         case BodyLink:            return String(body.link());
1545         case BodyText:            return String(body.text());
1546         case BodyVLink:           return String(body.vLink());
1547         default: {
1548             // Update the document's layout before we compute these attributes.
1549             DocumentImpl *doc = body.getDocument();
1550             if (doc)
1551                 doc->updateLayoutIgnorePendingStylesheets();
1552             KHTMLView *view = doc ? doc->view() : 0;
1553             switch (token) {
1554                 case BodyScrollLeft:
1555                     return Number(view ? view->contentsX() : 0);
1556                 case BodyScrollTop:
1557                     return Number(view ? view->contentsY() : 0);
1558                 case BodyScrollHeight:
1559                     return Number(view ? view->contentsHeight() : 0);
1560                 case BodyScrollWidth:
1561                     return Number(view ? view->contentsWidth() : 0);
1562             }
1563         }
1564     }
1565     return Undefined();
1566 }
1567
1568 ValueImp *HTMLElement::formGetter(ExecState* exec, int token) const
1569 {
1570     HTMLFormElementImpl& form = *static_cast<HTMLFormElementImpl*>(impl());
1571     switch (token) {
1572         case FormElements:        return getHTMLCollection(exec, form.elements().get());
1573         case FormLength:          return Number(form.length());
1574         case FormName:            return String(form.name());
1575         case FormAcceptCharset:   return String(form.acceptCharset());
1576         case FormAction:          return String(form.action());
1577         case FormEncType:         return String(form.enctype());
1578         case FormMethod:          return String(form.method());
1579         case FormTarget:          return String(form.target());
1580     }
1581     return Undefined();
1582 }
1583
1584 ValueImp *HTMLElement::selectGetter(ExecState* exec, int token) const
1585 {
1586     HTMLSelectElementImpl& select = *static_cast<HTMLSelectElementImpl*>(impl());
1587     switch (token) {
1588         case SelectType:            return String(select.type());
1589         case SelectSelectedIndex:   return Number(select.selectedIndex());
1590         case SelectValue:           return String(select.value());
1591         case SelectLength:          return Number(select.length());
1592         case SelectForm:            return getDOMNode(exec, select.form()); // type HTMLFormElement
1593         case SelectOptions:         return getSelectHTMLCollection(exec, select.optionsHTMLCollection().get(), &select); // type HTMLCollection
1594         case SelectDisabled:        return Boolean(select.disabled());
1595         case SelectMultiple:        return Boolean(select.multiple());
1596         case SelectName:            return String(select.name());
1597         case SelectSize:            return Number(select.size());
1598         case SelectTabIndex:        return Number(select.tabIndex());
1599     }
1600     return Undefined();
1601 }
1602
1603 ValueImp *HTMLElement::optGroupGetter(ExecState* exec, int token) const
1604 {
1605     HTMLOptGroupElementImpl& optgroup = *static_cast<HTMLOptGroupElementImpl*>(impl());
1606     switch (token) {
1607         case OptGroupDisabled:        return Boolean(optgroup.disabled());
1608         case OptGroupLabel:           return String(optgroup.label());
1609     }
1610     return Undefined();
1611 }
1612
1613 ValueImp *HTMLElement::optionGetter(ExecState* exec, int token) const
1614 {
1615     HTMLOptionElementImpl& option = *static_cast<HTMLOptionElementImpl*>(impl());
1616     switch (token) {
1617         case OptionForm:            return getDOMNode(exec,option.form()); // type HTMLFormElement
1618         case OptionDefaultSelected: return Boolean(option.defaultSelected());
1619         case OptionText:            return String(option.text());
1620         case OptionIndex:           return Number(option.index());
1621         case OptionDisabled:        return Boolean(option.disabled());
1622         case OptionLabel:           return String(option.label());
1623         case OptionSelected:        return Boolean(option.selected());
1624         case OptionValue:           return String(option.value());
1625     }
1626     return Undefined();
1627 }
1628
1629 static ValueImp *getInputSelectionStart(HTMLInputElementImpl &input)
1630 {
1631     if (input.canHaveSelection())
1632         return Number(input.selectionStart());
1633     return Undefined();
1634 }
1635
1636 static ValueImp *getInputSelectionEnd(HTMLInputElementImpl &input)
1637 {
1638     if (input.canHaveSelection())
1639         return Number(input.selectionEnd());
1640     return Undefined();
1641 }
1642
1643 ValueImp *HTMLElement::inputGetter(ExecState* exec, int token) const
1644 {
1645     HTMLInputElementImpl& input = *static_cast<HTMLInputElementImpl*>(impl());
1646     switch (token) {
1647         case InputDefaultValue:    return String(input.defaultValue());
1648         case InputDefaultChecked:  return Boolean(input.defaultChecked());
1649         case InputForm:            return getDOMNode(exec,input.form()); // type HTMLFormElement
1650         case InputAccept:          return String(input.accept());
1651         case InputAccessKey:       return String(input.accessKey());
1652         case InputAlign:           return String(input.align());
1653         case InputAlt:             return String(input.alt());
1654         case InputChecked:         return Boolean(input.checked());
1655         case InputDisabled:        return Boolean(input.disabled());
1656         case InputIndeterminate:   return Boolean(input.indeterminate());
1657         case InputMaxLength:       return Number(input.maxLength());
1658         case InputName:            return String(input.name());
1659         case InputReadOnly:        return Boolean(input.readOnly());
1660         case InputSelectionStart:  return getInputSelectionStart(input);
1661         case InputSelectionEnd:    return getInputSelectionEnd(input);
1662         case InputSize:            return Number(input.size());
1663         case InputSrc:             return String(input.src());
1664         case InputTabIndex:        return Number(input.tabIndex());
1665         case InputType:            return String(input.type());
1666         case InputUseMap:          return String(input.useMap());
1667         case InputValue:           return String(input.value());
1668     }
1669     return Undefined();
1670 }
1671
1672 ValueImp *HTMLElement::textAreaGetter(ExecState* exec, int token) const
1673 {
1674     HTMLTextAreaElementImpl& textarea = *static_cast<HTMLTextAreaElementImpl*>(impl());
1675     switch (token) {
1676         case TextAreaDefaultValue:    return String(textarea.defaultValue());
1677         case TextAreaForm:            return getDOMNode(exec,textarea.form()); // type HTMLFormElement
1678         case TextAreaAccessKey:       return String(textarea.accessKey());
1679         case TextAreaCols:            return Number(textarea.cols());
1680         case TextAreaDisabled:        return Boolean(textarea.disabled());
1681         case TextAreaName:            return String(textarea.name());
1682         case TextAreaReadOnly:        return Boolean(textarea.readOnly());
1683         case TextAreaRows:            return Number(textarea.rows());
1684         case TextAreaSelectionStart:  return Number(textarea.selectionStart());
1685         case TextAreaSelectionEnd:
1686             // FIXME (4363497): Work-around to prevent regression caused by GMail bug (4344954).
1687             // For the love of all that is holy, let's remove this code as soon as
1688             // Google fixes its bug.
1689             if (impl() && impl()->getDocument() && (impl()->getDocument()->domain() == "mail.google.com"))
1690                     return jsUndefined();
1691             
1692             return Number(textarea.selectionEnd());
1693         case TextAreaTabIndex:        return Number(textarea.tabIndex());
1694         case TextAreaType:            return String(textarea.type());
1695         case TextAreaValue:           return String(textarea.value());
1696     }
1697     return Undefined();
1698 }
1699
1700 ValueImp *HTMLElement::buttonGetter(ExecState* exec, int token) const
1701 {
1702     HTMLButtonElementImpl& button = *static_cast<HTMLButtonElementImpl*>(impl());
1703     switch (token) {
1704         case ButtonForm:            return getDOMNode(exec,button.form()); // type HTMLFormElement
1705         case ButtonAccessKey:       return String(button.accessKey());
1706         case ButtonDisabled:        return Boolean(button.disabled());
1707         case ButtonName:            return String(button.name());
1708         case ButtonTabIndex:        return Number(button.tabIndex());
1709         case ButtonType:            return String(button.type());
1710         case ButtonValue:           return String(button.value());
1711     }
1712     return Undefined();
1713 }
1714
1715 ValueImp *HTMLElement::labelGetter(ExecState* exec, int token) const
1716 {
1717     HTMLLabelElementImpl& label = *static_cast<HTMLLabelElementImpl*>(impl());
1718     switch (token) {
1719         case LabelForm:            return getDOMNode(exec,label.form()); // type HTMLFormElement
1720         case LabelAccessKey:       return String(label.accessKey());
1721         case LabelHtmlFor:         return String(label.htmlFor());
1722     }
1723     return Undefined();
1724 }
1725
1726 ValueImp *HTMLElement::fieldSetGetter(ExecState* exec, int token) const
1727 {
1728     HTMLFieldSetElementImpl& fieldSet = *static_cast<HTMLFieldSetElementImpl*>(impl());
1729     if (token == FieldSetForm)
1730         return getDOMNode(exec,fieldSet.form()); // type HTMLFormElement
1731     return Undefined();
1732 }
1733
1734 ValueImp *HTMLElement::legendGetter(ExecState* exec, int token) const
1735 {
1736     HTMLLegendElementImpl& legend = *static_cast<HTMLLegendElementImpl*>(impl());
1737     switch (token) {
1738         case LegendForm:            return getDOMNode(exec,legend.form()); // type HTMLFormElement
1739         case LegendAccessKey:       return String(legend.accessKey());
1740         case LegendAlign:           return String(legend.align());
1741     }
1742     return Undefined();
1743 }
1744
1745 ValueImp *HTMLElement::uListGetter(ExecState* exec, int token) const
1746 {
1747     HTMLUListElementImpl& uList = *static_cast<HTMLUListElementImpl*>(impl());
1748     switch (token) {
1749         case UListCompact:         return Boolean(uList.compact());
1750         case UListType:            return String(uList.type());
1751     }
1752     return Undefined();
1753 }
1754
1755 ValueImp *HTMLElement::oListGetter(ExecState* exec, int token) const
1756 {
1757     HTMLOListElementImpl& oList = *static_cast<HTMLOListElementImpl*>(impl());
1758     switch (token) {
1759         case OListCompact:         return Boolean(oList.compact());
1760         case OListStart:           return Number(oList.start());
1761         case OListType:            return String(oList.type());
1762     }
1763     return Undefined();
1764 }
1765
1766 ValueImp *HTMLElement::dListGetter(ExecState* exec, int token) const
1767 {
1768     HTMLDListElementImpl& dList = *static_cast<HTMLDListElementImpl*>(impl());
1769     if (token == DListCompact)
1770         return Boolean(dList.compact());
1771     return Undefined();
1772 }
1773
1774 ValueImp *HTMLElement::dirGetter(ExecState* exec, int token) const
1775 {
1776     HTMLDirectoryElementImpl& dir = *static_cast<HTMLDirectoryElementImpl*>(impl());
1777     if (token == DirectoryCompact)
1778         return Boolean(dir.compact());
1779     return Undefined();
1780 }
1781
1782 ValueImp *HTMLElement::menuGetter(ExecState* exec, int token) const
1783 {
1784     HTMLMenuElementImpl& menu = *static_cast<HTMLMenuElementImpl*>(impl());
1785     if (token == MenuCompact)
1786         return Boolean(menu.compact());
1787     return Undefined();
1788 }
1789
1790 ValueImp *HTMLElement::liGetter(ExecState* exec, int token) const
1791 {
1792     HTMLLIElementImpl& li = *static_cast<HTMLLIElementImpl*>(impl());
1793     switch (token) {
1794         case LIType:            return String(li.type());
1795         case LIValue:           return Number(li.value());
1796     }
1797     return Undefined();
1798 }
1799
1800 ValueImp *HTMLElement::divGetter(ExecState* exec, int token) const
1801 {
1802     HTMLDivElementImpl& div = *static_cast<HTMLDivElementImpl*>(impl());
1803     if (token == DivAlign)
1804         return String(div.align());
1805     return Undefined();
1806 }
1807
1808 ValueImp *HTMLElement::paragraphGetter(ExecState* exec, int token) const
1809 {
1810     HTMLParagraphElementImpl& p = *static_cast<HTMLParagraphElementImpl*>(impl());
1811     if (token == ParagraphAlign)
1812         return String(p.align());
1813     return Undefined();
1814 }
1815
1816 ValueImp *HTMLElement::headingGetter(ExecState* exec, int token) const
1817 {
1818     HTMLHeadingElementImpl& h = *static_cast<HTMLHeadingElementImpl*>(impl());
1819     if (token == HeadingAlign)
1820         return String(h.align());
1821     return Undefined();
1822 }
1823
1824 ValueImp *HTMLElement::blockQuoteGetter(ExecState* exec, int token) const
1825 {
1826     HTMLBlockquoteElementImpl& blockQuote = *static_cast<HTMLBlockquoteElementImpl*>(impl());
1827     if (token == BlockQuoteCite)
1828         return String(blockQuote.cite());
1829     return Undefined();
1830 }
1831
1832 ValueImp *HTMLElement::quoteGetter(ExecState* exec, int token) const
1833 {
1834     HTMLQuoteElementImpl& quote = *static_cast<HTMLQuoteElementImpl*>(impl());
1835     if (token == QuoteCite)
1836         return String(quote.cite());
1837     return Undefined();
1838 }
1839
1840 ValueImp *HTMLElement::preGetter(ExecState* exec, int token) const
1841 {
1842     // FIXME: Add support for 'wrap' when white-space: pre-wrap is implemented.
1843     HTMLPreElementImpl& pre = *static_cast<HTMLPreElementImpl*>(impl());
1844     if (token == PreWidth)
1845         return Number(pre.width());
1846     if (token == PreWrap)
1847         return Boolean(pre.wrap());
1848     return Undefined();
1849 }
1850
1851 ValueImp *HTMLElement::brGetter(ExecState* exec, int token) const
1852 {
1853     HTMLBRElementImpl& br = *static_cast<HTMLBRElementImpl*>(impl());
1854     if (token == BRClear)
1855         return String(br.clear());
1856     return Undefined();
1857 }
1858
1859 ValueImp *HTMLElement::baseFontGetter(ExecState* exec, int token) const
1860 {
1861     HTMLBaseFontElementImpl& baseFont = *static_cast<HTMLBaseFontElementImpl*>(impl());
1862     switch (token) {
1863         case BaseFontColor:           return String(baseFont.color());
1864         case BaseFontFace:            return String(baseFont.face());
1865         case BaseFontSize:            return String(baseFont.size());
1866     }
1867     return Undefined();
1868 }
1869
1870 ValueImp *HTMLElement::fontGetter(ExecState* exec, int token) const
1871 {
1872     HTMLFontElementImpl& font = *static_cast<HTMLFontElementImpl*>(impl());
1873     switch (token) {
1874         case FontColor:           return String(font.color());
1875         case FontFace:            return String(font.face());
1876         case FontSize:            return String(font.size());
1877     }
1878     return Undefined();
1879 }
1880
1881 ValueImp *HTMLElement::hrGetter(ExecState* exec, int token) const
1882 {
1883     HTMLHRElementImpl& hr = *static_cast<HTMLHRElementImpl*>(impl());
1884     switch (token) {
1885         case HRAlign:           return String(hr.align());
1886         case HRNoShade:         return Boolean(hr.noShade());
1887         case HRSize:            return String(hr.size());
1888         case HRWidth:           return String(hr.width());
1889     }
1890     return Undefined();
1891 }
1892
1893 ValueImp *HTMLElement::modGetter(ExecState* exec, int token) const
1894 {
1895     HTMLModElementImpl& mod = *static_cast<HTMLModElementImpl*>(impl());
1896     switch (token) {
1897         case ModCite:            return String(mod.cite());
1898         case ModDateTime:        return String(mod.dateTime());
1899     }
1900     return Undefined();
1901 }
1902
1903 ValueImp *HTMLElement::anchorGetter(ExecState* exec, int token) const
1904 {
1905     HTMLAnchorElementImpl& anchor = *static_cast<HTMLAnchorElementImpl*>(impl());
1906     switch (token) {
1907         case AnchorAccessKey:       return String(anchor.accessKey());
1908         case AnchorCharset:         return String(anchor.charset());
1909         case AnchorCoords:          return String(anchor.coords());
1910         case AnchorHref:            return String(anchor.href());
1911         case AnchorHrefLang:        return String(anchor.hreflang());
1912         case AnchorHash:            return String('#'+KURL(anchor.href().qstring()).ref());
1913         case AnchorHost:            return String(KURL(anchor.href().qstring()).host());
1914         case AnchorHostname: {
1915             KURL url(anchor.href().qstring());
1916             kdDebug(6070) << "anchor::hostname uses:" <<url.url()<<endl;
1917             if (url.port()==0)
1918                 return String(url.host());
1919             else
1920                 return String(url.host() + ":" + QString::number(url.port()));
1921         }
1922         case AnchorPathName:        return String(KURL(anchor.href().qstring()).path());
1923         case AnchorPort:            return String(QString::number(KURL(anchor.href().qstring()).port()));
1924         case AnchorProtocol:        return String(KURL(anchor.href().qstring()).protocol()+":");
1925         case AnchorSearch:          return String(KURL(anchor.href().qstring()).query());
1926         case AnchorName:            return String(anchor.name());
1927         case AnchorRel:             return String(anchor.rel());
1928         case AnchorRev:             return String(anchor.rev());
1929         case AnchorShape:           return String(anchor.shape());
1930         case AnchorTabIndex:        return Number(anchor.tabIndex());
1931         case AnchorTarget:          return String(anchor.target());
1932         case AnchorType:            return String(anchor.type());
1933         case AnchorText:
1934             if (DocumentImpl* doc = anchor.getDocument())
1935                 doc->updateLayoutIgnorePendingStylesheets();
1936             return String(anchor.innerText());
1937     }
1938     return Undefined();
1939 }
1940
1941 ValueImp *HTMLElement::imageGetter(ExecState* exec, int token) const
1942 {
1943     HTMLImageElementImpl& image = *static_cast<HTMLImageElementImpl*>(impl());
1944     switch (token) {
1945         case ImageName:            return String(image.name());
1946         case ImageAlign:           return String(image.align());
1947         case ImageAlt:             return String(image.alt());
1948         case ImageBorder:          return Number(image.border());
1949         case ImageHeight:          return Number(image.height(true));
1950         case ImageHspace:          return Number(image.hspace());
1951         case ImageIsMap:           return Boolean(image.isMap());
1952         case ImageLongDesc:        return String(image.longDesc());
1953         case ImageSrc:             return String(image.src());
1954         case ImageUseMap:          return String(image.useMap());
1955         case ImageVspace:          return Number(image.vspace());
1956         case ImageWidth:           return Number(image.width(true));
1957         case ImageX:               return Number(image.x());
1958         case ImageY:               return Number(image.y());
1959     }
1960     return Undefined();
1961 }
1962
1963 ValueImp *HTMLElement::objectGetter(ExecState* exec, int token) const
1964 {
1965     HTMLObjectElementImpl& object = *static_cast<HTMLObjectElementImpl*>(impl());
1966     switch (token) {
1967         case ObjectForm:            return getDOMNode(exec,object.form()); // type HTMLFormElement
1968         case ObjectCode:            return String(object.code());
1969         case ObjectAlign:           return String(object.align());
1970         case ObjectArchive:         return String(object.archive());
1971         case ObjectBorder:          return String(object.border());
1972         case ObjectCodeBase:        return String(object.codeBase());
1973         case ObjectCodeType:        return String(object.codeType());
1974         case ObjectContentDocument: return checkNodeSecurity(exec,object.contentDocument()) ? 
1975                                            getDOMNode(exec, object.contentDocument()) : Undefined();
1976         case ObjectData:            return String(object.data());
1977         case ObjectDeclare:         return Boolean(object.declare());
1978         case ObjectHeight:          return String(object.height());
1979         case ObjectHspace:          return String(object.hspace());
1980         case ObjectName:            return String(object.name());
1981         case ObjectStandby:         return String(object.standby());
1982         case ObjectTabIndex:        return Number(object.tabIndex());
1983         case ObjectType:            return String(object.type());
1984         case ObjectUseMap:          return String(object.useMap());
1985         case ObjectVspace:          return String(object.vspace());
1986         case ObjectWidth:           return String(object.width());
1987     }
1988     return Undefined();
1989 }
1990
1991 ValueImp *HTMLElement::paramGetter(ExecState* exec, int token) const
1992 {
1993     HTMLParamElementImpl& param = *static_cast<HTMLParamElementImpl*>(impl());
1994     switch (token) {
1995         case ParamName:            return String(param.name());
1996         case ParamType:            return String(param.type());
1997         case ParamValue:           return String(param.value());
1998         case ParamValueType:       return String(param.valueType());
1999     }
2000     return Undefined();
2001 }
2002
2003 ValueImp *HTMLElement::appletGetter(ExecState* exec, int token) const
2004 {
2005     HTMLAppletElementImpl& applet = *static_cast<HTMLAppletElementImpl*>(impl());
2006     switch (token) {
2007         case AppletAlign:           return String(applet.align());
2008         case AppletAlt:             return String(applet.alt());
2009         case AppletArchive:         return String(applet.archive());
2010         case AppletCode:            return String(applet.code());
2011         case AppletCodeBase:        return String(applet.codeBase());
2012         case AppletHeight:          return String(applet.height());
2013         case AppletHspace:          return String(applet.hspace());
2014         case AppletName:            return String(applet.name());
2015         case AppletObject:          return String(applet.object());
2016         case AppletVspace:          return String(applet.vspace());
2017         case AppletWidth:           return String(applet.width());
2018     }
2019     return Undefined();
2020 }
2021
2022 ValueImp *HTMLElement::mapGetter(ExecState* exec, int token) const
2023 {
2024     HTMLMapElementImpl& map = *static_cast<HTMLMapElementImpl*>(impl());
2025     switch (token) {
2026         case MapAreas:           return getHTMLCollection(exec, map.areas().get()); // type HTMLCollection
2027         case MapName:            return String(map.name());
2028     }
2029     return Undefined();
2030 }
2031
2032 ValueImp *HTMLElement::areaGetter(ExecState* exec, int token) const
2033 {
2034     HTMLAreaElementImpl& area = *static_cast<HTMLAreaElementImpl*>(impl());
2035     switch (token) {
2036         case AreaAccessKey:       return String(area.accessKey());
2037         case AreaAlt:             return String(area.alt());
2038         case AreaCoords:          return String(area.coords());
2039         case AreaHref:            return String(area.href());
2040         case AreaHash:            return String('#'+KURL(area.href().qstring()).ref());
2041         case AreaHost:            return String(KURL(area.href().qstring()).host());
2042         case AreaHostName: {
2043             KURL url(area.href().qstring());
2044             kdDebug(6070) << "link::hostname uses:" <<url.url()<<endl;
2045             if (url.port()==0)
2046                 return String(url.host());
2047             else
2048                 return String(url.host() + ":" + QString::number(url.port()));
2049         }
2050         case AreaPathName:        return String(KURL(area.href().qstring()).path());
2051         case AreaPort:            return String(QString::number(KURL(area.href().qstring()).port()));
2052         case AreaProtocol:        return String(KURL(area.href().qstring()).protocol()+":");
2053         case AreaSearch:          return String(KURL(area.href().qstring()).query());
2054         case AreaNoHref:          return Boolean(area.noHref());
2055         case AreaShape:           return String(area.shape());
2056         case AreaTabIndex:        return Number(area.tabIndex());
2057         case AreaTarget:          return String(area.target());
2058     }
2059     return Undefined();
2060 }
2061
2062 ValueImp *HTMLElement::scriptGetter(ExecState* exec, int token) const
2063 {
2064     HTMLScriptElementImpl& script = *static_cast<HTMLScriptElementImpl*>(impl());
2065     switch (token) {
2066         case ScriptText:            return String(script.text());
2067         case ScriptHtmlFor:         return String(script.htmlFor());
2068         case ScriptEvent:           return String(script.event());
2069         case ScriptCharset:         return String(script.charset());
2070         case ScriptDefer:           return Boolean(script.defer());
2071         case ScriptSrc:             return String(script.src());
2072         case ScriptType:            return String(script.type());
2073     }
2074     return Undefined();
2075 }
2076
2077 ValueImp *HTMLElement::tableGetter(ExecState* exec, int token) const
2078 {
2079     HTMLTableElementImpl& table = *static_cast<HTMLTableElementImpl*>(impl());
2080     switch (token) {
2081         case TableCaption:         return getDOMNode(exec,table.caption()); // type HTMLTableCaptionElement
2082         case TableTHead:           return getDOMNode(exec,table.tHead()); // type HTMLTableSectionElement
2083         case TableTFoot:           return getDOMNode(exec,table.tFoot()); // type HTMLTableSectionElement
2084         case TableRows:            return getHTMLCollection(exec, table.rows().get()); // type HTMLCollection
2085         case TableTBodies:         return getHTMLCollection(exec, table.tBodies().get()); // type HTMLCollection
2086         case TableAlign:           return String(table.align());
2087         case TableBgColor:         return String(table.bgColor());
2088         case TableBorder:          return String(table.border());
2089         case TableCellPadding:     return String(table.cellPadding());
2090         case TableCellSpacing:     return String(table.cellSpacing());
2091         case TableFrame:           return String(table.frame());
2092         case TableRules:           return String(table.rules());
2093         case TableSummary:         return String(table.summary());
2094         case TableWidth:           return String(table.width());
2095     }
2096     return Undefined();
2097 }
2098
2099 ValueImp *HTMLElement::tableCaptionGetter(ExecState* exec, int token) const
2100 {
2101     HTMLTableCaptionElementImpl& tableCaption = *static_cast<HTMLTableCaptionElementImpl*>(impl());
2102     if (token == TableCaptionAlign)
2103         return String(tableCaption.align());
2104     return Undefined();
2105 }
2106
2107 ValueImp *HTMLElement::tableColGetter(ExecState* exec, int token) const
2108 {
2109     HTMLTableColElementImpl& tableCol = *static_cast<HTMLTableColElementImpl*>(impl());
2110     switch (token) {
2111         case TableColAlign:           return String(tableCol.align());
2112         case TableColCh:              return String(tableCol.ch());
2113         case TableColChOff:           return String(tableCol.chOff());
2114         case TableColSpan:            return Number(tableCol.span());
2115         case TableColVAlign:          return String(tableCol.vAlign());
2116         case TableColWidth:           return String(tableCol.width());
2117     }
2118     return Undefined();
2119 }
2120
2121 ValueImp *HTMLElement::tableSectionGetter(ExecState* exec, int token) const
2122 {
2123     HTMLTableSectionElementImpl& tableSection = *static_cast<HTMLTableSectionElementImpl*>(impl());
2124     switch (token) {
2125         case TableSectionAlign:           return String(tableSection.align());
2126         case TableSectionCh:              return String(tableSection.ch());
2127         case TableSectionChOff:           return String(tableSection.chOff());
2128         case TableSectionVAlign:          return String(tableSection.vAlign());
2129         case TableSectionRows:            return getHTMLCollection(exec, tableSection.rows().get()); // type HTMLCollection
2130     }
2131     return Undefined();
2132 }
2133
2134 ValueImp *HTMLElement::tableRowGetter(ExecState* exec, int token) const
2135 {
2136     HTMLTableRowElementImpl& tableRow = *static_cast<HTMLTableRowElementImpl*>(impl());
2137     switch (token) {
2138         case TableRowRowIndex:        return Number(tableRow.rowIndex());
2139         case TableRowSectionRowIndex: return Number(tableRow.sectionRowIndex());
2140         case TableRowCells:           return getHTMLCollection(exec, tableRow.cells().get()); // type HTMLCollection
2141         case TableRowAlign:           return String(tableRow.align());
2142         case TableRowBgColor:         return String(tableRow.bgColor());
2143         case TableRowCh:              return String(tableRow.ch());
2144         case TableRowChOff:           return String(tableRow.chOff());
2145         case TableRowVAlign:          return String(tableRow.vAlign());
2146     }
2147     return Undefined();
2148 }
2149
2150 ValueImp *HTMLElement::tableCellGetter(ExecState* exec, int token) const
2151 {
2152     HTMLTableCellElementImpl& tableCell = *static_cast<HTMLTableCellElementImpl*>(impl());
2153     switch (token) {
2154         case TableCellCellIndex:       return Number(tableCell.cellIndex());
2155         case TableCellAbbr:            return String(tableCell.abbr());
2156         case TableCellAlign:           return String(tableCell.align());
2157         case TableCellAxis:            return String(tableCell.axis());
2158         case TableCellBgColor:         return String(tableCell.bgColor());
2159         case TableCellCh:              return String(tableCell.ch());
2160         case TableCellChOff:           return String(tableCell.chOff());
2161         case TableCellColSpan:         return Number(tableCell.colSpan());
2162         case TableCellHeaders:         return String(tableCell.headers());
2163         case TableCellHeight:          return String(tableCell.height());
2164         case TableCellNoWrap:          return Boolean(tableCell.noWrap());
2165         case TableCellRowSpan:         return Number(tableCell.rowSpan());
2166         case TableCellScope:           return String(tableCell.scope());
2167         case TableCellVAlign:          return String(tableCell.vAlign());
2168         case TableCellWidth:           return String(tableCell.width());
2169     }
2170     return Undefined();
2171 }
2172
2173 ValueImp *HTMLElement::frameSetGetter(ExecState* exec, int token) const
2174 {
2175     HTMLFrameSetElementImpl& frameSet = *static_cast<HTMLFrameSetElementImpl*>(impl());
2176     switch (token) {
2177         case FrameSetCols:            return String(frameSet.cols());
2178         case FrameSetRows:            return String(frameSet.rows());
2179     }
2180     return Undefined();
2181 }
2182
2183 ValueImp *HTMLElement::frameGetter(ExecState* exec, int token) const
2184 {
2185     HTMLFrameElementImpl& frameElement = *static_cast<HTMLFrameElementImpl*>(impl());
2186     switch (token) {
2187         case FrameContentDocument: return checkNodeSecurity(exec,frameElement.contentDocument()) ? 
2188                                           getDOMNode(exec, frameElement.contentDocument()) : Undefined();
2189         case FrameContentWindow:   return checkNodeSecurity(exec,frameElement.contentDocument())
2190                                         ? Window::retrieve(frameElement.contentPart())
2191                                         : Undefined();
2192         case FrameFrameBorder:     return String(frameElement.frameBorder());
2193         case FrameLongDesc:        return String(frameElement.longDesc());
2194         case FrameMarginHeight:    return String(frameElement.marginHeight());
2195         case FrameMarginWidth:     return String(frameElement.marginWidth());
2196         case FrameName:            return String(frameElement.name());
2197         case FrameNoResize:        return Boolean(frameElement.noResize());
2198         case FrameScrolling:       return String(frameElement.scrolling());
2199         case FrameSrc:
2200         case FrameLocation:        return String(frameElement.src());
2201     }
2202     return Undefined();
2203 }
2204
2205 ValueImp *HTMLElement::iFrameGetter(ExecState* exec, int token) const
2206 {
2207     HTMLIFrameElementImpl& iFrame = *static_cast<HTMLIFrameElementImpl*>(impl());
2208     switch (token) {
2209         case IFrameAlign:                return String(iFrame.align());
2210           // ### security check ?
2211         case IFrameDocument: // non-standard, mapped to contentDocument
2212         case IFrameContentDocument: return checkNodeSecurity(exec,iFrame.contentDocument()) ? 
2213                                       getDOMNode(exec, iFrame.contentDocument()) : Undefined();
2214         case IFrameContentWindow:       return checkNodeSecurity(exec,iFrame.contentDocument()) 
2215                                         ? Window::retrieve(iFrame.contentPart())
2216                                         : Undefined();
2217         case IFrameFrameBorder:     return String(iFrame.frameBorder());
2218         case IFrameHeight:          return String(iFrame.height());
2219         case IFrameLongDesc:        return String(iFrame.longDesc());
2220         case IFrameMarginHeight:    return String(iFrame.marginHeight());
2221         case IFrameMarginWidth:     return String(iFrame.marginWidth());
2222         case IFrameName:            return String(iFrame.name());
2223         case IFrameScrolling:       return String(iFrame.scrolling());
2224         case IFrameSrc:             return String(iFrame.src());
2225         case IFrameWidth:           return String(iFrame.width());
2226     }
2227     return Undefined();
2228 }
2229
2230 ValueImp *HTMLElement::marqueeGetter(ExecState* exec, int token) const
2231 {
2232     // FIXME: Find out what WinIE exposes as properties and implement this.
2233     return Undefined();
2234 }
2235
2236 ValueImp *HTMLElement::getValueProperty(ExecState *exec, int token) const
2237 {
2238     // Check our set of generic properties first.
2239     HTMLElementImpl &element = *static_cast<HTMLElementImpl *>(impl());
2240     switch (token) {
2241         case ElementId:
2242         // iht.com relies on this value being "" when no id is present.  Other browsers do this as well.
2243         // So we use String() instead of String() here.
2244         return String(element.id());
2245         case ElementTitle:
2246             return String(element.title());
2247         case ElementLang:
2248             return String(element.lang());
2249         case ElementDir:
2250             return String(element.dir());
2251         case ElementClassName:
2252             return String(element.className());
2253         case ElementInnerHTML:
2254             return String(element.innerHTML());
2255         case ElementInnerText:
2256             if (DocumentImpl* doc = impl()->getDocument())
2257                 doc->updateLayoutIgnorePendingStylesheets();
2258             return String(element.innerText());
2259         case ElementOuterHTML:
2260             return String(element.outerHTML());
2261         case ElementOuterText:
2262             return String(element.outerText());
2263         case ElementDocument:
2264             return getDOMNode(exec,element.ownerDocument());
2265         case ElementChildren:
2266             return getHTMLCollection(exec, element.children().get());
2267         case ElementContentEditable:
2268             return String(element.contentEditable());
2269         case ElementIsContentEditable:
2270             return Boolean(element.isContentEditable());
2271     }
2272
2273     // Now check the properties specific to our element type.
2274     const Accessors* info = getSetInfo();
2275     if (info && info->m_getter)
2276         return (this->*(info->m_getter))(exec, token);
2277     return Undefined();
2278 }
2279
2280 UString KJS::HTMLElement::toString(ExecState *exec) const
2281 {
2282     if (impl()->hasTagName(aTag))
2283         return UString(static_cast<const HTMLAnchorElementImpl *>(impl())->href());
2284     else
2285         return DOMElement::toString(exec);
2286 }
2287
2288 static HTMLFormElementImpl *getForm(HTMLElementImpl *element)
2289 {
2290     if (element->isGenericFormElement())
2291         return static_cast<HTMLGenericFormElementImpl *>(element)->form();
2292     if (element->hasTagName(labelTag))
2293         return static_cast<HTMLLabelElementImpl *>(element)->form();
2294     if (element->hasTagName(objectTag))
2295         return static_cast<HTMLObjectElementImpl *>(element)->form();
2296
2297     return 0;
2298 }
2299
2300 void KJS::HTMLElement::pushEventHandlerScope(ExecState *exec, ScopeChain &scope) const
2301 {
2302   HTMLElementImpl *element = static_cast<HTMLElementImpl *>(impl());
2303
2304   // The document is put on first, fall back to searching it only after the element and form.
2305   scope.push(static_cast<ObjectImp *>(getDOMNode(exec, element->ownerDocument())));
2306
2307   // The form is next, searched before the document, but after the element itself.
2308   
2309   // First try to obtain the form from the element itself.  We do this to deal with
2310   // the malformed case where <form>s aren't in our parent chain (e.g., when they were inside 
2311   // <table> or <tbody>.
2312   HTMLFormElementImpl *form = getForm(element);
2313   if (form)
2314     scope.push(static_cast<ObjectImp *>(getDOMNode(exec, form)));
2315   else {
2316     NodeImpl *form = element->parentNode();
2317     while (form && !form->hasTagName(formTag))
2318       form = form->parentNode();
2319     
2320     if (form)
2321       scope.push(static_cast<ObjectImp *>(getDOMNode(exec, form)));
2322   }
2323   
2324   // The element is on top, searched first.
2325   scope.push(static_cast<ObjectImp *>(getDOMNode(exec, element)));
2326 }
2327
2328 HTMLElementFunction::HTMLElementFunction(ExecState *exec, int i, int len)
2329   : DOMFunction(), id(i)
2330 {
2331   put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum);
2332 }
2333
2334 ValueImp *KJS::HTMLElementFunction::callAsFunction(ExecState *exec, ObjectImp *thisObj, const List &args)
2335 {
2336     if (!thisObj->inherits(&KJS::HTMLElement::info))
2337         return throwError(exec, TypeError);
2338     kdDebug() << "KJS::HTMLElementFunction::tryCall " << endl;
2339     DOMExceptionTranslator exception(exec);
2340     HTMLElementImpl &element = *static_cast<HTMLElementImpl *>(static_cast<HTMLElement *>(thisObj)->impl());
2341
2342     if (element.hasLocalName(formTag)) {
2343         HTMLFormElementImpl &form = static_cast<HTMLFormElementImpl &>(element);
2344         if (id == KJS::HTMLElement::FormSubmit) {
2345             form.submit();
2346             return Undefined();
2347         }
2348         else if (id == KJS::HTMLElement::FormReset) {
2349             form.reset();
2350             return Undefined();
2351         }
2352     }
2353     else if (element.hasLocalName(selectTag)) {
2354         HTMLSelectElementImpl &select = static_cast<HTMLSelectElementImpl &>(element);
2355         if (id == KJS::HTMLElement::SelectAdd) {
2356             select.add(toHTMLElement(args[0]), toHTMLElement(args[1]), exception);
2357             return Undefined();
2358         }
2359         else if (id == KJS::HTMLElement::SelectRemove) {
2360             select.remove(int(args[0]->toNumber(exec)));
2361             return Undefined();
2362         }
2363         else if (id == KJS::HTMLElement::SelectBlur) {
2364             select.blur();
2365             return Undefined();
2366         }
2367         else if (id == KJS::HTMLElement::SelectFocus) {
2368             select.focus();
2369             return Undefined();
2370         }
2371     }
2372     else if (element.hasLocalName(inputTag)) {
2373         HTMLInputElementImpl &input = static_cast<HTMLInputElementImpl &>(element);
2374         if (id == KJS::HTMLElement::InputBlur) {
2375             input.blur();
2376             return Undefined();
2377         }
2378         else if (id == KJS::HTMLElement::InputFocus) {
2379             input.focus();
2380             return Undefined();
2381         }
2382         else if (id == KJS::HTMLElement::InputSelect) {
2383             input.select();
2384             return Undefined();
2385         }
2386         else if (id == KJS::HTMLElement::InputClick) {
2387             input.click();
2388             return Undefined();
2389         }
2390         else if (id == KJS::HTMLElement::InputSetSelectionRange) {
2391             input.setSelectionRange(args[0]->toInt32(exec), args[1]->toInt32(exec));
2392             return Undefined();
2393         }
2394     }
2395     else if (element.hasLocalName(buttonTag)) {
2396         HTMLButtonElementImpl &button = static_cast<HTMLButtonElementImpl &>(element);
2397         if (id == KJS::HTMLElement::ButtonBlur) {
2398             button.blur();
2399             return Undefined();
2400         }
2401         else if (id == KJS::HTMLElement::ButtonFocus) {
2402             button.focus();
2403             return Undefined();
2404         }
2405     }
2406     else if (element.hasLocalName(labelTag)) {
2407         HTMLLabelElementImpl &label = static_cast<HTMLLabelElementImpl &>(element);
2408         if (id == KJS::HTMLElement::LabelFocus) {
2409             label.focus();
2410             return Undefined();
2411         }
2412     }
2413     else if (element.hasLocalName(legendTag)) {
2414         HTMLLegendElementImpl &legend = static_cast<HTMLLegendElementImpl &>(element);
2415         if (id == KJS::HTMLElement::LegendFocus) {
2416             legend.focus();
2417             return Undefined();
2418         }
2419     }
2420     else if (element.hasLocalName(textareaTag)) {
2421         HTMLTextAreaElementImpl &textarea = static_cast<HTMLTextAreaElementImpl &>(element);
2422         if (id == KJS::HTMLElement::TextAreaBlur) {
2423             textarea.blur();
2424             return Undefined();
2425         }
2426         else if (id == KJS::HTMLElement::TextAreaFocus) {
2427             textarea.focus();
2428             return Undefined();
2429         }
2430         else if (id == KJS::HTMLElement::TextAreaSelect) {
2431             textarea.select();
2432             return Undefined();
2433         }
2434         else if (id == KJS::HTMLElement::TextAreaSetSelectionRange) {
2435             textarea.setSelectionRange(args[0]->toInt32(exec), args[1]->toInt32(exec));
2436             return Undefined();
2437         }
2438     }
2439     else if (element.hasLocalName(aTag)) {
2440         HTMLAnchorElementImpl &anchor = static_cast<HTMLAnchorElementImpl &>(element);
2441         if (id == KJS::HTMLElement::AnchorBlur) {
2442             anchor.blur();
2443             return Undefined();
2444         }
2445         else if (id == KJS::HTMLElement::AnchorFocus) {
2446             anchor.focus();
2447             return Undefined();
2448         }
2449         else if (id == KJS::HTMLElement::AnchorToString)
2450             return String(thisObj->toString(exec));
2451     }
2452     else if (element.hasLocalName(tableTag)) {
2453         HTMLTableElementImpl &table = static_cast<HTMLTableElementImpl &>(element);
2454         if (id == KJS::HTMLElement::TableCreateTHead)
2455             return getDOMNode(exec,table.createTHead());
2456         else if (id == KJS::HTMLElement::TableDeleteTHead) {
2457             table.deleteTHead();
2458             return Undefined();
2459         }
2460         else if (id == KJS::HTMLElement::TableCreateTFoot)
2461             return getDOMNode(exec,table.createTFoot());
2462         else if (id == KJS::HTMLElement::TableDeleteTFoot) {
2463             table.deleteTFoot();
2464             return Undefined();
2465         }
2466         else if (id == KJS::HTMLElement::TableCreateCaption)
2467             return getDOMNode(exec,table.createCaption());
2468         else if (id == KJS::HTMLElement::TableDeleteCaption) {
2469             table.deleteCaption();
2470             return Undefined();
2471         }
2472         else if (id == KJS::HTMLElement::TableInsertRow)
2473             return getDOMNode(exec,table.insertRow(args[0]->toInt32(exec), exception));
2474         else if (id == KJS::HTMLElement::TableDeleteRow) {
2475             table.deleteRow(args[0]->toInt32(exec), exception);
2476             return Undefined();
2477         }
2478     }
2479     else if (element.hasLocalName(theadTag) ||
2480              element.hasLocalName(tbodyTag) ||
2481              element.hasLocalName(tfootTag)) {
2482         HTMLTableSectionElementImpl &tableSection = static_cast<HTMLTableSectionElementImpl &>(element);
2483         if (id == KJS::HTMLElement::TableSectionInsertRow)
2484             return getDOMNode(exec, tableSection.insertRow(args[0]->toInt32(exec), exception));
2485         else if (id == KJS::HTMLElement::TableSectionDeleteRow) {
2486             tableSection.deleteRow(args[0]->toInt32(exec), exception);
2487             return Undefined();
2488         }
2489     }
2490     else if (element.hasLocalName(trTag)) {
2491         HTMLTableRowElementImpl &tableRow = static_cast<HTMLTableRowElementImpl &>(element);
2492         if (id == KJS::HTMLElement::TableRowInsertCell)
2493             return getDOMNode(exec,tableRow.insertCell(args[0]->toInt32(exec), exception));
2494         else if (id == KJS::HTMLElement::TableRowDeleteCell) {
2495             tableRow.deleteCell(args[0]->toInt32(exec), exception);
2496             return Undefined();
2497         }
2498     }
2499     else if (element.hasLocalName(marqueeTag)) {
2500         if (id == KJS::HTMLElement::MarqueeStart && element.renderer() && 
2501             element.renderer()->layer() &&
2502             element.renderer()->layer()->marquee()) {
2503             element.renderer()->layer()->marquee()->start();
2504             return Undefined();
2505         }
2506         if (id == KJS::HTMLElement::MarqueeStop && element.renderer() && 
2507             element.renderer()->layer() &&
2508             element.renderer()->layer()->marquee()) {
2509             element.renderer()->layer()->marquee()->stop();
2510             return Undefined();
2511         }
2512     }
2513     else if (element.hasLocalName(canvasTag)) {
2514         if (id == KJS::HTMLElement::GetContext) {
2515             if (args.size() == 0 || (args.size() == 1 && args[0]->toString(exec).qstring().lower() == "2d")) {
2516                 return new Context2D(&element);
2517             }
2518             return Undefined();
2519         }
2520     }
2521
2522     return Undefined();
2523 }
2524
2525 void KJS::HTMLElement::put(ExecState *exec, const Identifier &propertyName, ValueImp *value, int attr)
2526 {
2527 #ifdef KJS_VERBOSE
2528     DOM::DOMString str = value.isNull() ? DOM::DOMString() : value->toString(exec).domString();
2529 #endif
2530     HTMLElementImpl &element = *static_cast<HTMLElementImpl *>(impl());
2531 #ifdef KJS_VERBOSE
2532     kdDebug(6070) << "KJS::HTMLElement::tryPut " << propertyName.qstring()
2533                   << " thisTag=" << element.tagName().qstring()
2534                   << " str=" << str.qstring() << endl;
2535 #endif
2536     // First look at dynamic properties
2537     if (element.hasLocalName(selectTag)) {
2538         HTMLSelectElementImpl &select = static_cast<HTMLSelectElementImpl &>(element);
2539         bool ok;
2540         /*uint u =*/ propertyName.toUInt32(&ok);
2541         if (ok) {
2542             ObjectImp *coll = static_cast<ObjectImp *>(getSelectHTMLCollection(exec, select.optionsHTMLCollection().get(), &select));
2543             coll->put(exec,propertyName,value);
2544             return;
2545         }
2546     }
2547     else if (element.hasLocalName(embedTag) || element.hasLocalName(objectTag) || element.hasLocalName(appletTag)) {
2548         if (ValueImp *runtimeObject = getRuntimeObject(exec, &element)) {
2549             ObjectImp *imp = static_cast<ObjectImp *>(runtimeObject);
2550             if (imp->canPut(exec, propertyName))
2551                 return imp->put(exec, propertyName, value);
2552         }
2553     }
2554
2555     const HashTable* table = classInfo()->propHashTable; // get the right hashtable
2556     const HashEntry* entry = Lookup::findEntry(table, propertyName);
2557     if (entry) {
2558         if (entry->attr & Function) { // function: put as override property
2559             ObjectImp::put(exec, propertyName, value, attr);
2560             return;
2561         }
2562         else if (!(entry->attr & ReadOnly)) { // let lookupPut print the warning if read-only
2563             putValueProperty(exec, entry->value, value, attr);
2564             return;
2565         }
2566     }
2567
2568     lookupPut<KJS::HTMLElement, DOMElement>(exec, propertyName, value, attr, &HTMLElementTable, this);
2569 }
2570
2571 void HTMLElement::htmlSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2572 {
2573     HTMLHeadElementImpl &head = *static_cast<HTMLHeadElementImpl*>(impl());
2574     if (token == HeadProfile) 
2575         head.setProfile(str);
2576 }
2577
2578 void HTMLElement::headSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2579 {
2580     HTMLHeadElementImpl &head = *static_cast<HTMLHeadElementImpl*>(impl());
2581     if (token == HeadProfile) 
2582         head.setProfile(str);
2583 }
2584
2585 void HTMLElement::linkSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2586 {
2587     HTMLLinkElementImpl &link = *static_cast<HTMLLinkElementImpl*>(impl());
2588     switch (token) {
2589         case LinkDisabled:        { link.setDisabled(value->toBoolean(exec)); return; }
2590         case LinkCharset:         { link.setCharset(str); return; }
2591         case LinkHref:            { link.setHref(str); return; }
2592         case LinkHrefLang:        { link.setHreflang(str); return; }
2593         case LinkMedia:           { link.setMedia(str); return; }
2594         case LinkRel:             { link.setRel(str); return; }
2595         case LinkRev:             { link.setRev(str); return; }
2596         case LinkTarget:          { link.setTarget(str); return; }
2597         case LinkType:            { link.setType(str); return; }
2598     }
2599 }
2600
2601 void HTMLElement::titleSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2602 {
2603      HTMLTitleElementImpl& title = *static_cast<HTMLTitleElementImpl*>(impl());
2604      if (token == TitleText)
2605         title.setText(str);
2606 }
2607
2608 void HTMLElement::metaSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2609 {
2610     HTMLMetaElementImpl& meta = *static_cast<HTMLMetaElementImpl*>(impl());
2611     switch (token) {
2612         case MetaContent:         { meta.setContent(str); return; }
2613         case MetaHttpEquiv:       { meta.setHttpEquiv(str); return; }
2614         case MetaName:            { meta.setName(str); return; }
2615         case MetaScheme:          { meta.setScheme(str); return; }
2616     }
2617 }
2618
2619 void HTMLElement::baseSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2620 {
2621     HTMLBaseElementImpl& base = *static_cast<HTMLBaseElementImpl*>(impl());
2622     switch (token) {
2623         case BaseHref:            { base.setHref(str); return; }
2624         case BaseTarget:          { base.setTarget(str); return; }
2625     }
2626 }
2627
2628 void HTMLElement::isIndexSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2629 {
2630     HTMLIsIndexElementImpl& isindex = *static_cast<HTMLIsIndexElementImpl*>(impl());
2631     if (token == IsIndexPrompt)
2632         isindex.setPrompt(str);
2633 }
2634
2635 void HTMLElement::styleSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2636 {
2637     HTMLStyleElementImpl& style = *static_cast<HTMLStyleElementImpl*>(impl());
2638     switch (token) {
2639         case StyleDisabled:        { style.setDisabled(value->toBoolean(exec)); return; }
2640         case StyleMedia:           { style.setMedia(str); return; }
2641         case StyleType:            { style.setType(str); return; }
2642     }
2643 }
2644
2645 void HTMLElement::bodySetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2646 {
2647     HTMLBodyElementImpl& body = *static_cast<HTMLBodyElementImpl*>(impl());
2648     switch (token) {
2649         case BodyALink:           { body.setALink(str); return; }
2650         case BodyBackground:      { body.setBackground(str); return; }
2651         case BodyBgColor:         { body.setBgColor(str); return; }
2652         case BodyLink:            { body.setLink(str); return; }
2653         case BodyText:            { body.setText(str); return; }
2654         case BodyVLink:           { body.setVLink(str); return; }
2655         case BodyScrollLeft:
2656         case BodyScrollTop: {
2657             QScrollView* sview = body.ownerDocument()->view();
2658             if (sview) {
2659                 // Update the document's layout before we compute these attributes.
2660                 if (DocumentImpl* doc = body.getDocument())
2661                     doc->updateLayoutIgnorePendingStylesheets();
2662                 if (token == BodyScrollLeft)
2663                     sview->setContentsPos(value->toInt32(exec), sview->contentsY());
2664                 else
2665                     sview->setContentsPos(sview->contentsX(), value->toInt32(exec));
2666             }
2667             return;
2668         }
2669     }
2670 }
2671
2672 void HTMLElement::formSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2673 {
2674     HTMLFormElementImpl& form = *static_cast<HTMLFormElementImpl*>(impl());
2675     switch (token) {
2676         // read-only: elements
2677         // read-only: length
2678         case FormName:            { form.setName(str); return; }
2679         case FormAcceptCharset:   { form.setAcceptCharset(str); return; }
2680         case FormAction:          { form.setAction(str); return; }
2681         case FormEncType:         { form.setEnctype(str); return; }
2682         case FormMethod:          { form.setMethod(str); return; }
2683         case FormTarget:          { form.setTarget(str); return; }
2684     }
2685 }
2686
2687 void HTMLElement::selectSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2688 {
2689     HTMLSelectElementImpl& select = *static_cast<HTMLSelectElementImpl*>(impl());
2690     switch (token) {
2691         // read-only: type
2692         case SelectSelectedIndex:   { select.setSelectedIndex(value->toInt32(exec)); return; }
2693         case SelectValue:           { select.setValue(str); return; }
2694         case SelectLength:          { // read-only according to the NS spec, but webpages need it writeable
2695                                         ObjectImp *coll = static_cast<ObjectImp *>(getSelectHTMLCollection(exec, select.optionsHTMLCollection().get(), &select));
2696                                         coll->put(exec,lengthPropertyName,value);
2697                                         return;
2698                                     }
2699         // read-only: form
2700         // read-only: options
2701         case SelectDisabled:        { select.setDisabled(value->toBoolean(exec)); return; }
2702         case SelectMultiple:        { select.setMultiple(value->toBoolean(exec)); return; }
2703         case SelectName:            { select.setName(str); return; }
2704         case SelectSize:            { select.setSize(value->toInt32(exec)); return; }
2705         case SelectTabIndex:        { select.setTabIndex(value->toInt32(exec)); return; }
2706     }
2707 }
2708
2709 void HTMLElement::optGroupSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2710 {
2711     HTMLOptGroupElementImpl& optgroup = *static_cast<HTMLOptGroupElementImpl*>(impl());
2712     switch (token) {
2713         case OptGroupDisabled:        { optgroup.setDisabled(value->toBoolean(exec)); return; }
2714         case OptGroupLabel:           { optgroup.setLabel(str); return; }
2715     }
2716 }
2717
2718 void HTMLElement::optionSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2719 {
2720     DOMExceptionTranslator exception(exec);
2721     HTMLOptionElementImpl& option = *static_cast<HTMLOptionElementImpl*>(impl());
2722     switch (token) {
2723         // read-only: form
2724         case OptionDefaultSelected: { option.setDefaultSelected(value->toBoolean(exec)); return; }
2725         case OptionText:            { option.setText(str, exception); return; }
2726         // read-only: index
2727         case OptionDisabled:        { option.setDisabled(value->toBoolean(exec)); return; }
2728         case OptionLabel:           { option.setLabel(str); return; }
2729         case OptionSelected:        { option.setSelected(value->toBoolean(exec)); return; }
2730         case OptionValue:           { option.setValue(str); return; }
2731     }
2732 }
2733
2734 void HTMLElement::inputSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2735 {
2736     HTMLInputElementImpl& input = *static_cast<HTMLInputElementImpl*>(impl());
2737     switch (token) {
2738         case InputDefaultValue:    { input.setDefaultValue(str); return; }
2739         case InputDefaultChecked:  { input.setDefaultChecked(value->toBoolean(exec)); return; }
2740         // read-only: form
2741         case InputAccept:          { input.setAccept(str); return; }
2742         case InputAccessKey:       { input.setAccessKey(str); return; }
2743         case InputAlign:           { input.setAlign(str); return; }
2744         case InputAlt:             { input.setAlt(str); return; }
2745         case InputChecked:         { input.setChecked(value->toBoolean(exec)); return; }
2746         case InputDisabled:        { input.setDisabled(value->toBoolean(exec)); return; }
2747         case InputIndeterminate:   { input.setIndeterminate(value->toBoolean(exec)); return; }
2748         case InputMaxLength:       { input.setMaxLength(value->toInt32(exec)); return; }
2749         case InputName:            { input.setName(str); return; }
2750         case InputReadOnly:        { input.setReadOnly(value->toBoolean(exec)); return; }
2751         case InputSize:            { input.setSize(value->toInt32(exec)); return; }
2752         case InputSelectionStart:  { input.setSelectionStart(value->toInt32(exec)); return; }
2753         case InputSelectionEnd:    { input.setSelectionEnd(value->toInt32(exec)); return; }
2754         case InputSrc:             { input.setSrc(str); return; }
2755         case InputTabIndex:        { input.setTabIndex(value->toInt32(exec)); return; }
2756         case InputType:            { input.setType(str); return; }
2757         case InputUseMap:          { input.setUseMap(str); return; }
2758         case InputValue:           { input.setValue(str); return; }
2759     }
2760 }
2761
2762 void HTMLElement::textAreaSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2763 {
2764     HTMLTextAreaElementImpl& textarea = *static_cast<HTMLTextAreaElementImpl*>(impl());
2765     switch (token) {
2766         case TextAreaDefaultValue:    { textarea.setDefaultValue(str); return; }
2767         // read-only: form
2768         case TextAreaAccessKey:       { textarea.setAccessKey(str); return; }
2769         case TextAreaCols:            { textarea.setCols(value->toInt32(exec)); return; }
2770         case TextAreaDisabled:        { textarea.setDisabled(value->toBoolean(exec)); return; }
2771         case TextAreaName:            { textarea.setName(str); return; }
2772         case TextAreaReadOnly:        { textarea.setReadOnly(value->toBoolean(exec)); return; }
2773         case TextAreaRows:            { textarea.setRows(value->toInt32(exec)); return; }
2774         case TextAreaSelectionStart:  { textarea.setSelectionStart(value->toInt32(exec)); return; }
2775         case TextAreaSelectionEnd:    { textarea.setSelectionEnd(value->toInt32(exec)); return; }
2776         case TextAreaTabIndex:        { textarea.setTabIndex(value->toInt32(exec)); return; }
2777         // read-only: type
2778         case TextAreaValue:           { textarea.setValue(str); return; }
2779     }
2780 }
2781
2782 void HTMLElement::buttonSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2783 {
2784     HTMLButtonElementImpl& button = *static_cast<HTMLButtonElementImpl*>(impl());
2785     switch (token) {
2786         // read-only: form
2787         case ButtonAccessKey:       { button.setAccessKey(str); return; }
2788         case ButtonDisabled:        { button.setDisabled(value->toBoolean(exec)); return; }
2789         case ButtonName:            { button.setName(str); return; }
2790         case ButtonTabIndex:        { button.setTabIndex(value->toInt32(exec)); return; }
2791         // read-only: type
2792         case ButtonValue:           { button.setValue(str); return; }
2793     }
2794 }
2795
2796 void HTMLElement::labelSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2797 {
2798     HTMLLabelElementImpl& label = *static_cast<HTMLLabelElementImpl*>(impl());
2799     switch (token) {
2800         // read-only: form
2801         case LabelAccessKey:       { label.setAccessKey(str); return; }
2802         case LabelHtmlFor:         { label.setHtmlFor(str); return; }
2803     }
2804 }
2805
2806 void HTMLElement::fieldSetSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2807 {
2808 }
2809
2810 void HTMLElement::legendSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2811 {
2812     HTMLLegendElementImpl& legend = *static_cast<HTMLLegendElementImpl*>(impl());
2813     switch (token) {
2814         // read-only: form
2815         case LegendAccessKey:       { legend.setAccessKey(str); return; }
2816         case LegendAlign:           { legend.setAlign(str); return; }
2817     }
2818 }
2819
2820 void HTMLElement::uListSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2821 {
2822     HTMLUListElementImpl& uList = *static_cast<HTMLUListElementImpl*>(impl());
2823     switch (token) {
2824         case UListCompact:         { uList.setCompact(value->toBoolean(exec)); return; }
2825         case UListType:            { uList.setType(str); return; }
2826     }
2827 }
2828
2829 void HTMLElement::oListSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2830 {
2831     HTMLOListElementImpl& oList = *static_cast<HTMLOListElementImpl*>(impl());
2832     switch (token) {
2833         case OListCompact:         { oList.setCompact(value->toBoolean(exec)); return; }
2834         case OListStart:           { oList.setStart(value->toInt32(exec)); return; }
2835         case OListType:            { oList.setType(str); return; }
2836     }
2837 }
2838
2839 void HTMLElement::dListSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2840 {
2841     HTMLDListElementImpl& dList = *static_cast<HTMLDListElementImpl*>(impl());
2842     if (token == DListCompact)
2843         dList.setCompact(value->toBoolean(exec));
2844 }
2845
2846 void HTMLElement::dirSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2847 {
2848     HTMLDirectoryElementImpl& directory = *static_cast<HTMLDirectoryElementImpl*>(impl());
2849     if (token == DirectoryCompact)
2850         directory.setCompact(value->toBoolean(exec));
2851 }
2852
2853 void HTMLElement::menuSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2854 {
2855     HTMLMenuElementImpl& menu = *static_cast<HTMLMenuElementImpl*>(impl());
2856     if (token == MenuCompact)
2857         menu.setCompact(value->toBoolean(exec));
2858 }
2859
2860 void HTMLElement::liSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2861 {
2862     HTMLLIElementImpl& li = *static_cast<HTMLLIElementImpl*>(impl());
2863     switch (token) {
2864         case LIType:            { li.setType(str); return; }
2865         case LIValue:           { li.setValue(value->toInt32(exec)); return; }
2866     }
2867 }
2868
2869 void HTMLElement::divSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2870 {
2871     HTMLDivElementImpl& div = *static_cast<HTMLDivElementImpl*>(impl());
2872     if (token == DivAlign)
2873         div.setAlign(str);
2874 }
2875
2876 void HTMLElement::paragraphSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2877 {
2878     HTMLParagraphElementImpl& paragraph = *static_cast<HTMLParagraphElementImpl*>(impl());
2879     if (token == ParagraphAlign)
2880         paragraph.setAlign(str);
2881 }
2882
2883 void HTMLElement::headingSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2884 {
2885     HTMLHeadingElementImpl& heading = *static_cast<HTMLHeadingElementImpl*>(impl());
2886     if (token == HeadingAlign)
2887         heading.setAlign(str);
2888 }
2889
2890 void HTMLElement::blockQuoteSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2891 {
2892     HTMLBlockquoteElementImpl& blockQuote = *static_cast<HTMLBlockquoteElementImpl*>(impl());
2893     if (token == BlockQuoteCite)
2894         blockQuote.setCite(str);
2895 }
2896
2897 void HTMLElement::quoteSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2898 {
2899     HTMLQuoteElementImpl& quote = *static_cast<HTMLQuoteElementImpl*>(impl());
2900     if (token == QuoteCite)
2901         quote.setCite(str);
2902 }
2903
2904 void HTMLElement::preSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2905 {
2906     HTMLPreElementImpl& pre = *static_cast<HTMLPreElementImpl*>(impl());
2907     if (token == PreWidth)
2908         pre.setWidth(value->toInt32(exec));
2909     else if (token == PreWrap)
2910         pre.setWrap(value->toBoolean(exec));
2911 }
2912
2913 void HTMLElement::brSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2914 {
2915     HTMLBRElementImpl& br = *static_cast<HTMLBRElementImpl*>(impl());
2916     if (token == BRClear)
2917         br.setClear(str);
2918 }
2919
2920 void HTMLElement::baseFontSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2921 {
2922     HTMLBaseFontElementImpl& baseFont = *static_cast<HTMLBaseFontElementImpl*>(impl());
2923     switch (token) {
2924         case BaseFontColor:           { baseFont.setColor(str); return; }
2925         case BaseFontFace:            { baseFont.setFace(str); return; }
2926         case BaseFontSize:            { baseFont.setSize(str); return; }
2927     }
2928 }
2929
2930 void HTMLElement::fontSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2931 {
2932     HTMLFontElementImpl& font = *static_cast<HTMLFontElementImpl*>(impl());
2933     switch (token) {
2934         case FontColor:           { font.setColor(str); return; }
2935         case FontFace:            { font.setFace(str); return; }
2936         case FontSize:            { font.setSize(str); return; }
2937     }
2938 }
2939
2940 void HTMLElement::hrSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2941 {
2942     HTMLHRElementImpl& hr = *static_cast<HTMLHRElementImpl*>(impl());
2943     switch (token) {
2944         case HRAlign:           { hr.setAlign(str); return; }
2945         case HRNoShade:         { hr.setNoShade(value->toBoolean(exec)); return; }
2946         case HRSize:            { hr.setSize(str); return; }
2947         case HRWidth:           { hr.setWidth(str); return; }
2948     }
2949 }
2950
2951 void HTMLElement::modSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2952 {
2953     HTMLModElementImpl& mod = *static_cast<HTMLModElementImpl*>(impl());
2954     switch (token) {
2955         case ModCite:            { mod.setCite(str); return; }
2956         case ModDateTime:        { mod.setDateTime(str); return; }
2957     }
2958 }
2959
2960 void HTMLElement::anchorSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2961 {
2962     HTMLAnchorElementImpl& anchor = *static_cast<HTMLAnchorElementImpl*>(impl());
2963     switch (token) {
2964         case AnchorAccessKey:       { anchor.setAccessKey(str); return; }
2965         case AnchorCharset:         { anchor.setCharset(str); return; }
2966         case AnchorCoords:          { anchor.setCoords(str); return; }
2967         case AnchorHref:            { anchor.setHref(str); return; }
2968         case AnchorHrefLang:        { anchor.setHreflang(str); return; }
2969         case AnchorName:            { anchor.setName(str); return; }
2970         case AnchorRel:             { anchor.setRel(str); return; }
2971         case AnchorRev:             { anchor.setRev(str); return; }
2972         case AnchorShape:           { anchor.setShape(str); return; }
2973         case AnchorTabIndex:        { anchor.setTabIndex(value->toInt32(exec)); return; }
2974         case AnchorTarget:          { anchor.setTarget(str); return; }
2975         case AnchorType:            { anchor.setType(str); return; }
2976     }
2977 }
2978
2979 void HTMLElement::imageSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2980 {
2981     HTMLImageElementImpl& image = *static_cast<HTMLImageElementImpl*>(impl());
2982     switch (token) {
2983         case ImageName:            { image.setName(str); return; }
2984         case ImageAlign:           { image.setAlign(str); return; }
2985         case ImageAlt:             { image.setAlt(str); return; }
2986         case ImageBorder:          { image.setBorder(value->toInt32(exec)); return; }
2987         case ImageHeight:          { image.setHeight(value->toInt32(exec)); return; }
2988         case ImageHspace:          { image.setHspace(value->toInt32(exec)); return; }
2989         case ImageIsMap:           { image.setIsMap(value->toBoolean(exec)); return; }
2990         case ImageLongDesc:        { image.setLongDesc(str); return; }
2991         case ImageSrc:             { image.setSrc(str); return; }
2992         case ImageUseMap:          { image.setUseMap(str); return; }
2993         case ImageVspace:          { image.setVspace(value->toInt32(exec)); return; }
2994         case ImageWidth:           { image.setWidth(value->toInt32(exec)); return; }
2995     }
2996 }
2997
2998 void HTMLElement::objectSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
2999 {
3000     HTMLObjectElementImpl& object = *static_cast<HTMLObjectElementImpl*>(impl());
3001     switch (token) {
3002         // read-only: form
3003         case ObjectCode:            { object.setCode(str); return; }
3004         case ObjectAlign:           { object.setAlign(str); return; }
3005         case ObjectArchive:         { object.setArchive(str); return; }
3006         case ObjectBorder:          { object.setBorder(str); return; }
3007         case ObjectCodeBase:        { object.setCodeBase(str); return; }
3008         case ObjectCodeType:        { object.setCodeType(str); return; }
3009         // read-only: ObjectContentDocument
3010         case ObjectData:            { object.setData(str); return; }
3011         case ObjectDeclare:         { object.setDeclare(value->toBoolean(exec)); return; }
3012         case ObjectHeight:          { object.setHeight(str); return; }
3013         case ObjectHspace:          { object.setHspace(str); return; }
3014         case ObjectName:            { object.setName(str); return; }
3015         case ObjectStandby:         { object.setStandby(str); return; }
3016         case ObjectTabIndex:        { object.setTabIndex(value->toInt32(exec)); return; }
3017         case ObjectType:            { object.setType(str); return; }
3018         case ObjectUseMap:          { object.setUseMap(str); return; }
3019         case ObjectVspace:          { object.setVspace(str); return; }
3020         case ObjectWidth:           { object.setWidth(str); return; }
3021     }
3022 }
3023
3024 void HTMLElement::paramSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
3025 {
3026     HTMLParamElementImpl& param = *static_cast<HTMLParamElementImpl*>(impl());
3027     switch (token) {
3028         case ParamName:            { param.setName(str); return; }
3029         case ParamType:            { param.setType(str); return; }
3030         case ParamValue:           { param.setValue(str); return; }
3031         case ParamValueType:       { param.setValueType(str); return; }
3032     }
3033 }
3034
3035 void HTMLElement::appletSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
3036 {
3037     HTMLAppletElementImpl& applet = *static_cast<HTMLAppletElementImpl*>(impl());
3038     switch (token) {
3039         case AppletAlign:           { applet.setAlign(str); return; }
3040         case AppletAlt:             { applet.setAlt(str); return; }
3041         case AppletArchive:         { applet.setArchive(str); return; }
3042         case AppletCode:            { applet.setCode(str); return; }
3043         case AppletCodeBase:        { applet.setCodeBase(str); return; }
3044         case AppletHeight:          { applet.setHeight(str); return; }
3045         case AppletHspace:          { applet.setHspace(str); return; }
3046         case AppletName:            { applet.setName(str); return; }
3047         case AppletObject:          { applet.setObject(str); return; }
3048         case AppletVspace:          { applet.setVspace(str); return; }
3049         case AppletWidth:           { applet.setWidth(str); return; }
3050     }
3051 }
3052
3053 void HTMLElement::mapSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
3054 {
3055     HTMLMapElementImpl& map = *static_cast<HTMLMapElementImpl*>(impl());
3056     if (token == MapName)
3057         // read-only: areas
3058         map.setName(str);
3059 }
3060
3061 void HTMLElement::areaSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
3062 {
3063     HTMLAreaElementImpl& area = *static_cast<HTMLAreaElementImpl*>(impl());
3064     switch (token) {
3065         case AreaAccessKey:       { area.setAccessKey(str); return; }
3066         case AreaAlt:             { area.setAlt(str); return; }
3067         case AreaCoords:          { area.setCoords(str); return; }
3068         case AreaHref:            { area.setHref(str); return; }
3069         case AreaNoHref:          { area.setNoHref(value->toBoolean(exec)); return; }
3070         case AreaShape:           { area.setShape(str); return; }
3071         case AreaTabIndex:        { area.setTabIndex(value->toInt32(exec)); return; }
3072         case AreaTarget:          { area.setTarget(str); return; }
3073     }
3074 }
3075
3076 void HTMLElement::scriptSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
3077 {
3078     HTMLScriptElementImpl& script = *static_cast<HTMLScriptElementImpl*>(impl());
3079     switch (token) {
3080         case ScriptText:            { script.setText(str); return; }
3081         case ScriptHtmlFor:         { script.setHtmlFor(str); return; }
3082         case ScriptEvent:           { script.setEvent(str); return; }
3083         case ScriptCharset:         { script.setCharset(str); return; }
3084         case ScriptDefer:           { script.setDefer(value->toBoolean(exec)); return; }
3085         case ScriptSrc:             { script.setSrc(str); return; }
3086         case ScriptType:            { script.setType(str); return; }
3087     }
3088 }
3089
3090 void HTMLElement::tableSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
3091 {
3092     HTMLTableElementImpl& table = *static_cast<HTMLTableElementImpl*>(impl());
3093     switch (token) {
3094         case TableCaption:         { table.setCaption(toHTMLTableCaptionElement(value)); return; }
3095         case TableTHead:           { table.setTHead(toHTMLTableSectionElement(value)); return; }
3096         case TableTFoot:           { table.setTFoot(toHTMLTableSectionElement(value)); return; }
3097         // read-only: rows
3098         // read-only: tbodies
3099         case TableAlign:           { table.setAlign(str); return; }
3100         case TableBgColor:         { table.setBgColor(str); return; }
3101         case TableBorder:          { table.setBorder(str); return; }
3102         case TableCellPadding:     { table.setCellPadding(str); return; }
3103         case TableCellSpacing:     { table.setCellSpacing(str); return; }
3104         case TableFrame:           { table.setFrame(str); return; }
3105         case TableRules:           { table.setRules(str); return; }
3106         case TableSummary:         { table.setSummary(str); return; }
3107         case TableWidth:           { table.setWidth(str); return; }
3108     }
3109 }
3110
3111 void HTMLElement::tableCaptionSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
3112 {
3113     HTMLTableCaptionElementImpl& tableCaption = *static_cast<HTMLTableCaptionElementImpl*>(impl());
3114     if (token == TableCaptionAlign)
3115         tableCaption.setAlign(str);
3116 }
3117
3118 void HTMLElement::tableColSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
3119 {
3120     HTMLTableColElementImpl& tableCol = *static_cast<HTMLTableColElementImpl*>(impl());
3121     switch (token) {
3122         case TableColAlign:           { tableCol.setAlign(str); return; }
3123         case TableColCh:              { tableCol.setCh(str); return; }
3124         case TableColChOff:           { tableCol.setChOff(str); return; }
3125         case TableColSpan:            { tableCol.setSpan(value->toInt32(exec)); return; }
3126         case TableColVAlign:          { tableCol.setVAlign(str); return; }
3127         case TableColWidth:           { tableCol.setWidth(str); return; }
3128     }
3129 }
3130
3131 void HTMLElement::tableSectionSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
3132 {
3133     HTMLTableSectionElementImpl& tableSection = *static_cast<HTMLTableSectionElementImpl*>(impl());
3134     switch (token) {
3135         case TableSectionAlign:           { tableSection.setAlign(str); return; }
3136         case TableSectionCh:              { tableSection.setCh(str); return; }
3137         case TableSectionChOff:           { tableSection.setChOff(str); return; }
3138         case TableSectionVAlign:          { tableSection.setVAlign(str); return; }
3139         // read-only: rows
3140     }
3141 }
3142
3143 void HTMLElement::tableRowSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
3144 {
3145     HTMLTableRowElementImpl& tableRow = *static_cast<HTMLTableRowElementImpl*>(impl());
3146     switch (token) {
3147         // read-only: rowIndex
3148         // read-only: sectionRowIndex
3149         // read-only: cells
3150         case TableRowAlign:           { tableRow.setAlign(str); return; }
3151         case TableRowBgColor:         { tableRow.setBgColor(str); return; }
3152         case TableRowCh:              { tableRow.setCh(str); return; }
3153         case TableRowChOff:           { tableRow.setChOff(str); return; }
3154         case TableRowVAlign:          { tableRow.setVAlign(str); return; }
3155     }
3156 }
3157
3158 void HTMLElement::tableCellSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
3159 {
3160     HTMLTableCellElementImpl& tableCell = *static_cast<HTMLTableCellElementImpl*>(impl());
3161     switch (token) {
3162         // read-only: cellIndex
3163         case TableCellAbbr:            { tableCell.setAbbr(str); return; }
3164         case TableCellAlign:           { tableCell.setAlign(str); return; }
3165         case TableCellAxis:            { tableCell.setAxis(str); return; }
3166         case TableCellBgColor:         { tableCell.setBgColor(str); return; }
3167         case TableCellCh:              { tableCell.setCh(str); return; }
3168         case TableCellChOff:           { tableCell.setChOff(str); return; }
3169         case TableCellColSpan:         { tableCell.setColSpan(value->toInt32(exec)); return; }
3170         case TableCellHeaders:         { tableCell.setHeaders(str); return; }
3171         case TableCellHeight:          { tableCell.setHeight(str); return; }
3172         case TableCellNoWrap:          { tableCell.setNoWrap(value->toBoolean(exec)); return; }
3173         case TableCellRowSpan:         { tableCell.setRowSpan(value->toInt32(exec)); return; }
3174         case TableCellScope:           { tableCell.setScope(str); return; }
3175         case TableCellVAlign:          { tableCell.setVAlign(str); return; }
3176         case TableCellWidth:           { tableCell.setWidth(str); return; }
3177     }
3178 }
3179
3180 void HTMLElement::frameSetSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
3181 {
3182     HTMLFrameSetElementImpl& frameSet = *static_cast<HTMLFrameSetElementImpl*>(impl());
3183     switch (token) {
3184         case FrameSetCols:            { frameSet.setCols(str); return; }
3185         case FrameSetRows:            { frameSet.setRows(str); return; }
3186     }
3187 }
3188
3189 void HTMLElement::frameSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
3190 {
3191     HTMLFrameElementImpl& frameElement = *static_cast<HTMLFrameElementImpl*>(impl());
3192     switch (token) {
3193         // read-only: FrameContentDocument:
3194         case FrameFrameBorder:     { frameElement.setFrameBorder(str); return; }
3195         case FrameLongDesc:        { frameElement.setLongDesc(str); return; }
3196         case FrameMarginHeight:    { frameElement.setMarginHeight(str); return; }
3197         case FrameMarginWidth:     { frameElement.setMarginWidth(str); return; }
3198         case FrameName:            { frameElement.setName(str); return; }
3199         case FrameNoResize:        { frameElement.setNoResize(value->toBoolean(exec)); return; }
3200         case FrameScrolling:       { frameElement.setScrolling(str); return; }
3201         case FrameSrc:             { frameElement.setSrc(str); return; }
3202         case FrameLocation:        { frameElement.setLocation(str); return; }
3203     }
3204 }
3205
3206 void HTMLElement::iFrameSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
3207 {
3208     HTMLIFrameElementImpl& iFrame = *static_cast<HTMLIFrameElementImpl*>(impl());
3209     switch (token) {
3210         case IFrameAlign:           { iFrame.setAlign(str); return; }
3211         // read-only: IFrameContentDocument
3212         case IFrameFrameBorder:     { iFrame.setFrameBorder(str); return; }
3213         case IFrameHeight:          { iFrame.setHeight(str); return; }
3214         case IFrameLongDesc:        { iFrame.setLongDesc(str); return; }
3215         case IFrameMarginHeight:    { iFrame.setMarginHeight(str); return; }
3216         case IFrameMarginWidth:     { iFrame.setMarginWidth(str); return; }
3217         case IFrameName:            { iFrame.setName(str); return; }
3218         case IFrameScrolling:       { iFrame.setScrolling(str); return; }
3219         case IFrameSrc:             { iFrame.setSrc(str); return; }
3220         case IFrameWidth:           { iFrame.setWidth(str); return; }
3221     }
3222 }
3223
3224 void HTMLElement::marqueeSetter(ExecState *exec, int token, ValueImp *value, const DOM::DOMString& str)
3225 {
3226     // FIXME: Find out what WinIE supports and implement it.
3227 }
3228
3229 void HTMLElement::putValueProperty(ExecState *exec, int token, ValueImp *value, int)
3230 {
3231     DOMExceptionTranslator exception(exec);
3232     DOM::DOMString str = value->toString(exec).domString();
3233  
3234     // Check our set of generic properties first.
3235     HTMLElementImpl &element = *static_cast<HTMLElementImpl *>(impl());
3236     switch (token) {
3237         case ElementId:
3238             element.setId(str);
3239             return;
3240         case ElementTitle:
3241             element.setTitle(str);
3242             return;
3243         case ElementLang:
3244             element.setLang(str);
3245             return;
3246         case ElementDir:
3247             element.setDir(str);
3248             return;
3249         case ElementClassName:
3250             element.setClassName(str);
3251             return;
3252         case ElementInnerHTML:
3253             element.setInnerHTML(str, exception);
3254             return;
3255         case ElementInnerText:
3256             element.setInnerText(str, exception);
3257             return;
3258         case ElementOuterHTML:
3259             element.setOuterHTML(str, exception);
3260             return;
3261         case ElementOuterText:
3262             element.setOuterText(str, exception);
3263             return;
3264         case ElementContentEditable:
3265             element.setContentEditable(str);
3266             return;
3267     }
3268
3269     // Now check for properties that apply to a specific element type.
3270     const Accessors* info = getSetInfo();
3271     if (info && info->m_setter)
3272         return (this->*(info->m_setter))(exec, token, value, str);  
3273 }
3274
3275 HTMLElementImpl *toHTMLElement(ValueImp *val)
3276 {
3277     if (!val || !val->isObject(&HTMLElement::info))
3278         return 0;
3279     return static_cast<HTMLElementImpl *>(static_cast<HTMLElement *>(val)->impl());
3280 }
3281
3282 HTMLTableCaptionElementImpl *toHTMLTableCaptionElement(ValueImp *val)
3283 {
3284     HTMLElementImpl *e = toHTMLElement(val);
3285     if (e && e->hasTagName(captionTag))
3286         return static_cast<HTMLTableCaptionElementImpl *>(e);
3287     return 0;
3288 }
3289
3290 HTMLTableSectionElementImpl *toHTMLTableSectionElement(ValueImp *val)
3291 {
3292     HTMLElementImpl *e = toHTMLElement(val);
3293     if (e && (e->hasTagName(theadTag) || e->hasTagName(tbodyTag) || e->hasTagName(tfootTag)))
3294         return static_cast<HTMLTableSectionElementImpl *>(e);
3295     return 0;
3296 }
3297
3298 // -------------------------------------------------------------------------
3299 /* Source for HTMLCollectionProtoTable. Use "make hashtables" to regenerate.
3300 @begin HTMLCollectionProtoTable 3
3301   item          HTMLCollection::Item            DontDelete|Function 1
3302   namedItem     HTMLCollection::NamedItem       DontDelete|Function 1
3303   tags          HTMLCollection::Tags            DontDelete|Function 1
3304 @end
3305 */
3306 DEFINE_PROTOTYPE("HTMLCollection", HTMLCollectionProto)
3307 IMPLEMENT_PROTOFUNC(HTMLCollectionProtoFunc)
3308 IMPLEMENT_PROTOTYPE(HTMLCollectionProto,HTMLCollectionProtoFunc)
3309
3310 const ClassInfo HTMLCollection::info = { "HTMLCollection", 0, 0, 0 };
3311
3312 HTMLCollection::HTMLCollection(ExecState *exec, HTMLCollectionImpl *c)
3313   : m_impl(c) 
3314 {
3315   setPrototype(HTMLCollectionProto::self(exec));
3316 }
3317
3318 HTMLCollection::~HTMLCollection()
3319 {
3320   ScriptInterpreter::forgetDOMObject(m_impl.get());
3321 }
3322
3323 ValueImp *HTMLCollection::lengthGetter(ExecState *exec, const Identifier& propertyName, const PropertySlot& slot)
3324 {
3325     HTMLCollection *thisObj = static_cast<HTMLCollection *>(slot.slotBase());
3326     return Number(thisObj->m_impl->length());
3327 }
3328
3329 ValueImp *HTMLCollection::indexGetter(ExecState *exec, const Identifier& propertyName, const PropertySlot& slot)
3330 {
3331     HTMLCollection *thisObj = static_cast<HTMLCollection *>(slot.slotBase());
3332     return getDOMNode(exec, thisObj->m_impl->item(slot.index()));
3333 }
3334
3335 ValueImp *HTMLCollection::nameGetter(ExecState *exec, const Identifier& propertyName, const PropertySlot& slot)
3336 {
3337     HTMLCollection *thisObj = static_cast<HTMLCollection *>(slot.slotBase());
3338     return thisObj->getNamedItems(exec, propertyName);
3339 }
3340
3341 bool HTMLCollection::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot)
3342 {
3343   if (propertyName == lengthPropertyName) {
3344       slot.setCustom(this, lengthGetter);
3345       return true;
3346   } else {
3347     // Look in the prototype (for functions) before assuming it's an item's name
3348     ValueImp *proto = prototype();
3349     if (proto->isObject() && static_cast<ObjectImp *>(proto)->hasProperty(exec, propertyName))
3350       return false;
3351
3352     // name or index ?
3353     bool ok;
3354     unsigned int u = propertyName.toUInt32(&ok);
3355     if (ok) {
3356       slot.setCustomIndex(this, u, indexGetter);
3357       return true;
3358     }
3359
3360     if (!getNamedItems(exec, propertyName)->isUndefined()) {
3361       slot.setCustom(this, nameGetter);
3362       return true;
3363     }
3364   }
3365
3366   return DOMObject::getOwnPropertySlot(exec, propertyName, slot);
3367 }
3368
3369 // HTMLCollections are strange objects, they support both get and call,
3370 // so that document.forms.item(0) and document.forms(0) both work.
3371 ValueImp *KJS::HTMLCollection::callAsFunction(ExecState *exec, ObjectImp *, const List &args)
3372 {
3373   // Do not use thisObj here. It can be the HTMLDocument, in the document.forms(i) case.
3374   HTMLCollectionImpl &collection = *m_impl;
3375
3376   // Also, do we need the TypeError test here ?
3377
3378   if (args.size() == 1) {
3379     // support for document.all(<index>) etc.
3380     bool ok;
3381     UString s = args[0]->toString(exec);
3382     unsigned int u = s.toUInt32(&ok);
3383     if (ok)
3384       return getDOMNode(exec, collection.item(u));
3385     // support for document.images('<name>') etc.
3386     return getNamedItems(exec, Identifier(s));
3387   }
3388   else if (args.size() >= 1) // the second arg, if set, is the index of the item we want
3389   {
3390     bool ok;
3391     UString s = args[0]->toString(exec);
3392     unsigned int u = args[1]->toString(exec).toUInt32(&ok);
3393     if (ok)
3394     {
3395       DOM::DOMString pstr = s.domString();
3396       NodeImpl *node = collection.namedItem(pstr);
3397       while (node) {
3398         if (!u)
3399           return getDOMNode(exec,node);
3400         node = collection.nextNamedItem(pstr);
3401         --u;
3402       }
3403     }
3404   }
3405   return Undefined();
3406 }
3407
3408 ValueImp *KJS::HTMLCollection::getNamedItems(ExecState *exec, const Identifier &propertyName) const
3409 {
3410 #ifdef KJS_VERBOSE
3411   kdDebug(6070) << "KJS::HTMLCollection::getNamedItems " << propertyName.ascii() << endl;
3412 #endif
3413   DOM::DOMString pstr = propertyName.domString();
3414
3415   QValueList< RefPtr<NodeImpl> > namedItems = m_impl->namedItems(pstr);
3416
3417   if (namedItems.isEmpty()) {
3418 #ifdef KJS_VERBOSE
3419     kdDebug(6070) << "not found" << endl;
3420 #endif
3421     return Undefined();
3422   }
3423
3424   if (namedItems.count() == 1)
3425     return getDOMNode(exec, namedItems[0].get());
3426   
3427   return new DOMNamedNodesCollection(exec, namedItems);
3428 }
3429
3430 ValueImp *KJS::HTMLCollectionProtoFunc::callAsFunction(ExecState *exec, ObjectImp *thisObj, const List &args)
3431 {
3432   if (!thisObj->inherits(&KJS::HTMLCollection::info))
3433     return throwError(exec, TypeError);
3434   HTMLCollectionImpl &coll = *static_cast<HTMLCollection *>(thisObj)->impl();
3435
3436   switch (id) {
3437   case KJS::HTMLCollection::Item:
3438     return getDOMNode(exec,coll.item(args[0]->toUInt32(exec)));
3439   case KJS::HTMLCollection::Tags:
3440     return getDOMNodeList(exec, coll.base()->getElementsByTagName(args[0]->toString(exec).domString()).get());
3441   case KJS::HTMLCollection::NamedItem:
3442     return static_cast<HTMLCollection *>(thisObj)->getNamedItems(exec, Identifier(args[0]->toString(exec)));
3443   default:
3444     return Undefined();
3445   }
3446 }
3447
3448 // -------------------------------------------------------------------------
3449
3450 HTMLSelectCollection::HTMLSelectCollection(ExecState *exec, HTMLCollectionImpl *c, HTMLSelectElementImpl *e)
3451   : HTMLCollection(exec, c), m_element(e)
3452 {
3453 }
3454
3455 ValueImp *HTMLSelectCollection::selectedIndexGetter(ExecState *exec, const Identifier& propertyName, const PropertySlot& slot)
3456 {
3457     HTMLSelectCollection *thisObj = static_cast<HTMLSelectCollection *>(slot.slotBase());
3458     return Number(thisObj->m_element->selectedIndex());
3459 }
3460
3461 bool HTMLSelectCollection::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot)
3462 {
3463   if (propertyName == "selectedIndex") {
3464     slot.setCustom(this, selectedIndexGetter);
3465     //result = Number(m_element->selectedIndex());
3466     return true;
3467   }
3468
3469   return HTMLCollection::getOwnPropertySlot(exec, propertyName, slot);
3470 }
3471
3472 void KJS::HTMLSelectCollection::put(ExecState *exec, const Identifier &propertyName, ValueImp *value, int)
3473 {
3474 #ifdef KJS_VERBOSE
3475   kdDebug(6070) << "KJS::HTMLSelectCollection::put " << propertyName.qstring() << endl;
3476 #endif
3477   if ( propertyName == "selectedIndex" ) {
3478     m_element->setSelectedIndex( value->toInt32( exec ) );
3479     return;
3480   }
3481   // resize ?
3482   else if (propertyName == lengthPropertyName) {
3483     int exception = 0;
3484
3485     unsigned newLen;
3486     bool converted = value->getUInt32(newLen);
3487
3488     if (!converted) {
3489       return;
3490     }
3491
3492     int diff = m_element->length() - newLen;
3493
3494     if (diff < 0) { // add dummy elements
3495       do {
3496         ElementImpl *option = m_element->ownerDocument()->createElement("option", exception);
3497         if (exception)
3498           break;         
3499         m_element->add(static_cast<HTMLElementImpl *>(option), 0, exception);
3500         if (exception)
3501           break;
3502       } while (++diff);
3503     }
3504     else // remove elements
3505       while (diff-- > 0)
3506         m_element->remove(newLen);
3507
3508     setDOMException(exec, exception);
3509     return;
3510   }
3511   // an index ?
3512   bool ok;
3513   unsigned int u = propertyName.toUInt32(&ok);
3514   if (!ok)
3515     return;
3516
3517   if (value->isUndefinedOrNull()) {
3518     // null and undefined delete. others, too ?
3519     m_element->remove(u);
3520     return;
3521   }
3522
3523   // is v an option element ?
3524   NodeImpl *option = toNode(value);
3525   if (!option || !option->hasTagName(optionTag))
3526     return;
3527
3528   int exception = 0;
3529   int diff = int(u) - m_element->length();
3530   HTMLElementImpl *before = 0;
3531   // out of array bounds ? first insert empty dummies
3532   if (diff > 0) {
3533     while (diff--) {
3534       ElementImpl *dummyOption = m_element->ownerDocument()->createElement("option", exception);
3535       if (!dummyOption)
3536         break;      
3537       m_element->add(static_cast<HTMLElementImpl *>(dummyOption), 0, exception);
3538       if (exception) 
3539           break;
3540     }
3541     // replace an existing entry ?
3542   } else if (diff < 0) {
3543     before = static_cast<HTMLElementImpl *>(m_element->options()->item(u+1));
3544     m_element->remove(u);
3545   }
3546   // finally add the new element
3547   if (exception == 0)
3548     m_element->add(static_cast<HTMLOptionElementImpl *>(option), before, exception);
3549
3550   setDOMException(exec, exception);
3551 }
3552
3553 ////////////////////// Option Object ////////////////////////
3554
3555 OptionConstructorImp::OptionConstructorImp(ExecState *exec, DocumentImpl *d)
3556     : m_doc(d)
3557 {
3558   // ## isn't there some redundancy between ObjectImp::_proto and the "prototype" property ?
3559   //put(exec,"prototype", ...,DontEnum|DontDelete|ReadOnly);
3560
3561   // no. of arguments for constructor
3562   // ## is 4 correct ? 0 to 4, it seems to be
3563   put(exec,lengthPropertyName, Number(4), ReadOnly|DontDelete|DontEnum);
3564 }
3565
3566 bool OptionConstructorImp::implementsConstruct() const
3567 {
3568   return true;
3569 }
3570
3571 ObjectImp *OptionConstructorImp::construct(ExecState *exec, const List &args)
3572 {
3573   int exception = 0;
3574   RefPtr<ElementImpl> el(m_doc->createElement("option", exception));
3575   HTMLOptionElementImpl *opt = 0;
3576   if (el) {
3577     opt = static_cast<HTMLOptionElementImpl *>(el.get());
3578     int sz = args.size();
3579     TextImpl *t = m_doc->createTextNode("");
3580     t->ref();
3581     opt->appendChild(t, exception);
3582     if (exception == 0 && sz > 0)
3583       t->setData(args[0]->toString(exec).domString(), exception); // set the text
3584     if (exception == 0 && sz > 1)
3585       opt->setValue(args[1]->toString(exec).domString());
3586     if (exception == 0 && sz > 2)
3587       opt->setDefaultSelected(args[2]->toBoolean(exec));
3588     if (exception == 0 && sz > 3)
3589       opt->setSelected(args[3]->toBoolean(exec));
3590     t->deref();
3591   }
3592
3593   setDOMException(exec, exception);
3594   return static_cast<ObjectImp *>(getDOMNode(exec,opt));
3595 }
3596
3597 ////////////////////// Image Object ////////////////////////
3598
3599 ImageConstructorImp::ImageConstructorImp(ExecState *, DocumentImpl *d)
3600     : m_doc(d)
3601 {
3602 }
3603
3604 bool ImageConstructorImp::implementsConstruct() const
3605 {
3606   return true;
3607 }
3608
3609 ObjectImp *ImageConstructorImp::construct(ExecState * exec, const List & list)
3610 {
3611     bool widthSet = false, heightSet = false;
3612     int width = 0, height = 0;
3613     if (list.size() > 0) {
3614         widthSet = true;
3615         ValueImp *w = list.at(0);
3616         width = w->toInt32(exec);
3617     }
3618     if (list.size() > 1) {
3619         heightSet = true;
3620         ValueImp *h = list.at(1);
3621         height = h->toInt32(exec);
3622     }
3623         
3624     ObjectImp *result(new Image(m_doc.get(), widthSet, width, heightSet, height));
3625   
3626     /* TODO: do we need a prototype ? */
3627     return result;
3628 }
3629
3630 const ClassInfo KJS::Image::info = { "Image", 0, &ImageTable, 0 };
3631
3632 /* Source for ImageTable. Use "make hashtables" to regenerate.
3633 @begin ImageTable 6
3634   src           Image::Src              DontDelete
3635   complete      Image::Complete         DontDelete|ReadOnly
3636   onload        Image::OnLoad           DontDelete
3637   width         Image::Width            DontDelete|ReadOnly
3638   height        Image::Height           DontDelete|ReadOnly
3639 @end
3640 */
3641
3642 bool Image::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot)
3643 {
3644   return getStaticValueSlot<Image,DOMObject>(exec, &ImageTable, this, propertyName, slot);
3645 }
3646
3647 ValueImp *Image::getValueProperty(ExecState *, int token) const
3648 {
3649   switch (token) {
3650   case Src:
3651     return jsString(doc ? doc->completeURL(src.domString()) : src);
3652   case Complete:
3653     return Boolean(!img || img->status() >= khtml::CachedObject::Persistent);
3654   case OnLoad:
3655     if (onLoadListener && onLoadListener->listenerObjImp()) {
3656       return onLoadListener->listenerObj();
3657     } else {
3658       return Null();
3659     }
3660   case Width: {
3661     if (widthSet)
3662         return Number(width);
3663     int w = 0;
3664     if (img) {
3665       QSize size = img->pixmap_size();
3666       if (size.isValid())
3667         w = size.width();
3668     }
3669     return Number(w);
3670   }
3671   case Height: {
3672     if (heightSet)
3673         return Number(height);
3674     int h = 0;
3675     if (img) {
3676       QSize size = img->pixmap_size();
3677       if (size.isValid())
3678         h = size.height();
3679     }
3680     return Number(h);
3681   }
3682   default:
3683     kdWarning() << "Image::getValueProperty unhandled token " << token << endl;
3684     return NULL;
3685   }
3686 }
3687
3688 void Image::put(ExecState *exec, const Identifier &propertyName, ValueImp *value, int attr)
3689 {
3690   lookupPut<Image,DOMObject>(exec, propertyName, value, attr, &ImageTable, this );
3691 }
3692
3693 void Image::putValueProperty(ExecState *exec, int token, ValueImp *value, int /*attr*/)
3694 {
3695   switch(token) {
3696   case Src:
3697   {
3698     src = value->toString(exec);
3699     if ( img ) img->deref(this);
3700     img = doc ? doc->docLoader()->requestImage( src.domString() ) : 0;
3701     if ( img ) img->ref(this);
3702     break;
3703   }
3704   case OnLoad:
3705     onLoadListener = Window::retrieveActive(exec)->getJSEventListener(value, true);
3706     if (onLoadListener) onLoadListener->ref();
3707     break;
3708   case Width:
3709     widthSet = true;
3710     width = value->toInt32(exec);
3711     break;
3712   case Height:
3713     heightSet = true;
3714     height = value->toInt32(exec);
3715     break;
3716   default:
3717     kdWarning() << "HTMLDocument::putValueProperty unhandled token " << token << endl;
3718   }
3719 }
3720
3721 void Image::notifyFinished(khtml::CachedObject *)
3722 {
3723   if (onLoadListener && doc->part()) {
3724     int ignoreException;
3725     EventImpl *ev = doc->createEvent("HTMLEvents", ignoreException);
3726     ev->ref();
3727     ev->initEvent(loadEvent, true, true);
3728     onLoadListener->handleEventImpl(ev, true);
3729     ev->deref();
3730   }
3731 }
3732
3733 Image::Image(DocumentImpl *d, bool ws, int w, bool hs, int h)
3734   : doc(d), img(0), onLoadListener(0)
3735 {
3736       widthSet = ws;
3737       width = w;
3738       heightSet = hs;
3739       height = h;
3740 }
3741
3742 Image::~Image()
3743 {
3744   if ( img ) img->deref(this);
3745   if ( onLoadListener ) onLoadListener->deref();
3746 }
3747
3748
3749 ////////////////////// Context2D Object ////////////////////////
3750
3751 IMPLEMENT_PROTOFUNC(Context2DFunction)
3752
3753 static bool isGradient(ValueImp *value)
3754 {
3755     return value->isObject(&Gradient::info);
3756 }
3757
3758 static bool isImagePattern(ValueImp *value)
3759 {
3760     return value->isObject(&ImagePattern::info);
3761 }
3762
3763 #define BITS_PER_COMPONENT 8
3764 #define BYTES_PER_ROW(width,bitsPerComponent,numComponents) ((width * bitsPerComponent * numComponents + 7)/8)
3765
3766 ValueImp *KJS::Context2DFunction::callAsFunction(ExecState *exec, ObjectImp *thisObj, const List &args)
3767 {
3768     if (!thisObj->inherits(&Context2D::info))
3769         return throwError(exec, TypeError);
3770
3771     Context2D *contextObject = static_cast<KJS::Context2D *>(thisObj);
3772     khtml::RenderCanvasImage *renderer = static_cast<khtml::RenderCanvasImage*>(contextObject->_element->renderer());
3773     if (!renderer)
3774         return Undefined();
3775
3776     CGContextRef drawingContext = renderer->drawingContext();
3777     if (!drawingContext)
3778         return Undefined();
3779     
3780     switch (id) {
3781         case Context2D::Save: {
3782             if (args.size() != 0)
3783                 return throwError(exec, SyntaxError);
3784             CGContextSaveGState(drawingContext);
3785             
3786             contextObject->save();
3787             
3788             break;
3789         }
3790         case Context2D::Restore: {
3791             if (args.size() != 0)
3792                 return throwError(exec, SyntaxError);
3793             CGContextRestoreGState(drawingContext);
3794             
3795             contextObject->restore();
3796             
3797             break;
3798         }
3799         case Context2D::BeginPath: {
3800             if (args.size() != 0)
3801                 return throwError(exec, SyntaxError);
3802             CGContextBeginPath(drawingContext);
3803             break;
3804         }
3805         case Context2D::ClosePath: {
3806             if (args.size() != 0)
3807                 return throwError(exec, SyntaxError);
3808             CGContextClosePath(drawingContext);
3809             break;
3810         }
3811         case Context2D::SetStrokeColor: {
3812             // string arg = named color
3813             // string arg, number arg = named color, alpha
3814             // number arg = gray color
3815             // number arg, number arg = gray color, alpha
3816             // 4 args (string or number) = r, g, b, a
3817             // 5 args (string or number) = c, m, y, k, a
3818             int numArgs = args.size();
3819             switch (numArgs) {