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