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