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