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