diff options
author | Timothy Pearson <[email protected]> | 2013-01-26 13:17:21 -0600 |
---|---|---|
committer | Timothy Pearson <[email protected]> | 2013-01-26 13:17:21 -0600 |
commit | dfe289850f068f19ba4a83ab4e7e22a7e09c13c9 (patch) | |
tree | c297348a55df66c571de4525646e0b9762427353 /tdehtml/ecma/kjs_html.cpp | |
parent | b7658a0d5eca24a9d37c6e04f88298ef02389db0 (diff) | |
download | tdelibs-dfe289850f068f19ba4a83ab4e7e22a7e09c13c9.tar.gz tdelibs-dfe289850f068f19ba4a83ab4e7e22a7e09c13c9.zip |
Rename a number of libraries and executables to avoid conflicts with KDE4
Diffstat (limited to 'tdehtml/ecma/kjs_html.cpp')
-rw-r--r-- | tdehtml/ecma/kjs_html.cpp | 3946 |
1 files changed, 3946 insertions, 0 deletions
diff --git a/tdehtml/ecma/kjs_html.cpp b/tdehtml/ecma/kjs_html.cpp new file mode 100644 index 000000000..37fd70754 --- /dev/null +++ b/tdehtml/ecma/kjs_html.cpp @@ -0,0 +1,3946 @@ +// -*- c-basic-offset: 2 -*- +/* + * This file is part of the KDE libraries + * Copyright (C) 1999-2002 Harri Porten ([email protected]) + * Copyright (C) 2001-2003 David Faure ([email protected]) + * Copyright (C) 2003 Apple Computer, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "misc/loader.h" +#include "dom/html_block.h" +#include "dom/html_head.h" +#include "dom/html_image.h" +#include "dom/html_inline.h" +#include "dom/html_list.h" +#include "dom/html_table.h" +#include "dom/html_object.h" +#include "dom/dom_exception.h" + +// ### HACK +#include "html/html_baseimpl.h" +#include "html/html_documentimpl.h" +#include "html/html_formimpl.h" +#include "html/html_imageimpl.h" +#include "html/html_miscimpl.h" +#include "xml/dom2_eventsimpl.h" + +#include <tdeparts/browserextension.h> + +#include "tdehtml_part.h" +#include "tdehtmlview.h" + +#include "ecma/kjs_css.h" +#include "ecma/kjs_events.h" +#include "ecma/kjs_html.h" +#include "ecma/kjs_window.h" +#include "kjs_html.lut.h" + +#include "misc/htmltags.h" +#include "misc/htmlattrs.h" +#include "rendering/render_object.h" +#include "rendering/render_canvas.h" +#include "rendering/render_frames.h" +#include "rendering/render_layer.h" + +#include "kmessagebox.h" +#include <kstringhandler.h> +#include <klocale.h> + +#include <kdebug.h> + +namespace KJS { + +KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(HTMLDocumentProto, DOMDocumentProto) +IMPLEMENT_PROTOFUNC_DOM(HTMLDocFunction) +KJS_IMPLEMENT_PROTOTYPE("HTMLDocument", HTMLDocumentProto, HTMLDocFunction) + +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLDocumentPseudoCtor, "HTMLDocument", HTMLDocumentProto) + +/* Source for HTMLDocumentProtoTable. +@begin HTMLDocumentProtoTable 11 + clear HTMLDocument::Clear DontDelete|Function 0 + open HTMLDocument::Open DontDelete|Function 0 + close HTMLDocument::Close DontDelete|Function 0 + write HTMLDocument::Write DontDelete|Function 1 + writeln HTMLDocument::WriteLn DontDelete|Function 1 + getElementsByName HTMLDocument::GetElementsByName DontDelete|Function 1 + getSelection HTMLDocument::GetSelection DontDelete|Function 1 + captureEvents HTMLDocument::CaptureEvents DontDelete|Function 0 + releaseEvents HTMLDocument::ReleaseEvents DontDelete|Function 0 +@end +*/ + + +Value KJS::HTMLDocFunction::tryCall(ExecState *exec, Object &thisObj, const List &args) +{ + KJS_CHECK_THIS( HTMLDocument, thisObj ); + + DOM::HTMLDocument doc = static_cast<KJS::HTMLDocument *>(thisObj.imp())->toDocument(); + + switch (id) { + case HTMLDocument::Clear: // even IE doesn't support that one... + //doc.clear(); // TODO + return Undefined(); + case HTMLDocument::Open: + if (args.size() >= 3) // IE extension for document.open: it means window.open if it has 3 args or more + { + KHTMLView *view = static_cast<DOM::DocumentImpl*>(doc.handle())->view(); + if ( view && view->part() ) { + Window* win = Window::retrieveWindow(view->part()); + if( win ) { + win->openWindow(exec, args); + } + } + } + + doc.open(); + return Undefined(); + case HTMLDocument::Close: + // see tdehtmltests/ecma/tokenizer-script-recursion.html + doc.close(); + return Undefined(); + case HTMLDocument::Write: + case HTMLDocument::WriteLn: { + // DOM only specifies single string argument, but NS & IE allow multiple + // or no arguments + UString str = ""; + for (int i = 0; i < args.size(); i++) + str += args[i].toString(exec); + if (id == HTMLDocument::WriteLn) + str += "\n"; +#ifdef KJS_VERBOSE + kdDebug(6070) << "document.write: " << str.string().string() << endl; +#endif + doc.write(str.string()); + return Undefined(); + } + case HTMLDocument::GetElementsByName: + return getDOMNodeList(exec,doc.getElementsByName(args[0].toString(exec).string())); + case HTMLDocument::GetSelection: { + // NS4 and Mozilla specific. IE uses document.selection.createRange() + // http://docs.sun.com/source/816-6408-10/document.htm#1195981 + KHTMLView *view = static_cast<DOM::DocumentImpl*>(doc.handle())->view(); + if ( view && view->part() ) + return String(view->part()->selectedText()); + else + return Undefined(); + } + case HTMLDocument::CaptureEvents: + case HTMLDocument::ReleaseEvents: + // Do nothing for now. These are NS-specific legacy calls. + break; + } + + return Undefined(); +} + +const ClassInfo KJS::HTMLDocument::info = + { "HTMLDocument", &DOMDocument::info, &HTMLDocumentTable, 0 }; +/* Source for HTMLDocumentTable. +@begin HTMLDocumentTable 31 + title HTMLDocument::Title DontDelete + referrer HTMLDocument::Referrer DontDelete|ReadOnly + domain HTMLDocument::Domain DontDelete + URL HTMLDocument::URL DontDelete|ReadOnly + body HTMLDocument::Body DontDelete + location HTMLDocument::Location DontDelete + cookie HTMLDocument::Cookie DontDelete + images HTMLDocument::Images DontDelete|ReadOnly + applets HTMLDocument::Applets DontDelete|ReadOnly + links HTMLDocument::Links DontDelete|ReadOnly + forms HTMLDocument::Forms DontDelete|ReadOnly + anchors HTMLDocument::Anchors DontDelete|ReadOnly + scripts HTMLDocument::Scripts DontDelete|ReadOnly + all HTMLDocument::All DontDelete|ReadOnly + bgColor HTMLDocument::BgColor DontDelete + fgColor HTMLDocument::FgColor DontDelete + alinkColor HTMLDocument::AlinkColor DontDelete + linkColor HTMLDocument::LinkColor DontDelete + vlinkColor HTMLDocument::VlinkColor DontDelete + lastModified HTMLDocument::LastModified DontDelete|ReadOnly + height HTMLDocument::Height DontDelete|ReadOnly + width HTMLDocument::Width DontDelete|ReadOnly + dir HTMLDocument::Dir DontDelete + compatMode HTMLDocument::CompatMode DontDelete|ReadOnly +#IE extension + frames HTMLDocument::Frames DontDelete|ReadOnly +#NS4 extension + layers HTMLDocument::Layers DontDelete|ReadOnly +#potentially obsolete array properties +# plugins +# tags +#potentially obsolete properties +# embeds +# ids +@end +*/ + +KJS::HTMLDocument::HTMLDocument(ExecState *exec, const DOM::HTMLDocument& d) + : DOMDocument(HTMLDocumentProto::self(exec), d) { } + +bool KJS::HTMLDocument::hasProperty(ExecState *exec, const Identifier &p) const +{ +#ifdef KJS_VERBOSE + //kdDebug(6070) << "KJS::HTMLDocument::hasProperty " << p.qstring() << endl; +#endif + DOM::HTMLDocument doc = static_cast<DOM::HTMLDocument>(node); + DOM::DocumentImpl* docImpl = static_cast<DOM::DocumentImpl*>(doc.handle()); + KHTMLView *view = docImpl->view(); + Window* win = view && view->part() ? Window::retrieveWindow(view->part()) : 0L; + if ( !win || !win->isSafeScript(exec) ) + return false; + + + if ( docImpl->underDocNamedCache().contains( p.qstring() ) ) + return true; + + if ( view && view->part() ) + { + KHTMLPart *kp = view->part()->findFrame( p.qstring() ); + if (kp) + return true; + } + + return DOMDocument::hasProperty(exec, p); +} + +Value KJS::HTMLDocument::tryGet(ExecState *exec, const Identifier &propertyName) const +{ +#ifdef KJS_VERBOSE + kdDebug(6070) << "KJS::HTMLDocument::tryGet " << propertyName.qstring() << endl; +#endif + + DOM::HTMLDocument doc = static_cast<DOM::HTMLDocument>(node); + DOM::DocumentImpl* docImpl = static_cast<DOM::DocumentImpl*>(doc.handle()); + KHTMLView *view = docImpl->view(); + + Window* win = view && view->part() ? Window::retrieveWindow(view->part()) : 0L; + if ( !win || !win->isSafeScript(exec) ) + return Undefined(); + + //Check for images, forms, objects, etc. + ElementMappingCache::ItemInfo* info = docImpl->underDocNamedCache().get(propertyName.qstring()); + if (info) { + //May be a false positive, but we can try to avoid doing it the hard way in + //simpler cases. The trickiness here is that the cache is kept under both + //name and id, but we sometimes ignore id for IE compat + DOM::DOMString propertyDOMString = propertyName.string(); + + if (info->nd && DOM::HTMLMappedNameCollectionImpl::matchesName(info->nd, + HTMLCollectionImpl::DOCUMENT_NAMED_ITEMS, propertyDOMString)) { + return getDOMNode(exec, info->nd); + } else { + //Can't tell it just like that, so better go through collection and count stuff. This is the slow path... + DOM::HTMLMappedNameCollection coll(docImpl, HTMLCollectionImpl::DOCUMENT_NAMED_ITEMS, propertyDOMString); + + if (coll.length() == 1) { + DOM::Node node = coll.firstItem(); + return getDOMNode(exec, node); + } else if (coll.length() > 1) { + return getHTMLCollection(exec, coll); + } + } + } + + // Check for frames/iframes with name==propertyName + if ( view && view->part() ) + { + // ###### TODO return a collection in case several frames have the same name + // (IE does that). Hard to do with findFrame :} + KHTMLPart *kp = view->part()->findFrame( propertyName.qstring() ); + if (kp) + return Window::retrieve(kp); + } + + const HashEntry* entry = Lookup::findEntry(&HTMLDocumentTable, propertyName); + if (entry) { + switch (entry->value) { + case Title: + return String(doc.title()); + case Referrer: + return String(doc.referrer()); + case Domain: + return String(doc.domain()); + case URL: + return String(doc.URL()); + case Body: + return getDOMNode(exec,doc.body()); + case Location: + if (win) + return Value(win->location()); + else + return Undefined(); + case Cookie: + return String(doc.cookie()); + case Images: + return getHTMLCollection(exec,doc.images()); + case Applets: + return getHTMLCollection(exec,doc.applets()); + case Links: + return getHTMLCollection(exec,doc.links()); + case Forms: + return getHTMLCollection(exec,doc.forms()); + case Layers: + // ### Should not be hidden when we emulate Netscape4 + return getHTMLCollection(exec,doc.layers(), true); + case Anchors: + return getHTMLCollection(exec,doc.anchors()); + case Scripts: + return getHTMLCollection(exec,doc.scripts()); + case All: + // Disable document.all when we try to be Netscape-compatible + if ( exec->interpreter()->compatMode() == Interpreter::NetscapeCompat ) + return Undefined(); + else + if ( exec->interpreter()->compatMode() == Interpreter::IECompat ) + return getHTMLCollection(exec,doc.all()); + else // enabled but hidden + return getHTMLCollection(exec,doc.all(), true); + case CompatMode: + return String(static_cast<HTMLDocumentImpl *>(doc.handle())->parseMode() + == DocumentImpl::Compat ? "BackCompat" : "CSS1Compat"); + } + } + // Look for overrides + ValueImp * val = ObjectImp::getDirect(propertyName); + if (val) + return Value(val); + + DOM::HTMLBodyElement body = doc.body(); + if (entry) { + switch (entry->value) { + case BgColor: + return String(body.bgColor()); + case FgColor: + return String(body.text()); + case AlinkColor: + return String(body.aLink()); + case LinkColor: + return String(body.link()); + case VlinkColor: + return String(body.vLink()); + case LastModified: + return String(doc.lastModified()); + case Height: // NS-only, not available in IE + return Number(view ? view->contentsHeight() : 0); + case Width: // NS-only, not available in IE + return Number(view ? view->contentsWidth() : 0); + case Dir: + return String(body.dir()); + case Frames: + if ( win ) + return Value(win->frames(exec)); + else + return Undefined(); + } + } + return DOMDocument::tryGet(exec, propertyName); +} + +void KJS::HTMLDocument::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr) +{ +#ifdef KJS_VERBOSE + kdDebug(6070) << "KJS::HTMLDocument::tryPut " << propertyName.qstring() << endl; +#endif + KHTMLView *view = static_cast<DOM::DocumentImpl*>(node.handle())->view(); + + Window* win = view && view->part() ? Window::retrieveWindow(view->part()) : 0L; + if ( !win || !win->isSafeScript(exec) ) + return; + + DOMObjectLookupPut<HTMLDocument, DOMDocument>( exec, propertyName, value, attr, &HTMLDocumentTable, this ); +} + +void KJS::HTMLDocument::putValueProperty(ExecState *exec, int token, const Value& value, int /*attr*/) +{ + DOM::HTMLDocument doc = static_cast<DOM::HTMLDocument>(node); + + DOM::HTMLBodyElement body = doc.body(); + DOM::DOMString val = value.toString(exec).string(); + + switch (token) { + case Title: + if (doc.title() != val) doc.setTitle(val); + break; + case Body: { + DOMNode *node = new DOMNode(exec, KJS::toNode(value)); + // This is required to avoid leaking the node. + Value nodeValue(node); + doc.setBody(node->toNode()); + break; + } + case Domain: { // not part of the DOM + DOM::HTMLDocumentImpl* docimpl = static_cast<DOM::HTMLDocumentImpl*>(doc.handle()); + if (docimpl) + docimpl->setDomain(val); + break; + } + case Cookie: + doc.setCookie(val); + break; + case Location: + { + KHTMLView *view = static_cast<DOM::DocumentImpl*>(doc.handle())->view(); + if ( view ) + Window::retrieveWindow(view->part())->goURL(exec, value.toString(exec).qstring(), false /*don't lock history*/); + break; + } + case BgColor: + if (body.bgColor() != val) body.setBgColor(val); + break; + case FgColor: + if (body.text() != val) body.setText(val); + break; + case AlinkColor: + if (body.aLink() != val) body.setALink(val); + break; + case LinkColor: + if (body.link() != val) body.setLink(val); + break; + case VlinkColor: + if (body.vLink() != val) body.setVLink(val); + break; + case Dir: + body.setDir(val); + break; + default: + kdDebug(6070) << "WARNING: HTMLDocument::putValueProperty unhandled token " << token << endl; + } +} + +// ------------------------------------------------------------------------- + +const ClassInfo KJS::HTMLElement::info = { "HTMLElement", &DOMElement::info, &HTMLElementTable, 0 }; +const ClassInfo KJS::HTMLElement::html_info = { "HTMLHtmlElement", &KJS::HTMLElement::info, &HTMLHtmlElementTable, 0 }; +const ClassInfo KJS::HTMLElement::head_info = { "HTMLHeadElement", &KJS::HTMLElement::info, &HTMLHeadElementTable, 0 }; +const ClassInfo KJS::HTMLElement::link_info = { "HTMLLinkElement", &KJS::HTMLElement::info, &HTMLLinkElementTable, 0 }; +const ClassInfo KJS::HTMLElement::title_info = { "HTMLTitleElement", &KJS::HTMLElement::info, &HTMLTitleElementTable, 0 }; +const ClassInfo KJS::HTMLElement::meta_info = { "HTMLMetaElement", &KJS::HTMLElement::info, &HTMLMetaElementTable, 0 }; +const ClassInfo KJS::HTMLElement::base_info = { "HTMLBaseElement", &KJS::HTMLElement::info, &HTMLBaseElementTable, 0 }; +const ClassInfo KJS::HTMLElement::isIndex_info = { "HTMLIsIndexElement", &KJS::HTMLElement::info, &HTMLIsIndexElementTable, 0 }; +const ClassInfo KJS::HTMLElement::style_info = { "HTMLStyleElement", &KJS::HTMLElement::info, &HTMLStyleElementTable, 0 }; +const ClassInfo KJS::HTMLElement::body_info = { "HTMLBodyElement", &KJS::HTMLElement::info, &HTMLBodyElementTable, 0 }; +const ClassInfo KJS::HTMLElement::form_info = { "HTMLFormElement", &KJS::HTMLElement::info, &HTMLFormElementTable, 0 }; +const ClassInfo KJS::HTMLElement::select_info = { "HTMLSelectElement", &KJS::HTMLElement::info, &HTMLSelectElementTable, 0 }; +const ClassInfo KJS::HTMLElement::optGroup_info = { "HTMLOptGroupElement", &KJS::HTMLElement::info, &HTMLOptGroupElementTable, 0 }; +const ClassInfo KJS::HTMLElement::option_info = { "HTMLOptionElement", &KJS::HTMLElement::info, &HTMLOptionElementTable, 0 }; +const ClassInfo KJS::HTMLElement::input_info = { "HTMLInputElement", &KJS::HTMLElement::info, &HTMLInputElementTable, 0 }; +const ClassInfo KJS::HTMLElement::textArea_info = { "HTMLTextAreaElement", &KJS::HTMLElement::info, &HTMLTextAreaElementTable, 0 }; +const ClassInfo KJS::HTMLElement::button_info = { "HTMLButtonElement", &KJS::HTMLElement::info, &HTMLButtonElementTable, 0 }; +const ClassInfo KJS::HTMLElement::label_info = { "HTMLLabelElement", &KJS::HTMLElement::info, &HTMLLabelElementTable, 0 }; +const ClassInfo KJS::HTMLElement::fieldSet_info = { "HTMLFieldSetElement", &KJS::HTMLElement::info, &HTMLFieldSetElementTable, 0 }; +const ClassInfo KJS::HTMLElement::legend_info = { "HTMLLegendElement", &KJS::HTMLElement::info, &HTMLLegendElementTable, 0 }; +const ClassInfo KJS::HTMLElement::ul_info = { "HTMLUListElement", &KJS::HTMLElement::info, &HTMLUListElementTable, 0 }; +const ClassInfo KJS::HTMLElement::ol_info = { "HTMLOListElement", &KJS::HTMLElement::info, &HTMLOListElementTable, 0 }; +const ClassInfo KJS::HTMLElement::dl_info = { "HTMLDListElement", &KJS::HTMLElement::info, &HTMLDListElementTable, 0 }; +const ClassInfo KJS::HTMLElement::dir_info = { "HTMLDirectoryElement", &KJS::HTMLElement::info, &HTMLDirectoryElementTable, 0 }; +const ClassInfo KJS::HTMLElement::menu_info = { "HTMLMenuElement", &KJS::HTMLElement::info, &HTMLMenuElementTable, 0 }; +const ClassInfo KJS::HTMLElement::li_info = { "HTMLLIElement", &KJS::HTMLElement::info, &HTMLLIElementTable, 0 }; +const ClassInfo KJS::HTMLElement::div_info = { "HTMLDivElement", &KJS::HTMLElement::info, &HTMLDivElementTable, 0 }; +const ClassInfo KJS::HTMLElement::p_info = { "HTMLParagraphElement", &KJS::HTMLElement::info, &HTMLParagraphElementTable, 0 }; +const ClassInfo KJS::HTMLElement::heading_info = { "HTMLHeadingElement", &KJS::HTMLElement::info, &HTMLHeadingElementTable, 0 }; +const ClassInfo KJS::HTMLElement::blockQuote_info = { "HTMLBlockQuoteElement", &KJS::HTMLElement::info, &HTMLBlockQuoteElementTable, 0 }; +const ClassInfo KJS::HTMLElement::q_info = { "HTMLQuoteElement", &KJS::HTMLElement::info, &HTMLQuoteElementTable, 0 }; +const ClassInfo KJS::HTMLElement::pre_info = { "HTMLPreElement", &KJS::HTMLElement::info, &HTMLPreElementTable, 0 }; +const ClassInfo KJS::HTMLElement::br_info = { "HTMLBRElement", &KJS::HTMLElement::info, &HTMLBRElementTable, 0 }; +const ClassInfo KJS::HTMLElement::baseFont_info = { "HTMLBaseFontElement", &KJS::HTMLElement::info, &HTMLBaseFontElementTable, 0 }; +const ClassInfo KJS::HTMLElement::font_info = { "HTMLFontElement", &KJS::HTMLElement::info, &HTMLFontElementTable, 0 }; +const ClassInfo KJS::HTMLElement::hr_info = { "HTMLHRElement", &KJS::HTMLElement::info, &HTMLHRElementTable, 0 }; +const ClassInfo KJS::HTMLElement::mod_info = { "HTMLModElement", &KJS::HTMLElement::info, &HTMLModElementTable, 0 }; +const ClassInfo KJS::HTMLElement::a_info = { "HTMLAnchorElement", &KJS::HTMLElement::info, &HTMLAnchorElementTable, 0 }; +const ClassInfo KJS::HTMLElement::img_info = { "HTMLImageElement", &KJS::HTMLElement::info, &HTMLImageElementTable, 0 }; +const ClassInfo KJS::HTMLElement::object_info = { "HTMLObjectElement", &KJS::HTMLElement::info, &HTMLObjectElementTable, 0 }; +const ClassInfo KJS::HTMLElement::param_info = { "HTMLParamElement", &KJS::HTMLElement::info, &HTMLParamElementTable, 0 }; +const ClassInfo KJS::HTMLElement::applet_info = { "HTMLAppletElement", &KJS::HTMLElement::info, &HTMLAppletElementTable, 0 }; +const ClassInfo KJS::HTMLElement::map_info = { "HTMLMapElement", &KJS::HTMLElement::info, &HTMLMapElementTable, 0 }; +const ClassInfo KJS::HTMLElement::area_info = { "HTMLAreaElement", &KJS::HTMLElement::info, &HTMLAreaElementTable, 0 }; +const ClassInfo KJS::HTMLElement::script_info = { "HTMLScriptElement", &KJS::HTMLElement::info, &HTMLScriptElementTable, 0 }; +const ClassInfo KJS::HTMLElement::table_info = { "HTMLTableElement", &KJS::HTMLElement::info, &HTMLTableElementTable, 0 }; +const ClassInfo KJS::HTMLElement::caption_info = { "HTMLTableCaptionElement", &KJS::HTMLElement::info, &HTMLTableCaptionElementTable, 0 }; +const ClassInfo KJS::HTMLElement::col_info = { "HTMLTableColElement", &KJS::HTMLElement::info, &HTMLTableColElementTable, 0 }; +const ClassInfo KJS::HTMLElement::tablesection_info = { "HTMLTableSectionElement", &KJS::HTMLElement::info, &HTMLTableSectionElementTable, 0 }; +const ClassInfo KJS::HTMLElement::tr_info = { "HTMLTableRowElement", &KJS::HTMLElement::info, &HTMLTableRowElementTable, 0 }; +const ClassInfo KJS::HTMLElement::tablecell_info = { "HTMLTableCellElement", &KJS::HTMLElement::info, &HTMLTableCellElementTable, 0 }; +const ClassInfo KJS::HTMLElement::frameSet_info = { "HTMLFrameSetElement", &KJS::HTMLElement::info, &HTMLFrameSetElementTable, 0 }; +const ClassInfo KJS::HTMLElement::frame_info = { "HTMLFrameElement", &KJS::HTMLElement::info, &HTMLFrameElementTable, 0 }; +const ClassInfo KJS::HTMLElement::iFrame_info = { "HTMLIFrameElement", &KJS::HTMLElement::info, &HTMLIFrameElementTable, 0 }; +const ClassInfo KJS::HTMLElement::marquee_info = { "HTMLMarqueeElement", &KJS::HTMLElement::info, 0, 0 }; +const ClassInfo KJS::HTMLElement::layer_info = { "HTMLLayerElement", &KJS::HTMLElement::info, &HTMLLayerElementTable, 0 }; + +static Object prototypeForID(ExecState* exec, DOM::NodeImpl::Id id); + +KJS::HTMLElement::HTMLElement(ExecState *exec, const DOM::HTMLElement& e) : + DOMElement(prototypeForID(exec, e.elementId()), e) { } + +const ClassInfo* KJS::HTMLElement::classInfo() const +{ + DOM::HTMLElement element = static_cast<DOM::HTMLElement>(node); + switch (element.elementId()) { + case ID_HTML: + return &html_info; + case ID_HEAD: + return &head_info; + case ID_LINK: + return &link_info; + case ID_TITLE: + return &title_info; + case ID_META: + return &meta_info; + case ID_BASE: + return &base_info; + case ID_ISINDEX: + return &isIndex_info; + case ID_STYLE: + return &style_info; + case ID_BODY: + return &body_info; + case ID_FORM: + return &form_info; + case ID_SELECT: + return &select_info; + case ID_OPTGROUP: + return &optGroup_info; + case ID_OPTION: + return &option_info; + case ID_INPUT: + return &input_info; + case ID_TEXTAREA: + return &textArea_info; + case ID_BUTTON: + return &button_info; + case ID_LABEL: + return &label_info; + case ID_FIELDSET: + return &fieldSet_info; + case ID_LEGEND: + return &legend_info; + case ID_UL: + return &ul_info; + case ID_OL: + return &ol_info; + case ID_DL: + return &dl_info; + case ID_DIR: + return &dir_info; + case ID_MENU: + return &menu_info; + case ID_LI: + return &li_info; + case ID_DIV: + return &div_info; + case ID_P: + return &p_info; + case ID_H1: + case ID_H2: + case ID_H3: + case ID_H4: + case ID_H5: + case ID_H6: + return &heading_info; + case ID_BLOCKQUOTE: + return &blockQuote_info; + case ID_Q: + return &q_info; + case ID_PRE: + return &pre_info; + case ID_BR: + return &br_info; + case ID_BASEFONT: + return &baseFont_info; + case ID_FONT: + return &font_info; + case ID_HR: + return &hr_info; + case ID_INS: + case ID_DEL: + return &mod_info; + case ID_A: + return &a_info; + case ID_IMG: + return &img_info; + case ID_OBJECT: + return &object_info; + case ID_PARAM: + return ¶m_info; + case ID_APPLET: + return &applet_info; + case ID_MAP: + return &map_info; + case ID_AREA: + return &area_info; + case ID_SCRIPT: + return &script_info; + case ID_TABLE: + return &table_info; + case ID_CAPTION: + return &caption_info; + case ID_COL: + case ID_COLGROUP: + return &col_info; + case ID_THEAD: + case ID_TBODY: + case ID_TFOOT: + return &tablesection_info; + case ID_TR: + return &tr_info; + case ID_TH: + case ID_TD: + return &tablecell_info; + case ID_FRAMESET: + return &frameSet_info; + case ID_FRAME: + return &frame_info; + case ID_IFRAME: + return &iFrame_info; + case ID_MARQUEE: + return &marquee_info; + case ID_LAYER: + return &layer_info; + default: + return &info; + } +} +/* +@begin HTMLElementTable 11 + id KJS::HTMLElement::ElementId DontDelete + title KJS::HTMLElement::ElementTitle DontDelete + lang KJS::HTMLElement::ElementLang DontDelete + dir KJS::HTMLElement::ElementDir DontDelete +### isn't this "class" in the HTML spec? + className KJS::HTMLElement::ElementClassName DontDelete + innerHTML KJS::HTMLElement::ElementInnerHTML DontDelete + innerText KJS::HTMLElement::ElementInnerText DontDelete + document KJS::HTMLElement::ElementDocument DontDelete|ReadOnly +# IE extension + children KJS::HTMLElement::ElementChildren DontDelete|ReadOnly + all KJS::HTMLElement::ElementAll DontDelete|ReadOnly +@end +@begin HTMLElementProtoTable 1 + scrollIntoView KJS::HTMLElement::ElementScrollIntoView DontDelete|Function 0 +@end +@begin HTMLHtmlElementTable 1 + version KJS::HTMLElement::HtmlVersion DontDelete +@end +@begin HTMLHeadElementTable 1 + profile KJS::HTMLElement::HeadProfile DontDelete +@end +@begin HTMLLinkElementTable 11 + disabled KJS::HTMLElement::LinkDisabled DontDelete + charset KJS::HTMLElement::LinkCharset DontDelete + href KJS::HTMLElement::LinkHref DontDelete + hreflang KJS::HTMLElement::LinkHrefLang DontDelete + media KJS::HTMLElement::LinkMedia DontDelete + rel KJS::HTMLElement::LinkRel DontDelete + rev KJS::HTMLElement::LinkRev DontDelete + target KJS::HTMLElement::LinkTarget DontDelete + type KJS::HTMLElement::LinkType DontDelete + sheet KJS::HTMLElement::LinkSheet DontDelete|ReadOnly +@end +@begin HTMLTitleElementTable 1 + text KJS::HTMLElement::TitleText DontDelete +@end +@begin HTMLMetaElementTable 4 + content KJS::HTMLElement::MetaContent DontDelete + httpEquiv KJS::HTMLElement::MetaHttpEquiv DontDelete + name KJS::HTMLElement::MetaName DontDelete + scheme KJS::HTMLElement::MetaScheme DontDelete +@end +@begin HTMLBaseElementTable 2 + href KJS::HTMLElement::BaseHref DontDelete + target KJS::HTMLElement::BaseTarget DontDelete +@end +@begin HTMLIsIndexElementTable 2 + form KJS::HTMLElement::IsIndexForm DontDelete|ReadOnly + prompt KJS::HTMLElement::IsIndexPrompt DontDelete +@end +@begin HTMLStyleElementTable 4 + disabled KJS::HTMLElement::StyleDisabled DontDelete + media KJS::HTMLElement::StyleMedia DontDelete + type KJS::HTMLElement::StyleType DontDelete + sheet KJS::HTMLElement::StyleSheet DontDelete|ReadOnly +@end +@begin HTMLBodyElementTable 8 + aLink KJS::HTMLElement::BodyALink DontDelete + background KJS::HTMLElement::BodyBackground DontDelete + bgColor KJS::HTMLElement::BodyBgColor DontDelete + link KJS::HTMLElement::BodyLink DontDelete + text KJS::HTMLElement::BodyText DontDelete + vLink KJS::HTMLElement::BodyVLink DontDelete +# IE extension + onload KJS::HTMLElement::BodyOnLoad DontDelete +@end +@begin HTMLBodyElementProtoTable 2 +# Mozilla'ish extension. Ideally we would want to support this on all elements. +# Not hard, but not an immediate need. + focus KJS::HTMLElement::BodyFocus DontDelete|Function 0 +@end +@begin HTMLFormElementTable 11 +# Also supported, by name/index + elements KJS::HTMLElement::FormElements DontDelete|ReadOnly + length KJS::HTMLElement::FormLength DontDelete|ReadOnly + name KJS::HTMLElement::FormName DontDelete + acceptCharset KJS::HTMLElement::FormAcceptCharset DontDelete + action KJS::HTMLElement::FormAction DontDelete + encoding KJS::HTMLElement::FormEncType DontDelete + enctype KJS::HTMLElement::FormEncType DontDelete + method KJS::HTMLElement::FormMethod DontDelete + target KJS::HTMLElement::FormTarget DontDelete +@end +@begin HTMLFormElementProtoTable 2 + submit KJS::HTMLElement::FormSubmit DontDelete|Function 0 + reset KJS::HTMLElement::FormReset DontDelete|Function 0 +@end +@begin HTMLSelectElementTable 11 +# Also supported, by index + type KJS::HTMLElement::SelectType DontDelete|ReadOnly + selectedIndex KJS::HTMLElement::SelectSelectedIndex DontDelete + value KJS::HTMLElement::SelectValue DontDelete + length KJS::HTMLElement::SelectLength DontDelete + form KJS::HTMLElement::SelectForm DontDelete|ReadOnly + options KJS::HTMLElement::SelectOptions DontDelete|ReadOnly + disabled KJS::HTMLElement::SelectDisabled DontDelete + multiple KJS::HTMLElement::SelectMultiple DontDelete + name KJS::HTMLElement::SelectName DontDelete + size KJS::HTMLElement::SelectSize DontDelete + tabIndex KJS::HTMLElement::SelectTabIndex DontDelete +@end +@begin HTMLSelectElementProtoTable 4 + add KJS::HTMLElement::SelectAdd DontDelete|Function 2 + remove KJS::HTMLElement::SelectRemove DontDelete|Function 1 + blur KJS::HTMLElement::SelectBlur DontDelete|Function 0 + focus KJS::HTMLElement::SelectFocus DontDelete|Function 0 +@end +@begin HTMLOptGroupElementTable 2 + disabled KJS::HTMLElement::OptGroupDisabled DontDelete + label KJS::HTMLElement::OptGroupLabel DontDelete +@end +@begin HTMLOptionElementTable 8 + form KJS::HTMLElement::OptionForm DontDelete|ReadOnly + defaultSelected KJS::HTMLElement::OptionDefaultSelected DontDelete + text KJS::HTMLElement::OptionText DontDelete + index KJS::HTMLElement::OptionIndex DontDelete|ReadOnly + disabled KJS::HTMLElement::OptionDisabled DontDelete + label KJS::HTMLElement::OptionLabel DontDelete + selected KJS::HTMLElement::OptionSelected DontDelete + value KJS::HTMLElement::OptionValue DontDelete +@end +@begin HTMLInputElementTable 25 + defaultValue KJS::HTMLElement::InputDefaultValue DontDelete + defaultChecked KJS::HTMLElement::InputDefaultChecked DontDelete + form KJS::HTMLElement::InputForm DontDelete|ReadOnly + accept KJS::HTMLElement::InputAccept DontDelete + accessKey KJS::HTMLElement::InputAccessKey DontDelete + align KJS::HTMLElement::InputAlign DontDelete + alt KJS::HTMLElement::InputAlt DontDelete + checked KJS::HTMLElement::InputChecked DontDelete + indeterminate KJS::HTMLElement::InputIndeterminate DontDelete + status KJS::HTMLElement::InputChecked DontDelete + disabled KJS::HTMLElement::InputDisabled DontDelete + maxLength KJS::HTMLElement::InputMaxLength DontDelete + name KJS::HTMLElement::InputName DontDelete + readOnly KJS::HTMLElement::InputReadOnly DontDelete + size KJS::HTMLElement::InputSize DontDelete + src KJS::HTMLElement::InputSrc DontDelete + tabIndex KJS::HTMLElement::InputTabIndex DontDelete + type KJS::HTMLElement::InputType DontDelete + useMap KJS::HTMLElement::InputUseMap DontDelete + value KJS::HTMLElement::InputValue DontDelete + selectionStart KJS::HTMLElement::InputSelectionStart DontDelete + selectionEnd KJS::HTMLElement::InputSelectionEnd DontDelete +@end +@begin HTMLInputElementProtoTable 5 + blur KJS::HTMLElement::InputBlur DontDelete|Function 0 + focus KJS::HTMLElement::InputFocus DontDelete|Function 0 + select KJS::HTMLElement::InputSelect DontDelete|Function 0 + click KJS::HTMLElement::InputClick DontDelete|Function 0 + setSelectionRange KJS::HTMLElement::InputSetSelectionRange DontDelete|Function 2 +@end +@begin HTMLTextAreaElementTable 13 + defaultValue KJS::HTMLElement::TextAreaDefaultValue DontDelete + form KJS::HTMLElement::TextAreaForm DontDelete|ReadOnly + accessKey KJS::HTMLElement::TextAreaAccessKey DontDelete + cols KJS::HTMLElement::TextAreaCols DontDelete + disabled KJS::HTMLElement::TextAreaDisabled DontDelete + name KJS::HTMLElement::TextAreaName DontDelete + readOnly KJS::HTMLElement::TextAreaReadOnly DontDelete + rows KJS::HTMLElement::TextAreaRows DontDelete + tabIndex KJS::HTMLElement::TextAreaTabIndex DontDelete + type KJS::HTMLElement::TextAreaType DontDelete|ReadOnly + value KJS::HTMLElement::TextAreaValue DontDelete + selectionStart KJS::HTMLElement::TextAreaSelectionStart DontDelete + selectionEnd KJS::HTMLElement::TextAreaSelectionEnd DontDelete + textLength KJS::HTMLElement::TextAreaTextLength DontDelete|ReadOnly +@end +@begin HTMLTextAreaElementProtoTable 4 + blur KJS::HTMLElement::TextAreaBlur DontDelete|Function 0 + focus KJS::HTMLElement::TextAreaFocus DontDelete|Function 0 + select KJS::HTMLElement::TextAreaSelect DontDelete|Function 0 + setSelectionRange KJS::HTMLElement::TextAreaSetSelectionRange DontDelete|Function 2 +@end +@begin HTMLButtonElementTable 9 + form KJS::HTMLElement::ButtonForm DontDelete|ReadOnly + accessKey KJS::HTMLElement::ButtonAccessKey DontDelete + disabled KJS::HTMLElement::ButtonDisabled DontDelete + name KJS::HTMLElement::ButtonName DontDelete + tabIndex KJS::HTMLElement::ButtonTabIndex DontDelete + type KJS::HTMLElement::ButtonType DontDelete|ReadOnly + value KJS::HTMLElement::ButtonValue DontDelete +@end +@begin HTMLButtonElementProtoTable 2 + blur KJS::HTMLElement::ButtonBlur DontDelete|Function 0 + focus KJS::HTMLElement::ButtonFocus DontDelete|Function 0 +@end +@begin HTMLLabelElementTable 3 + form KJS::HTMLElement::LabelForm DontDelete|ReadOnly + accessKey KJS::HTMLElement::LabelAccessKey DontDelete + htmlFor KJS::HTMLElement::LabelHtmlFor DontDelete +@end +@begin HTMLFieldSetElementTable 1 + form KJS::HTMLElement::FieldSetForm DontDelete|ReadOnly +@end +@begin HTMLLegendElementTable 3 + form KJS::HTMLElement::LegendForm DontDelete|ReadOnly + accessKey KJS::HTMLElement::LegendAccessKey DontDelete + align KJS::HTMLElement::LegendAlign DontDelete +@end +@begin HTMLUListElementTable 2 + compact KJS::HTMLElement::UListCompact DontDelete + type KJS::HTMLElement::UListType DontDelete +@end +@begin HTMLOListElementTable 3 + compact KJS::HTMLElement::OListCompact DontDelete + start KJS::HTMLElement::OListStart DontDelete + type KJS::HTMLElement::OListType DontDelete +@end +@begin HTMLDListElementTable 1 + compact KJS::HTMLElement::DListCompact DontDelete +@end +@begin HTMLDirectoryElementTable 1 + compact KJS::HTMLElement::DirectoryCompact DontDelete +@end +@begin HTMLMenuElementTable 1 + compact KJS::HTMLElement::MenuCompact DontDelete +@end +@begin HTMLLIElementTable 2 + type KJS::HTMLElement::LIType DontDelete + value KJS::HTMLElement::LIValue DontDelete +@end +@begin HTMLDivElementTable 1 + align KJS::HTMLElement::DivAlign DontDelete +@end +@begin HTMLParagraphElementTable 1 + align KJS::HTMLElement::ParagraphAlign DontDelete +@end +@begin HTMLHeadingElementTable 1 + align KJS::HTMLElement::HeadingAlign DontDelete +@end +@begin HTMLBlockQuoteElementTable 1 + cite KJS::HTMLElement::BlockQuoteCite DontDelete +@end +@begin HTMLQuoteElementTable 1 + cite KJS::HTMLElement::QuoteCite DontDelete +@end +@begin HTMLPreElementTable 1 + width KJS::HTMLElement::PreWidth DontDelete +@end +@begin HTMLBRElementTable 1 + clear KJS::HTMLElement::BRClear DontDelete +@end +@begin HTMLBaseFontElementTable 3 + color KJS::HTMLElement::BaseFontColor DontDelete + face KJS::HTMLElement::BaseFontFace DontDelete + size KJS::HTMLElement::BaseFontSize DontDelete +@end +@begin HTMLFontElementTable 3 + color KJS::HTMLElement::FontColor DontDelete + face KJS::HTMLElement::FontFace DontDelete + size KJS::HTMLElement::FontSize DontDelete +@end +@begin HTMLHRElementTable 4 + align KJS::HTMLElement::HRAlign DontDelete + noShade KJS::HTMLElement::HRNoShade DontDelete + size KJS::HTMLElement::HRSize DontDelete + width KJS::HTMLElement::HRWidth DontDelete +@end +@begin HTMLModElementTable 2 + cite KJS::HTMLElement::ModCite DontDelete + dateTime KJS::HTMLElement::ModDateTime DontDelete +@end +@begin HTMLAnchorElementTable 23 + accessKey KJS::HTMLElement::AnchorAccessKey DontDelete + charset KJS::HTMLElement::AnchorCharset DontDelete + coords KJS::HTMLElement::AnchorCoords DontDelete + href KJS::HTMLElement::AnchorHref DontDelete + hreflang KJS::HTMLElement::AnchorHrefLang DontDelete + hash KJS::HTMLElement::AnchorHash DontDelete|ReadOnly + host KJS::HTMLElement::AnchorHost DontDelete|ReadOnly + hostname KJS::HTMLElement::AnchorHostname DontDelete|ReadOnly + name KJS::HTMLElement::AnchorName DontDelete + pathname KJS::HTMLElement::AnchorPathName DontDelete|ReadOnly + port KJS::HTMLElement::AnchorPort DontDelete|ReadOnly + protocol KJS::HTMLElement::AnchorProtocol DontDelete|ReadOnly + rel KJS::HTMLElement::AnchorRel DontDelete + rev KJS::HTMLElement::AnchorRev DontDelete + search KJS::HTMLElement::AnchorSearch DontDelete + shape KJS::HTMLElement::AnchorShape DontDelete + tabIndex KJS::HTMLElement::AnchorTabIndex DontDelete + target KJS::HTMLElement::AnchorTarget DontDelete + text KJS::HTMLElement::AnchorText DontDelete|ReadOnly + type KJS::HTMLElement::AnchorType DontDelete +@end +@begin HTMLAnchorElementProtoTable 3 + blur KJS::HTMLElement::AnchorBlur DontDelete|Function 0 + focus KJS::HTMLElement::AnchorFocus DontDelete|Function 0 + click KJS::HTMLElement::AnchorClick DontDelete|Function 0 +@end +@begin HTMLImageElementTable 15 + name KJS::HTMLElement::ImageName DontDelete + align KJS::HTMLElement::ImageAlign DontDelete + alt KJS::HTMLElement::ImageAlt DontDelete + border KJS::HTMLElement::ImageBorder DontDelete + complete KJS::HTMLElement::ImageComplete DontDelete|ReadOnly + height KJS::HTMLElement::ImageHeight DontDelete + hspace KJS::HTMLElement::ImageHspace DontDelete + isMap KJS::HTMLElement::ImageIsMap DontDelete + longDesc KJS::HTMLElement::ImageLongDesc DontDelete + src KJS::HTMLElement::ImageSrc DontDelete + useMap KJS::HTMLElement::ImageUseMap DontDelete + vspace KJS::HTMLElement::ImageVspace DontDelete + width KJS::HTMLElement::ImageWidth DontDelete + x KJS::HTMLElement::ImageX DontDelete|ReadOnly + y KJS::HTMLElement::ImageY DontDelete|ReadOnly +@end +@begin HTMLObjectElementTable 20 + form KJS::HTMLElement::ObjectForm DontDelete|ReadOnly + code KJS::HTMLElement::ObjectCode DontDelete + align KJS::HTMLElement::ObjectAlign DontDelete + archive KJS::HTMLElement::ObjectArchive DontDelete + border KJS::HTMLElement::ObjectBorder DontDelete + codeBase KJS::HTMLElement::ObjectCodeBase DontDelete + codeType KJS::HTMLElement::ObjectCodeType DontDelete + contentDocument KJS::HTMLElement::ObjectContentDocument DontDelete|ReadOnly + data KJS::HTMLElement::ObjectData DontDelete + declare KJS::HTMLElement::ObjectDeclare DontDelete + height KJS::HTMLElement::ObjectHeight DontDelete + hspace KJS::HTMLElement::ObjectHspace DontDelete + name KJS::HTMLElement::ObjectName DontDelete + standby KJS::HTMLElement::ObjectStandby DontDelete + tabIndex KJS::HTMLElement::ObjectTabIndex DontDelete + type KJS::HTMLElement::ObjectType DontDelete + useMap KJS::HTMLElement::ObjectUseMap DontDelete + vspace KJS::HTMLElement::ObjectVspace DontDelete + width KJS::HTMLElement::ObjectWidth DontDelete +@end +@begin HTMLParamElementTable 4 + name KJS::HTMLElement::ParamName DontDelete + type KJS::HTMLElement::ParamType DontDelete + value KJS::HTMLElement::ParamValue DontDelete + valueType KJS::HTMLElement::ParamValueType DontDelete +@end +@begin HTMLAppletElementTable 11 + align KJS::HTMLElement::AppletAlign DontDelete + alt KJS::HTMLElement::AppletAlt DontDelete + archive KJS::HTMLElement::AppletArchive DontDelete + code KJS::HTMLElement::AppletCode DontDelete + codeBase KJS::HTMLElement::AppletCodeBase DontDelete + height KJS::HTMLElement::AppletHeight DontDelete + hspace KJS::HTMLElement::AppletHspace DontDelete + name KJS::HTMLElement::AppletName DontDelete + object KJS::HTMLElement::AppletObject DontDelete + vspace KJS::HTMLElement::AppletVspace DontDelete + width KJS::HTMLElement::AppletWidth DontDelete +@end +@begin HTMLMapElementTable 2 + areas KJS::HTMLElement::MapAreas DontDelete|ReadOnly + name KJS::HTMLElement::MapName DontDelete +@end +@begin HTMLAreaElementTable 15 + accessKey KJS::HTMLElement::AreaAccessKey DontDelete + alt KJS::HTMLElement::AreaAlt DontDelete + coords KJS::HTMLElement::AreaCoords DontDelete + href KJS::HTMLElement::AreaHref DontDelete + hash KJS::HTMLElement::AreaHash DontDelete|ReadOnly + host KJS::HTMLElement::AreaHost DontDelete|ReadOnly + hostname KJS::HTMLElement::AreaHostName DontDelete|ReadOnly + pathname KJS::HTMLElement::AreaPathName DontDelete|ReadOnly + port KJS::HTMLElement::AreaPort DontDelete|ReadOnly + protocol KJS::HTMLElement::AreaProtocol DontDelete|ReadOnly + search KJS::HTMLElement::AreaSearch DontDelete|ReadOnly + noHref KJS::HTMLElement::AreaNoHref DontDelete + shape KJS::HTMLElement::AreaShape DontDelete + tabIndex KJS::HTMLElement::AreaTabIndex DontDelete + target KJS::HTMLElement::AreaTarget DontDelete +@end +@begin HTMLScriptElementTable 7 + text KJS::HTMLElement::ScriptText DontDelete + htmlFor KJS::HTMLElement::ScriptHtmlFor DontDelete + event KJS::HTMLElement::ScriptEvent DontDelete + charset KJS::HTMLElement::ScriptCharset DontDelete + defer KJS::HTMLElement::ScriptDefer DontDelete + src KJS::HTMLElement::ScriptSrc DontDelete + type KJS::HTMLElement::ScriptType DontDelete +@end +@begin HTMLTableElementTable 23 + caption KJS::HTMLElement::TableCaption DontDelete + tHead KJS::HTMLElement::TableTHead DontDelete + tFoot KJS::HTMLElement::TableTFoot DontDelete + rows KJS::HTMLElement::TableRows DontDelete|ReadOnly + tBodies KJS::HTMLElement::TableTBodies DontDelete|ReadOnly + align KJS::HTMLElement::TableAlign DontDelete + bgColor KJS::HTMLElement::TableBgColor DontDelete + border KJS::HTMLElement::TableBorder DontDelete + cellPadding KJS::HTMLElement::TableCellPadding DontDelete + cellSpacing KJS::HTMLElement::TableCellSpacing DontDelete + frame KJS::HTMLElement::TableFrame DontDelete + rules KJS::HTMLElement::TableRules DontDelete + summary KJS::HTMLElement::TableSummary DontDelete + width KJS::HTMLElement::TableWidth DontDelete +@end +@begin HTMLTableElementProtoTable 8 + createTHead KJS::HTMLElement::TableCreateTHead DontDelete|Function 0 + deleteTHead KJS::HTMLElement::TableDeleteTHead DontDelete|Function 0 + createTFoot KJS::HTMLElement::TableCreateTFoot DontDelete|Function 0 + deleteTFoot KJS::HTMLElement::TableDeleteTFoot DontDelete|Function 0 + createCaption KJS::HTMLElement::TableCreateCaption DontDelete|Function 0 + deleteCaption KJS::HTMLElement::TableDeleteCaption DontDelete|Function 0 + insertRow KJS::HTMLElement::TableInsertRow DontDelete|Function 1 + deleteRow KJS::HTMLElement::TableDeleteRow DontDelete|Function 1 +@end +@begin HTMLTableCaptionElementTable 1 + align KJS::HTMLElement::TableCaptionAlign DontDelete +@end +@begin HTMLTableColElementTable 7 + align KJS::HTMLElement::TableColAlign DontDelete + ch KJS::HTMLElement::TableColCh DontDelete + chOff KJS::HTMLElement::TableColChOff DontDelete + span KJS::HTMLElement::TableColSpan DontDelete + vAlign KJS::HTMLElement::TableColVAlign DontDelete + width KJS::HTMLElement::TableColWidth DontDelete +@end +@begin HTMLTableSectionElementTable 7 + align KJS::HTMLElement::TableSectionAlign DontDelete + ch KJS::HTMLElement::TableSectionCh DontDelete + chOff KJS::HTMLElement::TableSectionChOff DontDelete + vAlign KJS::HTMLElement::TableSectionVAlign DontDelete + rows KJS::HTMLElement::TableSectionRows DontDelete|ReadOnly +@end +@begin HTMLTableSectionElementProtoTable 2 + insertRow KJS::HTMLElement::TableSectionInsertRow DontDelete|Function 1 + deleteRow KJS::HTMLElement::TableSectionDeleteRow DontDelete|Function 1 +@end +@begin HTMLTableRowElementTable 11 + rowIndex KJS::HTMLElement::TableRowRowIndex DontDelete|ReadOnly + sectionRowIndex KJS::HTMLElement::TableRowSectionRowIndex DontDelete|ReadOnly + cells KJS::HTMLElement::TableRowCells DontDelete|ReadOnly + align KJS::HTMLElement::TableRowAlign DontDelete + bgColor KJS::HTMLElement::TableRowBgColor DontDelete + ch KJS::HTMLElement::TableRowCh DontDelete + chOff KJS::HTMLElement::TableRowChOff DontDelete + vAlign KJS::HTMLElement::TableRowVAlign DontDelete +@end +@begin HTMLTableRowElementProtoTable 2 + insertCell KJS::HTMLElement::TableRowInsertCell DontDelete|Function 1 + deleteCell KJS::HTMLElement::TableRowDeleteCell DontDelete|Function 1 +@end +@begin HTMLTableCellElementTable 15 + cellIndex KJS::HTMLElement::TableCellCellIndex DontDelete|ReadOnly + abbr KJS::HTMLElement::TableCellAbbr DontDelete + align KJS::HTMLElement::TableCellAlign DontDelete + axis KJS::HTMLElement::TableCellAxis DontDelete + bgColor KJS::HTMLElement::TableCellBgColor DontDelete + ch KJS::HTMLElement::TableCellCh DontDelete + chOff KJS::HTMLElement::TableCellChOff DontDelete + colSpan KJS::HTMLElement::TableCellColSpan DontDelete + headers KJS::HTMLElement::TableCellHeaders DontDelete + height KJS::HTMLElement::TableCellHeight DontDelete + noWrap KJS::HTMLElement::TableCellNoWrap DontDelete + rowSpan KJS::HTMLElement::TableCellRowSpan DontDelete + scope KJS::HTMLElement::TableCellScope DontDelete + vAlign KJS::HTMLElement::TableCellVAlign DontDelete + width KJS::HTMLElement::TableCellWidth DontDelete +@end +@begin HTMLFrameSetElementTable 2 + cols KJS::HTMLElement::FrameSetCols DontDelete + rows KJS::HTMLElement::FrameSetRows DontDelete +@end +@begin HTMLLayerElementTable 6 + top KJS::HTMLElement::LayerTop DontDelete + left KJS::HTMLElement::LayerLeft DontDelete + visibility KJS::HTMLElement::LayerVisibility DontDelete + bgColor KJS::HTMLElement::LayerBgColor DontDelete + document KJS::HTMLElement::LayerDocument DontDelete|ReadOnly + clip KJS::HTMLElement::LayerClip DontDelete|ReadOnly + layers KJS::HTMLElement::LayerLayers DontDelete|ReadOnly +@end +@begin HTMLFrameElementTable 13 + contentDocument KJS::HTMLElement::FrameContentDocument DontDelete|ReadOnly + contentWindow KJS::HTMLElement::FrameContentWindow DontDelete|ReadOnly + frameBorder KJS::HTMLElement::FrameFrameBorder DontDelete + longDesc KJS::HTMLElement::FrameLongDesc DontDelete + marginHeight KJS::HTMLElement::FrameMarginHeight DontDelete + marginWidth KJS::HTMLElement::FrameMarginWidth DontDelete + name KJS::HTMLElement::FrameName DontDelete + noResize KJS::HTMLElement::FrameNoResize DontDelete + scrolling KJS::HTMLElement::FrameScrolling DontDelete + src KJS::HTMLElement::FrameSrc DontDelete + location KJS::HTMLElement::FrameLocation DontDelete +# IE extension + width KJS::HTMLElement::FrameWidth DontDelete|ReadOnly + height KJS::HTMLElement::FrameHeight DontDelete|ReadOnly +@end +@begin HTMLIFrameElementTable 12 + align KJS::HTMLElement::IFrameAlign DontDelete + contentDocument KJS::HTMLElement::IFrameContentDocument DontDelete|ReadOnly + contentWindow KJS::HTMLElement::IFrameContentWindow DontDelete|ReadOnly + frameBorder KJS::HTMLElement::IFrameFrameBorder DontDelete + height KJS::HTMLElement::IFrameHeight DontDelete + longDesc KJS::HTMLElement::IFrameLongDesc DontDelete + marginHeight KJS::HTMLElement::IFrameMarginHeight DontDelete + marginWidth KJS::HTMLElement::IFrameMarginWidth DontDelete + name KJS::HTMLElement::IFrameName DontDelete + scrolling KJS::HTMLElement::IFrameScrolling DontDelete + src KJS::HTMLElement::IFrameSrc DontDelete + width KJS::HTMLElement::IFrameWidth DontDelete +@end + +@begin HTMLMarqueeElementProtoTable 2 + start KJS::HTMLElement::MarqueeStart DontDelete|Function 0 + stop KJS::HTMLElement::MarqueeStop DontDelete|Function 0 +@end + +*/ + +static KParts::LiveConnectExtension *getLiveConnectExtension(const DOM::HTMLElement & element) +{ + DOM::HTMLDocument doc = element.ownerDocument(); + KHTMLView *view = static_cast<DOM::DocumentImpl*>(doc.handle())->view(); + if (view && element.handle()) + return view->part()->liveConnectExtension(static_cast<tdehtml::RenderPart*>(element.handle()->renderer())); + return 0L; +} + +Value KJS::HTMLElement::tryGet(ExecState *exec, const Identifier &propertyName) const +{ + DOM::HTMLElement element = static_cast<DOM::HTMLElement>(node); +#ifdef KJS_VERBOSE + kdDebug(6070) << "KJS::HTMLElement::tryGet " << propertyName.qstring() << " thisTag=" << element.tagName().string() << endl; +#endif + // First look at dynamic properties + switch (element.elementId()) { + case ID_FORM: { + DOM::HTMLFormElement form = element; + // Check if we're retrieving an element (by index or by name) + bool ok; + uint u = propertyName.toULong(&ok); + + if (ok) + return getDOMNode(exec,form.elements().item(u)); + KJS::HTMLCollection coll(exec, form.elements()); + Value namedItems = coll.getNamedItems(exec, propertyName); + if (namedItems.type() != UndefinedType) + return namedItems; + } + break; + case ID_SELECT: { + DOM::HTMLSelectElement select = element; + bool ok; + uint u = propertyName.toULong(&ok); + if (ok) + return getDOMNode(exec,select.options().item(u)); // not specified by DOM(?) but supported in netscape/IE + } + break; + case ID_APPLET: + case ID_OBJECT: + case ID_EMBED: { + KParts::LiveConnectExtension *lc = getLiveConnectExtension(element); + TQString rvalue; + KParts::LiveConnectExtension::Type rtype; + unsigned long robjid; + if (lc && lc->get(0, propertyName.qstring(), rtype, robjid, rvalue)) + return getLiveConnectValue(lc, propertyName.qstring(), rtype, rvalue, robjid); + } + break; + default: + break; + } + + const HashTable* table = classInfo()->propHashTable; // get the right hashtable + const HashEntry* entry = table ? Lookup::findEntry(table, propertyName) : 0; + if (entry) { + if (entry->attr & Function) + return lookupOrCreateFunction<KJS::HTMLElementFunction>(exec, propertyName, this, entry->value, entry->params, entry->attr); + return getValueProperty(exec, entry->value); + } + + // Base HTMLElement stuff or parent class forward, as usual + return DOMObjectLookupGet<KJS::HTMLElementFunction, KJS::HTMLElement, DOMElement>(exec, propertyName, &KJS::HTMLElementTable, this); +} + +Value KJS::HTMLElement::getValueProperty(ExecState *exec, int token) const +{ + DOM::HTMLElement element = static_cast<DOM::HTMLElement>(node); + switch (element.elementId()) { + case ID_HTML: { + DOM::HTMLHtmlElement html = element; + if (token == HtmlVersion) return String(html.version()); + } + break; + case ID_HEAD: { + DOM::HTMLHeadElement head = element; + if (token == HeadProfile) return String(head.profile()); + } + break; + case ID_LINK: { + DOM::HTMLLinkElement link = element; + switch (token) { + case LinkDisabled: return Boolean(link.disabled()); + case LinkCharset: return String(link.charset()); + case LinkHref: return String(link.href()); + case LinkHrefLang: return String(link.hreflang()); + case LinkMedia: return String(link.media()); + case LinkRel: return String(link.rel()); + case LinkRev: return String(link.rev()); + case LinkTarget: return String(link.target()); + case LinkType: return String(link.type()); + case LinkSheet: return getDOMStyleSheet(exec,static_cast<DOM::ProcessingInstruction>(node).sheet()); + } + } + break; + case ID_TITLE: { + DOM::HTMLTitleElement title = element; + switch (token) { + case TitleText: return String(title.text()); + } + } + break; + case ID_META: { + DOM::HTMLMetaElement meta = element; + switch (token) { + case MetaContent: return String(meta.content()); + case MetaHttpEquiv: return String(meta.httpEquiv()); + case MetaName: return String(meta.name()); + case MetaScheme: return String(meta.scheme()); + } + } + break; + case ID_BASE: { + DOM::HTMLBaseElement base = element; + switch (token) { + case BaseHref: return String(base.href()); + case BaseTarget: return String(base.target()); + } + } + break; + case ID_ISINDEX: { + DOM::HTMLIsIndexElement isindex = element; + switch (token) { + case IsIndexForm: return getDOMNode(exec,isindex.form()); // type HTMLFormElement + case IsIndexPrompt: return String(isindex.prompt()); + } + } + break; + case ID_STYLE: { + DOM::HTMLStyleElement style = element; + switch (token) { + case StyleDisabled: return Boolean(style.disabled()); + case StyleMedia: return String(style.media()); + case StyleType: return String(style.type()); + case StyleSheet: return getDOMStyleSheet(exec,style.sheet()); + } + } + break; + case ID_BODY: { + DOM::HTMLBodyElement body = element; + switch (token) { + case BodyALink: return String(body.aLink()); + case BodyBackground: return String(body.background()); + case BodyBgColor: return String(body.bgColor()); + case BodyLink: return String(body.link()); + case BodyText: return String(body.text()); + case BodyVLink: return String(body.vLink()); + case BodyOnLoad: { + DOM::DocumentImpl *doc = static_cast<DOM::DocumentImpl *>(node.ownerDocument().handle()); + if (!doc || !checkNodeSecurity(exec, node)) + return Undefined(); + DOMNode* kjsDocNode = new DOMNode(exec, doc); + // Need to create a Value wrapper to avoid leaking the KJS::DOMNode + Value nodeValue(kjsDocNode); + return kjsDocNode->getListener( DOM::EventImpl::LOAD_EVENT ); + } + } + } + break; + + case ID_FORM: { + DOM::HTMLFormElement form = element; + switch (token) { + case FormElements: return getHTMLCollection(exec,form.elements()); + case FormLength: return Number(form.length()); + case FormName: return String(form.name()); // NOT getString (IE gives empty string) + case FormAcceptCharset: return String(form.acceptCharset()); + case FormAction: return String(form.action()); + case FormEncType: return String(form.enctype()); + case FormMethod: return String(form.method()); + case FormTarget: return String(form.target()); + } + } + break; + case ID_SELECT: { + DOM::HTMLSelectElement select = element; + switch (token) { + case SelectType: return String(select.type()); + case SelectSelectedIndex: return Number(select.selectedIndex()); + case SelectValue: return String(select.value()); + case SelectLength: return Number(select.length()); + case SelectForm: return getDOMNode(exec,select.form()); // type HTMLFormElement + case SelectOptions: return getSelectHTMLCollection(exec, select.options(), select); // type HTMLCollection + case SelectDisabled: return Boolean(select.disabled()); + case SelectMultiple: return Boolean(select.multiple()); + case SelectName: return String(select.name()); + case SelectSize: return Number(select.size()); + case SelectTabIndex: return Number(select.tabIndex()); + } + } + break; + case ID_OPTGROUP: { + DOM::HTMLOptGroupElement optgroup = element; + switch (token) { + case OptGroupDisabled: return Boolean(optgroup.disabled()); + case OptGroupLabel: return String(optgroup.label()); + } + } + break; + case ID_OPTION: { + DOM::HTMLOptionElement option = element; + switch (token) { + case OptionForm: return getDOMNode(exec,option.form()); // type HTMLFormElement + case OptionDefaultSelected: return Boolean(option.defaultSelected()); + case OptionText: return String(option.text()); + case OptionIndex: return Number(option.index()); + case OptionDisabled: return Boolean(option.disabled()); + case OptionLabel: return String(option.label()); + case OptionSelected: return Boolean(option.selected()); + case OptionValue: return String(option.value()); + } + } + break; + case ID_INPUT: { + DOM::HTMLInputElement input = element; + switch (token) { + case InputDefaultValue: return String(input.defaultValue()); + case InputDefaultChecked: return Boolean(input.defaultChecked()); + case InputForm: return getDOMNode(exec,input.form()); // type HTMLFormElement + case InputAccept: return String(input.accept()); + case InputAccessKey: return String(input.accessKey()); + case InputAlign: return String(input.align()); + case InputAlt: return String(input.alt()); + case InputChecked: return Boolean(input.checked()); + case InputIndeterminate: return Boolean(input.indeterminate()); + case InputDisabled: return Boolean(input.disabled()); + case InputMaxLength: return Number(input.maxLength()); + case InputName: return String(input.name()); // NOT getString (IE gives empty string) + case InputReadOnly: return Boolean(input.readOnly()); + case InputSize: return Number(input.getSize()); + case InputSrc: return String(input.src()); + case InputTabIndex: return Number(input.tabIndex()); + case InputType: return String(input.type()); + case InputUseMap: return String(input.useMap()); + case InputValue: return String(input.value()); + case InputSelectionStart: { + long val = input.selectionStart(); + if (val != -1) + return Number(val); + else + return Undefined(); + } + case InputSelectionEnd: { + long val = input.selectionEnd(); + if (val != -1) + return Number(val); + else + return Undefined(); + } + } + } + break; + case ID_TEXTAREA: { + DOM::HTMLTextAreaElement textarea = element; + switch (token) { + case TextAreaDefaultValue: return String(textarea.defaultValue()); + case TextAreaForm: return getDOMNode(exec,textarea.form()); // type HTMLFormElement + case TextAreaAccessKey: return String(textarea.accessKey()); + case TextAreaCols: return Number(textarea.cols()); + case TextAreaDisabled: return Boolean(textarea.disabled()); + case TextAreaName: return String(textarea.name()); + case TextAreaReadOnly: return Boolean(textarea.readOnly()); + case TextAreaRows: return Number(textarea.rows()); + case TextAreaTabIndex: return Number(textarea.tabIndex()); + case TextAreaType: return String(textarea.type()); + case TextAreaValue: return String(textarea.value()); + case TextAreaSelectionStart: return Number(textarea.selectionStart()); + case TextAreaSelectionEnd: return Number(textarea.selectionEnd()); + case TextAreaTextLength: return Number(textarea.textLength()); + } + } + break; + case ID_BUTTON: { + DOM::HTMLButtonElement button = element; + switch (token) { + case ButtonForm: return getDOMNode(exec,button.form()); // type HTMLFormElement + case ButtonAccessKey: return String(button.accessKey()); + case ButtonDisabled: return Boolean(button.disabled()); + case ButtonName: return String(button.name()); + case ButtonTabIndex: return Number(button.tabIndex()); + case ButtonType: return String(button.type()); + case ButtonValue: return String(button.value()); + } + } + break; + case ID_LABEL: { + DOM::HTMLLabelElement label = element; + switch (token) { + case LabelForm: return getDOMNode(exec,label.form()); // type HTMLFormElement + case LabelAccessKey: return String(label.accessKey()); + case LabelHtmlFor: return String(label.htmlFor()); + } + } + break; + case ID_FIELDSET: { + DOM::HTMLFieldSetElement fieldSet = element; + switch (token) { + case FieldSetForm: return getDOMNode(exec,fieldSet.form()); // type HTMLFormElement + } + } + break; + case ID_LEGEND: { + DOM::HTMLLegendElement legend = element; + switch (token) { + case LegendForm: return getDOMNode(exec,legend.form()); // type HTMLFormElement + case LegendAccessKey: return String(legend.accessKey()); + case LegendAlign: return String(legend.align()); + } + } + break; + case ID_UL: { + DOM::HTMLUListElement uList = element; + switch (token) { + case UListCompact: return Boolean(uList.compact()); + case UListType: return String(uList.type()); + } + } + break; + case ID_OL: { + DOM::HTMLOListElement oList = element; + switch (token) { + case OListCompact: return Boolean(oList.compact()); + case OListStart: return Number(oList.start()); + case OListType: return String(oList.type()); + } + } + break; + case ID_DL: { + DOM::HTMLDListElement dList = element; + switch (token) { + case DListCompact: return Boolean(dList.compact()); + } + } + break; + case ID_DIR: { + DOM::HTMLDirectoryElement directory = element; + switch (token) { + case DirectoryCompact: return Boolean(directory.compact()); + } + } + break; + case ID_MENU: { + DOM::HTMLMenuElement menu = element; + switch (token) { + case MenuCompact: return Boolean(menu.compact()); + } + } + break; + case ID_LI: { + DOM::HTMLLIElement li = element; + switch (token) { + case LIType: return String(li.type()); + case LIValue: return Number(li.value()); + } + } + break; + case ID_DIV: { + DOM::HTMLDivElement div = element; + switch (token) { + case DivAlign: return String(div.align()); + } + } + break; + case ID_P: { + DOM::HTMLParagraphElement paragraph = element; + switch (token) { + case ParagraphAlign: return String(paragraph.align()); + } + } + break; + case ID_H1: + case ID_H2: + case ID_H3: + case ID_H4: + case ID_H5: + case ID_H6: { + DOM::HTMLHeadingElement heading = element; + switch (token) { + case HeadingAlign: return String(heading.align()); + } + } + break; + case ID_BLOCKQUOTE: { + DOM::HTMLBlockquoteElement blockquote = element; + switch (token) { + case BlockQuoteCite: return String(blockquote.cite()); + } + } + case ID_Q: { + DOM::HTMLQuoteElement quote = element; + switch (token) { + case QuoteCite: return String(quote.cite()); + } + } + case ID_PRE: { + DOM::HTMLPreElement pre = element; + switch (token) { + case PreWidth: return Number(pre.width()); + } + } + break; + case ID_BR: { + DOM::HTMLBRElement br = element; + switch (token) { + case BRClear: return String(br.clear()); + } + } + break; + case ID_BASEFONT: { + DOM::HTMLBaseFontElement baseFont = element; + switch (token) { + case BaseFontColor: return String(baseFont.color()); + case BaseFontFace: return String(baseFont.face()); + case BaseFontSize: return Number(baseFont.getSize()); + } + } + break; + case ID_FONT: { + DOM::HTMLFontElement font = element; + switch (token) { + case FontColor: return String(font.color()); + case FontFace: return String(font.face()); + case FontSize: return String(font.size()); + } + } + break; + case ID_HR: { + DOM::HTMLHRElement hr = element; + switch (token) { + case HRAlign: return String(hr.align()); + case HRNoShade: return Boolean(hr.noShade()); + case HRSize: return String(hr.size()); + case HRWidth: return String(hr.width()); + } + } + break; + case ID_INS: + case ID_DEL: { + DOM::HTMLModElement mod = element; + switch (token) { + case ModCite: return String(mod.cite()); + case ModDateTime: return String(mod.dateTime()); + } + } + break; + case ID_A: { + DOM::HTMLAnchorElement anchor = element; + switch (token) { + case AnchorAccessKey: return String(anchor.accessKey()); + case AnchorCharset: return String(anchor.charset()); + case AnchorCoords: return String(anchor.coords()); + case AnchorHref: return String(anchor.href()); + case AnchorHrefLang: return String(anchor.hreflang()); + case AnchorHash: return String('#'+KURL(anchor.href().string()).ref()); + case AnchorHost: return String(KURL(anchor.href().string()).host()); + case AnchorHostname: { + KURL url(anchor.href().string()); + kdDebug(6070) << "anchor::hostname uses:" <<url.url()<<endl; + if (url.port()==0) + return String(url.host()); + else + return String(url.host() + ":" + TQString::number(url.port())); + } + case AnchorPathName: return String(KURL(anchor.href().string()).path()); + case AnchorPort: return String(TQString::number(KURL(anchor.href().string()).port())); + case AnchorProtocol: return String(KURL(anchor.href().string()).protocol()+":"); + case AnchorSearch: { KURL u(anchor.href().string()); + TQString q = u.query(); + if (q.length() == 1) + return String(); + return String(q); } + case AnchorName: return String(anchor.name()); + case AnchorRel: return String(anchor.rel()); + case AnchorRev: return String(anchor.rev()); + case AnchorShape: return String(anchor.shape()); + case AnchorTabIndex: return Number(anchor.tabIndex()); + case AnchorTarget: return String(anchor.target()); + // Not specified in http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/a.asp + // Mozilla returns the inner text. + case AnchorText: return String(anchor.innerText()); + case AnchorType: return String(anchor.type()); + } + } + break; + case ID_IMG: { + DOM::HTMLImageElement image = element; + switch (token) { + case ImageName: return String(image.name()); // NOT getString (IE gives empty string) + case ImageAlign: return String(image.align()); + case ImageAlt: return String(image.alt()); + case ImageBorder: return String(image.getBorder()); + case ImageComplete: return Boolean(static_cast<DOM::HTMLImageElementImpl*>( image.handle() )->complete()); + case ImageHeight: return Number(image.height()); + case ImageHspace: return Number(image.hspace()); + case ImageIsMap: return Boolean(image.isMap()); + case ImageLongDesc: return String(image.longDesc()); + case ImageSrc: return String(image.src()); + case ImageUseMap: return String(image.useMap()); + case ImageVspace: return Number(image.vspace()); + case ImageWidth: return Number(image.width()); + case ImageX: return Number(image.x()); + case ImageY: return Number(image.y()); + } + } + break; + case ID_OBJECT: { + DOM::HTMLObjectElement object = element; + switch (token) { + case ObjectForm: return getDOMNode(exec,object.form()); // type HTMLFormElement + case ObjectCode: return String(object.code()); + case ObjectAlign: return String(object.align()); + case ObjectArchive: return String(object.archive()); + case ObjectBorder: return String(object.border()); + case ObjectCodeBase: return String(object.codeBase()); + case ObjectCodeType: return String(object.codeType()); + case ObjectContentDocument: return checkNodeSecurity(exec,object.contentDocument()) ? + getDOMNode(exec, object.contentDocument()) : Undefined(); + case ObjectData: return String(object.data()); + case ObjectDeclare: return Boolean(object.declare()); + case ObjectHeight: return String(object.height()); + case ObjectHspace: return Number(object.getHspace()); + case ObjectName: return String(object.name()); + case ObjectStandby: return String(object.standby()); + case ObjectTabIndex: return Number(object.tabIndex()); + case ObjectType: return String(object.type()); + case ObjectUseMap: return String(object.useMap()); + case ObjectVspace: return Number(object.getVspace()); + case ObjectWidth: return String(object.width()); + } + } + break; + case ID_PARAM: { + DOM::HTMLParamElement param = element; + switch (token) { + case ParamName: return String(param.name()); + case ParamType: return String(param.type()); + case ParamValue: return String(param.value()); + case ParamValueType: return String(param.valueType()); + } + } + break; + case ID_APPLET: { + DOM::HTMLAppletElement applet = element; + switch (token) { + case AppletAlign: return String(applet.align()); + case AppletAlt: return String(applet.alt()); + case AppletArchive: return String(applet.archive()); + case AppletCode: return String(applet.code()); + case AppletCodeBase: return String(applet.codeBase()); + case AppletHeight: return String(applet.height()); + case AppletHspace: return Number(applet.getHspace()); + case AppletName: return String(applet.name()); + case AppletObject: return String(applet.object()); + case AppletVspace: return Number(applet.getVspace()); + case AppletWidth: return String(applet.width()); + } + } + break; + case ID_MAP: { + DOM::HTMLMapElement map = element; + switch (token) { + case MapAreas: return getHTMLCollection(exec, map.areas()); // type HTMLCollection + case MapName: return String(map.name()); + } + } + break; + case ID_AREA: { + DOM::HTMLAreaElement area = element; + switch (token) { + case AreaAccessKey: return String(area.accessKey()); + case AreaAlt: return String(area.alt()); + case AreaCoords: return String(area.coords()); + // Group everything that needs href + case AreaHref: + case AreaHash: + case AreaHost: + case AreaHostName: + case AreaPathName: + case AreaPort: + case AreaProtocol: + case AreaSearch: + { + DOM::Document doc = area.ownerDocument(); + DOM::DOMString href = area.href(); + KURL url; + if ( !href.isNull() ) { + url = doc.completeURL( href ).string(); + if ( href.isEmpty() ) + url.setFileName( TQString::null ); // href="" clears the filename (in IE) + } + switch(token) { + case AreaHref: + return String(url.url()); + case AreaHash: return String(url.isEmpty() ? "" : '#'+url.ref()); + case AreaHost: return String(url.host()); + case AreaHostName: { + if (url.port()==0) + return String(url.host()); + else + return String(url.host() + ":" + TQString::number(url.port())); + } + case AreaPathName: { + return String(url.path()); + } + case AreaPort: return String(TQString::number(url.port())); + case AreaProtocol: return String(url.isEmpty() ? "" : url.protocol()+":"); + case AreaSearch: return String(url.query()); + } + } + case AreaNoHref: return Boolean(area.noHref()); + case AreaShape: return String(area.shape()); + case AreaTabIndex: return Number(area.tabIndex()); + case AreaTarget: return String(area.target()); + } + } + break; + case ID_SCRIPT: { + DOM::HTMLScriptElement script = element; + switch (token) { + case ScriptText: return String(script.text()); + case ScriptHtmlFor: return String(script.htmlFor()); + case ScriptEvent: return String(script.event()); + case ScriptCharset: return String(script.charset()); + case ScriptDefer: return Boolean(script.defer()); + case ScriptSrc: return String(script.src()); + case ScriptType: return String(script.type()); + } + } + break; + case ID_TABLE: { + DOM::HTMLTableElement table = element; + switch (token) { + case TableCaption: return getDOMNode(exec,table.caption()); // type HTMLTableCaptionElement + case TableTHead: return getDOMNode(exec,table.tHead()); // type HTMLTableSectionElement + case TableTFoot: return getDOMNode(exec,table.tFoot()); // type HTMLTableSectionElement + case TableRows: return getHTMLCollection(exec,table.rows()); // type HTMLCollection + case TableTBodies: return getHTMLCollection(exec,table.tBodies()); // type HTMLCollection + case TableAlign: return String(table.align()); + case TableBgColor: return String(table.bgColor()); + case TableBorder: return String(table.border()); + case TableCellPadding: return String(table.cellPadding()); + case TableCellSpacing: return String(table.cellSpacing()); + case TableFrame: return String(table.frame()); + case TableRules: return String(table.rules()); + case TableSummary: return String(table.summary()); + case TableWidth: return String(table.width()); + } + } + break; + case ID_CAPTION: { + DOM::HTMLTableCaptionElement tableCaption = element; + switch (token) { + case TableCaptionAlign: return String(tableCaption.align()); + } + } + break; + case ID_COL: + case ID_COLGROUP: { + DOM::HTMLTableColElement tableCol = element; + switch (token) { + case TableColAlign: return String(tableCol.align()); + case TableColCh: return String(tableCol.ch()); + case TableColChOff: return String(tableCol.chOff()); + case TableColSpan: return Number(tableCol.span()); + case TableColVAlign: return String(tableCol.vAlign()); + case TableColWidth: return String(tableCol.width()); + } + } + break; + case ID_THEAD: + case ID_TBODY: + case ID_TFOOT: { + DOM::HTMLTableSectionElement tableSection = element; + switch (token) { + case TableSectionAlign: return String(tableSection.align()); + case TableSectionCh: return String(tableSection.ch()); + case TableSectionChOff: return String(tableSection.chOff()); + case TableSectionVAlign: return String(tableSection.vAlign()); + case TableSectionRows: return getHTMLCollection(exec,tableSection.rows()); // type HTMLCollection + } + } + break; + case ID_TR: { + DOM::HTMLTableRowElement tableRow = element; + switch (token) { + case TableRowRowIndex: return Number(tableRow.rowIndex()); + case TableRowSectionRowIndex: return Number(tableRow.sectionRowIndex()); + case TableRowCells: return getHTMLCollection(exec,tableRow.cells()); // type HTMLCollection + case TableRowAlign: return String(tableRow.align()); + case TableRowBgColor: return String(tableRow.bgColor()); + case TableRowCh: return String(tableRow.ch()); + case TableRowChOff: return String(tableRow.chOff()); + case TableRowVAlign: return String(tableRow.vAlign()); + } + } + break; + case ID_TH: + case ID_TD: { + DOM::HTMLTableCellElement tableCell = element; + switch (token) { + case TableCellCellIndex: return Number(tableCell.cellIndex()); + case TableCellAbbr: return String(tableCell.abbr()); + case TableCellAlign: return String(tableCell.align()); + case TableCellAxis: return String(tableCell.axis()); + case TableCellBgColor: return String(tableCell.bgColor()); + case TableCellCh: return String(tableCell.ch()); + case TableCellChOff: return String(tableCell.chOff()); + case TableCellColSpan: return Number(tableCell.colSpan()); + case TableCellHeaders: return String(tableCell.headers()); + case TableCellHeight: return String(tableCell.height()); + case TableCellNoWrap: return Boolean(tableCell.noWrap()); + case TableCellRowSpan: return Number(tableCell.rowSpan()); + case TableCellScope: return String(tableCell.scope()); + case TableCellVAlign: return String(tableCell.vAlign()); + case TableCellWidth: return String(tableCell.width()); + } + } + break; + case ID_FRAMESET: { + DOM::HTMLFrameSetElement frameSet = element; + switch (token) { + case FrameSetCols: return String(frameSet.cols()); + case FrameSetRows: return String(frameSet.rows()); + } + } + break; + case ID_LAYER: { + DOM::HTMLLayerElement layerElement = element; + switch (token) { + case LayerTop: return Number(layerElement.top()); + case LayerLeft: return Number(layerElement.left()); + case LayerVisibility: return getString(layerElement.visibility()); + case LayerBgColor: return getString(layerElement.bgColor()); + /*case LayerClip: return getLayerClip(exec, layerElement); */ + case LayerDocument: return Undefined(); + case LayerLayers: return getHTMLCollection(exec,layerElement.layers()); + } + } + break; + case ID_FRAME: { + DOM::HTMLFrameElement frameElement = element; + switch (token) { + case FrameContentDocument: return checkNodeSecurity(exec,frameElement.contentDocument()) ? + getDOMNode(exec, frameElement.contentDocument()) : Undefined(); + case FrameContentWindow: { + KHTMLPart* part = static_cast<DOM::HTMLFrameElementImpl*>(frameElement.handle())->contentPart(); + if (part) { + Window *w = Window::retrieveWindow(part); + if (w) + return Value(w); + } + return Undefined(); + } + case FrameFrameBorder: return String(frameElement.frameBorder()); + case FrameLongDesc: return String(frameElement.longDesc()); + case FrameMarginHeight: return String(frameElement.marginHeight()); + case FrameMarginWidth: return String(frameElement.marginWidth()); + case FrameName: return String(frameElement.name()); + case FrameNoResize: return Boolean(frameElement.noResize()); + case FrameScrolling: return String(frameElement.scrolling()); + case FrameSrc: + case FrameLocation: return String(frameElement.src()); + // IE only + case FrameWidth: + case FrameHeight: + { + frameElement.handle()->getDocument()->updateLayout(); + tdehtml::RenderObject* r = frameElement.handle()->renderer(); + return Number( r ? (token == FrameWidth ? r->width() : r->height()) : 0 ); + } + } + } + break; + case ID_IFRAME: { + DOM::HTMLIFrameElement iFrame = element; + switch (token) { + case IFrameAlign: return String(iFrame.align()); + case IFrameContentDocument: return checkNodeSecurity(exec,iFrame.contentDocument()) ? + getDOMNode(exec, iFrame.contentDocument()) : Undefined(); + case IFrameContentWindow: { + KHTMLPart* part = static_cast<DOM::HTMLIFrameElementImpl*>(iFrame.handle())->contentPart(); + if (part) { + Window *w = Window::retrieveWindow(part); + if (w) + return Value(w); + } + return Undefined(); + } + case IFrameFrameBorder: return String(iFrame.frameBorder()); + case IFrameHeight: return String(iFrame.height()); + case IFrameLongDesc: return String(iFrame.longDesc()); + case IFrameMarginHeight: return String(iFrame.marginHeight()); + case IFrameMarginWidth: return String(iFrame.marginWidth()); + case IFrameName: return String(iFrame.name()); + case IFrameScrolling: return String(iFrame.scrolling()); + case IFrameSrc: return String(iFrame.src()); + case IFrameWidth: return String(iFrame.width()); + } + break; + } + } // xemacs (or arnt) could be a bit smarter when it comes to indenting switch()es ;) + // its not arnt to blame - its the original Stroustrup style we like :) (Dirk) + + // generic properties + switch (token) { + case ElementId: + return String(element.id()); // String is wrong here. Other browsers return empty string if no id specified. + case ElementTitle: + return String(element.title()); + case ElementLang: + return String(element.lang()); + case ElementDir: + return String(element.dir()); + case ElementClassName: + return String(element.className()); + case ElementInnerHTML: + return String(element.innerHTML()); + case ElementInnerText: + return String(element.innerText()); + case ElementDocument: + return getDOMNode(exec,element.ownerDocument()); + case ElementChildren: + return getHTMLCollection(exec,element.children()); + case ElementAll: + // Disable element.all when we try to be Netscape-compatible + if ( exec->interpreter()->compatMode() == Interpreter::NetscapeCompat ) + return Undefined(); + else + if ( exec->interpreter()->compatMode() == Interpreter::IECompat ) + return getHTMLCollection(exec,element.all()); + else // Enabled but hidden by default + return getHTMLCollection(exec,element.all(), true); + // ### what about style? or is this used instead for DOM2 stylesheets? + } + kdError() << "HTMLElement::getValueProperty unhandled token " << token << endl; + return Undefined(); +} + +bool KJS::HTMLElement::hasProperty(ExecState *exec, const Identifier &propertyName) const +{ +#ifdef KJS_VERBOSE + //kdDebug(6070) << "HTMLElement::hasProperty " << propertyName.qstring() << endl; +#endif + DOM::HTMLElement element = static_cast<DOM::HTMLElement>(node); + // First look at dynamic properties - keep this in sync with tryGet + switch (element.elementId()) { + case ID_FORM: { + DOM::HTMLFormElement form = element; + // Check if we're retrieving an element (by index or by name) + bool ok; + uint u = propertyName.toULong(&ok); + if (ok && !(form.elements().item(u).isNull())) + return true; + DOM::Node testnode = form.elements().namedItem(propertyName.string()); + if (!testnode.isNull()) + return true; + } + case ID_SELECT: { + DOM::HTMLSelectElement select = element; + bool ok; + uint u = propertyName.toULong(&ok); + if (ok && !(select.options().item(u).isNull())) + return true; + } + default: + break; + } + + return DOMElement::hasProperty(exec, propertyName); +} + +UString KJS::HTMLElement::toString(ExecState *exec) const +{ + if (node.elementId() == ID_A) + return UString(static_cast<const DOM::HTMLAnchorElement&>(node).href()); + else if (node.elementId() == ID_APPLET) { + KParts::LiveConnectExtension *lc = getLiveConnectExtension(node); + TQStringList qargs; + TQString retvalue; + KParts::LiveConnectExtension::Type rettype; + unsigned long retobjid; + if (lc && lc->call(0, "hashCode", qargs, rettype, retobjid, retvalue)) { + TQString str("[object APPLET ref="); + return UString(str + retvalue + TQString("]")); + } + } else if (node.elementId() == ID_IMG) { + DOM::HTMLImageElement image(node); + if (!image.alt().isEmpty()) + return UString(image.alt()) + " " + DOMElement::toString(exec); + } + return DOMElement::toString(exec); +} + +static void getForm(DOM::HTMLFormElement* form, const DOM::HTMLElement& element) +{ + switch (element.elementId()) { + case ID_ISINDEX: { + DOM::HTMLIsIndexElement isindex = element; + *form = isindex.form(); + break; + } + case ID_SELECT: { + DOM::HTMLSelectElement select = element; + *form = select.form(); + break; + } + case ID_OPTION: { + DOM::HTMLOptionElement option = element; + *form = option.form(); + break; + } + case ID_INPUT: { + DOM::HTMLInputElement input = element; + *form = input.form(); + break; + } + case ID_TEXTAREA: { + DOM::HTMLTextAreaElement textarea = element; + *form = textarea.form(); + break; + } + case ID_LABEL: { + DOM::HTMLLabelElement label = element; + *form = label.form(); + break; + } + case ID_FIELDSET: { + DOM::HTMLFieldSetElement fieldset = element; + *form = fieldset.form(); + break; + } + case ID_LEGEND: { + DOM::HTMLLegendElement legend = element; + *form = legend.form(); + break; + } + case ID_OBJECT: { + DOM::HTMLObjectElement object = element; + *form = object.form(); + break; + } + default: + break; + } +} + +void KJS::HTMLElement::pushEventHandlerScope(ExecState *exec, ScopeChain &scope) const +{ + DOM::HTMLElement element = static_cast<DOM::HTMLElement>(node); + + // The document is put on first, fall back to searching it only after the element and form. + scope.push(static_cast<ObjectImp *>(getDOMNode(exec, element.ownerDocument()).imp())); + + // The form is next, searched before the document, but after the element itself. + DOM::HTMLFormElement formElt; + + // First try to obtain the form from the element itself. We do this to deal with + // the malformed case where <form>s aren't in our parent chain (e.g., when they were inside + // <table> or <tbody>. + getForm(&formElt, element); + if (!formElt.isNull()) + scope.push(static_cast<ObjectImp *>(getDOMNode(exec, formElt).imp())); + else { + DOM::Node form = element.parentNode(); + while (!form.isNull() && form.elementId() != ID_FORM) + form = form.parentNode(); + + if (!form.isNull()) + scope.push(static_cast<ObjectImp *>(getDOMNode(exec, form).imp())); + } + + // The element is on top, searched first. + scope.push(static_cast<ObjectImp *>(getDOMNode(exec, element).imp())); +} + +HTMLElementFunction::HTMLElementFunction(ExecState *exec, int i, int len) + : DOMFunction(exec), id(i) +{ + Value protect(this); + put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum); +} + +Value KJS::HTMLElementFunction::tryCall(ExecState *exec, Object &thisObj, const List &args) +{ + KJS_CHECK_THIS( HTMLElement, thisObj ); + +#ifdef KJS_VERBOSE + kdDebug(6070) << "KJS::HTMLElementFunction::tryCall " << endl; +#endif + DOM::HTMLElement element = static_cast<KJS::HTMLElement *>(thisObj.imp())->toElement(); + + switch (element.elementId()) { + case ID_FORM: { + DOM::HTMLFormElement form = element; + if (id == KJS::HTMLElement::FormSubmit) { + + + DOM::HTMLDocument doc = element.ownerDocument(); + KHTMLView *view = static_cast<DOM::DocumentImpl*>(doc.handle())->view(); + KHTMLSettings::KJSWindowOpenPolicy policy = KHTMLSettings::KJSWindowOpenAllow; + if (view) + policy = view->part()->settings()->windowOpenPolicy(view->part()->url().host()); + + bool block = false; + + if ( policy != KHTMLSettings::KJSWindowOpenAllow ) { + block = true; + + // if this is a form without a target, or a special target, don't block + TQString trg = form.target().lower().string(); + if( trg.isEmpty() || trg == "_top" || trg == "_self" || + trg == "_parent") + block = false; + + TQString caption; + + // if there is a frame with the target name, don't block + if ( view && view->part() ) { + if (!view->part()->url().host().isEmpty()) + caption = view->part()->url().host() + " - "; + // search all (possibly nested) framesets + KHTMLPart *currentPart = view->part()->parentPart(); + while( currentPart != 0L ) { + if( currentPart->frameExists( form.target().string() ) ) + block = false; + currentPart = currentPart->parentPart(); + } + } + + if ( block && policy == KHTMLSettings::KJSWindowOpenAsk && view ) { + if (view && view->part()) + emit view->part()->browserExtension()->requestFocus(view->part()); + caption += i18n( "Confirmation: JavaScript Popup" ); + if ( KMessageBox::questionYesNo(view, form.action().isEmpty() ? + i18n( "This site is submitting a form which will open up a new browser " + "window via JavaScript.\n" + "Do you want to allow the form to be submitted?" ) : + i18n( "<qt>This site is submitting a form which will open <p>%1</p> in a new browser window via JavaScript.<br />" + "Do you want to allow the form to be submitted?</qt>").arg(KStringHandler::csqueeze(form.action().string(), 100)), + caption, i18n("Allow"), i18n("Do Not Allow") ) == KMessageBox::Yes ) + block = false; + + } else if ( block && policy == KHTMLSettings::KJSWindowOpenSmart ) { + if( static_cast<KJS::ScriptInterpreter *>(exec->interpreter())->isWindowOpenAllowed() ) { + // This submission has been triggered by the user + block = false; + } + } + } + + if( !block ) + form.submit(); + + return Undefined(); + } + else if (id == KJS::HTMLElement::FormReset) { + form.reset(); + return Undefined(); + } + } + break; + case ID_BODY: { + if (id == KJS::HTMLElement::BodyFocus) { + // Just blur everything. Not perfect, but good enough for now + if (DOM::NodeImpl* impl = element.handle()) { + impl->getDocument()->setFocusNode(0); + } + } + } + break; + case ID_SELECT: { + DOM::HTMLSelectElement select = element; + if (id == KJS::HTMLElement::SelectAdd) { + select.add(KJS::toNode(args[0]),KJS::toNode(args[1])); + return Undefined(); + } + else if (id == KJS::HTMLElement::SelectRemove) { + select.remove(int(args[0].toNumber(exec))); + return Undefined(); + } + else if (id == KJS::HTMLElement::SelectBlur) { + select.blur(); + return Undefined(); + } + else if (id == KJS::HTMLElement::SelectFocus) { + select.focus(); + return Undefined(); + } + } + break; + case ID_INPUT: { + DOM::HTMLInputElement input = element; + if (id == KJS::HTMLElement::InputBlur) { + input.blur(); + return Undefined(); + } + else if (id == KJS::HTMLElement::InputFocus) { + input.focus(); + return Undefined(); + } + else if (id == KJS::HTMLElement::InputSelect) { + input.select(); + return Undefined(); + } + else if (id == KJS::HTMLElement::InputClick) { + input.click(); + return Undefined(); + } + else if (id == KJS::HTMLElement::InputSetSelectionRange) { + input.setSelectionRange(args[0].toNumber(exec), args[1].toNumber(exec)); + return Undefined(); + } + } + break; + case ID_BUTTON: { + DOM::HTMLButtonElement button = element; + if (id == KJS::HTMLElement::ButtonBlur) { + button.blur(); + return Undefined(); + } + else if (id == KJS::HTMLElement::ButtonFocus) { + button.focus(); + return Undefined(); + } + } + break; + case ID_TEXTAREA: { + DOM::HTMLTextAreaElement textarea = element; + if (id == KJS::HTMLElement::TextAreaBlur) { + textarea.blur(); + return Undefined(); + } + else if (id == KJS::HTMLElement::TextAreaFocus) { + textarea.focus(); + return Undefined(); + } + else if (id == KJS::HTMLElement::TextAreaSelect) { + textarea.select(); + return Undefined(); + } + else if (id == KJS::HTMLElement::TextAreaSetSelectionRange) { + textarea.setSelectionRange(args[0].toNumber(exec), args[1].toNumber(exec)); + return Undefined(); + } + + } + break; + case ID_A: { + DOM::HTMLAnchorElement anchor = element; + if (id == KJS::HTMLElement::AnchorBlur) { + anchor.blur(); + return Undefined(); + } + else if (id == KJS::HTMLElement::AnchorFocus) { + anchor.focus(); + return Undefined(); + } + else if (id == KJS::HTMLElement::AnchorClick) { + static_cast<DOM::HTMLAnchorElementImpl*>(anchor.handle())->click(); + return Undefined(); + } + } + break; + case ID_TABLE: { + DOM::HTMLTableElement table = element; + if (id == KJS::HTMLElement::TableCreateTHead) + return getDOMNode(exec,table.createTHead()); + else if (id == KJS::HTMLElement::TableDeleteTHead) { + table.deleteTHead(); + return Undefined(); + } + else if (id == KJS::HTMLElement::TableCreateTFoot) + return getDOMNode(exec,table.createTFoot()); + else if (id == KJS::HTMLElement::TableDeleteTFoot) { + table.deleteTFoot(); + return Undefined(); + } + else if (id == KJS::HTMLElement::TableCreateCaption) + return getDOMNode(exec,table.createCaption()); + else if (id == KJS::HTMLElement::TableDeleteCaption) { + table.deleteCaption(); + return Undefined(); + } + else if (id == KJS::HTMLElement::TableInsertRow) + return getDOMNode(exec,table.insertRow(args[0].toInteger(exec))); + else if (id == KJS::HTMLElement::TableDeleteRow) { + table.deleteRow(args[0].toInteger(exec)); + return Undefined(); + } + } + break; + case ID_THEAD: + case ID_TBODY: + case ID_TFOOT: { + DOM::HTMLTableSectionElement tableSection = element; + if (id == KJS::HTMLElement::TableSectionInsertRow) + return getDOMNode(exec,tableSection.insertRow(args[0].toInteger(exec))); + else if (id == KJS::HTMLElement::TableSectionDeleteRow) { + tableSection.deleteRow(args[0].toInteger(exec)); + return Undefined(); + } + } + break; + case ID_TR: { + DOM::HTMLTableRowElement tableRow = element; + if (id == KJS::HTMLElement::TableRowInsertCell) + return getDOMNode(exec,tableRow.insertCell(args[0].toInteger(exec))); + else if (id == KJS::HTMLElement::TableRowDeleteCell) { + tableRow.deleteCell(args[0].toInteger(exec)); + return Undefined(); + } + break; + } + case ID_MARQUEE: { + if (id == KJS::HTMLElement::MarqueeStart && element.handle()->renderer() && + element.handle()->renderer()->layer() && + element.handle()->renderer()->layer()->marquee()) { + element.handle()->renderer()->layer()->marquee()->start(); + return Undefined(); + } + else if (id == KJS::HTMLElement::MarqueeStop && element.handle()->renderer() && + element.handle()->renderer()->layer() && + element.handle()->renderer()->layer()->marquee()) { + element.handle()->renderer()->layer()->marquee()->stop(); + return Undefined(); + } + break; + } + } + + if (id == HTMLElement::ElementScrollIntoView) { + bool alignToTop = true; + if (args.size() > 0) + alignToTop = args[0].toBoolean(exec); + static_cast<HTMLElementImpl*>(element.handle())->scrollIntoView(alignToTop); + return Undefined(); + } + + return Undefined(); +} + +void KJS::HTMLElement::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr) +{ +#ifdef KJS_VERBOSE + DOM::DOMString str = value.isA(NullType) ? DOM::DOMString() : value.toString(exec).string(); +#endif + DOM::HTMLElement element = static_cast<DOM::HTMLElement>(node); +#ifdef KJS_VERBOSE + kdDebug(6070) << "KJS::HTMLElement::tryPut " << propertyName.qstring() + << " thisTag=" << element.tagName().string() + << " str=" << str.string() << endl; +#endif + // First look at dynamic properties + switch (element.elementId()) { + case ID_SELECT: { + DOM::HTMLSelectElement select = element; + bool ok; + /*uint u =*/ propertyName.toULong(&ok); + if (ok) { + Object coll = Object::dynamicCast( getSelectHTMLCollection(exec, select.options(), select) ); + if ( coll.isValid() ) + coll.put(exec,propertyName,value); + return; + } + break; + } + case ID_APPLET: + case ID_OBJECT: + case ID_EMBED: { + KParts::LiveConnectExtension *lc = getLiveConnectExtension(element); + if (lc && lc->put(0, propertyName.qstring(), value.toString(exec).qstring())) + return; + break; + } + default: + break; + } + + const HashTable* table = classInfo()->propHashTable; // get the right hashtable + const HashEntry* entry = table ? Lookup::findEntry(table, propertyName) : 0; + if (entry) { + if (entry->attr & Function) // function: put as override property + { + ObjectImp::put(exec, propertyName, value, attr); + return; + } + else if ((entry->attr & ReadOnly) == 0) // let DOMObjectLookupPut print the warning if not + { + putValueProperty(exec, entry->value, value, attr); + return; + } + } + DOMObjectLookupPut<KJS::HTMLElement, DOMElement>(exec, propertyName, value, attr, &KJS::HTMLElementTable, this); +} + +void KJS::HTMLElement::putValueProperty(ExecState *exec, int token, const Value& value, int) +{ + DOM::DOMString str = value.isA(NullType) ? DOM::DOMString() : value.toString(exec).string(); + DOMNode *kjsNode = new DOMNode(exec, KJS::toNode(value)); + // Need to create a Value wrapper to avoid leaking the KJS::DOMNode + Value nodeValue(kjsNode); + DOM::Node n = kjsNode->toNode(); + DOM::HTMLElement element = static_cast<DOM::HTMLElement>(node); +#ifdef KJS_VERBOSE + kdDebug(6070) << "KJS::HTMLElement::putValueProperty " + << " thisTag=" << element.tagName().string() + << " token=" << token << endl; +#endif + + switch (element.elementId()) { + case ID_HTML: { + DOM::HTMLHtmlElement html = element; + switch (token) { + case HtmlVersion: { html.setVersion(str); return; } + } + } + break; + case ID_HEAD: { + DOM::HTMLHeadElement head = element; + switch (token) { + case HeadProfile: { head.setProfile(str); return; } + } + } + break; + case ID_LINK: { + DOM::HTMLLinkElement link = element; + switch (token) { + case LinkDisabled: { link.setDisabled(value.toBoolean(exec)); return; } + case LinkCharset: { link.setCharset(str); return; } + case LinkHref: { link.setHref(str); return; } + case LinkHrefLang: { link.setHreflang(str); return; } + case LinkMedia: { link.setMedia(str); return; } + case LinkRel: { link.setRel(str); return; } + case LinkRev: { link.setRev(str); return; } + case LinkTarget: { link.setTarget(str); return; } + case LinkType: { link.setType(str); return; } + } + } + break; + case ID_TITLE: { + DOM::HTMLTitleElement title = element; + switch (token) { + case TitleText: { title.setText(str); return; } + } + } + break; + case ID_META: { + DOM::HTMLMetaElement meta = element; + switch (token) { + case MetaContent: { meta.setContent(str); return; } + case MetaHttpEquiv: { meta.setHttpEquiv(str); return; } + case MetaName: { meta.setName(str); return; } + case MetaScheme: { meta.setScheme(str); return; } + } + } + break; + case ID_BASE: { + DOM::HTMLBaseElement base = element; + switch (token) { + case BaseHref: { base.setHref(str); return; } + case BaseTarget: { base.setTarget(str); return; } + } + } + break; + case ID_ISINDEX: { + DOM::HTMLIsIndexElement isindex = element; + switch (token) { + // read-only: form + case IsIndexPrompt: { isindex.setPrompt(str); return; } + } + } + break; + case ID_STYLE: { + DOM::HTMLStyleElement style = element; + switch (token) { + case StyleDisabled: { style.setDisabled(value.toBoolean(exec)); return; } + case StyleMedia: { style.setMedia(str); return; } + case StyleType: { style.setType(str); return; } + } + } + break; + case ID_BODY: { + DOM::HTMLBodyElement body = element; + switch (token) { + case BodyALink: { body.setALink(str); return; } + case BodyBackground: { body.setBackground(str); return; } + case BodyBgColor: { body.setBgColor(str); return; } + case BodyLink: { body.setLink(str); return; } + case BodyText: { body.setText(str); return; } + case BodyVLink: { body.setVLink(str); return; } + case BodyOnLoad: + DOM::DocumentImpl *doc = static_cast<DOM::DocumentImpl *>(node.ownerDocument().handle()); + if (doc && checkNodeSecurity(exec, node)) + { + DOMNode* kjsDocNode = new DOMNode(exec, doc); + // Need to create a Value wrapper to avoid leaking the KJS::DOMNode + Value nodeValue(kjsDocNode); + kjsDocNode->setListener(exec,DOM::EventImpl::LOAD_EVENT,value); + } + return; + } + } + break; + case ID_FORM: { + DOM::HTMLFormElement form = element; + switch (token) { + // read-only: elements + // read-only: length + case FormName: { form.setName(str); return; } + case FormAcceptCharset: { form.setAcceptCharset(str); return; } + case FormAction: { form.setAction(str.string()); return; } + case FormEncType: { form.setEnctype(str); return; } + case FormMethod: { form.setMethod(str); return; } + case FormTarget: { form.setTarget(str); return; } + } + } + break; + case ID_SELECT: { + DOM::HTMLSelectElement select = element; + switch (token) { + // read-only: type + case SelectSelectedIndex: { select.setSelectedIndex(value.toInteger(exec)); return; } + case SelectValue: { select.setValue(str); return; } + case SelectLength: { // read-only according to the NS spec, but webpages need it writeable + Object coll = Object::dynamicCast( getSelectHTMLCollection(exec, select.options(), select) ); + if ( coll.isValid() ) + coll.put(exec,"length",value); + return; + } + // read-only: form + // read-only: options + case SelectDisabled: { select.setDisabled(value.toBoolean(exec)); return; } + case SelectMultiple: { select.setMultiple(value.toBoolean(exec)); return; } + case SelectName: { select.setName(str); return; } + case SelectSize: { select.setSize(value.toInteger(exec)); return; } + case SelectTabIndex: { select.setTabIndex(value.toInteger(exec)); return; } + } + } + break; + case ID_OPTGROUP: { + DOM::HTMLOptGroupElement optgroup = element; + switch (token) { + case OptGroupDisabled: { optgroup.setDisabled(value.toBoolean(exec)); return; } + case OptGroupLabel: { optgroup.setLabel(str); return; } + } + } + break; + case ID_OPTION: { + DOM::HTMLOptionElement option = element; + switch (token) { + // read-only: form + case OptionDefaultSelected: { option.setDefaultSelected(value.toBoolean(exec)); return; } + // read-only: text <--- According to the DOM, but JavaScript and JScript both allow changes. + // So, we'll do it here and not add it to our DOM headers. + case OptionText: { DOM::NodeList nl(option.childNodes()); + for (unsigned int i = 0; i < nl.length(); i++) { + if (nl.item(i).nodeType() == DOM::Node::TEXT_NODE) { + static_cast<DOM::Text>(nl.item(i)).setData(str); + return; + } + } + // No child text node found, creating one + DOM::Text t = option.ownerDocument().createTextNode(str); + try { option.appendChild(t); } + catch(DOM::DOMException& e) { + // #### exec->setException ? + } + + return; + } + // read-only: index + case OptionDisabled: { option.setDisabled(value.toBoolean(exec)); return; } + case OptionLabel: { option.setLabel(str); return; } + case OptionSelected: { option.setSelected(value.toBoolean(exec)); return; } + case OptionValue: { option.setValue(str); return; } + } + } + break; + case ID_INPUT: { + DOM::HTMLInputElement input = element; + switch (token) { + case InputDefaultValue: { input.setDefaultValue(str); return; } + case InputDefaultChecked: { input.setDefaultChecked(value.toBoolean(exec)); return; } + // read-only: form + case InputAccept: { input.setAccept(str); return; } + case InputAccessKey: { input.setAccessKey(str); return; } + case InputAlign: { input.setAlign(str); return; } + case InputAlt: { input.setAlt(str); return; } + case InputChecked: { input.setChecked(value.toBoolean(exec)); return; } + case InputIndeterminate: { input.setIndeterminate(value.toBoolean(exec)); return; } + case InputDisabled: { input.setDisabled(value.toBoolean(exec)); return; } + case InputMaxLength: { input.setMaxLength(value.toInteger(exec)); return; } + case InputName: { input.setName(str); return; } + case InputReadOnly: { input.setReadOnly(value.toBoolean(exec)); return; } + case InputSize: { input.setSize(value.toInteger(exec)); return; } + case InputSrc: { input.setSrc(str); return; } + case InputTabIndex: { input.setTabIndex(value.toInteger(exec)); return; } + case InputType: { input.setType(str); return; } + case InputUseMap: { input.setUseMap(str); return; } + case InputValue: { input.setValue(str); return; } + case InputSelectionStart: { input.setSelectionStart(value.toInteger(exec)); return; } + case InputSelectionEnd: { input.setSelectionEnd (value.toInteger(exec)); return; } + } + } + break; + case ID_TEXTAREA: { + DOM::HTMLTextAreaElement textarea = element; + switch (token) { + case TextAreaDefaultValue: { textarea.setDefaultValue(str); return; } + // read-only: form + case TextAreaAccessKey: { textarea.setAccessKey(str); return; } + case TextAreaCols: { textarea.setCols(value.toInteger(exec)); return; } + case TextAreaDisabled: { textarea.setDisabled(value.toBoolean(exec)); return; } + case TextAreaName: { textarea.setName(str); return; } + case TextAreaReadOnly: { textarea.setReadOnly(value.toBoolean(exec)); return; } + case TextAreaRows: { textarea.setRows(value.toInteger(exec)); return; } + case TextAreaTabIndex: { textarea.setTabIndex(value.toInteger(exec)); return; } + // read-only: type + case TextAreaValue: { textarea.setValue(str); return; } + case TextAreaSelectionStart: { textarea.setSelectionStart(value.toInteger(exec)); return; } + case TextAreaSelectionEnd: { textarea.setSelectionEnd (value.toInteger(exec)); return; } + } + } + break; + case ID_BUTTON: { + DOM::HTMLButtonElement button = element; + switch (token) { + // read-only: form + case ButtonAccessKey: { button.setAccessKey(str); return; } + case ButtonDisabled: { button.setDisabled(value.toBoolean(exec)); return; } + case ButtonName: { button.setName(str); return; } + case ButtonTabIndex: { button.setTabIndex(value.toInteger(exec)); return; } + // read-only: type + case ButtonValue: { button.setValue(str); return; } + } + } + break; + case ID_LABEL: { + DOM::HTMLLabelElement label = element; + switch (token) { + // read-only: form + case LabelAccessKey: { label.setAccessKey(str); return; } + case LabelHtmlFor: { label.setHtmlFor(str); return; } + } + } + break; +// case ID_FIELDSET: { +// DOM::HTMLFieldSetElement fieldSet = element; +// // read-only: form +// } +// break; + case ID_LEGEND: { + DOM::HTMLLegendElement legend = element; + switch (token) { + // read-only: form + case LegendAccessKey: { legend.setAccessKey(str); return; } + case LegendAlign: { legend.setAlign(str); return; } + } + } + break; + case ID_UL: { + DOM::HTMLUListElement uList = element; + switch (token) { + case UListCompact: { uList.setCompact(value.toBoolean(exec)); return; } + case UListType: { uList.setType(str); return; } + } + } + break; + case ID_OL: { + DOM::HTMLOListElement oList = element; + switch (token) { + case OListCompact: { oList.setCompact(value.toBoolean(exec)); return; } + case OListStart: { oList.setStart(value.toInteger(exec)); return; } + case OListType: { oList.setType(str); return; } + } + } + break; + case ID_DL: { + DOM::HTMLDListElement dList = element; + switch (token) { + case DListCompact: { dList.setCompact(value.toBoolean(exec)); return; } + } + } + break; + case ID_DIR: { + DOM::HTMLDirectoryElement directory = element; + switch (token) { + case DirectoryCompact: { directory.setCompact(value.toBoolean(exec)); return; } + } + } + break; + case ID_MENU: { + DOM::HTMLMenuElement menu = element; + switch (token) { + case MenuCompact: { menu.setCompact(value.toBoolean(exec)); return; } + } + } + break; + case ID_LI: { + DOM::HTMLLIElement li = element; + switch (token) { + case LIType: { li.setType(str); return; } + case LIValue: { li.setValue(value.toInteger(exec)); return; } + } + } + break; + case ID_DIV: { + DOM::HTMLDivElement div = element; + switch (token) { + case DivAlign: { div.setAlign(str); return; } + } + } + break; + case ID_P: { + DOM::HTMLParagraphElement paragraph = element; + switch (token) { + case ParagraphAlign: { paragraph.setAlign(str); return; } + } + } + break; + case ID_H1: + case ID_H2: + case ID_H3: + case ID_H4: + case ID_H5: + case ID_H6: { + DOM::HTMLHeadingElement heading = element; + switch (token) { + case HeadingAlign: { heading.setAlign(str); return; } + } + } + break; + case ID_BLOCKQUOTE: { + DOM::HTMLBlockquoteElement blockquote = element; + switch (token) { + case BlockQuoteCite: { blockquote.setCite(str); return; } + } + } + break; + case ID_Q: { + DOM::HTMLQuoteElement quote = element; + switch (token) { + case QuoteCite: { quote.setCite(str); return; } + } + } + break; + case ID_PRE: { + DOM::HTMLPreElement pre = element; + switch (token) { + case PreWidth: { pre.setWidth(value.toInteger(exec)); return; } + } + } + break; + case ID_BR: { + DOM::HTMLBRElement br = element; + switch (token) { + case BRClear: { br.setClear(str); return; } + } + } + break; + case ID_BASEFONT: { + DOM::HTMLBaseFontElement baseFont = element; + switch (token) { + case BaseFontColor: { baseFont.setColor(str); return; } + case BaseFontFace: { baseFont.setFace(str); return; } + case BaseFontSize: { baseFont.setSize(value.toInteger(exec)); return; } + } + } + break; + case ID_FONT: { + DOM::HTMLFontElement font = element; + switch (token) { + case FontColor: { font.setColor(str); return; } + case FontFace: { font.setFace(str); return; } + case FontSize: { font.setSize(str); return; } + } + } + break; + case ID_HR: { + DOM::HTMLHRElement hr = element; + switch (token) { + case HRAlign: { hr.setAlign(str); return; } + case HRNoShade: { hr.setNoShade(value.toBoolean(exec)); return; } + case HRSize: { hr.setSize(str); return; } + case HRWidth: { hr.setWidth(str); return; } + } + } + break; + case ID_INS: + case ID_DEL: { + DOM::HTMLModElement mod = element; + switch (token) { + case ModCite: { mod.setCite(str); return; } + case ModDateTime: { mod.setDateTime(str); return; } + } + } + break; + case ID_A: { + DOM::HTMLAnchorElement anchor = element; + switch (token) { + case AnchorAccessKey: { anchor.setAccessKey(str); return; } + case AnchorCharset: { anchor.setCharset(str); return; } + case AnchorCoords: { anchor.setCoords(str); return; } + case AnchorHref: { anchor.setHref(str); return; } + case AnchorHrefLang: { anchor.setHreflang(str); return; } + case AnchorSearch: { KURL href(anchor.href().string()); + TQString q = str.isEmpty() ? TQString() : str.string(); + href.setQuery(q); + anchor.setHref(href.url()); return; } + case AnchorName: { anchor.setName(str); return; } + case AnchorRel: { anchor.setRel(str); return; } + case AnchorRev: { anchor.setRev(str); return; } + case AnchorShape: { anchor.setShape(str); return; } + case AnchorTabIndex: { anchor.setTabIndex(value.toInteger(exec)); return; } + case AnchorTarget: { anchor.setTarget(str); return; } + case AnchorType: { anchor.setType(str); return; } + } + } + break; + case ID_IMG: { + DOM::HTMLImageElement image = element; + switch (token) { + case ImageName: { image.setName(str); return; } + case ImageAlign: { image.setAlign(str); return; } + case ImageAlt: { image.setAlt(str); return; } + case ImageBorder: { image.setBorder(str); return; } + case ImageHeight: { image.setHeight(value.toInteger(exec)); return; } + case ImageHspace: { image.setHspace(value.toInteger(exec)); return; } + case ImageIsMap: { image.setIsMap(value.toBoolean(exec)); return; } + case ImageLongDesc: { image.setLongDesc(str); return; } + case ImageSrc: { image.setSrc(str); return; } + case ImageUseMap: { image.setUseMap(str); return; } + case ImageVspace: { image.setVspace(value.toInteger(exec)); return; } + case ImageWidth: { image.setWidth(value.toInteger(exec)); return; } + } + } + break; + case ID_OBJECT: { + DOM::HTMLObjectElement object = element; + switch (token) { + // read-only: form + case ObjectCode: { object.setCode(str); return; } + case ObjectAlign: { object.setAlign(str); return; } + case ObjectArchive: { object.setArchive(str); return; } + case ObjectBorder: { object.setBorder(str); return; } + case ObjectCodeBase: { object.setCodeBase(str); return; } + case ObjectCodeType: { object.setCodeType(str); return; } + // read-only: ObjectContentDocument + case ObjectData: { object.setData(str); return; } + case ObjectDeclare: { object.setDeclare(value.toBoolean(exec)); return; } + case ObjectHeight: { object.setHeight(str); return; } + case ObjectHspace: { object.setHspace(value.toInteger(exec)); return; } + case ObjectName: { object.setName(str); return; } + case ObjectStandby: { object.setStandby(str); return; } + case ObjectTabIndex: { object.setTabIndex(value.toInteger(exec)); return; } + case ObjectType: { object.setType(str); return; } + case ObjectUseMap: { object.setUseMap(str); return; } + case ObjectVspace: { object.setVspace(value.toInteger(exec)); return; } + case ObjectWidth: { object.setWidth(str); return; } + } + } + break; + case ID_PARAM: { + DOM::HTMLParamElement param = element; + switch (token) { + case ParamName: { param.setName(str); return; } + case ParamType: { param.setType(str); return; } + case ParamValue: { param.setValue(str); return; } + case ParamValueType: { param.setValueType(str); return; } + } + } + break; + case ID_APPLET: { + DOM::HTMLAppletElement applet = element; + switch (token) { + case AppletAlign: { applet.setAlign(str); return; } + case AppletAlt: { applet.setAlt(str); return; } + case AppletArchive: { applet.setArchive(str); return; } + case AppletCode: { applet.setCode(str); return; } + case AppletCodeBase: { applet.setCodeBase(str); return; } + case AppletHeight: { applet.setHeight(str); return; } + case AppletHspace: { applet.setHspace(value.toInteger(exec)); return; } + case AppletName: { applet.setName(str); return; } + case AppletObject: { applet.setObject(str); return; } + case AppletVspace: { applet.setVspace(value.toInteger(exec)); return; } + case AppletWidth: { applet.setWidth(str); return; } + } + } + break; + case ID_MAP: { + DOM::HTMLMapElement map = element; + switch (token) { + // read-only: areas + case MapName: { map.setName(str); return; } + } + } + break; + case ID_AREA: { + DOM::HTMLAreaElement area = element; + switch (token) { + case AreaAccessKey: { area.setAccessKey(str); return; } + case AreaAlt: { area.setAlt(str); return; } + case AreaCoords: { area.setCoords(str); return; } + case AreaHref: { area.setHref(str); return; } + case AreaNoHref: { area.setNoHref(value.toBoolean(exec)); return; } + case AreaShape: { area.setShape(str); return; } + case AreaTabIndex: { area.setTabIndex(value.toInteger(exec)); return; } + case AreaTarget: { area.setTarget(str); return; } + } + } + break; + case ID_SCRIPT: { + DOM::HTMLScriptElement script = element; + switch (token) { + case ScriptText: { script.setText(str); return; } + case ScriptHtmlFor: { script.setHtmlFor(str); return; } + case ScriptEvent: { script.setEvent(str); return; } + case ScriptCharset: { script.setCharset(str); return; } + case ScriptDefer: { script.setDefer(value.toBoolean(exec)); return; } + case ScriptSrc: { script.setSrc(str); return; } + case ScriptType: { script.setType(str); return; } + } + } + break; + case ID_TABLE: { + DOM::HTMLTableElement table = element; + switch (token) { + case TableCaption: { table.setCaption(n); return; } // type HTMLTableCaptionElement + case TableTHead: { table.setTHead(n); return; } // type HTMLTableSectionElement + case TableTFoot: { table.setTFoot(n); return; } // type HTMLTableSectionElement + // read-only: rows + // read-only: tbodies + case TableAlign: { table.setAlign(str); return; } + case TableBgColor: { table.setBgColor(str); return; } + case TableBorder: { table.setBorder(str); return; } + case TableCellPadding: { table.setCellPadding(str); return; } + case TableCellSpacing: { table.setCellSpacing(str); return; } + case TableFrame: { table.setFrame(str); return; } + case TableRules: { table.setRules(str); return; } + case TableSummary: { table.setSummary(str); return; } + case TableWidth: { table.setWidth(str); return; } + } + } + break; + case ID_CAPTION: { + DOM::HTMLTableCaptionElement tableCaption = element; + switch (token) { + case TableCaptionAlign: { tableCaption.setAlign(str); return; } + } + } + break; + case ID_COL: + case ID_COLGROUP: { + DOM::HTMLTableColElement tableCol = element; + switch (token) { + case TableColAlign: { tableCol.setAlign(str); return; } + case TableColCh: { tableCol.setCh(str); return; } + case TableColChOff: { tableCol.setChOff(str); return; } + case TableColSpan: { tableCol.setSpan(value.toInteger(exec)); return; } + case TableColVAlign: { tableCol.setVAlign(str); return; } + case TableColWidth: { tableCol.setWidth(str); return; } + } + } + break; + case ID_THEAD: + case ID_TBODY: + case ID_TFOOT: { + DOM::HTMLTableSectionElement tableSection = element; + switch (token) { + case TableSectionAlign: { tableSection.setAlign(str); return; } + case TableSectionCh: { tableSection.setCh(str); return; } + case TableSectionChOff: { tableSection.setChOff(str); return; } + case TableSectionVAlign: { tableSection.setVAlign(str); return; } + // read-only: rows + } + } + break; + case ID_TR: { + DOM::HTMLTableRowElement tableRow = element; + switch (token) { + // read-only: rowIndex + // read-only: sectionRowIndex + // read-only: cells + case TableRowAlign: { tableRow.setAlign(str); return; } + case TableRowBgColor: { tableRow.setBgColor(str); return; } + case TableRowCh: { tableRow.setCh(str); return; } + case TableRowChOff: { tableRow.setChOff(str); return; } + case TableRowVAlign: { tableRow.setVAlign(str); return; } + } + } + break; + case ID_TH: + case ID_TD: { + DOM::HTMLTableCellElement tableCell = element; + switch (token) { + // read-only: cellIndex + case TableCellAbbr: { tableCell.setAbbr(str); return; } + case TableCellAlign: { tableCell.setAlign(str); return; } + case TableCellAxis: { tableCell.setAxis(str); return; } + case TableCellBgColor: { tableCell.setBgColor(str); return; } + case TableCellCh: { tableCell.setCh(str); return; } + case TableCellChOff: { tableCell.setChOff(str); return; } + case TableCellColSpan: { tableCell.setColSpan(value.toInteger(exec)); return; } + case TableCellHeaders: { tableCell.setHeaders(str); return; } + case TableCellHeight: { tableCell.setHeight(str); return; } + case TableCellNoWrap: { tableCell.setNoWrap(value.toBoolean(exec)); return; } + case TableCellRowSpan: { tableCell.setRowSpan(value.toInteger(exec)); return; } + case TableCellScope: { tableCell.setScope(str); return; } + case TableCellVAlign: { tableCell.setVAlign(str); return; } + case TableCellWidth: { tableCell.setWidth(str); return; } + } + } + break; + case ID_FRAMESET: { + DOM::HTMLFrameSetElement frameSet = element; + switch (token) { + case FrameSetCols: { frameSet.setCols(str); return; } + case FrameSetRows: { frameSet.setRows(str); return; } + } + } + break; + case ID_LAYER: { + DOM::HTMLLayerElement layerElement = element; + switch (token) { + case LayerTop: { layerElement.setTop(value.toInteger(exec)); return; } + case LayerLeft: { layerElement.setLeft(value.toInteger(exec)); return; } + case LayerVisibility: { layerElement.setVisibility(str); return; } + case LayerBgColor: { layerElement.setBgColor(str); return; } + // read-only: layers, clip + } + } + break; + case ID_FRAME: { + DOM::HTMLFrameElement frameElement = element; + switch (token) { + // read-only: FrameContentDocument: + case FrameFrameBorder: { frameElement.setFrameBorder(str); return; } + case FrameLongDesc: { frameElement.setLongDesc(str); return; } + case FrameMarginHeight: { frameElement.setMarginHeight(str); return; } + case FrameMarginWidth: { frameElement.setMarginWidth(str); return; } + case FrameName: { frameElement.setName(str); return; } + case FrameNoResize: { frameElement.setNoResize(value.toBoolean(exec)); return; } + case FrameScrolling: { frameElement.setScrolling(str); return; } + case FrameSrc: { frameElement.setSrc(str); return; } + case FrameLocation: { + static_cast<DOM::HTMLFrameElementImpl *>(frameElement.handle())->setLocation(str); + return; + } + } + } + break; + case ID_IFRAME: { + DOM::HTMLIFrameElement iFrame = element; + switch (token) { + case IFrameAlign: { iFrame.setAlign(str); return; } + // read-only: IFrameContentDocument + case IFrameFrameBorder: { iFrame.setFrameBorder(str); return; } + case IFrameHeight: { iFrame.setHeight(str); return; } + case IFrameLongDesc: { iFrame.setLongDesc(str); return; } + case IFrameMarginHeight: { iFrame.setMarginHeight(str); return; } + case IFrameMarginWidth: { iFrame.setMarginWidth(str); return; } + case IFrameName: { iFrame.setName(str); return; } + case IFrameScrolling: { iFrame.setScrolling(str); return; } + case IFrameSrc: { iFrame.setSrc(str); return; } + case IFrameWidth: { iFrame.setWidth(str); return; } + } + break; + } + } + + // generic properties + switch (token) { + case ElementId: + element.setId(str); + return; + case ElementTitle: + element.setTitle(str); + return; + case ElementLang: + element.setLang(str); + return; + case ElementDir: + element.setDir(str); + return; + case ElementClassName: + element.setClassName(str); + return; + case ElementInnerHTML: + element.setInnerHTML(str); + return; + case ElementInnerText: + element.setInnerText(str); + return; + default: + kdDebug(6070) << "WARNING: KJS::HTMLElement::putValueProperty unhandled token " << token << " thisTag=" << element.tagName().string() << " str=" << str.string() << endl; + } +} + +//Prototype mess for this... +KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(HTMLElementProto, DOMElementProto) +KJS_IMPLEMENT_PROTOTYPE("HTMLElement", HTMLElementProto, HTMLElementFunction) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLElementPseudoCtor, "HTMLElement", HTMLElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLHtmlElement", HTMLHtmlElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLHtmlElementPseudoCtor, "HTMLHtmlElement", HTMLHtmlElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLHeadElement", HTMLHeadElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLHeadElementPseudoCtor, "HTMLHeadElement", HTMLHeadElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLLinkElement", HTMLLinkElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLLinkElementPseudoCtor, "HTMLLinkElement", HTMLLinkElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLTitleElement", HTMLTitleElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLTitleElementPseudoCtor, "HTMLTitleElement", HTMLTitleElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLMetaElement", HTMLMetaElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLMetaElementPseudoCtor, "HTMLMetaElement", HTMLMetaElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLBaseElement", HTMLBaseElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLBaseElementPseudoCtor, "HTMLBaseElement", HTMLBaseElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLIsIndexElement", HTMLIsIndexElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLIsIndexElementPseudoCtor, "HTMLIsIndexElement", HTMLIsIndexElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLStyleElement", HTMLStyleElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLStyleElementPseudoCtor, "HTMLStyleElement", HTMLStyleElementProto) + +KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(HTMLBodyElementProto, HTMLElementProto) +KJS_IMPLEMENT_PROTOTYPE("HTMLBodyElement", HTMLBodyElementProto, HTMLElementFunction) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLBodyElementPseudoCtor, "HTMLBodyElement", HTMLBodyElementProto) + +KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(HTMLFormElementProto, HTMLElementProto) +KJS_IMPLEMENT_PROTOTYPE("HTMLFormElement", HTMLFormElementProto, HTMLElementFunction) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLFormElementPseudoCtor, "HTMLFormElement", HTMLFormElementProto) + +KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(HTMLSelectElementProto, HTMLElementProto) +KJS_IMPLEMENT_PROTOTYPE("HTMLSelectElement", HTMLSelectElementProto, HTMLElementFunction) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLSelectElementPseudoCtor, "HTMLSelectElement", HTMLSelectElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLOptGroupElement", HTMLOptGroupElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLOptGroupElementPseudoCtor, "HTMLOptGroupElement", HTMLOptGroupElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLOptionElement", HTMLOptionElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLOptionElementPseudoCtor, "HTMLOptionElement", HTMLOptionElementProto) + +KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(HTMLInputElementProto, HTMLElementProto) +KJS_IMPLEMENT_PROTOTYPE("HTMLInputElement", HTMLInputElementProto, HTMLElementFunction) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLInputElementPseudoCtor, "HTMLInputElement", HTMLInputElementProto) + +KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(HTMLTextAreaElementProto, HTMLElementProto) +KJS_IMPLEMENT_PROTOTYPE("HTMLTextAreaElement", HTMLTextAreaElementProto, HTMLElementFunction) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLTextAreaElementPseudoCtor, "HTMLTextAreaElement", HTMLTextAreaElementProto) + +KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(HTMLButtonElementProto, HTMLElementProto) +KJS_IMPLEMENT_PROTOTYPE("HTMLButtonElement", HTMLButtonElementProto, HTMLElementFunction) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLButtonElementPseudoCtor, "HTMLButtonElement", HTMLButtonElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLLabelElement", HTMLLabelElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLLabelElementPseudoCtor, "HTMLLabelElement", HTMLLabelElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLFieldSetElement", HTMLFieldSetElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLFieldSetElementPseudoCtor, "HTMLFieldSetElement", HTMLFieldSetElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLLegendElement", HTMLLegendElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLLegendElementPseudoCtor, "HTMLLegendElement", HTMLLegendElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLUListElement", HTMLUListElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLUListElementPseudoCtor, "HTMLUListElement", HTMLUListElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLOListElement", HTMLOListElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLOListElementPseudoCtor, "HTMLOListElement", HTMLOListElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLDListElement", HTMLDListElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLDListElementPseudoCtor, "HTMLDListElement", HTMLDListElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLDirectoryElement", HTMLDirectoryElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLDirectoryElementPseudoCtor, "HTMLDirectoryElement", HTMLDirectoryElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLMenuElement", HTMLMenuElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLMenuElementPseudoCtor, "HTMLMenuElement", HTMLMenuElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLLIElement", HTMLLIElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLLIElementPseudoCtor, "HTMLLIElement", HTMLLIElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLDivElement", HTMLDivElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLDivElementPseudoCtor, "HTMLDivElement", HTMLDivElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLParagraphElement", HTMLParagraphElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLParagraphElementPseudoCtor, "HTMLParagraphElement", HTMLParagraphElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLHeadingElement", HTMLHeadingElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLHeadingElementPseudoCtor, "HTMLHeadingElement", HTMLHeadingElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLBlockQuoteElement", HTMLBlockQuoteElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLBlockQuoteElementPseudoCtor, "HTMLBlockQuoteElement", HTMLBlockQuoteElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLQuoteElement", HTMLQuoteElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLQuoteElementPseudoCtor, "HTMLQuoteElement", HTMLQuoteElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLPreElement", HTMLPreElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLPreElementPseudoCtor, "HTMLPreElement", HTMLPreElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLBRElement", HTMLBRElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLBRElementPseudoCtor, "HTMLBRElement", HTMLBRElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLBaseFontElement", HTMLBaseFontElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLBaseFontElementPseudoCtor, "HTMLBaseFontElement", HTMLBaseFontElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLFontElement", HTMLFontElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLFontElementPseudoCtor, "HTMLFontElement", HTMLFontElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLHRElement", HTMLHRElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLHRElementPseudoCtor, "HTMLHRElement", HTMLHRElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLModElement", HTMLModElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLModElementPseudoCtor, "HTMLModElement", HTMLModElementProto) + +KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(HTMLAnchorElementProto, HTMLElementProto) +KJS_IMPLEMENT_PROTOTYPE("HTMLAnchorElement", HTMLAnchorElementProto, HTMLElementFunction) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLAnchorElementPseudoCtor, "HTMLAnchorElement", HTMLAnchorElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLImageElement", HTMLImageElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLImageElementPseudoCtor, "HTMLImageElement", HTMLImageElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLObjectElement", HTMLObjectElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLObjectElementPseudoCtor, "HTMLObjectElement", HTMLObjectElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLParamElement", HTMLParamElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLParamElementPseudoCtor, "HTMLParamElement", HTMLParamElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLAppletElement", HTMLAppletElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLAppletElementPseudoCtor, "HTMLAppletElement", HTMLAppletElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLMapElement", HTMLMapElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLMapElementPseudoCtor, "HTMLMapElement", HTMLMapElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLAreaElement", HTMLAreaElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLAreaElementPseudoCtor, "HTMLAreaElement", HTMLAreaElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLScriptElement", HTMLScriptElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLScriptElementPseudoCtor, "HTMLScriptElement", HTMLScriptElementProto) + +KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(HTMLTableElementProto, HTMLElementProto) +KJS_IMPLEMENT_PROTOTYPE("HTMLTableElement", HTMLTableElementProto, HTMLElementFunction) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLTableElementPseudoCtor, "HTMLTableElement", HTMLTableElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLTableCaptionElement", HTMLTableCaptionElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLTableCaptionElementPseudoCtor, "HTMLTableCaptionElement", HTMLTableCaptionElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLTableColElement", HTMLTableColElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLTableColElementPseudoCtor, "HTMLTableColElement", HTMLTableColElementProto) + +KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(HTMLTableSectionElementProto, HTMLElementProto) +KJS_IMPLEMENT_PROTOTYPE("HTMLTableSectionElement", HTMLTableSectionElementProto, HTMLElementFunction) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLTableSectionElementPseudoCtor, "HTMLTableSectionElement", HTMLTableSectionElementProto) + +KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(HTMLTableRowElementProto, HTMLElementProto) +KJS_IMPLEMENT_PROTOTYPE("HTMLTableRowElement", HTMLTableRowElementProto, HTMLElementFunction) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLTableRowElementPseudoCtor, "HTMLTableRowElement", HTMLTableRowElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLTableCellElement", HTMLTableCellElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLTableCellElementPseudoCtor, "HTMLTableCellElement", HTMLTableCellElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLFrameSetElement", HTMLFrameSetElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLFrameSetElementPseudoCtor, "HTMLFrameSetElement", HTMLFrameSetElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLLayerElement", HTMLLayerElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLLayerElementPseudoCtor, "HTMLLayerElement", HTMLLayerElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLFrameElement", HTMLFrameElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLFrameElementPseudoCtor, "HTMLFrameElement", HTMLFrameElementProto) + +KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE("HTMLIFrameElement", HTMLIFrameElementProto, HTMLElementProto) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLIFrameElementPseudoCtor, "HTMLIFrameElement", HTMLIFrameElementProto) + +KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(HTMLMarqueeElementProto, HTMLElementProto) +KJS_IMPLEMENT_PROTOTYPE("HTMLMarqueeElement", HTMLMarqueeElementProto, HTMLElementFunction) +IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLMarqueeElementPseudoCtor, "HTMLMarqueeElement", HTMLMarqueeElementProto) + +static Object prototypeForID(ExecState* exec, DOM::NodeImpl::Id id) { + switch (id) { + case ID_HTML: + return HTMLHtmlElementProto::self(exec); + case ID_HEAD: + return HTMLHeadElementProto::self(exec); + case ID_LINK: + return HTMLLinkElementProto::self(exec); + case ID_TITLE: + return HTMLTitleElementProto::self(exec); + case ID_META: + return HTMLMetaElementProto::self(exec); + case ID_BASE: + return HTMLBaseElementProto::self(exec); + case ID_ISINDEX: + return HTMLIsIndexElementProto::self(exec); + case ID_STYLE: + return HTMLStyleElementProto::self(exec); + case ID_BODY: + return HTMLBodyElementProto::self(exec); + case ID_FORM: + return HTMLFormElementProto::self(exec); + case ID_SELECT: + return HTMLSelectElementProto::self(exec); + case ID_OPTGROUP: + return HTMLOptGroupElementProto::self(exec); + case ID_OPTION: + return HTMLOptionElementProto::self(exec); + case ID_INPUT: + return HTMLInputElementProto::self(exec); + case ID_TEXTAREA: + return HTMLTextAreaElementProto::self(exec); + case ID_BUTTON: + return HTMLButtonElementProto::self(exec); + case ID_LABEL: + return HTMLLabelElementProto::self(exec); + case ID_FIELDSET: + return HTMLFieldSetElementProto::self(exec); + case ID_LEGEND: + return HTMLLegendElementProto::self(exec); + case ID_UL: + return HTMLUListElementProto::self(exec); + case ID_OL: + return HTMLOListElementProto::self(exec); + case ID_DL: + return HTMLDListElementProto::self(exec); + case ID_DIR: + return HTMLDirectoryElementProto::self(exec); + case ID_MENU: + return HTMLMenuElementProto::self(exec); + case ID_LI: + return HTMLLIElementProto::self(exec); + case ID_DIV: + return HTMLDivElementProto::self(exec); + case ID_P: + return HTMLParagraphElementProto::self(exec); + case ID_H1: + case ID_H2: + case ID_H3: + case ID_H4: + case ID_H5: + case ID_H6: + return HTMLHeadingElementProto::self(exec); + case ID_BLOCKQUOTE: + return HTMLBlockQuoteElementProto::self(exec); + case ID_Q: + return HTMLQuoteElementProto::self(exec); + case ID_PRE: + return HTMLPreElementProto::self(exec); + case ID_BR: + return HTMLBRElementProto::self(exec); + case ID_BASEFONT: + return HTMLBaseFontElementProto::self(exec); + case ID_FONT: + return HTMLFontElementProto::self(exec); + case ID_HR: + return HTMLHRElementProto::self(exec); + case ID_INS: + case ID_DEL: + return HTMLModElementProto::self(exec); + case ID_A: + return HTMLAnchorElementProto::self(exec); + case ID_IMG: + return HTMLImageElementProto::self(exec); + case ID_OBJECT: + return HTMLObjectElementProto::self(exec); + case ID_PARAM: + return HTMLParamElementProto::self(exec); + case ID_APPLET: + return HTMLAppletElementProto::self(exec); + case ID_MAP: + return HTMLMapElementProto::self(exec); + case ID_AREA: + return HTMLAreaElementProto::self(exec); + case ID_SCRIPT: + return HTMLScriptElementProto::self(exec); + case ID_TABLE: + return HTMLTableElementProto::self(exec); + case ID_CAPTION: + return HTMLTableCaptionElementProto::self(exec); + case ID_COL: + case ID_COLGROUP: + return HTMLTableColElementProto::self(exec); + case ID_THEAD: + case ID_TBODY: + case ID_TFOOT: + return HTMLTableSectionElementProto::self(exec); + case ID_TR: + return HTMLTableRowElementProto::self(exec); + case ID_TD: + case ID_TH: + return HTMLTableCellElementProto::self(exec); + case ID_FRAMESET: + return HTMLFrameSetElementProto::self(exec); + case ID_LAYER: + return HTMLLayerElementProto::self(exec); + case ID_FRAME: + return HTMLFrameElementProto::self(exec); + case ID_IFRAME: + return HTMLIFrameElementProto::self(exec); + case ID_MARQUEE: + return HTMLMarqueeElementProto::self(exec); + default: + return HTMLElementProto::self(exec); + } +} + +// ------------------------------------------------------------------------- +/* Source for HTMLCollectionProtoTable. +@begin HTMLCollectionProtoTable 3 + item HTMLCollection::Item DontDelete|Function 1 + namedItem HTMLCollection::NamedItem DontDelete|Function 1 + tags HTMLCollection::Tags DontDelete|Function 1 +@end +*/ +KJS_DEFINE_PROTOTYPE(HTMLCollectionProto) +IMPLEMENT_PROTOFUNC_DOM(HTMLCollectionProtoFunc) +KJS_IMPLEMENT_PROTOTYPE("HTMLCollection", HTMLCollectionProto,HTMLCollectionProtoFunc) + +const ClassInfo KJS::HTMLCollection::info = { "HTMLCollection", 0, 0, 0 }; + +KJS::HTMLCollection::HTMLCollection(ExecState *exec, const DOM::HTMLCollection& c) + : DOMObject(HTMLCollectionProto::self(exec)), collection(c), hidden(false) {} + +KJS::HTMLCollection::HTMLCollection(const KJS::Object& proto, const DOM::HTMLCollection& c) + : DOMObject(proto), collection(c), hidden(false) {} + +KJS::HTMLCollection::~HTMLCollection() +{ + ScriptInterpreter::forgetDOMObject(collection.handle()); +} + +bool KJS::HTMLCollection::toBoolean(ExecState *) const { + return !hidden; +} + +// We have to implement hasProperty since we don't use a hashtable for 'selectedIndex' and 'length', +// and for indices in "for (..in..)" +bool KJS::HTMLCollection::hasProperty(ExecState *exec, const Identifier &p) const +{ + if (p == lengthPropertyName) + return true; + if ( collection.handle()->getType() == HTMLCollectionImpl::SELECT_OPTIONS && + ( p == "selectedIndex" || p == "value" ) ) + return true; + + bool ok; + unsigned long pos = p.toULong(&ok); + if (ok && pos < collection.length()) + return true; + + return DOMObject::hasProperty(exec, p); +} + +ReferenceList KJS::HTMLCollection::propList(ExecState *exec, bool recursive) +{ + ReferenceList properties = ObjectImp::propList(exec,recursive); + + for (unsigned i = 0; i < collection.length(); ++i) { + if (!ObjectImp::hasProperty(exec,Identifier::from(i))) { + properties.append(Reference(this, i)); + } + } + + if (!ObjectImp::hasProperty(exec, lengthPropertyName)) + properties.append(Reference(this, lengthPropertyName)); + + return properties; +} + +Value KJS::HTMLCollection::tryGet(ExecState *exec, const Identifier &propertyName) const +{ +#ifdef KJS_VERBOSE + kdDebug(6070) << "KJS::HTMLCollection::tryGet " << propertyName.ascii() << endl; +#endif + if (propertyName == lengthPropertyName) + { +#ifdef KJS_VERBOSE + kdDebug(6070) << " collection length is " << collection.length() << endl; +#endif + return Number(collection.length()); + } + + if (collection.handle()->getType() == HTMLCollectionImpl::SELECT_OPTIONS) { + DOM::HTMLSelectElement parentSelect = collection.base(); + if ( parentSelect.isNull() ) + return Undefined(); + if (propertyName == "selectedIndex") { + // NON-STANDARD options.selectedIndex + return Number(parentSelect.selectedIndex()); + } else if ( propertyName == "value" ) { + // NON-STANDARD options.value + return String(parentSelect.value()); + } + } + + // Look in the prototype (for functions) before assuming it's an item's name + Object proto = Object::dynamicCast(prototype()); + if (proto.isValid() && proto.hasProperty(exec,propertyName)) + return proto.get(exec,propertyName); + + // name or index ? + bool ok; + unsigned int u = propertyName.toULong(&ok); + if (ok) { + if ( u < collection.length() ) { + DOM::Node node = collection.item(u); + return getDOMNode(exec,node); + } else + return Undefined(); + } + else + return getNamedItems(exec,propertyName); +} + +// HTMLCollections are strange objects, they support both get and call, +// so that document.forms.item(0) and document.forms(0) both work. +Value KJS::HTMLCollection::call(ExecState *exec, Object &thisObj, const List &args) +{ + // This code duplication is necessary, HTMLCollection isn't a DOMFunction + Value val; + try { + val = tryCall(exec, thisObj, args); + } + // pity there's no way to distinguish between these in JS code + catch (...) { + Object err = Error::create(exec, GeneralError, "Exception from HTMLCollection"); + exec->setException(err); + } + return val; +} + +Value KJS::HTMLCollection::tryCall(ExecState *exec, Object &, const List &args) +{ + // Do not use thisObj here. It can be the HTMLDocument, in the document.forms(i) case. + /*if( thisObj.imp() != this ) + { + kdDebug(6070) << "WARNING: thisObj.imp() != this in HTMLCollection::tryCall" << endl; + KJS::printInfo(exec,"KJS::HTMLCollection::tryCall thisObj",thisObj,-1); + KJS::printInfo(exec,"KJS::HTMLCollection::tryCall this",Value(this),-1); + }*/ + // Also, do we need the TypeError test here ? + + if (args.size() == 1) { + // support for document.all(<index>) etc. + bool ok; + UString s = args[0].toString(exec); + unsigned int u = s.toULong(&ok); + if (ok) { + DOM::Element element = collection.item(u); + return getDOMNode(exec,element); + } + // support for document.images('<name>') etc. + return getNamedItems(exec,Identifier(s)); + } + else if (args.size() >= 1) // the second arg, if set, is the index of the item we want + { + bool ok; + UString s = args[0].toString(exec); + unsigned int u = args[1].toString(exec).toULong(&ok); + if (ok) + { + DOM::DOMString pstr = s.string(); + DOM::Node node = collection.namedItem(pstr); + while (!node.isNull()) { + if (!u) + return getDOMNode(exec,node); + node = collection.nextNamedItem(pstr); + --u; + } + } + } + return Undefined(); +} + +Value KJS::HTMLCollection::getNamedItems(ExecState *exec, const Identifier &propertyName) const +{ +#ifdef KJS_VERBOSE + kdDebug(6070) << "KJS::HTMLCollection::getNamedItems " << propertyName.ascii() << endl; +#endif + + DOM::DOMString pstr = propertyName.string(); + + TQValueList<DOM::NodeImpl*> matches = collection.handle()->namedItems(pstr); + + if (!matches.isEmpty()) { + if (matches.size() == 1) { + DOM::Node node(matches[0]); +#ifdef KJS_VERBOSE + kdDebug(6070) << "returning single node" << endl; +#endif + return getDOMNode(exec,node); + } + else { + // multiple items, return a collection + TQValueList<DOM::Node> nodes; + for (TQValueList<DOM::NodeImpl*>::const_iterator i = matches.begin(); + i != matches.end(); ++i) + nodes.append(DOM::Node(*i)); +#ifdef KJS_VERBOSE + kdDebug(6070) << "returning list of " << nodes.count() << " nodes" << endl; +#endif + return Value(new DOMNamedNodesCollection(exec, nodes)); + } + } +#ifdef KJS_VERBOSE + kdDebug(6070) << "not found" << endl; +#endif + return Undefined(); +} + +Value KJS::HTMLCollectionProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) +{ + KJS_CHECK_THIS( KJS::HTMLCollection, thisObj ); + DOM::HTMLCollection coll = static_cast<KJS::HTMLCollection *>(thisObj.imp())->toCollection(); + + switch (id) { + case KJS::HTMLCollection::Item: + { + // support for item(<index>) (DOM) + bool ok; + UString s = args[0].toString(exec); + unsigned int u = s.toULong(&ok); + if (ok) { + return getDOMNode(exec,coll.item(u)); + } + // support for item('<name>') (IE only) + kdWarning() << "non-standard HTMLCollection.item('" << s.ascii() << "') called, use namedItem instead" << endl; + return getDOMNode(exec,coll.namedItem(s.string())); + } + case KJS::HTMLCollection::Tags: + { + DOM::DOMString tagName = args[0].toString(exec).string(); + DOM::NodeList list; + // getElementsByTagName exists in Document and in Element, pick up the right one + if ( coll.base().nodeType() == DOM::Node::DOCUMENT_NODE ) + { + DOM::Document doc = coll.base(); + list = doc.getElementsByTagName(tagName); +#ifdef KJS_VERBOSE + kdDebug(6070) << "KJS::HTMLCollectionProtoFunc::tryCall document.tags(" << tagName.string() << ") -> " << list.length() << " items in node list" << endl; +#endif + } else + { + DOM::Element e = coll.base(); + list = e.getElementsByTagName(tagName); +#ifdef KJS_VERBOSE + kdDebug(6070) << "KJS::HTMLCollectionProtoFunc::tryCall element.tags(" << tagName.string() << ") -> " << list.length() << " items in node list" << endl; +#endif + } + return getDOMNodeList(exec, list); + } + case KJS::HTMLCollection::NamedItem: + { + Value val = static_cast<HTMLCollection *>(thisObj.imp())->getNamedItems(exec, Identifier(args[0].toString(exec))); + // Must return null when asking for a named item that isn't in the collection + // (DOM2 testsuite, HTMLCollection12 test) + if ( val.type() == KJS::UndefinedType ) + return Null(); + else + return val; + } + default: + return Undefined(); + } +} + +// ------------------------------------------------------------------------- +/* Source for HTMLSelectCollectionProtoTable. +@begin HTMLSelectCollectionProtoTable 1 + add HTMLSelectCollection::Add DontDelete|Function 2 +@end +*/ +KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(HTMLSelectCollectionProto, HTMLCollectionProto) +IMPLEMENT_PROTOFUNC_DOM(HTMLSelectCollectionProtoFunc) +KJS_IMPLEMENT_PROTOTYPE("HTMLOptionsCollection", HTMLSelectCollectionProto, HTMLSelectCollectionProtoFunc) + +const ClassInfo KJS::HTMLSelectCollection::info = { "HTMLOptionsCollection", &HTMLCollection::info, 0, 0 }; + +KJS::HTMLSelectCollection::HTMLSelectCollection(ExecState *exec, const DOM::HTMLCollection& c, + const DOM::HTMLSelectElement& e) + : HTMLCollection(HTMLSelectCollectionProto::self(exec), c), element(e) { } + +Value KJS::HTMLSelectCollection::tryGet(ExecState *exec, const Identifier &p) const +{ + if (p == "selectedIndex") + return Number(element.selectedIndex()); + + return HTMLCollection::tryGet(exec, p); +} + +void KJS::HTMLSelectCollection::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int) +{ +#ifdef KJS_VERBOSE + kdDebug(6070) << "KJS::HTMLSelectCollection::tryPut " << propertyName.qstring() << endl; +#endif + if ( propertyName == "selectedIndex" ) { + element.setSelectedIndex( value.toInteger( exec ) ); + return; + } + // resize ? + else if (propertyName == lengthPropertyName) { + unsigned newLen; + bool converted = value.toUInt32(newLen); + + if (!converted) { + return; + } + + long diff = element.length() - newLen; + + if (diff < 0) { // add dummy elements + do { + element.add(element.ownerDocument().createElement("OPTION"), DOM::HTMLElement()); + } while (++diff); + } + else // remove elements + while (diff-- > 0) + element.remove(newLen + diff); + + return; + } + // an index ? + bool ok; + unsigned int u = propertyName.toULong(&ok); + if (!ok) + return; + + if (value.isA(NullType) || value.isA(UndefinedType)) { + // null and undefined delete. others, too ? + element.remove(u); + return; + } + + // is v an option element ? + DOM::Node node = KJS::toNode(value); + if (node.isNull() || node.elementId() != ID_OPTION) + return; + + DOM::HTMLOptionElement option = static_cast<DOM::HTMLOptionElement>(node); + if ( option.ownerDocument() != element.ownerDocument() ) + option = static_cast<DOM::HTMLOptionElement>(element.ownerDocument().importNode(option, true)); + long diff = long(u) - element.length(); + DOM::HTMLElement before; + // out of array bounds ? first insert empty dummies + if (diff > 0) { + while (diff--) { + element.add(element.ownerDocument().createElement("OPTION"), before); + } + // replace an existing entry ? + } else if (diff < 0) { + before = element.options().item(u+1); + element.remove(u); + } + // finally add the new element + element.add(option, before); +} + + +Value KJS::HTMLSelectCollectionProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) +{ + KJS_CHECK_THIS( KJS::HTMLSelectCollection, thisObj ); + DOM::HTMLSelectElement element = static_cast<KJS::HTMLSelectCollection *>(thisObj.imp())->toElement(); + + switch (id) { + case KJS::HTMLSelectCollection::Add: + { + //Non-standard select.options.add. + //The first argument is the item, 2nd is offset. + //IE and Mozilla are both quite picky here, too... + DOM::Node node = KJS::toNode(args[0]); + if (node.isNull() || node.elementId() != ID_OPTION) { + Object err = Error::create(exec, GeneralError, "Invalid argument to HTMLOptionsCollection::add"); + exec->setException(err); + return Undefined(); + } + + DOM::HTMLOptionElement option = static_cast<DOM::HTMLOptionElement>(node); + if ( option.ownerDocument() != element.ownerDocument() ) //### remove this once auto-adopt works... + option = static_cast<DOM::HTMLOptionElement>(element.ownerDocument().importNode(option, true)); + + int pos = 0; + //By default append, if not specified or null.. + if (args[1].isA(UndefinedType)) + pos = element.length(); + else + pos = (int)args[1].toNumber(exec); + + if (pos < 0) { + Object err = Error::create(exec, GeneralError, "Invalid index argument to HTMLOptionsCollection::add"); + exec->setException(err); + return Undefined(); + } + + if (pos >= element.length()) { + //Append + element.add(option, DOM::Node()); + } else { + //Find what to prepend before.. + DOM::HTMLSelectElementImpl* impl = static_cast<HTMLSelectElementImpl*>(element.handle()); + TQMemArray<HTMLGenericFormElementImpl*> items = impl->listItems(); + int dummy; + impl->insertBefore(option.handle(), items.at(pos), dummy); + } + return Undefined(); + break; + } + default: + break; + } + return Undefined(); +} + + +////////////////////// Option Object //////////////////////// + +OptionConstructorImp::OptionConstructorImp(ExecState *exec, const DOM::Document &d) + : ObjectImp(), doc(d) +{ + // ## isn't there some redundancy between ObjectImp::_proto and the "prototype" property ? + //put(exec,"prototype", ...,DontEnum|DontDelete|ReadOnly); + + // no. of arguments for constructor + // ## is 4 correct ? 0 to 4, it seems to be + put(exec,lengthPropertyName, Number(4), ReadOnly|DontDelete|DontEnum); +} + +bool OptionConstructorImp::implementsConstruct() const +{ + return true; +} + +Object OptionConstructorImp::construct(ExecState *exec, const List &args) +{ + DOM::Element el = doc.createElement("OPTION"); + DOM::HTMLOptionElement opt = static_cast<DOM::HTMLOptionElement>(el); + int sz = args.size(); + DOM::Text t = doc.createTextNode(""); + try { opt.appendChild(t); } + catch(DOM::DOMException& e) { + // #### exec->setException ? + } + if (sz > 0) + t.setData(args[0].toString(exec).string()); // set the text + if (sz > 1) + opt.setValue(args[1].toString(exec).string()); + if (sz > 2) + opt.setDefaultSelected(args[2].toBoolean(exec)); + if (sz > 3) + opt.setSelected(args[3].toBoolean(exec)); + + return Object::dynamicCast(getDOMNode(exec,opt)); +} + +////////////////////// Image Object //////////////////////// + +//Like in other browsers, we merely make a new HTMLImageElement +//not in tree for this. +ImageConstructorImp::ImageConstructorImp(ExecState *, const DOM::Document &d) + : ObjectImp(), doc(d) +{ +} + +bool ImageConstructorImp::implementsConstruct() const +{ + return true; +} + +Object ImageConstructorImp::construct(ExecState *exec, const List &list) +{ + bool widthSet = false, heightSet = false; + int width = 0, height = 0; + if (list.size() > 0) { + widthSet = true; + Value w = list.at(0); + width = w.toInt32(exec); + } + if (list.size() > 1) { + heightSet = true; + Value h = list.at(1); + height = h.toInt32(exec); + } + + HTMLImageElement image(doc.createElement("image")); + + if (widthSet) + image.setWidth(width); + + if (heightSet) + image.setHeight(height); + + return Object::dynamicCast(getDOMNode(exec,image)); +} + +Value getHTMLCollection(ExecState *exec, const DOM::HTMLCollection& c, bool hide) +{ + Value coll = cacheDOMObject<DOM::HTMLCollection, KJS::HTMLCollection>(exec, c); + if (hide) { + KJS::HTMLCollection *impl = static_cast<KJS::HTMLCollection*>(coll.imp()); + impl->hide(); + } + return coll; +} + +Value getSelectHTMLCollection(ExecState *exec, const DOM::HTMLCollection& c, const DOM::HTMLSelectElement& e) +{ + DOMObject *ret; + if (c.isNull()) + return Null(); + ScriptInterpreter* interp = static_cast<ScriptInterpreter *>(exec->interpreter()); + if ((ret = interp->getDOMObject(c.handle()))) + return Value(ret); + else { + ret = new HTMLSelectCollection(exec, c, e); + interp->putDOMObject(c.handle(),ret); + return Value(ret); + } +} + +} //namespace KJS |