diff options
Diffstat (limited to 'khtml/ecma')
40 files changed, 0 insertions, 18689 deletions
diff --git a/khtml/ecma/AUTHORS b/khtml/ecma/AUTHORS deleted file mode 100644 index 2a129330d..000000000 --- a/khtml/ecma/AUTHORS +++ /dev/null @@ -1,4 +0,0 @@ -Harri Porten <porten@kde.org> -Peter Kelly <pmk@post.com> -Dirk Mueller <mueller@kde.org> -Daniel Molkentin <molkentin@kde.org> diff --git a/khtml/ecma/CMakeLists.txt b/khtml/ecma/CMakeLists.txt deleted file mode 100644 index 77457436b..000000000 --- a/khtml/ecma/CMakeLists.txt +++ /dev/null @@ -1,61 +0,0 @@ -################################################# -# -# (C) 2010 Serghei Amelian -# serghei (DOT) amelian (AT) gmail.com -# -# Improvements and feedback are welcome -# -# This file is released under GPL >= 2 -# -################################################# - -include_directories( - ${TQT_INCLUDE_DIRS} - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_BINARY_DIR} - ${CMAKE_BINARY_DIR}/kjs - ${CMAKE_BINARY_DIR}/tdecore - ${CMAKE_SOURCE_DIR} - ${CMAKE_SOURCE_DIR}/khtml - ${CMAKE_SOURCE_DIR}/dcop - ${CMAKE_SOURCE_DIR}/tdefx - ${CMAKE_SOURCE_DIR}/tdecore - ${CMAKE_SOURCE_DIR}/tdeui - ${CMAKE_SOURCE_DIR}/kio - ${CMAKE_SOURCE_DIR}/kio/kio - ${CMAKE_SOURCE_DIR}/kio/bookmarks - ${CMAKE_SOURCE_DIR}/kjs - ${CMAKE_SOURCE_DIR}/kwallet/client - ${CMAKE_SOURCE_DIR}/kutils -) - -link_directories( - ${TQT_LIBRARY_DIRS} -) - - -##### kjs_html-static ########################### - -set( target kjs_html ) - -set( ${target}_SRCS - kjs_binding.cpp kjs_dom.cpp kjs_html.cpp kjs_window.cpp - kjs_navigator.cpp kjs_proxy.cpp kjs_css.cpp - kjs_range.cpp kjs_traversal.cpp kjs_events.cpp - kjs_views.cpp kjs_debugwin.cpp kjs_mozilla.cpp - xmlhttprequest.cpp xmlserializer.cpp domparser.cpp -) - -set( ${target}_LUTS - kjs_dom.cpp kjs_html.cpp kjs_css.cpp kjs_events.cpp - kjs_navigator.cpp kjs_mozilla.cpp kjs_range.cpp - kjs_traversal.cpp kjs_views.cpp kjs_window.cpp - xmlhttprequest.cpp xmlserializer.cpp domparser.cpp -) - -tde_add_luts( ${${target}_LUTS} ) - -tde_add_library( ${target} STATIC_PIC AUTOMOC - SOURCES ${${target}_SRCS} -) - diff --git a/khtml/ecma/Makefile.am b/khtml/ecma/Makefile.am deleted file mode 100644 index c88b51d33..000000000 --- a/khtml/ecma/Makefile.am +++ /dev/null @@ -1,90 +0,0 @@ -# This file is part of the KDE libraries -# Copyright (C) 1999 Harri Porten (porten@kde.org) - -# 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; see the file COPYING.LIB. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -# Boston, MA 02110-1301, USA. - -INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/kio -I$(top_srcdir)/kio/bookmarks -I$(top_srcdir)/khtml -I$(top_srcdir)/khtml/java -I$(top_srcdir)/kwallet/client -I$(top_srcdir)/kutils -I$(top_builddir)/kjs $(all_includes) - -KDE_CXXFLAGS = $(USE_EXCEPTIONS) - -noinst_LTLIBRARIES = libkjs_html.la - -noinst_HEADERS = kjs_html.h kjs_dom.h kjs_window.h kjs_navigator.h \ - kjs_binding.h kjs_proxy.h kjs_css.h kjs_range.h \ - kjs_traversal.h kjs_events.h kjs_views.h kjs_debugwin.h - -libkjs_html_la_SOURCES = kjs_binding.cpp kjs_dom.cpp kjs_html.cpp kjs_window.cpp \ - kjs_navigator.cpp kjs_proxy.cpp \ - kjs_css.cpp kjs_range.cpp kjs_traversal.cpp kjs_events.cpp \ - kjs_views.cpp kjs_debugwin.cpp kjs_mozilla.cpp xmlhttprequest.cpp \ - xmlserializer.cpp domparser.cpp -#libkjs_html_la_LDFLAGS = -module -avoid-version $(all_libraries) -libkjs_html_la_LIBADD = $(top_builddir)/kjs/libkjs.la # ../libkhtml.la -libkjs_html_la_METASOURCES = AUTO - -LUT_FILES = kjs_dom.lut.h kjs_html.lut.h kjs_css.lut.h kjs_events.lut.h kjs_navigator.lut.h \ - kjs_mozilla.lut.h kjs_range.lut.h kjs_traversal.lut.h kjs_views.lut.h kjs_window.lut.h - -CREATE_HASH_TABLE = $(top_srcdir)/kjs/create_hash_table - -kjs_dom.lut.h : $(srcdir)/kjs_dom.cpp $(CREATE_HASH_TABLE) - $(PERL) $(CREATE_HASH_TABLE) $(srcdir)/kjs_dom.cpp > $@ -kjs_dom.lo: kjs_dom.lut.h -kjs_html.lut.h : $(srcdir)/kjs_html.cpp $(CREATE_HASH_TABLE) - $(PERL) $(CREATE_HASH_TABLE) $(srcdir)/kjs_html.cpp > $@ -kjs_html.lo: kjs_html.lut.h -kjs_css.lut.h : $(srcdir)/kjs_css.cpp $(CREATE_HASH_TABLE) - $(PERL) $(CREATE_HASH_TABLE) $(srcdir)/kjs_css.cpp > $@ -kjs_css.lo: kjs_css.lut.h -kjs_events.lut.h : $(srcdir)/kjs_events.cpp $(CREATE_HASH_TABLE) - $(PERL) $(CREATE_HASH_TABLE) $(srcdir)/kjs_events.cpp > $@ -kjs_events.lo: kjs_events.lut.h -kjs_navigator.lut.h : $(srcdir)/kjs_navigator.cpp $(CREATE_HASH_TABLE) - $(PERL) $(CREATE_HASH_TABLE) $(srcdir)/kjs_navigator.cpp > $@ -kjs_navigator.lo: kjs_navigator.lut.h -kjs_mozilla.lut.h : $(srcdir)/kjs_mozilla.cpp $(CREATE_HASH_TABLE) - $(PERL) $(CREATE_HASH_TABLE) $(srcdir)/kjs_mozilla.cpp > $@ -kjs_mozilla.lo: kjs_mozilla.lut.h -kjs_range.lut.h : $(srcdir)/kjs_range.cpp $(CREATE_HASH_TABLE) - $(PERL) $(CREATE_HASH_TABLE) $(srcdir)/kjs_range.cpp > $@ -kjs_range.lo: kjs_range.lut.h -kjs_traversal.lut.h : $(srcdir)/kjs_traversal.cpp $(CREATE_HASH_TABLE) - $(PERL) $(CREATE_HASH_TABLE) $(srcdir)/kjs_traversal.cpp > $@ -kjs_traversal.lo: kjs_traversal.lut.h -kjs_views.lut.h : $(srcdir)/kjs_views.cpp $(CREATE_HASH_TABLE) - $(PERL) $(CREATE_HASH_TABLE) $(srcdir)/kjs_views.cpp > $@ -kjs_views.lo: kjs_views.lut.h -kjs_window.lut.h : $(srcdir)/kjs_window.cpp $(CREATE_HASH_TABLE) - $(PERL) $(CREATE_HASH_TABLE) $(srcdir)/kjs_window.cpp > $@ -kjs_window.lo: kjs_window.lut.h -xmlhttprequest.lut.h : $(srcdir)/xmlhttprequest.cpp $(CREATE_HASH_TABLE) - $(PERL) $(CREATE_HASH_TABLE) $(srcdir)/xmlhttprequest.cpp > $@ -xmlhttprequest.lo: xmlhttprequest.lut.h -xmlserializer.lut.h : $(srcdir)/xmlserializer.cpp $(CREATE_HASH_TABLE) - $(PERL) $(CREATE_HASH_TABLE) $(srcdir)/xmlserializer.cpp > $@ -xmlserializer.lo: xmlserializer.lut.h -domparser.lut.h : $(srcdir)/domparser.cpp $(CREATE_HASH_TABLE) - $(PERL) $(CREATE_HASH_TABLE) $(srcdir)/domparser.cpp > $@ -domparser.lo: domparser.lut.h - - -CLEANFILES = $(LUT_FILES) - -# interactive test program -#check_PROGRAMS = testecma -#testecma_SOURCES = testecma.cpp -#testecma_LDADD = ../libkhtml.la $(top_builddir)/kjs/libkjs.la - diff --git a/khtml/ecma/README b/khtml/ecma/README deleted file mode 100644 index 4c341699a..000000000 --- a/khtml/ecma/README +++ /dev/null @@ -1,21 +0,0 @@ -This module contains the ECMAScript a.k.a. JavaScript language bindings for -the KHTML Part. - -The module is loaded into KHTML's address space on demand. - -To test the non-HTML DOM functions you may compile a little interactive -interpreter called 'testecma' with 'make check' (see testecma.cpp for -further details). - -Harri Porten <porten@kde.org> - -======================================================================== -Appendix A: Web sites with useful tests - -http://oucsace.cs.ohiou.edu/~ywang/JavaScript -http://www.xs4all.nl/~ppk/js/index.html?version5.html - -Appendix B: References for HTML JavaScript bindings - -http://msdn.microsoft.com/workshop/author/dhtml/reference/objects.asp -http://docs.sun.com/source/816-6408-10/ diff --git a/khtml/ecma/THANKS b/khtml/ecma/THANKS deleted file mode 100644 index b21dce741..000000000 --- a/khtml/ecma/THANKS +++ /dev/null @@ -1,9 +0,0 @@ -Vadim Plessky <lucy-ples@mtu-net.ru> for dissecting an endless number -of bug reports and therefore taking quite some load of our shoulders. - -Ferdinand Gassauer <f.gassauer@aon.at> for numerous useful bug reports -and keeping track of them later. - -David Faure <faure@kde.org> for taking some time off from Konqueror -and making a lotto site working fixing bugs along the way. - diff --git a/khtml/ecma/TODO b/khtml/ecma/TODO deleted file mode 100644 index 16a7152c5..000000000 --- a/khtml/ecma/TODO +++ /dev/null @@ -1,12 +0,0 @@ -Has to be done -============== -- frame[] correct search and sorting order (DONE ?) -- optional error message output -- change KParts::WindowArgs && friends - that we can detect if a locationbar is on/or not - -Could be done -============= -- Make the graphical debugger useable -- Improve internal structures to give a really useful - output on errors (i.e. improve backtrance capabilities) diff --git a/khtml/ecma/domparser.cpp b/khtml/ecma/domparser.cpp deleted file mode 100644 index 672754a45..000000000 --- a/khtml/ecma/domparser.cpp +++ /dev/null @@ -1,112 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2005 Anders Carlsson (andersca@mac.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser 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 "domparser.h" -#include "domparser.lut.h" - -#include "kjs_dom.h" -#include "kjs_window.h" -#include "xml/dom_nodeimpl.h" -#include "xml/dom_docimpl.h" - -#include "html/html_documentimpl.h" - -using DOM::DocumentImpl; - -////////////////////// DOMParser Object //////////////////////// - -/* Source for DOMParserProtoTable. -@begin DOMParserProtoTable 1 - parseFromString DOMParser::ParseFromString DontDelete|Function 2 -@end -*/ - - -namespace KJS { - -KJS_DEFINE_PROTOTYPE(DOMParserProto) -IMPLEMENT_PROTOFUNC_DOM(DOMParserProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMParser", DOMParserProto, DOMParserProtoFunc) - - -DOMParserConstructorImp::DOMParserConstructorImp(ExecState *, DOM::DocumentImpl *d) - : doc(d) -{ -} - -bool DOMParserConstructorImp::implementsConstruct() const -{ - return true; -} - -Object DOMParserConstructorImp::construct(ExecState *exec, const List &) -{ - return Object(new DOMParser(exec, doc.get())); -} - -const ClassInfo DOMParser::info = { "DOMParser", 0, 0 /* &DOMParserTable*/, 0 }; - - -DOMParser::DOMParser(ExecState *exec, DOM::DocumentImpl *d) - : DOMObject(DOMParserProto::self(exec)), doc(d) -{ -// setPrototype(DOMParserProto::self(exec)); -} - - -Value DOMParserProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - if (!thisObj.inherits(&DOMParser::info)) { - Object err = Error::create(exec,TypeError); - exec->setException(err); - return err; - } - - DOMParser *parser = static_cast<DOMParser *>(thisObj.imp()); - - switch (id) { - case DOMParser::ParseFromString: - { - if (args.size() != 2) { - return Undefined(); - } - - TQString str = args[0].toString(exec).qstring(); - TQString contentType = args[1].toString(exec).qstring().stripWhiteSpace(); - - if (contentType == "text/xml" || contentType == "application/xml" || contentType == "application/xhtml+xml") { - DocumentImpl *docImpl = parser->doc->implementation()->createDocument(); - - docImpl->open(); - docImpl->write(str); - docImpl->finishParsing(); - docImpl->close(); - - return getDOMNode(exec, docImpl); - } - } - } - - return Undefined(); -} - -} // end namespace - - diff --git a/khtml/ecma/domparser.h b/khtml/ecma/domparser.h deleted file mode 100644 index 746514783..000000000 --- a/khtml/ecma/domparser.h +++ /dev/null @@ -1,58 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2005 Anders Carlsson (andersca@mac.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser 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 - */ - -#ifndef DOMPARSER_H -#define DOMPARSER_H - -#include <tqguardedptr.h> -#include <kjs/object.h> -#include <kjs/interpreter.h> -#include <misc/shared.h> - -#include "kjs_dom.h" - -namespace KJS { - - class DOMParserConstructorImp : public ObjectImp { - public: - DOMParserConstructorImp(ExecState *, DOM::DocumentImpl *d); - virtual bool implementsConstruct() const; - virtual Object construct(ExecState *exec, const List &args); -private: - khtml::SharedPtr<DOM::DocumentImpl> doc; - }; - - class DOMParser : public DOMObject { - public: - DOMParser(ExecState *, DOM::DocumentImpl *d); - virtual bool toBoolean(ExecState *) const { return true; } - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { ParseFromString }; - - private: - TQGuardedPtr<DOM::DocumentImpl> doc; - - friend class DOMParserProtoFunc; - }; - -} // namespace - -#endif diff --git a/khtml/ecma/jsk.html b/khtml/ecma/jsk.html deleted file mode 100644 index 917c083e8..000000000 --- a/khtml/ecma/jsk.html +++ /dev/null @@ -1,113 +0,0 @@ -<html> -<!-- -Javascript Konsole (c) 2001 Till Krech <till@snafu.de> -Dieser Code unterliegt den Bedingungen der Gnu Public License Version 2. ---> -<head> -<title>Javascript Konsole</title> -<style type="text/css"> -code { - color:#444488; -} -em { - font-weight: bold; -} -</style> -<script language="JavaScript"> - -function do_eval() { - var fo = document.forms.fo; - fo.restyp.value = ""; - fo.field.value = ""; - var fo = document.fo; - var expr = fo.zeile.value; - var result = eval(expr); - fo.restyp.value = typeof(result); - var tuedel = ""; - if (typeof(result) == "string") { - tuedel = '"'; - } - fo.field.value = tuedel + result + tuedel; -} - -function do_properties() { - var fo = document.forms.fo; - fo.restyp.value = ""; - fo.field.value = ""; - var fo = document.fo; - var expr = fo.zeile.value; - var result = eval(expr); - var i; - fo.restyp.value = typeof(result); - var fieldvalue = ""; - if (typeof(result) != "undefined") { - for (i in result) { - var tuedel = ""; - var propval = result[i]; - if (typeof(propval) == "string") { - tuedel = '"'; - } - fieldvalue += - i - + " [" + typeof(propval) + "] = " - + tuedel + propval + tuedel + "\n"; - } - fo.field.value = fieldvalue; - } -} - - -</script> -</head> -<body bgcolor="#dddddd"> -<h1>JavaScript Konsole</h1> -<form name="fo"> -<table bgcolor="#cccccc" cellspacing="1" cellpadding="8"> - <tr bgcolor="#ffeeee"><th height="40" align="right">Expression</th><td><input name="zeile" type="text" size="60"></td></tr> - <tr bgcolor="#eeeeee"><th align="right">Result Type</th><td><input name="restyp" readonly type="text" size="60"></td></tr> - <tr bgcolor="#eeeeee"><th align="right">Result(s)</th><td><textarea readonly name="field" rows="10" cols="60"></textarea></td></tr> -<tr bgcolor="#ffeeee"><td> </td><td> - <input type="button" value="list properties" onclick="do_properties()"> - <input type="button" value="evaluate" onclick="do_eval()"> - <input type="reset" value="clear fields" -</td></tr> -</table> -</form> -<h2>Explanation</h2> -<h3>Operation</h3> -<blockquote> -When <em>evaluate</em> is pressed, the given expression is evaluated and the result is displayed in the result(s) field. -In case of <em>list properties</em> being pressed, the result of the expression is taken as an object -and the objects properties are displayed with their type and value in the the result(s) field. -</blockquote> -<h3>Expression</h3> -<blockquote> -Expression must be a valid javascript expression, e.g.<br><code>window</code> -<br>or<br><code>document.body.innerHTML</code><br>or<br> -<code>"Today: " + (new Date()).toString()</code><br> -or<br> -<code>"Cablecar".match(/ab.*c/)</code> -<br>It is also possible to assign a value, -e.g.<br><code>document.getElementsByTagName('H1').item(0).innerText="Hello World"</code><br> -You may execute these examples by pasting them into the expression field. -</blockquote> -<h3>Result Type</h3> -<blockquote> -The type of the result of the given expression. -</blockquote> -<h3>Result(s)</h3> -<blockquote> -The result of the expression is implicitly converted to a primitive type by the javascript interpreter, -if <em>evaluate</em> was pressed. When <em>list properties</em> was pressed, a <code>for (var i in obj)</code> loop -is executed to list the properties. These object properties are in turn evaluated and their types and values -are displayed. -</blockquote> -<p> -<a href="mailto:till@snafu.de?subject=JavaScript%20Konsole">Till Krech</a> -</p> -<p> -<br> -</p> - -</body> -</html> diff --git a/khtml/ecma/kjs_binding.cpp b/khtml/ecma/kjs_binding.cpp deleted file mode 100644 index 125401cae..000000000 --- a/khtml/ecma/kjs_binding.cpp +++ /dev/null @@ -1,467 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 1999-2003 Harri Porten (porten@kde.org) - * Copyright (C) 2001-2003 David Faure (faure@kde.org) - * 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 "kjs_binding.h" -#include "kjs_dom.h" - -#include "dom/dom_exception.h" -#include "dom/dom2_range.h" -#include "xml/dom2_eventsimpl.h" -#include "khtmlpart_p.h" - -#include <kdebug.h> -#include <kparts/browserextension.h> - -#include <assert.h> - -using namespace KJS; - -/* TODO: - * The catch all (...) clauses below shouldn't be necessary. - * But they helped to view for example www.faz.net in an stable manner. - * Those unknown exceptions should be treated as severe bugs and be fixed. - * - * these may be CSS exceptions - need to check - pmk - */ - -Value DOMObject::get(ExecState *exec, const Identifier &p) const -{ - Value result; - try { - result = tryGet(exec,p); - } - catch (DOM::DOMException e) { - // ### translate code into readable string ? - // ### oh, and s/QString/i18n or I18N_NOOP (the code in kjs uses I18N_NOOP... but where is it translated ?) - // and where does it appear to the user ? - Object err = Error::create(exec, GeneralError, TQString(TQString("DOM exception %1").arg(e.code)).local8Bit()); - exec->setException( err ); - result = Undefined(); - } - catch (...) { - kdError(6070) << "Unknown exception in DOMObject::get()" << endl; - result = String("Unknown exception"); - } - - return result; -} - -void DOMObject::put(ExecState *exec, const Identifier &propertyName, - const Value &value, int attr) -{ - try { - tryPut(exec, propertyName, value, attr); - } - catch (DOM::DOMException e) { - Object err = Error::create(exec, GeneralError, TQString(TQString("DOM exception %1").arg(e.code)).local8Bit()); - exec->setException(err); - } - catch (...) { - kdError(6070) << "Unknown exception in DOMObject::put()" << endl; - } -} - -void DOMObject::tryPut(ExecState *exec, const Identifier &propertyName, - const Value& value, int attr) -{ - static_cast<ScriptInterpreter*>(exec->dynamicInterpreter())->customizedDOMObject(this); - ObjectImp::put(exec,propertyName,value,attr); -} - -UString DOMObject::toString(ExecState *) const -{ - return "[object " + className() + "]"; -} - -Boolean DOMObject::hasInstance(ExecState *exec, const Value &value) -{ - if (value.type() != ObjectType) - return Boolean(false); - - Value prot = get(exec,prototypePropertyName); - if (prot.type() != ObjectType && prot.type() != NullType) { - Object err = Error::create(exec, TypeError, "Invalid prototype encountered " - "in instanceof operation."); - exec->setException(err); - return Boolean(false); - } - - Object v = Object(static_cast<ObjectImp*>(value.imp())); - while ((v = Object::dynamicCast(v.prototype())).imp()) { - if (v.imp() == prot.imp()) - return Boolean(true); - } - return Boolean(false); -} - - -Value DOMFunction::get(ExecState *exec, const Identifier &propertyName) const -{ - try { - return tryGet(exec, propertyName); - } - catch (DOM::DOMException e) { - Object err = Error::create(exec, GeneralError, TQString(TQString("DOM exception %1").arg(e.code)).local8Bit()); - exec->setException(err); - return Undefined(); - } - catch (...) { - kdError(6070) << "Unknown exception in DOMFunction::get()" << endl; - return String("Unknown exception"); - } -} - -Value DOMFunction::call(ExecState *exec, Object &thisObj, const List &args) -{ - try { - return tryCall(exec, thisObj, args); - } - // pity there's no way to distinguish between these in JS code - // ### Look into setting prototypes of these & the use of instanceof so the exception - // type can be determined. See what other browsers do. - catch (DOM::DOMException e) { - Object err = Error::create(exec, GeneralError, TQString(TQString("DOM Exception %1").arg(e.code)).local8Bit()); - err.put(exec, "code", Number(e.code)); - exec->setException(err); - return Undefined(); - } - catch (DOM::RangeException e) { - Object err = Error::create(exec, GeneralError, TQString(TQString("DOM Range Exception %1").arg(e.code)).local8Bit()); - err.put(exec, "code", Number(e.code)); - exec->setException(err); - return Undefined(); - } - catch (DOM::CSSException e) { - Object err = Error::create(exec, GeneralError, TQString(TQString("CSS Exception %1").arg(e.code)).local8Bit()); - err.put(exec, "code", Number(e.code)); - exec->setException(err); - return Undefined(); - } - catch (DOM::EventException e) { - Object err = Error::create(exec, GeneralError, TQString(TQString("DOM Event Exception %1").arg(e.code)).local8Bit()); - err.put(exec, "code", Number(e.code)); - exec->setException(err); - return Undefined(); - } - catch (...) { - kdError(6070) << "Unknown exception in DOMFunction::call()" << endl; - Object err = Error::create(exec, GeneralError, "Unknown exception"); - exec->setException(err); - return Undefined(); - } -} - -typedef TQPtrList<ScriptInterpreter> InterpreterList; -static InterpreterList *interpreterList; - -ScriptInterpreter::ScriptInterpreter( const Object &global, khtml::ChildFrame* frame ) - : Interpreter( global ), m_frame( frame ), m_domObjects(1021), - m_evt( 0L ), m_inlineCode(false), m_timerCallback(false) -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "ScriptInterpreter::ScriptInterpreter " << this << " for part=" << m_frame << endl; -#endif - if ( !interpreterList ) - interpreterList = new InterpreterList; - interpreterList->append( this ); -} - -ScriptInterpreter::~ScriptInterpreter() -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "ScriptInterpreter::~ScriptInterpreter " << this << " for part=" << m_frame << endl; -#endif - assert( interpreterList && interpreterList->contains( this ) ); - interpreterList->remove( this ); - if ( interpreterList->isEmpty() ) { - delete interpreterList; - interpreterList = 0; - } -} - -void ScriptInterpreter::forgetDOMObject( void* objectHandle ) -{ - if( !interpreterList ) return; - - TQPtrListIterator<ScriptInterpreter> it( *interpreterList ); - while ( it.current() ) { - (*it)->deleteDOMObject( objectHandle ); - ++it; - } -} - -void ScriptInterpreter::mark() -{ - Interpreter::mark(); -#ifdef KJS_VERBOSE - kdDebug(6070) << "ScriptInterpreter::mark " << this << " marking " << m_customizedDomObjects.count() << " DOM objects" << endl; -#endif - TQPtrDictIterator<void> it( m_customizedDomObjects ); - for( ; it.current(); ++it ) - static_cast<DOMObject*>(it.currentKey())->mark(); -} - -KParts::ReadOnlyPart* ScriptInterpreter::part() const { - return m_frame->m_part; -} - -bool ScriptInterpreter::isWindowOpenAllowed() const -{ - if ( m_evt ) - { - int id = m_evt->handle()->id(); - bool eventOk = ( // mouse events - id == DOM::EventImpl::CLICK_EVENT || - id == DOM::EventImpl::MOUSEUP_EVENT || id == DOM::EventImpl::MOUSEDOWN_EVENT || - id == DOM::EventImpl::KHTML_ECMA_CLICK_EVENT || id == DOM::EventImpl::KHTML_ECMA_DBLCLICK_EVENT || - // keyboard events - id == DOM::EventImpl::KEYDOWN_EVENT || id == DOM::EventImpl::KEYPRESS_EVENT || - id == DOM::EventImpl::KEYUP_EVENT || - // other accepted events - id == DOM::EventImpl::SELECT_EVENT || id == DOM::EventImpl::CHANGE_EVENT || - id == DOM::EventImpl::SUBMIT_EVENT ); - kdDebug(6070) << "Window.open, smart policy: id=" << id << " eventOk=" << eventOk << endl; - if (eventOk) - return true; - } else // no event - { - if ( m_inlineCode && !m_timerCallback ) - { - // This is the <a href="javascript:window.open('...')> case -> we let it through - return true; - kdDebug(6070) << "Window.open, smart policy, no event, inline code -> ok" << endl; - } - else // This is the <script>window.open(...)</script> case or a timer callback -> block it - kdDebug(6070) << "Window.open, smart policy, no event, <script> tag -> refused" << endl; - } - return false; -} - - -UString::UString(const TQString &d) -{ - unsigned int len = d.length(); - UChar *dat = new UChar[len]; - memcpy(dat, d.unicode(), len * sizeof(UChar)); - rep = UString::Rep::create(dat, len); -} - -UString::UString(const DOM::DOMString &d) -{ - if (d.isNull()) { - // we do a conversion here as null DOMStrings shouldn't cross - // the boundary to kjs. They should either be empty strings - // or explicitly converted to KJS::Null via getString(). - attach(&Rep::empty); - return; - } - - unsigned int len = d.length(); - UChar *dat = new UChar[len]; - memcpy(dat, d.unicode(), len * sizeof(UChar)); - rep = UString::Rep::create(dat, len); -} - -DOM::DOMString UString::string() const -{ - return DOM::DOMString((TQChar*) data(), size()); -} - -TQString UString::qstring() const -{ - return TQString((TQChar*) data(), size()); -} - -TQConstString UString::qconststring() const -{ - return TQConstString((TQChar*) data(), size()); -} - -DOM::DOMString Identifier::string() const -{ - return DOM::DOMString((TQChar*) data(), size()); -} - -TQString Identifier::qstring() const -{ - return TQString((TQChar*) data(), size()); -} - -DOM::Node KJS::toNode(const Value& val) -{ - Object obj = Object::dynamicCast(val); - if (!obj.isValid() || !obj.inherits(&DOMNode::info)) - return DOM::Node(); - - const DOMNode *dobj = static_cast<const DOMNode*>(obj.imp()); - return dobj->toNode(); -} - -Value KJS::getString(DOM::DOMString s) -{ - if (s.isNull()) - return Null(); - else - return String(s); -} - -TQVariant KJS::ValueToVariant(ExecState* exec, const Value &val) { - TQVariant res; - switch (val.type()) { - case BooleanType: - res = TQVariant(val.toBoolean(exec), 0); - break; - case NumberType: - res = TQVariant(val.toNumber(exec)); - break; - case StringType: - res = TQVariant(val.toString(exec).qstring()); - break; - default: - // everything else will be 'invalid' - break; - } - return res; -} - -class EmbedLiveConnect : public ObjectImp -{ - friend Value KJS::getLiveConnectValue(KParts::LiveConnectExtension *lc, const TQString & name, const int type, const TQString & value, int id); - EmbedLiveConnect(KParts::LiveConnectExtension *lc, UString n, KParts::LiveConnectExtension::Type t, int id); -public: - ~EmbedLiveConnect(); - - virtual Value get(ExecState *, const Identifier & prop) const; - virtual void put(ExecState * exec, const Identifier &prop, const Value & value, int=None); - virtual Value call(ExecState * exec, Object &, const List &args); - virtual bool implementsCall() const; - virtual bool toBoolean(ExecState *) const; - virtual Value toPrimitive(ExecState *exec, Type) const; - virtual UString toString(ExecState *) const; - -private: - EmbedLiveConnect(const EmbedLiveConnect &); - TQGuardedPtr<KParts::LiveConnectExtension> m_liveconnect; - UString name; - KParts::LiveConnectExtension::Type objtype; - unsigned long objid; -}; - -Value KJS::getLiveConnectValue(KParts::LiveConnectExtension *lc, const TQString & name, const int type, const TQString & value, int id) -{ - KParts::LiveConnectExtension::Type t=(KParts::LiveConnectExtension::Type)type; - switch(t) { - case KParts::LiveConnectExtension::TypeBool: { - bool ok; - int i = value.toInt(&ok); - if (ok) - return Boolean(i); - return Boolean(!strcasecmp(value.latin1(), "true")); - } - case KParts::LiveConnectExtension::TypeObject: - case KParts::LiveConnectExtension::TypeFunction: - return Value(new EmbedLiveConnect(lc, name, t, id)); - case KParts::LiveConnectExtension::TypeNumber: { - bool ok; - int i = value.toInt(&ok); - if (ok) - return Number(i); - else - return Number(value.toDouble(&ok)); - } - case KParts::LiveConnectExtension::TypeString: - return String(value); - case KParts::LiveConnectExtension::TypeVoid: - default: - return Undefined(); - } -} - -/* only with gcc > 3.4 KDE_NO_EXPORT */ -EmbedLiveConnect::EmbedLiveConnect(KParts::LiveConnectExtension *lc, UString n, KParts::LiveConnectExtension::Type t, int id) - : m_liveconnect (lc), name(n), objtype(t), objid(id) -{} - -/* only with gcc > 3.4 KDE_NO_EXPORT */ -EmbedLiveConnect::~EmbedLiveConnect() { - if (m_liveconnect) - m_liveconnect->unregister(objid); -} - -KDE_NO_EXPORT -Value EmbedLiveConnect::get(ExecState *, const Identifier & prop) const -{ - if (m_liveconnect) { - KParts::LiveConnectExtension::Type rettype; - TQString retval; - unsigned long retobjid; - if (m_liveconnect->get(objid, prop.qstring(), rettype, retobjid, retval)) - return getLiveConnectValue(m_liveconnect, prop.qstring(), rettype, retval, retobjid); - } - return Undefined(); -} - -KDE_NO_EXPORT -void EmbedLiveConnect::put(ExecState * exec, const Identifier &prop, const Value & value, int) -{ - if (m_liveconnect) - m_liveconnect->put(objid, prop.qstring(), value.toString(exec).qstring()); -} - -KDE_NO_EXPORT -bool EmbedLiveConnect::implementsCall() const { - return objtype == KParts::LiveConnectExtension::TypeFunction; -} - -KDE_NO_EXPORT -Value EmbedLiveConnect::call(ExecState *exec, Object&, const List &args) -{ - if (m_liveconnect) { - TQStringList qargs; - for (ListIterator i = args.begin(); i != args.end(); ++i) - qargs.append((*i).toString(exec).qstring()); - KParts::LiveConnectExtension::Type rtype; - TQString rval; - unsigned long robjid; - if (m_liveconnect->call(objid, name.qstring(), qargs, rtype, robjid, rval)) - return getLiveConnectValue(m_liveconnect, name.qstring(), rtype, rval, robjid); - } - return Undefined(); -} - -KDE_NO_EXPORT -bool EmbedLiveConnect::toBoolean(ExecState *) const { - return true; -} - -KDE_NO_EXPORT -Value EmbedLiveConnect::toPrimitive(ExecState *exec, Type) const { - return String(toString(exec)); -} - -KDE_NO_EXPORT -UString EmbedLiveConnect::toString(ExecState *) const { - TQString str; - const char *type = objtype == KParts::LiveConnectExtension::TypeFunction ? "Function" : "Object"; - str.sprintf("[object %s ref=%d]", type, (int) objid); - return UString(str); -} diff --git a/khtml/ecma/kjs_binding.h b/khtml/ecma/kjs_binding.h deleted file mode 100644 index c55da21ce..000000000 --- a/khtml/ecma/kjs_binding.h +++ /dev/null @@ -1,409 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 1999-2001 Harri Porten (porten@kde.org) - * 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 - */ - -#ifndef _KJS_BINDING_H_ -#define _KJS_BINDING_H_ - -#include <kjs/interpreter.h> -#include <kjs/function_object.h> /// for FunctionPrototypeImp - -#include <dom/dom_node.h> -#include <tqvariant.h> -#include <tqptrdict.h> -#include <kurl.h> -#include <kjs/lookup.h> - -namespace KParts { - class ReadOnlyPart; - class LiveConnectExtension; -} - -namespace khtml { - class ChildFrame; -} - -namespace KJS { - - /** - * Base class for all objects in this binding - get() and put() run - * tryGet() and tryPut() respectively, and catch exceptions if they - * occur. - */ - class DOMObject : public ObjectImp { - public: - DOMObject(const Object &proto) : ObjectImp(proto) {} - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const - { return ObjectImp::get(exec, propertyName); } - virtual bool implementsHasInstance() const { return true; } - virtual Boolean hasInstance(ExecState *exec, const Value &value); - virtual void put(ExecState *exec, const Identifier &propertyName, - const Value &value, int attr = None); - virtual void tryPut(ExecState *exec, const Identifier &propertyName, - const Value& value, int attr = None); - - virtual UString toString(ExecState *exec) const; - }; - - /** - * Base class for all functions in this binding - get() and call() run - * tryGet() and tryCall() respectively, and catch exceptions if they - * occur. - */ - class DOMFunction : public InternalFunctionImp { - public: - DOMFunction(ExecState* exec) : InternalFunctionImp( - static_cast<FunctionPrototypeImp*>(exec->interpreter()->builtinFunctionPrototype().imp()) - ) {} - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const - { return ObjectImp::get(exec, propertyName); } - - virtual bool implementsCall() const { return true; } - virtual Value call(ExecState *exec, Object &thisObj, const List &args); - - virtual Value tryCall(ExecState *exec, Object &thisObj, const List&args) - { return ObjectImp::call(exec, thisObj, args); } - virtual bool toBoolean(ExecState *) const { return true; } - }; - - /** - * We inherit from Interpreter, to save a pointer to the HTML part - * that the interpreter runs for. - * The interpreter also stores the DOM object - >KJS::DOMObject cache. - */ - class KDE_EXPORT ScriptInterpreter : public Interpreter - { - public: - ScriptInterpreter( const Object &global, khtml::ChildFrame* frame ); - virtual ~ScriptInterpreter(); - - DOMObject* getDOMObject( void* objectHandle ) const { - return m_domObjects[objectHandle]; - } - void putDOMObject( void* objectHandle, DOMObject* obj ) { - m_domObjects.insert( objectHandle, obj ); - } - void customizedDOMObject( DOMObject* obj ) { - m_customizedDomObjects.replace( obj, this ); - } - bool deleteDOMObject( void* objectHandle ) { - DOMObject* obj = m_domObjects.take( objectHandle ); - if (obj) { - m_customizedDomObjects.remove( obj ); - return true; - } - else - return false; - } - void clear() { - m_customizedDomObjects.clear(); - m_domObjects.clear(); - } - /** - * Static method. Makes all interpreters forget about the object - */ - static void forgetDOMObject( void* objectHandle ); - - /** - * Mark objects in the DOMObject cache. - */ - virtual void mark(); - KParts::ReadOnlyPart* part() const; - - virtual int rtti() { return 1; } - - /** - * Set the event that is triggering the execution of a script, if any - */ - void setCurrentEvent( DOM::Event *evt ) { m_evt = evt; } - void setInlineCode( bool inlineCode ) { m_inlineCode = inlineCode; } - void setProcessingTimerCallback( bool timerCallback ) { m_timerCallback = timerCallback; } - /** - * "Smart" window.open policy - */ - bool isWindowOpenAllowed() const; - - private: - khtml::ChildFrame* m_frame; - TQPtrDict<DOMObject> m_domObjects; - TQPtrDict<void> m_customizedDomObjects; //Objects which had custom properties set, - //and should not be GC'd. key is DOMObject* - DOM::Event *m_evt; - bool m_inlineCode; - bool m_timerCallback; - }; - /** - * Retrieve from cache, or create, a KJS object around a DOM object - */ - template<class DOMObj, class KJSDOMObj> - inline Value cacheDOMObject(ExecState *exec, DOMObj domObj) - { - DOMObject *ret; - if (domObj.isNull()) - return Null(); - ScriptInterpreter* interp = static_cast<ScriptInterpreter *>(exec->interpreter()); - if ((ret = interp->getDOMObject(domObj.handle()))) - return Value(ret); - else { - ret = new KJSDOMObj(exec, domObj); - interp->putDOMObject(domObj.handle(),ret); - return Value(ret); - } - } - - /** - * Convert an object to a Node. Returns a null Node if not possible. - */ - DOM::Node toNode(const Value&); - /** - * Get a String object, or Null() if s is null - */ - Value getString(DOM::DOMString s); - - /** - * Convery a KJS value into a QVariant - */ - TQVariant ValueToVariant(ExecState* exec, const Value& val); - - /** - * We need a modified version of lookupGet because - * we call tryGet instead of get, in DOMObjects. - */ - template <class FuncImp, class ThisImp, class ParentImp> - inline Value DOMObjectLookupGet(ExecState *exec, const Identifier &propertyName, - const HashTable* table, const ThisImp* thisObj) - { - const HashEntry* entry = Lookup::findEntry(table, propertyName); - - if (!entry) // not found, forward to parent - return thisObj->ParentImp::tryGet(exec, propertyName); - - if (entry->attr & Function) { - return lookupOrCreateFunction<FuncImp>(exec, propertyName, thisObj, entry->value, entry->params, entry->attr); - } - return thisObj->getValueProperty(exec, entry->value); - } - - /** - * Simplified version of DOMObjectLookupGet in case there are no - * functions, only "values". - */ - template <class ThisImp, class ParentImp> - inline Value DOMObjectLookupGetValue(ExecState *exec, const Identifier &propertyName, - const HashTable* table, const ThisImp* thisObj) - { - const HashEntry* entry = Lookup::findEntry(table, propertyName); - - if (!entry) // not found, forward to parent - return thisObj->ParentImp::tryGet(exec, propertyName); - - if (entry->attr & Function) - fprintf(stderr, "Function bit set! Shouldn't happen in lookupValue!\n" ); - return thisObj->getValueProperty(exec, entry->value); - } - - /** - * We need a modified version of lookupPut because - * we call tryPut instead of put, in DOMObjects. - */ - template <class ThisImp, class ParentImp> - inline void DOMObjectLookupPut(ExecState *exec, const Identifier &propertyName, - const Value& value, int attr, - const HashTable* table, ThisImp* thisObj) - { - const HashEntry* entry = Lookup::findEntry(table, propertyName); - - if (!entry) // not found: forward to parent - thisObj->ParentImp::tryPut(exec, propertyName, value, attr); - else if (entry->attr & Function) // function: put as override property - thisObj->ObjectImp::put(exec, propertyName, value, attr); - else if (entry->attr & ReadOnly) // readonly! Can't put! -#ifdef KJS_VERBOSE - fprintf(stderr,"WARNING: Attempt to change value of readonly property '%s'\n",propertyName.ascii()); -#else - ; // do nothing -#endif - else - thisObj->putValueProperty(exec, entry->value, value, attr); - } - -// Versions of prototype functions that properly support instanceof, -// and are compatible with trunk. -#define KJS_DEFINE_PROTOTYPE_IMP(ClassProto,ProtoCode) \ - class ClassProto : public ObjectImp { \ - friend Object cacheGlobalObject<ClassProto>(ExecState *exec, const Identifier &propertyName); \ - public: \ - static Object self(ExecState *exec); \ - virtual const ClassInfo *classInfo() const { return &info; } \ - static const ClassInfo info; \ - Value get(ExecState *exec, const Identifier &propertyName) const; \ - protected: \ - ClassProto( ExecState *exec ) \ - : ObjectImp( ProtoCode ) {} \ - \ - static Identifier* s_name; \ - static Identifier* name(); \ - }; - -#define KJS_DEFINE_PROTOTYPE(ClassProto) \ - KJS_DEFINE_PROTOTYPE_IMP(ClassProto, exec->interpreter()->builtinObjectPrototype()) - -#define KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(ClassProto, ClassProtoProto) \ - KJS_DEFINE_PROTOTYPE_IMP(ClassProto, ClassProtoProto::self(exec)) - -#define KJS_EMPTY_PROTOTYPE_IMP(ClassName, ClassProto, ProtoCode) \ - class ClassProto : public ObjectImp { \ - friend Object cacheGlobalObject<ClassProto>(ExecState *exec, const Identifier &propertyName); \ - public: \ - static Object self(ExecState *exec) { \ - return cacheGlobalObject<ClassProto>(exec, *name()); \ - } \ - virtual const ClassInfo *classInfo() const { return &info; } \ - static const ClassInfo info; \ - protected: \ - ClassProto( ExecState *exec ) \ - : ObjectImp( ProtoCode ) {} \ - \ - static Identifier* s_name; \ - static Identifier* name() { \ - if (!s_name) s_name = new Identifier("[[" ClassName ".prototype]]"); \ - return s_name; \ - }\ - }; \ - Identifier* ClassProto::s_name = 0; \ - const ClassInfo ClassProto::info = { ClassName, 0, 0, 0 }; - -#define KJS_EMPTY_PROTOTYPE_WITH_PROTOTYPE(ClassName, ClassProto, ClassProtoProto) \ - KJS_EMPTY_PROTOTYPE_IMP(ClassName, ClassProto, ClassProtoProto::self(exec)) - -//### this doesn't implement hasProperty, but stuff in lookup.h didn't -//either (just did the forward) -#define KJS_IMPLEMENT_PROTOTYPE(ClassName, ClassProto, ClassFunc) \ - const ClassInfo ClassProto::info = { ClassName, 0, &ClassProto##Table, 0 }; \ - Identifier* ClassProto::s_name = 0; \ - Object ClassProto::self(ExecState *exec) \ - { \ - return cacheGlobalObject<ClassProto>(exec, *name()); \ - } \ - Value ClassProto::get(ExecState *exec, const Identifier &propertyName) const \ - { \ - /*fprintf( stderr, "%sProto::get(%s) [in macro, no parent]\n", info.className, propertyName.ascii());*/ \ - return lookupGetFunction<ClassFunc,ObjectImp>(exec, propertyName, &ClassProto##Table, this ); \ - } \ - Identifier* ClassProto::name() \ - { \ - if (!s_name) s_name = new Identifier("[[" ClassName ".prototype]]"); \ - return s_name; \ - } - - // Modified version of IMPLEMENT_PROTOFUNC, to use DOMFunction and tryCall -#define IMPLEMENT_PROTOFUNC_DOM(ClassFunc) \ - class ClassFunc : public DOMFunction { \ - public: \ - ClassFunc(ExecState *exec, int i, int len) \ - : DOMFunction( exec ), id(i) { \ - Value protect(this); \ - put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum); \ - } \ - /** You need to implement that one */ \ - virtual Value tryCall(ExecState *exec, Object &thisObj, const List &args); \ - private: \ - int id; \ - }; - - Value getLiveConnectValue(KParts::LiveConnectExtension *lc, const TQString & name, const int type, const TQString & value, int id); - - -// This is used to create pseudo-constructor objects, like Mozillaish -// Element, HTMLDocument, etc., which do not act like real constructors, -// but do have the prototype property pointing to prototype of "instances" -#define DEFINE_PSEUDO_CONSTRUCTOR(ClassName) \ - class ClassName : public DOMObject { \ - public: \ - ClassName(ExecState *); \ - virtual const ClassInfo* classInfo() const { return &info; } \ - static const ClassInfo info; \ - static Object self(ExecState *exec); \ - }; - -#define IMPLEMENT_PSEUDO_CONSTRUCTOR_IMP(Class,ClassName,ProtoClass,ParentProto) \ - const ClassInfo Class::info = { ClassName, 0, 0, 0 }; \ - Class::Class(ExecState* exec): DOMObject(ParentProto) {\ - Object proto = ProtoClass::self(exec); \ - putDirect(prototypePropertyName, proto.imp(), DontDelete|ReadOnly); \ - }\ - Object Class::self(ExecState *exec) { \ - return Object(cacheGlobalObject<Class>(exec, "[[" ClassName ".constructor]]")); \ - } - -#define IMPLEMENT_PSEUDO_CONSTRUCTOR(Class,ClassName,ProtoClass) \ - IMPLEMENT_PSEUDO_CONSTRUCTOR_IMP(Class,ClassName,ProtoClass,exec->lexicalInterpreter()->builtinObjectPrototype()) - -#define IMPLEMENT_PSEUDO_CONSTRUCTOR_WITH_PARENT(Class,ClassName,ProtoClass,ParentProtoClass) \ - IMPLEMENT_PSEUDO_CONSTRUCTOR_IMP(Class,ClassName,ProtoClass,ParentProtoClass::self(exec)) - -// This declares a constant table, which merely maps everything in its -// table to its token value. Can be used as a prototype -#define DEFINE_CONSTANT_TABLE(Class) \ - class Class : public DOMObject { \ - public: \ - Class(ExecState *exec): DOMObject(exec->lexicalInterpreter()->builtinObjectPrototype()) {} \ - \ - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;\ - Value getValueProperty(ExecState * /*exec*/, int token) const; \ - virtual const ClassInfo* classInfo() const { return &info; } \ - static const ClassInfo info; \ - static Object self(ExecState *exec);\ - static Identifier* s_name; \ - static Identifier* name(); \ - }; - -// Emits an implementation of a constant table -#define IMPLEMENT_CONSTANT_TABLE(Class,ClassName) \ - Value Class::tryGet(ExecState *exec, const Identifier &propertyName) const { \ - return DOMObjectLookupGetValue<Class, DOMObject>(exec, propertyName, &Class##Table, this);\ - } \ - Value Class::getValueProperty(ExecState * /*exec*/, int token) const { \ - /* We use the token as the value to return directly*/ \ - return Number((unsigned int)token); \ - } \ - Object Class::self(ExecState *exec) { \ - return cacheGlobalObject<Class>(exec, *name()); \ - } \ - Identifier* Class::s_name = 0; \ - Identifier* Class::name() { \ - if (!s_name) s_name = new Identifier("[[" ClassName ".constant_table]]"); \ - return s_name; \ - } \ - const ClassInfo Class::info = { ClassName, 0, &Class##Table, 0 }; - - -// Hide some of the stuff in lookup.h.. -#undef PUBLIC_DEFINE_PROTOTYPE -#undef DEFINE_PROTOTYPE -#undef IMPLEMENT_PROTOTYPE -#undef PUBLIC_IMPLEMENT_PROTOTYPE -#undef IMPLEMENT_PROTOTYPE_WITH_PARENT - -} // namespace - -#endif diff --git a/khtml/ecma/kjs_css.cpp b/khtml/ecma/kjs_css.cpp deleted file mode 100644 index b42f9dd02..000000000 --- a/khtml/ecma/kjs_css.cpp +++ /dev/null @@ -1,1302 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2000 Harri Porten (porten@kde.org) - * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * 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 "kjs_css.h" -#include "kjs_css.lut.h" - -#include <dom/html_head.h> // for HTMLStyleElement - -#include <css/css_base.h> -#include "kjs_dom.h" - - -#include <kdebug.h> - -namespace KJS { - -static TQString cssPropertyName( const Identifier &p, bool& hadPixelPrefix ) -{ - TQString prop = p.qstring(); - int i = prop.length(); - while ( --i ) { - char c = prop[i].latin1(); - if ( c >= 'A' && c <= 'Z' ) - prop.insert( i, '-' ); - } - - prop = prop.lower(); - hadPixelPrefix = false; - - if (prop.startsWith("css-")) { - prop = prop.mid(4); - } else if (prop.startsWith("pixel-")) { - prop = prop.mid(6); - hadPixelPrefix = true; - } else if (prop.startsWith("pos-")) { - prop = prop.mid(4); - hadPixelPrefix = true; - } - - return prop; -} - -/* -@begin DOMCSSStyleDeclarationProtoTable 7 - getPropertyValue DOMCSSStyleDeclaration::GetPropertyValue DontDelete|Function 1 - getPropertyCSSValue DOMCSSStyleDeclaration::GetPropertyCSSValue DontDelete|Function 1 - removeProperty DOMCSSStyleDeclaration::RemoveProperty DontDelete|Function 1 - getPropertyPriority DOMCSSStyleDeclaration::GetPropertyPriority DontDelete|Function 1 - setProperty DOMCSSStyleDeclaration::SetProperty DontDelete|Function 3 - item DOMCSSStyleDeclaration::Item DontDelete|Function 1 -# IE names for it (#36063) - getAttribute DOMCSSStyleDeclaration::GetPropertyValue DontDelete|Function 1 - removeAttribute DOMCSSStyleDeclaration::RemoveProperty DontDelete|Function 1 - setAttribute DOMCSSStyleDeclaration::SetProperty DontDelete|Function 3 -@end -@begin DOMCSSStyleDeclarationTable 3 - cssText DOMCSSStyleDeclaration::CssText DontDelete - length DOMCSSStyleDeclaration::Length DontDelete|ReadOnly - parentRule DOMCSSStyleDeclaration::ParentRule DontDelete|ReadOnly -@end -*/ -KJS_DEFINE_PROTOTYPE(DOMCSSStyleDeclarationProto) -IMPLEMENT_PROTOFUNC_DOM(DOMCSSStyleDeclarationProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMCSSStyleDeclaration", DOMCSSStyleDeclarationProto, DOMCSSStyleDeclarationProtoFunc) - -IMPLEMENT_PSEUDO_CONSTRUCTOR(CSSStyleDeclarationPseudoCtor, "DOMCSSStyleDeclaration",DOMCSSStyleDeclarationProto) - -const ClassInfo DOMCSSStyleDeclaration::info = { "CSSStyleDeclaration", 0, &DOMCSSStyleDeclarationTable, 0 }; - -DOMCSSStyleDeclaration::DOMCSSStyleDeclaration(ExecState *exec, const DOM::CSSStyleDeclaration& s) - : DOMObject(DOMCSSStyleDeclarationProto::self(exec)), styleDecl(s) -{ } - -DOMCSSStyleDeclaration::~DOMCSSStyleDeclaration() -{ - ScriptInterpreter::forgetDOMObject(styleDecl.handle()); -} - -bool DOMCSSStyleDeclaration::hasProperty(ExecState *exec, const Identifier &p) const -{ - bool hadPixelPrefix; - TQString cssprop = cssPropertyName(p, hadPixelPrefix); - if (DOM::getPropertyID(cssprop.latin1(), cssprop.length())) - return true; - - return ObjectImp::hasProperty(exec, p); -} - -Value DOMCSSStyleDeclaration::tryGet(ExecState *exec, const Identifier &propertyName) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMCSSStyleDeclaration::tryGet " << propertyName.qstring() << endl; -#endif - const HashEntry* entry = Lookup::findEntry(&DOMCSSStyleDeclarationTable, propertyName); - if (entry) - switch (entry->value) { - case CssText: - return String(styleDecl.cssText()); - case Length: - return Number(styleDecl.length()); - case ParentRule: - return getDOMCSSRule(exec,styleDecl.parentRule()); - default: - break; - } - - // Look in the prototype (for functions) before assuming it's a name - Object proto = Object::dynamicCast(prototype()); - if (proto.isValid() && proto.hasProperty(exec,propertyName)) - return proto.get(exec,propertyName); - - bool ok; - long unsigned int u = propertyName.toULong(&ok); - if (ok) - return String(DOM::CSSStyleDeclaration(styleDecl).item(u)); - - // pixelTop returns "CSS Top" as number value in unit pixels - // posTop returns "CSS top" as number value in unit pixels _if_ its a - // positioned element. if it is not a positioned element, return 0 - // from MSIE documentation ### IMPLEMENT THAT (Dirk) - bool asNumber; - TQString p = cssPropertyName(propertyName, asNumber); - -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMCSSStyleDeclaration: converting to css property name: " << p << ( asNumber ? "px" : "" ) << endl; -#endif - - if (asNumber) { - DOM::CSSValue v = styleDecl.getPropertyCSSValue(p); - if ( !v.isNull() && v.cssValueType() == DOM::CSSValue::CSS_PRIMITIVE_VALUE) - return Number(static_cast<DOM::CSSPrimitiveValue>(v).getFloatValue(DOM::CSSPrimitiveValue::CSS_PX)); - } - - DOM::DOMString str = const_cast<DOM::CSSStyleDeclaration &>( styleDecl ).getPropertyValue(p); - if (!str.isNull()) - return String(str); - - // see if we know this css property, return empty then - if (DOM::getPropertyID(p.latin1(), p.length())) - return String(DOM::DOMString("")); - - return DOMObject::tryGet(exec, propertyName); -} - - -void DOMCSSStyleDeclaration::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr ) -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMCSSStyleDeclaration::tryPut " << propertyName.qstring() << endl; -#endif - if (propertyName == "cssText") { - styleDecl.setCssText(value.toString(exec).string()); - } - else { - bool pxSuffix; - TQString prop = cssPropertyName(propertyName, pxSuffix); - TQString propvalue = value.toString(exec).qstring(); - - if (pxSuffix) - propvalue += "px"; -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMCSSStyleDeclaration: prop=" << prop << " propvalue=" << propvalue << endl; -#endif - // Look whether the property is known.d In that case add it as a CSS property. - if (DOM::getPropertyID(prop.latin1(), prop.length())) { - if (propvalue.isEmpty()) - styleDecl.removeProperty(prop); - else { - int important = propvalue.find("!important", 0, false); - if (important == -1) - styleDecl.setProperty(prop, DOM::DOMString(propvalue), ""); - else - styleDecl.setProperty(prop, DOM::DOMString(propvalue.left(important - 1)), "important"); - } - } - else - // otherwise add it as a JS property - DOMObject::tryPut( exec, propertyName, value, attr ); - } -} - -Value DOMCSSStyleDeclarationProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMCSSStyleDeclaration, thisObj ); - DOM::CSSStyleDeclaration styleDecl = static_cast<DOMCSSStyleDeclaration *>(thisObj.imp())->toStyleDecl(); - String str = args[0].toString(exec); - DOM::DOMString s = str.value().string(); - - switch (id) { - case DOMCSSStyleDeclaration::GetPropertyValue: - return String(styleDecl.getPropertyValue(s)); - case DOMCSSStyleDeclaration::GetPropertyCSSValue: - return getDOMCSSValue(exec,styleDecl.getPropertyCSSValue(s)); - case DOMCSSStyleDeclaration::RemoveProperty: - return String(styleDecl.removeProperty(s)); - case DOMCSSStyleDeclaration::GetPropertyPriority: - return String(styleDecl.getPropertyPriority(s)); - case DOMCSSStyleDeclaration::SetProperty: - styleDecl.setProperty(args[0].toString(exec).string(), - args[1].toString(exec).string(), - args[2].toString(exec).string()); - return Undefined(); - case DOMCSSStyleDeclaration::Item: - return String(styleDecl.item(args[0].toInteger(exec))); - default: - return Undefined(); - } -} - -Value getDOMCSSStyleDeclaration(ExecState *exec, const DOM::CSSStyleDeclaration& s) -{ - return cacheDOMObject<DOM::CSSStyleDeclaration, KJS::DOMCSSStyleDeclaration>(exec, s); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMStyleSheet::info = { "StyleSheet", 0, &DOMStyleSheetTable, 0 }; -/* -@begin DOMStyleSheetTable 7 - type DOMStyleSheet::Type DontDelete|ReadOnly - disabled DOMStyleSheet::Disabled DontDelete - ownerNode DOMStyleSheet::OwnerNode DontDelete|ReadOnly - parentStyleSheet DOMStyleSheet::ParentStyleSheet DontDelete|ReadOnly - href DOMStyleSheet::Href DontDelete|ReadOnly - title DOMStyleSheet::Title DontDelete|ReadOnly - media DOMStyleSheet::Media DontDelete|ReadOnly -@end -*/ - -DOMStyleSheet::DOMStyleSheet(ExecState* exec, const DOM::StyleSheet& ss) - : DOMObject(exec->interpreter()->builtinObjectPrototype()), styleSheet(ss) -{ -} - -DOMStyleSheet::~DOMStyleSheet() -{ - ScriptInterpreter::forgetDOMObject(styleSheet.handle()); -} - -Value DOMStyleSheet::tryGet(ExecState *exec, const Identifier &propertyName) const -{ - return DOMObjectLookupGetValue<DOMStyleSheet,DOMObject>(exec,propertyName,&DOMStyleSheetTable,this); -} - -Value DOMStyleSheet::getValueProperty(ExecState *exec, int token) const -{ - switch (token) { - case Type: - return String(styleSheet.type()); - case Disabled: - return Boolean(styleSheet.disabled()); - case OwnerNode: - return getDOMNode(exec,styleSheet.ownerNode()); - case ParentStyleSheet: - return getDOMStyleSheet(exec,styleSheet.parentStyleSheet()); - case Href: - return String(styleSheet.href()); - case Title: - return String(styleSheet.title()); - case Media: - return getDOMMediaList(exec, styleSheet.media()); - } - return Value(); -} - -void DOMStyleSheet::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr) -{ - if (propertyName == "disabled") { - styleSheet.setDisabled(value.toBoolean(exec)); - } - else - DOMObject::tryPut(exec, propertyName, value, attr); -} - -Value getDOMStyleSheet(ExecState *exec, const DOM::StyleSheet& ss) -{ - DOMObject *ret; - if (ss.isNull()) - return Null(); - ScriptInterpreter* interp = static_cast<ScriptInterpreter *>(exec->interpreter()); - if ((ret = interp->getDOMObject(ss.handle()))) - return Value(ret); - else { - if (ss.isCSSStyleSheet()) { - DOM::CSSStyleSheet cs; - cs = ss; - ret = new DOMCSSStyleSheet(exec,cs); - } - else - ret = new DOMStyleSheet(exec,ss); - interp->putDOMObject(ss.handle(),ret); - return Value(ret); - } -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMStyleSheetList::info = { "StyleSheetList", 0, &DOMStyleSheetListTable, 0 }; - -/* -@begin DOMStyleSheetListTable 2 - length DOMStyleSheetList::Length DontDelete|ReadOnly - item DOMStyleSheetList::Item DontDelete|Function 1 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(DOMStyleSheetListFunc) // not really a proto, but doesn't matter - -DOMStyleSheetList::DOMStyleSheetList(ExecState *exec, const DOM::StyleSheetList& ssl, const DOM::Document& doc) - : DOMObject(exec->interpreter()->builtinObjectPrototype()), styleSheetList(ssl), m_doc(doc) -{ -} - -DOMStyleSheetList::~DOMStyleSheetList() -{ - ScriptInterpreter::forgetDOMObject(styleSheetList.handle()); -} - -Value DOMStyleSheetList::tryGet(ExecState *exec, const Identifier &p) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMStyleSheetList::tryGet " << p.qstring() << endl; -#endif - if (p == lengthPropertyName) - return Number(styleSheetList.length()); - else if (p == "item") - return lookupOrCreateFunction<DOMStyleSheetListFunc>(exec,p,this,DOMStyleSheetList::Item,1,DontDelete|Function); - - // Retrieve stylesheet by index - bool ok; - long unsigned int u = p.toULong(&ok); - if (ok) - return getDOMStyleSheet(exec, DOM::StyleSheetList(styleSheetList).item(u)); - - // IE also supports retrieving a stylesheet by name, using the name/id of the <style> tag - // (this is consistent with all the other collections) -#if 0 - // Bad implementation because DOM::StyleSheet doesn't inherit DOM::Node - // so we can't use DOMNamedNodesCollection..... - // We could duplicate it for stylesheets though - worth it ? - // Other problem of this implementation: it doesn't look for the ID attribute! - DOM::NameNodeListImpl namedList( m_doc.documentElement().handle(), p.string() ); - int len = namedList.length(); - if ( len ) { - TQValueList<DOM::Node> styleSheets; - for ( int i = 0 ; i < len ; ++i ) { - DOM::HTMLStyleElement elem = DOM::Node(namedList.item(i)); - if (!elem.isNull()) - styleSheets.append(elem.sheet()); - } - if ( styleSheets.count() == 1 ) // single result - return getDOMStyleSheet(exec, styleSheets[0]); - else if ( styleSheets.count() > 1 ) { - return new DOMNamedItemsCollection(exec,styleSheets); - } - } -#endif - // ### Bad implementation because returns a single element (are IDs always unique?) - // and doesn't look for name attribute (see implementation above). - // But unicity of stylesheet ids is good practice anyway ;) - DOM::DOMString pstr = p.string(); - DOM::HTMLStyleElement styleElem = m_doc.getElementById( pstr ); - if (!styleElem.isNull()) - return getDOMStyleSheet(exec, styleElem.sheet()); - - return DOMObject::tryGet(exec, p); -} - -Value KJS::DOMStyleSheetList::call(ExecState *exec, Object &thisObj, const List &args) -{ - // This code duplication is necessary, DOMStyleSheetList 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 DOMStyleSheetList"); - exec->setException(err); - } - return val; -} - -Value DOMStyleSheetList::tryCall(ExecState *exec, Object & /*thisObj*/, const List &args) -{ - if (args.size() == 1) { - // support for styleSheets(<index>) and styleSheets(<name>) - return tryGet( exec, Identifier(args[0].toString(exec)) ); - } - return Undefined(); -} - -Value getDOMStyleSheetList(ExecState *exec, const DOM::StyleSheetList& ssl, const DOM::Document& doc) -{ - // Can't use the cacheDOMObject macro because of the doc argument - DOMObject *ret; - if (ssl.isNull()) - return Null(); - ScriptInterpreter* interp = static_cast<ScriptInterpreter *>(exec->interpreter()); - if ((ret = interp->getDOMObject(ssl.handle()))) - return Value(ret); - else { - ret = new DOMStyleSheetList(exec, ssl, doc); - interp->putDOMObject(ssl.handle(),ret); - return Value(ret); - } -} - -Value DOMStyleSheetListFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMStyleSheetList, thisObj ); - DOM::StyleSheetList styleSheetList = static_cast<DOMStyleSheetList *>(thisObj.imp())->toStyleSheetList(); - if (id == DOMStyleSheetList::Item) - return getDOMStyleSheet(exec, styleSheetList.item(args[0].toInteger(exec))); - return Undefined(); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMMediaList::info = { "MediaList", 0, &DOMMediaListTable, 0 }; - -/* -@begin DOMMediaListTable 2 - mediaText DOMMediaList::MediaText DontDelete|ReadOnly - length DOMMediaList::Length DontDelete|ReadOnly -@end -@begin DOMMediaListProtoTable 3 - item DOMMediaList::Item DontDelete|Function 1 - deleteMedium DOMMediaList::DeleteMedium DontDelete|Function 1 - appendMedium DOMMediaList::AppendMedium DontDelete|Function 1 -@end -*/ -KJS_DEFINE_PROTOTYPE(DOMMediaListProto) -IMPLEMENT_PROTOFUNC_DOM(DOMMediaListProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMMediaList", DOMMediaListProto, DOMMediaListProtoFunc) - -DOMMediaList::DOMMediaList(ExecState *exec, const DOM::MediaList& ml) - : DOMObject(DOMMediaListProto::self(exec)), mediaList(ml) { } - -DOMMediaList::~DOMMediaList() -{ - ScriptInterpreter::forgetDOMObject(mediaList.handle()); -} - -Value DOMMediaList::tryGet(ExecState *exec, const Identifier &p) const -{ - if (p == "mediaText") - return String(mediaList.mediaText()); - else if (p == lengthPropertyName) - return Number(mediaList.length()); - - bool ok; - long unsigned int u = p.toULong(&ok); - if (ok) - return String(mediaList.item(u)); - - return DOMObject::tryGet(exec, p); -} - -void DOMMediaList::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr) -{ - if (propertyName == "mediaText") - mediaList.setMediaText(value.toString(exec).string()); - else - DOMObject::tryPut(exec, propertyName, value, attr); -} - -Value getDOMMediaList(ExecState *exec, const DOM::MediaList& ml) -{ - return cacheDOMObject<DOM::MediaList, KJS::DOMMediaList>(exec, ml); -} - -Value KJS::DOMMediaListProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMMediaList, thisObj ); - DOM::MediaList mediaList = static_cast<DOMMediaList *>(thisObj.imp())->toMediaList(); - switch (id) { - case DOMMediaList::Item: - return String(mediaList.item(args[0].toInteger(exec))); - case DOMMediaList::DeleteMedium: - mediaList.deleteMedium(args[0].toString(exec).string()); - return Undefined(); - case DOMMediaList::AppendMedium: - mediaList.appendMedium(args[0].toString(exec).string()); - return Undefined(); - default: - return Undefined(); - } -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMCSSStyleSheet::info = { "CSSStyleSheet", 0, &DOMCSSStyleSheetTable, 0 }; - -/* -@begin DOMCSSStyleSheetTable 2 - ownerRule DOMCSSStyleSheet::OwnerRule DontDelete|ReadOnly - cssRules DOMCSSStyleSheet::CssRules DontDelete|ReadOnly -# MSIE extension - rules DOMCSSStyleSheet::Rules DontDelete|ReadOnly -@end -@begin DOMCSSStyleSheetProtoTable 2 - insertRule DOMCSSStyleSheet::InsertRule DontDelete|Function 2 - deleteRule DOMCSSStyleSheet::DeleteRule DontDelete|Function 1 -# IE extensions - addRule DOMCSSStyleSheet::AddRule DontDelete|Function 3 - removeRule DOMCSSStyleSheet::RemoveRule DontDelete|Function 1 -@end -*/ -KJS_DEFINE_PROTOTYPE(DOMCSSStyleSheetProto) -IMPLEMENT_PROTOFUNC_DOM(DOMCSSStyleSheetProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMCSSStyleSheet",DOMCSSStyleSheetProto,DOMCSSStyleSheetProtoFunc) // warning, use _WITH_PARENT if DOMStyleSheet gets a proto - -DOMCSSStyleSheet::DOMCSSStyleSheet(ExecState *exec, const DOM::CSSStyleSheet& ss) - : DOMStyleSheet(DOMCSSStyleSheetProto::self(exec),ss) { } - -DOMCSSStyleSheet::~DOMCSSStyleSheet() -{ -} - -Value DOMCSSStyleSheet::tryGet(ExecState *exec, const Identifier &p) const -{ - DOM::CSSStyleSheet cssStyleSheet = static_cast<DOM::CSSStyleSheet>(styleSheet); - if (p == "ownerRule") - return getDOMCSSRule(exec,cssStyleSheet.ownerRule()); - else if (p == "cssRules" || p == "rules" /* MSIE extension */) - return getDOMCSSRuleList(exec,cssStyleSheet.cssRules()); - return DOMStyleSheet::tryGet(exec,p); -} - -Value DOMCSSStyleSheetProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMCSSStyleSheet, thisObj ); - DOM::CSSStyleSheet styleSheet = static_cast<DOMCSSStyleSheet *>(thisObj.imp())->toCSSStyleSheet(); - - switch (id) { - case DOMCSSStyleSheet::InsertRule: - return Number(styleSheet.insertRule(args[0].toString(exec).string(),(long unsigned int)args[1].toInteger(exec))); - case DOMCSSStyleSheet::DeleteRule: - styleSheet.deleteRule(args[0].toInteger(exec)); - return Undefined(); - // IE extensions - case DOMCSSStyleSheet::AddRule: { - //Unpassed/-1 means append. Since insertRule is picky (throws exceptions) - //we adjust it to the desired length - unsigned long index = args[2].toInteger(exec); - unsigned long length = styleSheet.cssRules().length(); - if (args[2].type() == UndefinedType) index = length; - if (index > length) index = length; - DOM::DOMString str = args[0].toString(exec).string() + " { " + args[1].toString(exec).string() + " } "; - return Number(styleSheet.insertRule(str,index)); - } - case DOMCSSStyleSheet::RemoveRule: { - int index = args.size() > 0 ? args[0].toInteger(exec) : 0 /*first one*/; - styleSheet.deleteRule(index); - return Undefined(); - } - default: - return Undefined(); - } -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMCSSRuleList::info = { "CSSRuleList", 0, &DOMCSSRuleListTable, 0 }; -/* -@begin DOMCSSRuleListTable 3 - length DOMCSSRuleList::Length DontDelete|ReadOnly - item DOMCSSRuleList::Item DontDelete|Function 1 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(DOMCSSRuleListFunc) // not really a proto, but doesn't matter - -DOMCSSRuleList::DOMCSSRuleList(ExecState* exec, const DOM::CSSRuleList& rl) - : DOMObject(exec->interpreter()->builtinObjectPrototype()), cssRuleList(rl) -{ -} - -DOMCSSRuleList::~DOMCSSRuleList() -{ - ScriptInterpreter::forgetDOMObject(cssRuleList.handle()); -} - -Value DOMCSSRuleList::tryGet(ExecState *exec, const Identifier &p) const -{ - Value result; - if (p == lengthPropertyName) - return Number(cssRuleList.length()); - else if (p == "item") - return lookupOrCreateFunction<DOMCSSRuleListFunc>(exec,p,this,DOMCSSRuleList::Item,1,DontDelete|Function); - - bool ok; - long unsigned int u = p.toULong(&ok); - if (ok) - return getDOMCSSRule(exec,DOM::CSSRuleList(cssRuleList).item(u)); - - return DOMObject::tryGet(exec,p); -} - -Value DOMCSSRuleListFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMCSSRuleList, thisObj ); - DOM::CSSRuleList cssRuleList = static_cast<DOMCSSRuleList *>(thisObj.imp())->toCSSRuleList(); - switch (id) { - case DOMCSSRuleList::Item: - return getDOMCSSRule(exec,cssRuleList.item(args[0].toInteger(exec))); - default: - return Undefined(); - } -} - -Value getDOMCSSRuleList(ExecState *exec, const DOM::CSSRuleList& rl) -{ - return cacheDOMObject<DOM::CSSRuleList, KJS::DOMCSSRuleList>(exec, rl); -} - -// ------------------------------------------------------------------------- - -IMPLEMENT_PROTOFUNC_DOM(DOMCSSRuleFunc) // Not a proto, but doesn't matter - -DOMCSSRule::DOMCSSRule(ExecState* exec, const DOM::CSSRule& r) - : DOMObject(exec->interpreter()->builtinObjectPrototype()), cssRule(r) -{ -} - -DOMCSSRule::~DOMCSSRule() -{ - ScriptInterpreter::forgetDOMObject(cssRule.handle()); -} - -const ClassInfo DOMCSSRule::info = { "CSSRule", 0, &DOMCSSRuleTable, 0 }; -const ClassInfo DOMCSSRule::style_info = { "CSSStyleRule", &DOMCSSRule::info, &DOMCSSStyleRuleTable, 0 }; -const ClassInfo DOMCSSRule::media_info = { "CSSMediaRule", &DOMCSSRule::info, &DOMCSSMediaRuleTable, 0 }; -const ClassInfo DOMCSSRule::fontface_info = { "CSSFontFaceRule", &DOMCSSRule::info, &DOMCSSFontFaceRuleTable, 0 }; -const ClassInfo DOMCSSRule::page_info = { "CSSPageRule", &DOMCSSRule::info, &DOMCSSPageRuleTable, 0 }; -const ClassInfo DOMCSSRule::import_info = { "CSSImportRule", &DOMCSSRule::info, &DOMCSSImportRuleTable, 0 }; -const ClassInfo DOMCSSRule::charset_info = { "CSSCharsetRule", &DOMCSSRule::info, &DOMCSSCharsetRuleTable, 0 }; - -const ClassInfo* DOMCSSRule::classInfo() const -{ - switch (cssRule.type()) { - case DOM::CSSRule::STYLE_RULE: - return &style_info; - case DOM::CSSRule::MEDIA_RULE: - return &media_info; - case DOM::CSSRule::FONT_FACE_RULE: - return &fontface_info; - case DOM::CSSRule::PAGE_RULE: - return &page_info; - case DOM::CSSRule::IMPORT_RULE: - return &import_info; - case DOM::CSSRule::CHARSET_RULE: - return &charset_info; - case DOM::CSSRule::UNKNOWN_RULE: - default: - return &info; - } -} -/* -@begin DOMCSSRuleTable 4 - type DOMCSSRule::Type DontDelete|ReadOnly - cssText DOMCSSRule::CssText DontDelete|ReadOnly - parentStyleSheet DOMCSSRule::ParentStyleSheet DontDelete|ReadOnly - parentRule DOMCSSRule::ParentRule DontDelete|ReadOnly -@end -@begin DOMCSSStyleRuleTable 2 - selectorText DOMCSSRule::Style_SelectorText DontDelete - style DOMCSSRule::Style_Style DontDelete|ReadOnly -@end -@begin DOMCSSMediaRuleTable 4 - media DOMCSSRule::Media_Media DontDelete|ReadOnly - cssRules DOMCSSRule::Media_CssRules DontDelete|ReadOnly - insertRule DOMCSSRule::Media_InsertRule DontDelete|Function 2 - deleteRule DOMCSSRule::Media_DeleteRule DontDelete|Function 1 -@end -@begin DOMCSSFontFaceRuleTable 1 - style DOMCSSRule::FontFace_Style DontDelete|ReadOnly -@end -@begin DOMCSSPageRuleTable 2 - selectorText DOMCSSRule::Page_SelectorText DontDelete - style DOMCSSRule::Page_Style DontDelete|ReadOnly -@end -@begin DOMCSSImportRuleTable 3 - href DOMCSSRule::Import_Href DontDelete|ReadOnly - media DOMCSSRule::Import_Media DontDelete|ReadOnly - styleSheet DOMCSSRule::Import_StyleSheet DontDelete|ReadOnly -@end -@begin DOMCSSCharsetRuleTable 1 - encoding DOMCSSRule::Charset_Encoding DontDelete -@end -*/ -Value DOMCSSRule::tryGet(ExecState *exec, const Identifier &propertyName) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMCSSRule::tryGet " << propertyName.qstring() << endl; -#endif - const HashTable* table = classInfo()->propHashTable; // get the right hashtable - const HashEntry* entry = Lookup::findEntry(table, propertyName); - if (entry) { - if (entry->attr & Function) - return lookupOrCreateFunction<DOMCSSRuleFunc>(exec, propertyName, this, entry->value, entry->params, entry->attr); - return getValueProperty(exec, entry->value); - } - - // Base CSSRule stuff or parent class forward, as usual - return DOMObjectLookupGet<DOMCSSRuleFunc, DOMCSSRule, DOMObject>(exec, propertyName, &DOMCSSRuleTable, this); -} - -Value DOMCSSRule::getValueProperty(ExecState *exec, int token) const -{ - switch (token) { - case Type: - return Number(cssRule.type()); - case CssText: - return String(cssRule.cssText()); - case ParentStyleSheet: - return getDOMStyleSheet(exec,cssRule.parentStyleSheet()); - case ParentRule: - return getDOMCSSRule(exec,cssRule.parentRule()); - - // for DOM::CSSRule::STYLE_RULE: - case Style_SelectorText: - return String(static_cast<DOM::CSSStyleRule>(cssRule).selectorText()); - case Style_Style: - return getDOMCSSStyleDeclaration(exec,static_cast<DOM::CSSStyleRule>(cssRule).style()); - - // for DOM::CSSRule::MEDIA_RULE: - case Media_Media: - return getDOMMediaList(exec,static_cast<DOM::CSSMediaRule>(cssRule).media()); - case Media_CssRules: - return getDOMCSSRuleList(exec,static_cast<DOM::CSSMediaRule>(cssRule).cssRules()); - - // for DOM::CSSRule::FONT_FACE_RULE: - case FontFace_Style: - return getDOMCSSStyleDeclaration(exec,static_cast<DOM::CSSFontFaceRule>(cssRule).style()); - - // for DOM::CSSRule::PAGE_RULE: - case Page_SelectorText: - return String(static_cast<DOM::CSSPageRule>(cssRule).selectorText()); - case Page_Style: - return getDOMCSSStyleDeclaration(exec,static_cast<DOM::CSSPageRule>(cssRule).style()); - - // for DOM::CSSRule::IMPORT_RULE: - case Import_Href: - return String(static_cast<DOM::CSSImportRule>(cssRule).href()); - case Import_Media: - return getDOMMediaList(exec,static_cast<DOM::CSSImportRule>(cssRule).media()); - case Import_StyleSheet: - return getDOMStyleSheet(exec,static_cast<DOM::CSSImportRule>(cssRule).styleSheet()); - - // for DOM::CSSRule::CHARSET_RULE: - case Charset_Encoding: - return String(static_cast<DOM::CSSCharsetRule>(cssRule).encoding()); - - default: - kdDebug(6070) << "WARNING: DOMCSSRule::getValueProperty unhandled token " << token << endl; - } - return Undefined(); -} - -void DOMCSSRule::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr) -{ - const HashTable* table = classInfo()->propHashTable; // get the right hashtable - const HashEntry* entry = Lookup::findEntry(table, propertyName); - 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<DOMCSSRule, DOMObject>(exec, propertyName, value, attr, &DOMCSSRuleTable, this); -} - -void DOMCSSRule::putValueProperty(ExecState *exec, int token, const Value& value, int) -{ - switch (token) { - // for DOM::CSSRule::STYLE_RULE: - case Style_SelectorText: - static_cast<DOM::CSSStyleRule>(cssRule).setSelectorText(value.toString(exec).string()); - return; - - // for DOM::CSSRule::PAGE_RULE: - case Page_SelectorText: - static_cast<DOM::CSSPageRule>(cssRule).setSelectorText(value.toString(exec).string()); - return; - - // for DOM::CSSRule::CHARSET_RULE: - case Charset_Encoding: - static_cast<DOM::CSSCharsetRule>(cssRule).setEncoding(value.toString(exec).string()); - return; - - default: - kdDebug(6070) << "WARNING: DOMCSSRule::putValueProperty unhandled token " << token << endl; - } -} - -Value DOMCSSRuleFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMCSSRule, thisObj ); - DOM::CSSRule cssRule = static_cast<DOMCSSRule *>(thisObj.imp())->toCSSRule(); - - if (cssRule.type() == DOM::CSSRule::MEDIA_RULE) { - DOM::CSSMediaRule rule = static_cast<DOM::CSSMediaRule>(cssRule); - if (id == DOMCSSRule::Media_InsertRule) - return Number(rule.insertRule(args[0].toString(exec).string(),args[1].toInteger(exec))); - else if (id == DOMCSSRule::Media_DeleteRule) - rule.deleteRule(args[0].toInteger(exec)); - } - - return Undefined(); -} - -Value getDOMCSSRule(ExecState *exec, const DOM::CSSRule& r) -{ - return cacheDOMObject<DOM::CSSRule, KJS::DOMCSSRule>(exec, r); -} - -// ------------------------------------------------------------------------- - - -DOM::CSSRule toCSSRule(const Value& val) -{ - Object obj = Object::dynamicCast(val); - if (!obj.isValid() || !obj.inherits(&DOMCSSRule::info)) - return DOM::CSSRule(); - - const DOMCSSRule *dobj = static_cast<const DOMCSSRule*>(obj.imp()); - return dobj->toCSSRule(); -} - -// ------------------------------------------------------------------------- - -const ClassInfo CSSRuleConstructor::info = { "CSSRuleConstructor", 0, &CSSRuleConstructorTable, 0 }; -/* -@begin CSSRuleConstructorTable 7 - UNKNOWN_RULE CSSRuleConstructor::UNKNOWN_RULE DontDelete|ReadOnly - STYLE_RULE CSSRuleConstructor::STYLE_RULE DontDelete|ReadOnly - CHARSET_RULE CSSRuleConstructor::CHARSET_RULE DontDelete|ReadOnly - IMPORT_RULE CSSRuleConstructor::IMPORT_RULE DontDelete|ReadOnly - MEDIA_RULE CSSRuleConstructor::MEDIA_RULE DontDelete|ReadOnly - FONT_FACE_RULE CSSRuleConstructor::FONT_FACE_RULE DontDelete|ReadOnly - PAGE_RULE CSSRuleConstructor::PAGE_RULE DontDelete|ReadOnly -@end -*/ - -CSSRuleConstructor::CSSRuleConstructor(ExecState *exec) - : DOMObject(exec->interpreter()->builtinObjectPrototype()) -{ -} - -Value CSSRuleConstructor::tryGet(ExecState *exec, const Identifier &p) const -{ - return DOMObjectLookupGetValue<CSSRuleConstructor,DOMObject>(exec,p,&CSSRuleConstructorTable,this); -} - -Value CSSRuleConstructor::getValueProperty(ExecState *, int token) const -{ - switch (token) { - case UNKNOWN_RULE: - return Number(DOM::CSSRule::UNKNOWN_RULE); - case STYLE_RULE: - return Number(DOM::CSSRule::STYLE_RULE); - case CHARSET_RULE: - return Number(DOM::CSSRule::CHARSET_RULE); - case IMPORT_RULE: - return Number(DOM::CSSRule::IMPORT_RULE); - case MEDIA_RULE: - return Number(DOM::CSSRule::MEDIA_RULE); - case FONT_FACE_RULE: - return Number(DOM::CSSRule::FONT_FACE_RULE); - case PAGE_RULE: - return Number(DOM::CSSRule::PAGE_RULE); - } - return Value(); -} - -Value getCSSRuleConstructor(ExecState *exec) -{ - return cacheGlobalObject<CSSRuleConstructor>( exec, "[[cssRule.constructor]]" ); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMCSSValue::info = { "CSSValue", 0, &DOMCSSValueTable, 0 }; - -/* -@begin DOMCSSValueTable 2 - cssText DOMCSSValue::CssText DontDelete|ReadOnly - cssValueType DOMCSSValue::CssValueType DontDelete|ReadOnly -@end -*/ - -DOMCSSValue::DOMCSSValue(ExecState* exec, const DOM::CSSValue& val) - : DOMObject(exec->interpreter()->builtinObjectPrototype()), cssValue(val) -{ -} - -DOMCSSValue::~DOMCSSValue() -{ - ScriptInterpreter::forgetDOMObject(cssValue.handle()); -} - -Value DOMCSSValue::tryGet(ExecState *exec, const Identifier &p) const -{ - if (p == "cssText") - return String(cssValue.cssText()); - else if (p == "cssValueType") - return Number(cssValue.cssValueType()); - return DOMObject::tryGet(exec,p); -} - -void DOMCSSValue::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr) -{ - if (propertyName == "cssText") - cssValue.setCssText(value.toString(exec).string()); - else - DOMObject::tryPut(exec, propertyName, value, attr); -} - -Value getDOMCSSValue(ExecState *exec, const DOM::CSSValue& v) -{ - DOMObject *ret; - if (v.isNull()) - return Null(); - ScriptInterpreter* interp = static_cast<ScriptInterpreter *>(exec->interpreter()); - if ((ret = interp->getDOMObject(v.handle()))) - return Value(ret); - else { - if (v.isCSSValueList()) - ret = new DOMCSSValueList(exec,v); - else if (v.isCSSPrimitiveValue()) - ret = new DOMCSSPrimitiveValue(exec,v); - else - ret = new DOMCSSValue(exec,v); - interp->putDOMObject(v.handle(),ret); - return Value(ret); - } -} - -// ------------------------------------------------------------------------- - -const ClassInfo CSSValueConstructor::info = { "CSSValueConstructor", 0, &CSSValueConstructorTable, 0 }; -/* -@begin CSSValueConstructorTable 5 - CSS_INHERIT CSSValueConstructor::CSS_INHERIT DontDelete|ReadOnly - CSS_PRIMITIVE_VALUE CSSValueConstructor::CSS_PRIMITIVE_VALUE DontDelete|ReadOnly - CSS_VALUE_LIST CSSValueConstructor::CSS_VALUE_LIST DontDelete|ReadOnly - CSS_CUSTOM CSSValueConstructor::CSS_CUSTOM DontDelete|ReadOnly -@end -*/ - -CSSValueConstructor::CSSValueConstructor(ExecState *exec) - : DOMObject(exec->interpreter()->builtinObjectPrototype()) -{ -} - -Value CSSValueConstructor::tryGet(ExecState *exec, const Identifier &p) const -{ - return DOMObjectLookupGetValue<CSSValueConstructor,DOMObject>(exec,p,&CSSValueConstructorTable,this); -} - -Value CSSValueConstructor::getValueProperty(ExecState *, int token) const -{ - switch (token) { - case CSS_INHERIT: - return Number(DOM::CSSValue::CSS_INHERIT); - case CSS_PRIMITIVE_VALUE: - return Number(DOM::CSSValue::CSS_PRIMITIVE_VALUE); - case CSS_VALUE_LIST: - return Number(DOM::CSSValue::CSS_VALUE_LIST); - case CSS_CUSTOM: - return Number(DOM::CSSValue::CSS_CUSTOM); - } - return Value(); -} - -Value getCSSValueConstructor(ExecState *exec) -{ - return cacheGlobalObject<CSSValueConstructor>( exec, "[[cssValue.constructor]]" ); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMCSSPrimitiveValue::info = { "CSSPrimitiveValue", 0, &DOMCSSPrimitiveValueTable, 0 }; -/* -@begin DOMCSSPrimitiveValueTable 1 - primitiveType DOMCSSPrimitiveValue::PrimitiveType DontDelete|ReadOnly -@end -@begin DOMCSSPrimitiveValueProtoTable 3 - setFloatValue DOMCSSPrimitiveValue::SetFloatValue DontDelete|Function 2 - getFloatValue DOMCSSPrimitiveValue::GetFloatValue DontDelete|Function 1 - setStringValue DOMCSSPrimitiveValue::SetStringValue DontDelete|Function 2 - getStringValue DOMCSSPrimitiveValue::GetStringValue DontDelete|Function 0 - getCounterValue DOMCSSPrimitiveValue::GetCounterValue DontDelete|Function 0 - getRectValue DOMCSSPrimitiveValue::GetRectValue DontDelete|Function 0 - getRGBColorValue DOMCSSPrimitiveValue::GetRGBColorValue DontDelete|Function 0 -@end -*/ -KJS_DEFINE_PROTOTYPE(DOMCSSPrimitiveValueProto) -IMPLEMENT_PROTOFUNC_DOM(DOMCSSPrimitiveValueProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMCSSPrimitiveValue",DOMCSSPrimitiveValueProto,DOMCSSPrimitiveValueProtoFunc) - -DOMCSSPrimitiveValue::DOMCSSPrimitiveValue(ExecState *exec, const DOM::CSSPrimitiveValue& v) - : DOMCSSValue(DOMCSSPrimitiveValueProto::self(exec), v) { } - -Value DOMCSSPrimitiveValue::tryGet(ExecState *exec, const Identifier &p) const -{ - if (p=="primitiveType") - return Number(static_cast<DOM::CSSPrimitiveValue>(cssValue).primitiveType()); - return DOMObject::tryGet(exec,p); -} - -Value DOMCSSPrimitiveValueProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMCSSPrimitiveValue, thisObj ); - DOM::CSSPrimitiveValue val = static_cast<DOMCSSPrimitiveValue *>(thisObj.imp())->toCSSPrimitiveValue(); - switch (id) { - case DOMCSSPrimitiveValue::SetFloatValue: - val.setFloatValue(args[0].toInteger(exec),args[1].toNumber(exec)); - return Undefined(); - case DOMCSSPrimitiveValue::GetFloatValue: - return Number(val.getFloatValue(args[0].toInteger(exec))); - case DOMCSSPrimitiveValue::SetStringValue: - val.setStringValue(args[0].toInteger(exec),args[1].toString(exec).string()); - return Undefined(); - case DOMCSSPrimitiveValue::GetStringValue: - return String(val.getStringValue()); - case DOMCSSPrimitiveValue::GetCounterValue: - return getDOMCounter(exec,val.getCounterValue()); - case DOMCSSPrimitiveValue::GetRectValue: - return getDOMRect(exec,val.getRectValue()); - case DOMCSSPrimitiveValue::GetRGBColorValue: - return getDOMRGBColor(exec,val.getRGBColorValue()); - default: - return Undefined(); - } -} - -// ------------------------------------------------------------------------- - -const ClassInfo CSSPrimitiveValueConstructor::info = { "CSSPrimitiveValueConstructor", 0, &CSSPrimitiveValueConstructorTable, 0 }; - -/* -@begin CSSPrimitiveValueConstructorTable 27 - CSS_UNKNOWN DOM::CSSPrimitiveValue::CSS_UNKNOWN DontDelete|ReadOnly - CSS_NUMBER DOM::CSSPrimitiveValue::CSS_NUMBER DontDelete|ReadOnly - CSS_PERCENTAGE DOM::CSSPrimitiveValue::CSS_PERCENTAGE DontDelete|ReadOnly - CSS_EMS DOM::CSSPrimitiveValue::CSS_EMS DontDelete|ReadOnly - CSS_EXS DOM::CSSPrimitiveValue::CSS_EXS DontDelete|ReadOnly - CSS_PX DOM::CSSPrimitiveValue::CSS_PX DontDelete|ReadOnly - CSS_CM DOM::CSSPrimitiveValue::CSS_CM DontDelete|ReadOnly - CSS_MM DOM::CSSPrimitiveValue::CSS_MM DontDelete|ReadOnly - CSS_IN DOM::CSSPrimitiveValue::CSS_IN DontDelete|ReadOnly - CSS_PT DOM::CSSPrimitiveValue::CSS_PT DontDelete|ReadOnly - CSS_PC DOM::CSSPrimitiveValue::CSS_PC DontDelete|ReadOnly - CSS_DEG DOM::CSSPrimitiveValue::CSS_DEG DontDelete|ReadOnly - CSS_RAD DOM::CSSPrimitiveValue::CSS_RAD DontDelete|ReadOnly - CSS_GRAD DOM::CSSPrimitiveValue::CSS_GRAD DontDelete|ReadOnly - CSS_MS DOM::CSSPrimitiveValue::CSS_MS DontDelete|ReadOnly - CSS_S DOM::CSSPrimitiveValue::CSS_S DontDelete|ReadOnly - CSS_HZ DOM::CSSPrimitiveValue::CSS_HZ DontDelete|ReadOnly - CSS_KHZ DOM::CSSPrimitiveValue::CSS_KHZ DontDelete|ReadOnly - CSS_DIMENSION DOM::CSSPrimitiveValue::CSS_DIMENSION DontDelete|ReadOnly - CSS_STRING DOM::CSSPrimitiveValue::CSS_STRING DontDelete|ReadOnly - CSS_URI DOM::CSSPrimitiveValue::CSS_URI DontDelete|ReadOnly - CSS_IDENT DOM::CSSPrimitiveValue::CSS_IDENT DontDelete|ReadOnly - CSS_ATTR DOM::CSSPrimitiveValue::CSS_ATTR DontDelete|ReadOnly - CSS_COUNTER DOM::CSSPrimitiveValue::CSS_COUNTER DontDelete|ReadOnly - CSS_RECT DOM::CSSPrimitiveValue::CSS_RECT DontDelete|ReadOnly - CSS_RGBCOLOR DOM::CSSPrimitiveValue::CSS_RGBCOLOR DontDelete|ReadOnly -@end -*/ - -Value CSSPrimitiveValueConstructor::tryGet(ExecState *exec, const Identifier &p) const -{ - return DOMObjectLookupGetValue<CSSPrimitiveValueConstructor,CSSValueConstructor>(exec,p,&CSSPrimitiveValueConstructorTable,this); -} - -Value CSSPrimitiveValueConstructor::getValueProperty(ExecState *, int token) const -{ - // We use the token as the value to return directly - return Number(token); -} - -Value getCSSPrimitiveValueConstructor(ExecState *exec) -{ - return cacheGlobalObject<CSSPrimitiveValueConstructor>( exec, "[[cssPrimitiveValue.constructor]]" ); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMCSSValueList::info = { "CSSValueList", 0, &DOMCSSValueListTable, 0 }; - -/* -@begin DOMCSSValueListTable 3 - length DOMCSSValueList::Length DontDelete|ReadOnly - item DOMCSSValueList::Item DontDelete|Function 1 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(DOMCSSValueListFunc) // not really a proto, but doesn't matter - -DOMCSSValueList::DOMCSSValueList(ExecState *exec, const DOM::CSSValueList& v) - : DOMCSSValue(exec, v) { } - -Value DOMCSSValueList::tryGet(ExecState *exec, const Identifier &p) const -{ - Value result; - DOM::CSSValueList valueList = static_cast<DOM::CSSValueList>(cssValue); - - if (p == lengthPropertyName) - return Number(valueList.length()); - else if (p == "item") - return lookupOrCreateFunction<DOMCSSValueListFunc>(exec,p,this,DOMCSSValueList::Item,1,DontDelete|Function); - - bool ok; - long unsigned int u = p.toULong(&ok); - if (ok) - return getDOMCSSValue(exec,valueList.item(u)); - - return DOMCSSValue::tryGet(exec,p); -} - -Value DOMCSSValueListFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMCSSValueList, thisObj ); - DOM::CSSValueList valueList = static_cast<DOMCSSValueList *>(thisObj.imp())->toValueList(); - switch (id) { - case DOMCSSValueList::Item: - return getDOMCSSValue(exec,valueList.item(args[0].toInteger(exec))); - default: - return Undefined(); - } -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMRGBColor::info = { "RGBColor", 0, &DOMRGBColorTable, 0 }; - -/* -@begin DOMRGBColorTable 3 - red DOMRGBColor::Red DontDelete|ReadOnly - green DOMRGBColor::Green DontDelete|ReadOnly - blue DOMRGBColor::Blue DontDelete|ReadOnly -@end -*/ - -DOMRGBColor::DOMRGBColor(ExecState* exec, const DOM::RGBColor& c) - : DOMObject(exec->interpreter()->builtinObjectPrototype()), rgbColor(c) -{ -} - -DOMRGBColor::~DOMRGBColor() -{ - //rgbColors.remove(rgbColor.handle()); -} - -Value DOMRGBColor::tryGet(ExecState *exec, const Identifier &p) const -{ - return DOMObjectLookupGetValue<DOMRGBColor,DOMObject>(exec, p, - &DOMRGBColorTable, - this); -} - -Value DOMRGBColor::getValueProperty(ExecState *exec, int token) const -{ - switch (token) { - case Red: - return getDOMCSSValue(exec, rgbColor.red()); - case Green: - return getDOMCSSValue(exec, rgbColor.green()); - case Blue: - return getDOMCSSValue(exec, rgbColor.blue()); - default: - return Value(); - } -} - -Value getDOMRGBColor(ExecState *exec, const DOM::RGBColor& c) -{ - // ### implement equals for RGBColor since they're not refcounted objects - return Value(new DOMRGBColor(exec, c)); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMRect::info = { "Rect", 0, &DOMRectTable, 0 }; -/* -@begin DOMRectTable 4 - top DOMRect::Top DontDelete|ReadOnly - right DOMRect::Right DontDelete|ReadOnly - bottom DOMRect::Bottom DontDelete|ReadOnly - left DOMRect::Left DontDelete|ReadOnly -@end -*/ - -DOMRect::DOMRect(ExecState *exec, const DOM::Rect& r) - : DOMObject(exec->interpreter()->builtinObjectPrototype()), rect(r) -{ -} - -DOMRect::~DOMRect() -{ - ScriptInterpreter::forgetDOMObject(rect.handle()); -} - -Value DOMRect::tryGet(ExecState *exec, const Identifier &p) const -{ - return DOMObjectLookupGetValue<DOMRect,DOMObject>(exec, p, - &DOMRectTable, this); -} - -Value DOMRect::getValueProperty(ExecState *exec, int token) const -{ - switch (token) { - case Top: - return getDOMCSSValue(exec, rect.top()); - case Right: - return getDOMCSSValue(exec, rect.right()); - case Bottom: - return getDOMCSSValue(exec, rect.bottom()); - case Left: - return getDOMCSSValue(exec, rect.left()); - default: - return Value(); - } -} - -Value getDOMRect(ExecState *exec, const DOM::Rect& r) -{ - return cacheDOMObject<DOM::Rect, KJS::DOMRect>(exec, r); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMCounter::info = { "Counter", 0, &DOMCounterTable, 0 }; -/* -@begin DOMCounterTable 3 - identifier DOMCounter::identifier DontDelete|ReadOnly - listStyle DOMCounter::listStyle DontDelete|ReadOnly - separator DOMCounter::separator DontDelete|ReadOnly -@end -*/ -DOMCounter::DOMCounter(ExecState *exec, const DOM::Counter& c) - : DOMObject(exec->interpreter()->builtinObjectPrototype()), counter(c) -{ -} - -DOMCounter::~DOMCounter() -{ - ScriptInterpreter::forgetDOMObject(counter.handle()); -} - -Value DOMCounter::tryGet(ExecState *exec, const Identifier &p) const -{ - return DOMObjectLookupGetValue<DOMCounter,DOMObject>(exec, p, - &DOMCounterTable, this); -} - -Value DOMCounter::getValueProperty(ExecState *, int token) const -{ - switch (token) { - case identifier: - return String(counter.identifier()); - case listStyle: - return String(counter.listStyle()); - case separator: - return String(counter.separator()); - default: - return Value(); - } -} - -Value getDOMCounter(ExecState *exec, const DOM::Counter& c) -{ - return cacheDOMObject<DOM::Counter, KJS::DOMCounter>(exec, c); -} - -} //namespace KJS diff --git a/khtml/ecma/kjs_css.h b/khtml/ecma/kjs_css.h deleted file mode 100644 index 2b7d14712..000000000 --- a/khtml/ecma/kjs_css.h +++ /dev/null @@ -1,304 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2000 Harri Porten (porten@kde.org) - * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * 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 - */ - -#ifndef _KJS_CSS_H_ -#define _KJS_CSS_H_ - -#include <dom/dom_node.h> -#include <dom/dom_doc.h> -#include <kjs/object.h> -#include <dom/css_value.h> -#include <dom/css_stylesheet.h> -#include <dom/css_rule.h> -#include "kjs_binding.h" - -namespace KJS { - - class DOMCSSStyleDeclaration : public DOMObject { - public: - DOMCSSStyleDeclaration(ExecState *exec, const DOM::CSSStyleDeclaration& s); - virtual ~DOMCSSStyleDeclaration(); - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None); - virtual bool hasProperty(ExecState *exec, const Identifier &propertyName) const; - virtual const ClassInfo *classInfo() const { return &info; } - static const ClassInfo info; - enum { CssText, Length, ParentRule, - GetPropertyValue, GetPropertyCSSValue, RemoveProperty, GetPropertyPriority, - SetProperty, Item }; - DOM::CSSStyleDeclaration toStyleDecl() const { return styleDecl; } - protected: - DOM::CSSStyleDeclaration styleDecl; - }; - - DEFINE_PSEUDO_CONSTRUCTOR(CSSStyleDeclarationPseudoCtor) - - Value getDOMCSSStyleDeclaration(ExecState *exec, const DOM::CSSStyleDeclaration& n); - - class DOMStyleSheet : public DOMObject { - public: - // Build a DOMStyleSheet - DOMStyleSheet(ExecState *, const DOM::StyleSheet& ss); - // Constructor for inherited classes - DOMStyleSheet(const Object& proto, const DOM::StyleSheet& ss) : DOMObject(proto), styleSheet(ss) { } - virtual ~DOMStyleSheet(); - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None); - virtual bool toBoolean(ExecState *) const { return true; } - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Type, Disabled, OwnerNode, ParentStyleSheet, Href, Title, Media }; - protected: - DOM::StyleSheet styleSheet; - }; - - Value getDOMStyleSheet(ExecState *exec, const DOM::StyleSheet& ss); - - class DOMStyleSheetList : public DOMObject { - public: - DOMStyleSheetList(ExecState *, const DOM::StyleSheetList& ssl, const DOM::Document& doc); - virtual ~DOMStyleSheetList(); - virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const; - virtual Value call(ExecState *exec, Object &thisObj, const List &args); - Value tryCall(ExecState *exec, Object &thisObj, const List &args); - virtual bool implementsCall() const { return true; } - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - virtual bool toBoolean(ExecState* ) const { return true; } - static const ClassInfo info; - DOM::StyleSheetList toStyleSheetList() const { return styleSheetList; } - enum { Item, Length }; - private: - DOM::StyleSheetList styleSheetList; - DOM::Document m_doc; - }; - - // The document is only used for get-stylesheet-by-name (make optional if necessary) - Value getDOMStyleSheetList(ExecState *exec, const DOM::StyleSheetList& ss, const DOM::Document& doc); - - class DOMMediaList : public DOMObject { - public: - DOMMediaList(ExecState *, const DOM::MediaList& ml); - virtual ~DOMMediaList(); - virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const; - virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None); - virtual const ClassInfo* classInfo() const { return &info; } - virtual bool toBoolean(ExecState* ) const { return true; } - static const ClassInfo info; - enum { MediaText, Length, - Item, DeleteMedium, AppendMedium }; - DOM::MediaList toMediaList() const { return mediaList; } - private: - DOM::MediaList mediaList; - }; - - Value getDOMMediaList(ExecState *exec, const DOM::MediaList& ss); - - class DOMCSSStyleSheet : public DOMStyleSheet { - public: - DOMCSSStyleSheet(ExecState *exec, const DOM::CSSStyleSheet& ss); - virtual ~DOMCSSStyleSheet(); - virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { OwnerRule, CssRules, Rules, - InsertRule, DeleteRule, AddRule, RemoveRule }; - DOM::CSSStyleSheet toCSSStyleSheet() const { return static_cast<DOM::CSSStyleSheet>(styleSheet); } - }; - - class DOMCSSRuleList : public DOMObject { - public: - DOMCSSRuleList(ExecState *, const DOM::CSSRuleList& rl); - virtual ~DOMCSSRuleList(); - virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Item, Length }; - DOM::CSSRuleList toCSSRuleList() const { return cssRuleList; } - protected: - DOM::CSSRuleList cssRuleList; - }; - - Value getDOMCSSRuleList(ExecState *exec, const DOM::CSSRuleList& rl); - - class DOMCSSRule : public DOMObject { - public: - DOMCSSRule(ExecState *, const DOM::CSSRule& r); - virtual ~DOMCSSRule(); - virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None); - void putValueProperty(ExecState *exec, int token, const Value& value, int attr); - virtual const ClassInfo* classInfo() const; - static const ClassInfo info; - static const ClassInfo style_info, media_info, fontface_info, page_info, import_info, charset_info; - enum { ParentStyleSheet, Type, CssText, ParentRule, - Style_SelectorText, Style_Style, - Media_Media, Media_InsertRule, Media_DeleteRule, Media_CssRules, - FontFace_Style, Page_SelectorText, Page_Style, - Import_Href, Import_Media, Import_StyleSheet, Charset_Encoding }; - DOM::CSSRule toCSSRule() const { return cssRule; } - protected: - DOM::CSSRule cssRule; - }; - - Value getDOMCSSRule(ExecState *exec, const DOM::CSSRule& r); - - /** - * Convert an object to a CSSRule. Returns a null CSSRule if not possible. - */ - DOM::CSSRule toCSSRule(const Value&); - - // Constructor for CSSRule - currently only used for some global values - class CSSRuleConstructor : public DOMObject { - public: - CSSRuleConstructor(ExecState *); - virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { UNKNOWN_RULE, STYLE_RULE, CHARSET_RULE, IMPORT_RULE, MEDIA_RULE, FONT_FACE_RULE, PAGE_RULE }; - }; - - Value getCSSRuleConstructor(ExecState *exec); - - class DOMCSSValue : public DOMObject { - public: - DOMCSSValue(ExecState *, const DOM::CSSValue& v); - DOMCSSValue(const Object& proto, const DOM::CSSValue& v) : DOMObject(proto), cssValue(v) { } - virtual ~DOMCSSValue(); - virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const; - virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None); - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { CssText, CssValueType }; - protected: - DOM::CSSValue cssValue; - }; - - Value getDOMCSSValue(ExecState *exec, const DOM::CSSValue& v); - - // Constructor for CSSValue - currently only used for some global values - class CSSValueConstructor : public DOMObject { - public: - CSSValueConstructor(ExecState *exec); - virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { CSS_VALUE_LIST, CSS_PRIMITIVE_VALUE, CSS_CUSTOM, CSS_INHERIT }; - }; - - Value getCSSValueConstructor(ExecState *exec); - - class DOMCSSPrimitiveValue : public DOMCSSValue { - public: - DOMCSSPrimitiveValue(ExecState *exec, const DOM::CSSPrimitiveValue& v); - virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - DOM::CSSPrimitiveValue toCSSPrimitiveValue() const { return static_cast<DOM::CSSPrimitiveValue>(cssValue); } - enum { PrimitiveType, SetFloatValue, GetFloatValue, SetStringValue, GetStringValue, - GetCounterValue, GetRectValue, GetRGBColorValue }; - }; - - // Constructor for CSSPrimitiveValue - currently only used for some global values - class CSSPrimitiveValueConstructor : public CSSValueConstructor { - public: - CSSPrimitiveValueConstructor(ExecState *exec) : CSSValueConstructor(exec) { } - virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - }; - - Value getCSSPrimitiveValueConstructor(ExecState *exec); - - class DOMCSSValueList : public DOMCSSValue { - public: - DOMCSSValueList(ExecState *exec, const DOM::CSSValueList& v); - virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Item, Length }; - DOM::CSSValueList toValueList() const { return static_cast<DOM::CSSValueList>(cssValue); } - }; - - class DOMRGBColor : public DOMObject { - public: - DOMRGBColor(ExecState*, const DOM::RGBColor& c); - ~DOMRGBColor(); - virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Red, Green, Blue }; - protected: - DOM::RGBColor rgbColor; - }; - - Value getDOMRGBColor(ExecState *exec, const DOM::RGBColor& c); - - class DOMRect : public DOMObject { - public: - DOMRect(ExecState *, const DOM::Rect& r); - ~DOMRect(); - virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Top, Right, Bottom, Left }; - protected: - DOM::Rect rect; - }; - - Value getDOMRect(ExecState *exec, const DOM::Rect& r); - - class DOMCounter : public DOMObject { - public: - DOMCounter(ExecState *, const DOM::Counter& c); - ~DOMCounter(); - virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { identifier, listStyle, separator }; - protected: - DOM::Counter counter; - }; - - Value getDOMCounter(ExecState *exec, const DOM::Counter& c); - -} // namespace - -#endif diff --git a/khtml/ecma/kjs_debugwin.cpp b/khtml/ecma/kjs_debugwin.cpp deleted file mode 100644 index 73a55cf94..000000000 --- a/khtml/ecma/kjs_debugwin.cpp +++ /dev/null @@ -1,1139 +0,0 @@ -/* - * This file is part of the KDE libraries - * Copyright (C) 2000-2001 Harri Porten (porten@kde.org) - * Copyright (C) 2001,2003 Peter Kelly (pmk@post.com) - * - * 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 "kjs_debugwin.h" -#include "kjs_proxy.h" - -#ifdef KJS_DEBUGGER - -#include <assert.h> -#include <stdlib.h> -#include <tqlayout.h> -#include <tqpushbutton.h> -#include <tqtextedit.h> -#include <tqlistbox.h> -#include <tqmultilineedit.h> -#include <tqapplication.h> -#include <tqsplitter.h> -#include <tqcombobox.h> -#include <tqbitmap.h> -#include <tqwidgetlist.h> -#include <tqlabel.h> -#include <tqdatastream.h> -#include <tqcstring.h> -#include <tqpainter.h> -#include <tqscrollbar.h> - -#include <klocale.h> -#include <kdebug.h> -#include <kiconloader.h> -#include <kglobal.h> -#include <kmessagebox.h> -#include <kguiitem.h> -#include <kpopupmenu.h> -#include <kmenubar.h> -#include <kaction.h> -#include <kactioncollection.h> -#include <kglobalsettings.h> -#include <kshortcut.h> -#include <kconfig.h> -#include <kconfigbase.h> -#include <kapplication.h> -#include <dcop/dcopclient.h> -#include <kstringhandler.h> - -#include "kjs_dom.h" -#include "kjs_binding.h" -#include "khtml_part.h" -#include "khtmlview.h" -#include "khtml_pagecache.h" -#include "khtml_settings.h" -#include "khtml_factory.h" -#include "misc/decoder.h" -#include <kjs/ustring.h> -#include <kjs/object.h> -#include <kjs/function.h> -#include <kjs/interpreter.h> - -using namespace KJS; -using namespace khtml; - -SourceDisplay::SourceDisplay(KJSDebugWin *debugWin, TQWidget *parent, const char *name) - : TQScrollView(parent,name), m_currentLine(-1), m_sourceFile(0), m_debugWin(debugWin), - m_font(TDEGlobalSettings::fixedFont()) -{ - verticalScrollBar()->setLineStep(TQFontMetrics(m_font).height()); - viewport()->setBackgroundMode(TQt::NoBackground); - m_breakpointIcon = TDEGlobal::iconLoader()->loadIcon("stop",KIcon::Small); -} - -SourceDisplay::~SourceDisplay() -{ - if (m_sourceFile) { - m_sourceFile->deref(); - m_sourceFile = 0L; - } -} - -void SourceDisplay::setSource(SourceFile *sourceFile) -{ - if ( sourceFile ) - sourceFile->ref(); - if (m_sourceFile) - m_sourceFile->deref(); - m_sourceFile = sourceFile; - if ( m_sourceFile ) - m_sourceFile->ref(); - - if (!m_sourceFile || !m_debugWin->isVisible()) { - return; - } - - TQString code = sourceFile->getCode(); - const TQChar *chars = code.unicode(); - uint len = code.length(); - TQChar newLine('\n'); - TQChar cr('\r'); - TQChar tab('\t'); - TQString tabstr(" "); - TQString line; - m_lines.clear(); - int width = 0; - TQFontMetrics metrics(m_font); - - for (uint pos = 0; pos < len; pos++) { - TQChar c = chars[pos]; - if (c == cr) { - if (pos < len-1 && chars[pos+1] == newLine) - continue; - else - c = newLine; - } - if (c == newLine) { - m_lines.append(line); - int lineWidth = metrics.width(line); - if (lineWidth > width) - width = lineWidth; - line = ""; - } - else if (c == tab) { - line += tabstr; - } - else { - line += c; - } - } - if (line.length()) { - m_lines.append(line); - int lineWidth = metrics.width(line); - if (lineWidth > width) - width = lineWidth; - } - - int linenoDisplayWidth = metrics.width("888888"); - resizeContents(linenoDisplayWidth+4+width,metrics.height()*m_lines.count()); - update(); - sourceFile->deref(); -} - -void SourceDisplay::setCurrentLine(int lineno, bool doCenter) -{ - m_currentLine = lineno; - - if (doCenter && m_currentLine >= 0) { - TQFontMetrics metrics(m_font); - int height = metrics.height(); - center(0,height*m_currentLine+height/2); - } - - updateContents(); -} - -void SourceDisplay::contentsMousePressEvent(TQMouseEvent *e) -{ - TQScrollView::mouseDoubleClickEvent(e); - TQFontMetrics metrics(m_font); - int lineno = e->y()/metrics.height(); - emit lineDoubleClicked(lineno+1); // line numbers start from 1 -} - -void SourceDisplay::showEvent(TQShowEvent *) -{ - setSource(m_sourceFile); -} - -void SourceDisplay::drawContents(TQPainter *p, int clipx, int clipy, int clipw, int cliph) -{ - if (!m_sourceFile) { - p->fillRect(clipx,clipy,clipw,cliph,palette().active().base()); - return; - } - - TQFontMetrics metrics(m_font); - int height = metrics.height(); - - int bottom = clipy + cliph; - int right = clipx + clipw; - - int firstLine = clipy/height-1; - if (firstLine < 0) - firstLine = 0; - int lastLine = bottom/height+2; - if (lastLine > (int)m_lines.count()) - lastLine = m_lines.count(); - - p->setFont(m_font); - - int linenoWidth = metrics.width("888888"); - - for (int lineno = firstLine; lineno <= lastLine; lineno++) { - TQString linenoStr = TQString().sprintf("%d",lineno+1); - - - p->fillRect(0,height*lineno,linenoWidth,height,palette().active().mid()); - - p->setPen(palette().active().text()); - p->drawText(0,height*lineno,linenoWidth,height,Qt::AlignRight,linenoStr); - - TQColor bgColor; - TQColor textColor; - - if (lineno == m_currentLine) { - bgColor = palette().active().highlight(); - textColor = palette().active().highlightedText(); - } - else if (m_debugWin->haveBreakpoint(m_sourceFile,lineno+1,lineno+1)) { - bgColor = palette().active().text(); - textColor = palette().active().base(); - p->drawPixmap(2,height*lineno+height/2-m_breakpointIcon.height()/2,m_breakpointIcon); - } - else { - bgColor = palette().active().base(); - textColor = palette().active().text(); - } - - p->fillRect(linenoWidth,height*lineno,right-linenoWidth,height,bgColor); - p->setPen(textColor); - p->drawText(linenoWidth+4,height*lineno,contentsWidth()-linenoWidth-4,height, - Qt::AlignLeft,m_lines[lineno]); - } - - int remainingTop = height*(lastLine+1); - p->fillRect(0,remainingTop,linenoWidth,bottom-remainingTop,palette().active().mid()); - - p->fillRect(linenoWidth,remainingTop, - right-linenoWidth,bottom-remainingTop,palette().active().base()); -} - -//------------------------------------------------------------------------- - -KJSDebugWin * KJSDebugWin::kjs_html_debugger = 0; - -TQString SourceFile::getCode() -{ - if (interpreter) { - KHTMLPart *part = ::tqqt_cast<KHTMLPart*>(static_cast<ScriptInterpreter*>(interpreter)->part()); - if (part && url == part->url().url() && KHTMLPageCache::self()->isValid(part->cacheId())) { - Decoder *decoder = part->createDecoder(); - TQByteArray data; - TQDataStream stream(data,IO_WriteOnly); - KHTMLPageCache::self()->saveData(part->cacheId(),&stream); - TQString str; - if (data.size() == 0) - str = ""; - else - str = decoder->decode(data.data(),data.size()) + decoder->flush(); - delete decoder; - return str; - } - } - - return code; -} - -//------------------------------------------------------------------------- - -SourceFragment::SourceFragment(int sid, int bl, int el, SourceFile *sf) -{ - sourceId = sid; - baseLine = bl; - errorLine = el; - sourceFile = sf; - sourceFile->ref(); -} - -SourceFragment::~SourceFragment() -{ - sourceFile->deref(); - sourceFile = 0L; -} - -//------------------------------------------------------------------------- - -KJSErrorDialog::KJSErrorDialog(TQWidget *parent, const TQString& errorMessage, bool showDebug) - : KDialogBase(parent,0,true,i18n("JavaScript Error"), - showDebug ? KDialogBase::Ok|KDialogBase::User1 : KDialogBase::Ok, - KDialogBase::Ok,false,KGuiItem("&Debug","gear")) -{ - TQWidget *page = new TQWidget(this); - setMainWidget(page); - - TQLabel *iconLabel = new TQLabel("",page); - iconLabel->setPixmap(TDEGlobal::iconLoader()->loadIcon("messagebox_critical", - KIcon::NoGroup,KIcon::SizeMedium, - KIcon::DefaultState,0,true)); - - TQWidget *contents = new TQWidget(page); - TQLabel *label = new TQLabel(errorMessage,contents); - m_dontShowAgainCb = new TQCheckBox(i18n("&Do not show this message again"),contents); - - TQVBoxLayout *vl = new TQVBoxLayout(contents,0,spacingHint()); - vl->addWidget(label); - vl->addWidget(m_dontShowAgainCb); - - TQHBoxLayout *topLayout = new TQHBoxLayout(page,0,spacingHint()); - topLayout->addWidget(iconLabel); - topLayout->addWidget(contents); - topLayout->addStretch(10); - - m_debugSelected = false; -} - -KJSErrorDialog::~KJSErrorDialog() -{ -} - -void KJSErrorDialog::slotUser1() -{ - m_debugSelected = true; - close(); -} - -//------------------------------------------------------------------------- -EvalMultiLineEdit::EvalMultiLineEdit(TQWidget *parent) - : TQMultiLineEdit(parent) { -} - -void EvalMultiLineEdit::keyPressEvent(TQKeyEvent * e) -{ - if (e->key() == Qt::Key_Return) { - if (hasSelectedText()) { - m_code = selectedText(); - } else { - int para, index; - getCursorPosition(¶, &index); - m_code = text(para); - } - end(); - } - TQMultiLineEdit::keyPressEvent(e); -} -//------------------------------------------------------------------------- -KJSDebugWin::KJSDebugWin(TQWidget *parent, const char *name) - : KMainWindow(parent, name, (WFlags)WType_TopLevel), TDEInstance("kjs_debugger") -{ - m_breakpoints = 0; - m_breakpointCount = 0; - - m_curSourceFile = 0; - m_mode = Continue; - m_nextSourceUrl = ""; - m_nextSourceBaseLine = 1; - m_execs = 0; - m_execsCount = 0; - m_execsAlloc = 0; - m_steppingDepth = 0; - - m_stopIcon = TDEGlobal::iconLoader()->loadIcon("stop",KIcon::Small); - m_emptyIcon = TQPixmap(m_stopIcon.width(),m_stopIcon.height()); - TQBitmap emptyMask(m_stopIcon.width(),m_stopIcon.height(),true); - m_emptyIcon.setMask(emptyMask); - - setCaption(i18n("JavaScript Debugger")); - - TQWidget *mainWidget = new TQWidget(this); - setCentralWidget(mainWidget); - - TQVBoxLayout *vl = new TQVBoxLayout(mainWidget,5); - - // frame list & code - TQSplitter *hsplitter = new TQSplitter(Qt::Vertical,mainWidget); - TQSplitter *vsplitter = new TQSplitter(hsplitter); - TQFont font(TDEGlobalSettings::fixedFont()); - - TQWidget *contextContainer = new TQWidget(vsplitter); - - TQLabel *contextLabel = new TQLabel(i18n("Call stack"),contextContainer); - TQWidget *contextListContainer = new TQWidget(contextContainer); - m_contextList = new TQListBox(contextListContainer); - m_contextList->setMinimumSize(100,200); - connect(m_contextList,TQT_SIGNAL(highlighted(int)),this,TQT_SLOT(slotShowFrame(int))); - - TQHBoxLayout *clistLayout = new TQHBoxLayout(contextListContainer); - clistLayout->addWidget(m_contextList); - clistLayout->addSpacing(KDialog::spacingHint()); - - TQVBoxLayout *contextLayout = new TQVBoxLayout(contextContainer); - contextLayout->addWidget(contextLabel); - contextLayout->addSpacing(KDialog::spacingHint()); - contextLayout->addWidget(contextListContainer); - - // source selection & display - TQWidget *sourceSelDisplay = new TQWidget(vsplitter); - TQVBoxLayout *ssdvl = new TQVBoxLayout(sourceSelDisplay); - - m_sourceSel = new TQComboBox(toolBar()); - connect(m_sourceSel,TQT_SIGNAL(activated(int)),this,TQT_SLOT(slotSourceSelected(int))); - - m_sourceDisplay = new SourceDisplay(this,sourceSelDisplay); - ssdvl->addWidget(m_sourceDisplay); - connect(m_sourceDisplay,TQT_SIGNAL(lineDoubleClicked(int)),TQT_SLOT(slotToggleBreakpoint(int))); - - TQValueList<int> vsplitSizes; - vsplitSizes.insert(vsplitSizes.end(),120); - vsplitSizes.insert(vsplitSizes.end(),480); - vsplitter->setSizes(vsplitSizes); - - // evaluate - - TQWidget *evalContainer = new TQWidget(hsplitter); - - TQLabel *evalLabel = new TQLabel(i18n("JavaScript console"),evalContainer); - m_evalEdit = new EvalMultiLineEdit(evalContainer); - m_evalEdit->setWordWrap(TQMultiLineEdit::NoWrap); - m_evalEdit->setFont(font); - connect(m_evalEdit,TQT_SIGNAL(returnPressed()),TQT_SLOT(slotEval())); - m_evalDepth = 0; - - TQVBoxLayout *evalLayout = new TQVBoxLayout(evalContainer); - evalLayout->addSpacing(KDialog::spacingHint()); - evalLayout->addWidget(evalLabel); - evalLayout->addSpacing(KDialog::spacingHint()); - evalLayout->addWidget(m_evalEdit); - - TQValueList<int> hsplitSizes; - hsplitSizes.insert(hsplitSizes.end(),400); - hsplitSizes.insert(hsplitSizes.end(),200); - hsplitter->setSizes(hsplitSizes); - - vl->addWidget(hsplitter); - - // actions - KPopupMenu *debugMenu = new KPopupMenu(this); - menuBar()->insertItem("&Debug",debugMenu); - - m_actionCollection = new KActionCollection(this); - m_actionCollection->setInstance(this); - - // Venkman use F12, KDevelop F10 - KShortcut scNext = KShortcut(KKeySequence(KKey(Qt::Key_F12))); - scNext.append(KKeySequence(KKey(Qt::Key_F10))); - m_nextAction = new KAction(i18n("Next breakpoint","&Next"),"dbgnext",scNext,TQT_TQOBJECT(this),TQT_SLOT(slotNext()), - m_actionCollection,"next"); - m_stepAction = new KAction(i18n("&Step"),"dbgstep",KShortcut(Qt::Key_F11),TQT_TQOBJECT(this),TQT_SLOT(slotStep()), - m_actionCollection,"step"); - // Venkman use F5, Kdevelop F9 - KShortcut scCont = KShortcut(KKeySequence(KKey(Qt::Key_F5))); - scCont.append(KKeySequence(KKey(Qt::Key_F9))); - m_continueAction = new KAction(i18n("&Continue"),"dbgrun",scCont,TQT_TQOBJECT(this),TQT_SLOT(slotContinue()), - m_actionCollection,"cont"); - m_stopAction = new KAction(i18n("St&op"),"stop",KShortcut(Qt::Key_F4),TQT_TQOBJECT(this),TQT_SLOT(slotStop()), - m_actionCollection,"stop"); - m_breakAction = new KAction(i18n("&Break at Next Statement"),"dbgrunto",KShortcut(Qt::Key_F8),TQT_TQOBJECT(this),TQT_SLOT(slotBreakNext()), - m_actionCollection,"breaknext"); - - - m_nextAction->setToolTip(i18n("Next breakpoint","Next")); - m_stepAction->setToolTip(i18n("Step")); - m_continueAction->setToolTip(i18n("Continue")); - m_stopAction->setToolTip(i18n("Stop")); - m_breakAction->setToolTip("Break at next Statement"); - - m_nextAction->setEnabled(false); - m_stepAction->setEnabled(false); - m_continueAction->setEnabled(false); - m_stopAction->setEnabled(false); - m_breakAction->setEnabled(true); - - m_nextAction->plug(debugMenu); - m_stepAction->plug(debugMenu); - m_continueAction->plug(debugMenu); -// m_stopAction->plug(debugMenu); ### disabled until DebuggerImp::stop() works reliably - m_breakAction->plug(debugMenu); - - m_nextAction->plug(toolBar()); - m_stepAction->plug(toolBar()); - m_continueAction->plug(toolBar()); -// m_stopAction->plug(toolBar()); ### - m_breakAction->plug(toolBar()); - - toolBar()->insertWidget(1,300,m_sourceSel); - toolBar()->setItemAutoSized(1); - - updateContextList(); - setMinimumSize(300,200); - resize(600,450); - -} - -KJSDebugWin::~KJSDebugWin() -{ - free(m_breakpoints); - free(m_execs); -} - -KJSDebugWin *KJSDebugWin::createInstance() -{ - assert(!kjs_html_debugger); - kjs_html_debugger = new KJSDebugWin(); - return kjs_html_debugger; -} - -void KJSDebugWin::destroyInstance() -{ - assert(kjs_html_debugger); - kjs_html_debugger->hide(); - delete kjs_html_debugger; -} - -void KJSDebugWin::slotNext() -{ - m_mode = Next; - leaveSession(); -} - -void KJSDebugWin::slotStep() -{ - m_mode = Step; - leaveSession(); -} - -void KJSDebugWin::slotContinue() -{ - m_mode = Continue; - leaveSession(); -} - -void KJSDebugWin::slotStop() -{ - m_mode = Stop; - while (!m_execStates.isEmpty()) - leaveSession(); -} - -void KJSDebugWin::slotBreakNext() -{ - m_mode = Step; -} - -void KJSDebugWin::slotToggleBreakpoint(int lineno) -{ - if (m_sourceSel->currentItem() < 0) - return; - - SourceFile *sourceFile = m_sourceSelFiles.at(m_sourceSel->currentItem()); - - // Find the source fragment containing the selected line (if any) - int sourceId = -1; - int highestBaseLine = -1; - TQMap<int,SourceFragment*>::Iterator it; - - for (it = m_sourceFragments.begin(); it != m_sourceFragments.end(); ++it) { - SourceFragment *sourceFragment = it.data(); - if (sourceFragment && - sourceFragment->sourceFile == sourceFile && - sourceFragment->baseLine <= lineno && - sourceFragment->baseLine > highestBaseLine) { - - sourceId = sourceFragment->sourceId; - highestBaseLine = sourceFragment->baseLine; - } - } - - if (sourceId < 0) - return; - - // Update the source code display with the appropriate icon - int fragmentLineno = lineno-highestBaseLine+1; - if (!setBreakpoint(sourceId,fragmentLineno)) // was already set - deleteBreakpoint(sourceId,fragmentLineno); - - m_sourceDisplay->updateContents(); -} - -void KJSDebugWin::slotShowFrame(int frameno) -{ - if (frameno < 0 || frameno >= m_execsCount) - return; - - Context ctx = m_execs[frameno]->context(); - setSourceLine(ctx.sourceId(),ctx.curStmtFirstLine()); -} - -void KJSDebugWin::slotSourceSelected(int sourceSelIndex) -{ - // A source file has been selected from the drop-down list - display the file - if (sourceSelIndex < 0 || sourceSelIndex >= (int)m_sourceSel->count()) - return; - SourceFile *sourceFile = m_sourceSelFiles.at(sourceSelIndex); - displaySourceFile(sourceFile,true); - - // If the currently selected context is in the current source file, then hilight - // the line it's on. - if (m_contextList->currentItem() >= 0) { - Context ctx = m_execs[m_contextList->currentItem()]->context(); - if (m_sourceFragments[ctx.sourceId()]->sourceFile == m_sourceSelFiles.at(sourceSelIndex)) - setSourceLine(ctx.sourceId(),ctx.curStmtFirstLine()); - } -} - -void KJSDebugWin::slotEval() -{ - // Work out which execution state to use. If we're currently in a debugging session, - // use the current context - otherwise, use the global execution state from the interpreter - // corresponding to the currently displayed source file. - ExecState *exec; - Object thisobj; - if (m_execStates.isEmpty()) { - if (m_sourceSel->currentItem() < 0) - return; - SourceFile *sourceFile = m_sourceSelFiles.at(m_sourceSel->currentItem()); - if (!sourceFile->interpreter) - return; - exec = sourceFile->interpreter->globalExec(); - thisobj = exec->interpreter()->globalObject(); - } - else { - exec = m_execStates.top(); - thisobj = exec->context().thisValue(); - } - - // Evaluate the js code from m_evalEdit - UString code(m_evalEdit->code()); - TQString msg; - - KJSCPUGuard guard; - guard.start(); - - Interpreter *interp = exec->interpreter(); - - Object obj = Object::dynamicCast(interp->globalObject().get(exec, "eval")); - List args; - args.append(String(code)); - - m_evalDepth++; - Value retval = obj.call(exec, thisobj, args); - m_evalDepth--; - guard.stop(); - - // Print the return value or exception message to the console - if (exec->hadException()) { - Value exc = exec->exception(); - exec->clearException(); - msg = "Exception: " + exc.toString(interp->globalExec()).qstring(); - } - else { - msg = retval.toString(interp->globalExec()).qstring(); - } - - m_evalEdit->insert(msg+"\n"); - updateContextList(); -} - -void KJSDebugWin::closeEvent(TQCloseEvent *e) -{ - while (!m_execStates.isEmpty()) // ### not sure if this will work - leaveSession(); - return TQWidget::closeEvent(e); -} - -bool KJSDebugWin::eventFilter(TQObject *o, TQEvent *e) -{ - switch (e->type()) { - case TQEvent::MouseButtonPress: - case TQEvent::MouseButtonRelease: - case TQEvent::MouseButtonDblClick: - case TQEvent::MouseMove: - case TQEvent::KeyPress: - case TQEvent::KeyRelease: - case TQEvent::Destroy: - case TQEvent::Close: - case TQEvent::Quit: - while (o->parent()) - o = TQT_TQOBJECT(o->parent()); - if (TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(this)) - return TQWidget::eventFilter(o,e); - else - return true; - break; - default: - return TQWidget::eventFilter(o,e); - } -} - -void KJSDebugWin::disableOtherWindows() -{ - TQWidgetList *widgets = TQApplication::allWidgets(); - TQWidgetListIt it(*widgets); - for (; it.current(); ++it) - it.current()->installEventFilter(this); -} - -void KJSDebugWin::enableOtherWindows() -{ - TQWidgetList *widgets = TQApplication::allWidgets(); - TQWidgetListIt it(*widgets); - for (; it.current(); ++it) - it.current()->removeEventFilter(this); -} - -bool KJSDebugWin::sourceParsed(KJS::ExecState *exec, int sourceId, - const KJS::UString &source, int errorLine) -{ - // Work out which source file this fragment is in - SourceFile *sourceFile = 0; - if (!m_nextSourceUrl.isEmpty()) - sourceFile = getSourceFile(exec->interpreter(),m_nextSourceUrl); - - int index; - if (!sourceFile) { - index = m_sourceSel->count(); - if (!m_nextSourceUrl.isEmpty()) { - - TQString code = source.qstring(); - KParts::ReadOnlyPart *part = static_cast<ScriptInterpreter*>(exec->interpreter())->part(); - if (m_nextSourceUrl == part->url().url()) { - // Only store the code here if it's not from the part's html page... in that - // case we can get it from KHTMLPageCache - code = TQString::null; - } - - sourceFile = new SourceFile(m_nextSourceUrl,code,exec->interpreter()); - setSourceFile(exec->interpreter(),m_nextSourceUrl,sourceFile); - m_sourceSelFiles.append(sourceFile); - m_sourceSel->insertItem(m_nextSourceUrl); - } - else { - // Sourced passed from somewhere else (possibly an eval call)... we don't know the url, - // but we still know the interpreter - sourceFile = new SourceFile("(unknown)",source.qstring(),exec->interpreter()); - m_sourceSelFiles.append(sourceFile); - m_sourceSel->insertItem(TQString::number(index) += "-???"); - } - } - else { - // Ensure that each source file to be displayed is associated with - // an appropriate interpreter - if (!sourceFile->interpreter) - sourceFile->interpreter = exec->interpreter(); - for (index = 0; index < m_sourceSel->count(); index++) { - if (m_sourceSelFiles.at(index) == sourceFile) - break; - } - assert(index < m_sourceSel->count()); - } - - SourceFragment *sf = new SourceFragment(sourceId,m_nextSourceBaseLine,errorLine,sourceFile); - m_sourceFragments[sourceId] = sf; - - if (m_sourceSel->currentItem() < 0) - m_sourceSel->setCurrentItem(index); - - if (m_sourceSel->currentItem() == index) { - displaySourceFile(sourceFile,true); - } - - m_nextSourceBaseLine = 1; - m_nextSourceUrl = ""; - - return (m_mode != Stop); -} - -bool KJSDebugWin::sourceUnused(KJS::ExecState *exec, int sourceId) -{ - // Verify that there aren't any contexts on the stack using the given sourceId - // This should never be the case because this function is only called when - // the interpreter has deleted all Node objects for the source. - for (int e = 0; e < m_execsCount; e++) - assert(m_execs[e]->context().sourceId() != sourceId); - - // Now remove the fragment (and the SourceFile, if it was the last fragment in that file) - SourceFragment *fragment = m_sourceFragments[sourceId]; - if (fragment) { - m_sourceFragments.erase(sourceId); - - SourceFile *sourceFile = fragment->sourceFile; - if (sourceFile->hasOneRef()) { - for (int i = 0; i < m_sourceSel->count(); i++) { - if (m_sourceSelFiles.at(i) == sourceFile) { - m_sourceSel->removeItem(i); - m_sourceSelFiles.remove(i); - break; - } - } - removeSourceFile(exec->interpreter(),sourceFile->url); - } - delete fragment; - } - - return (m_mode != Stop); -} - -bool KJSDebugWin::exception(ExecState *exec, const Value &value, bool inTryCatch) -{ - assert(value.isValid()); - - // Ignore exceptions that will be caught by the script - if (inTryCatch) - return true; - - KParts::ReadOnlyPart *part = static_cast<ScriptInterpreter*>(exec->interpreter())->part(); - KHTMLPart *khtmlpart = ::tqqt_cast<KHTMLPart*>(part); - if (khtmlpart && !khtmlpart->settings()->isJavaScriptErrorReportingEnabled()) - return true; - - TQWidget *dlgParent = (m_evalDepth == 0) ? (TQWidget*)part->widget() : (TQWidget*)this; - - TQString exceptionMsg = value.toString(exec).qstring(); - - // Syntax errors are a special case. For these we want to display the url & lineno, - // which isn't included in the exception messeage. So we work it out from the values - // passed to sourceParsed() - Object valueObj = Object::dynamicCast(value); - Object syntaxError = exec->interpreter()->builtinSyntaxError(); - if (valueObj.isValid() && valueObj.get(exec,"constructor").imp() == syntaxError.imp()) { - Value sidValue = valueObj.get(exec,"sid"); - if (sidValue.isA(NumberType)) { // sid is not set for Function() constructor - int sourceId = (int)sidValue.toNumber(exec); - assert(m_sourceFragments[sourceId]); - exceptionMsg = i18n("Parse error at %1 line %2") - .arg(m_sourceFragments[sourceId]->sourceFile->url) - .arg(m_sourceFragments[sourceId]->baseLine+m_sourceFragments[sourceId]->errorLine-1); - } - } - - bool dontShowAgain = false; - if (m_execsCount == 0) { - // An exception occurred and we're not currently executing any code... this can - // happen in some cases e.g. a parse error, or native code accessing funcitons like - // Object::put() - TQString msg = i18n("An error occurred while attempting to run a script on this page.\n\n%1") - .arg(exceptionMsg); - KJSErrorDialog dlg(dlgParent,msg,false); - dlg.exec(); - dontShowAgain = dlg.dontShowAgain(); - } - else { - Context ctx = m_execs[m_execsCount-1]->context(); - SourceFragment *sourceFragment = m_sourceFragments[ctx.sourceId()]; - TQString msg = i18n("An error occurred while attempting to run a script on this page.\n\n%1 line %2:\n%3") - .arg(KStringHandler::rsqueeze( sourceFragment->sourceFile->url,80), - TQString::number( sourceFragment->baseLine+ctx.curStmtFirstLine()-1), - exceptionMsg); - - KJSErrorDialog dlg(dlgParent,msg,true); - dlg.exec(); - dontShowAgain = dlg.dontShowAgain(); - - if (dlg.debugSelected()) { - m_mode = Next; - m_steppingDepth = m_execsCount-1; - enterSession(exec); - } - } - - if (dontShowAgain) { - TDEConfig *config = kapp->config(); - TDEConfigGroupSaver saver(config,TQString::fromLatin1("Java/JavaScript Settings")); - config->writeEntry("ReportJavaScriptErrors",TQVariant(false,0)); - config->sync(); - TQByteArray data; - kapp->dcopClient()->send( "konqueror*", "KonquerorIface", "reparseConfiguration()", data ); - } - - return (m_mode != Stop); -} - -bool KJSDebugWin::atStatement(KJS::ExecState *exec) -{ - assert(m_execsCount > 0); - assert(m_execs[m_execsCount-1] == exec); - checkBreak(exec); - return (m_mode != Stop); -} - -bool KJSDebugWin::enterContext(ExecState *exec) -{ - if (m_execsCount >= m_execsAlloc) { - m_execsAlloc += 10; - m_execs = (ExecState**)realloc(m_execs,m_execsAlloc*sizeof(ExecState*)); - } - m_execs[m_execsCount++] = exec; - - if (m_mode == Step) - m_steppingDepth = m_execsCount-1; - - checkBreak(exec); - return (m_mode != Stop); -} - -bool KJSDebugWin::exitContext(ExecState *exec, const Completion &/*completion*/) -{ - assert(m_execsCount > 0); - assert(m_execs[m_execsCount-1] == exec); - - checkBreak(exec); - - m_execsCount--; - if (m_steppingDepth > m_execsCount-1) - m_steppingDepth = m_execsCount-1; - if (m_execsCount == 0) - updateContextList(); - - return (m_mode != Stop); -} - -void KJSDebugWin::displaySourceFile(SourceFile *sourceFile, bool forceRefresh) -{ - if (m_curSourceFile == sourceFile && !forceRefresh) - return; - sourceFile->ref(); - m_sourceDisplay->setSource(sourceFile); - if (m_curSourceFile) - m_curSourceFile->deref(); - m_curSourceFile = sourceFile; -} - -void KJSDebugWin::setSourceLine(int sourceId, int lineno) -{ - SourceFragment *source = m_sourceFragments[sourceId]; - if (!source) - return; - - SourceFile *sourceFile = source->sourceFile; - if (m_curSourceFile != source->sourceFile) { - for (int i = 0; i < m_sourceSel->count(); i++) - if (m_sourceSelFiles.at(i) == sourceFile) - m_sourceSel->setCurrentItem(i); - displaySourceFile(sourceFile,false); - } - m_sourceDisplay->setCurrentLine(source->baseLine+lineno-2); -} - -void KJSDebugWin::setNextSourceInfo(TQString url, int baseLine) -{ - m_nextSourceUrl = url; - m_nextSourceBaseLine = baseLine; -} - -void KJSDebugWin::sourceChanged(Interpreter *interpreter, TQString url) -{ - SourceFile *sourceFile = getSourceFile(interpreter,url); - if (sourceFile && m_curSourceFile == sourceFile) - displaySourceFile(sourceFile,true); -} - -void KJSDebugWin::clearInterpreter(Interpreter *interpreter) -{ - TQMap<int,SourceFragment*>::Iterator it; - - for (it = m_sourceFragments.begin(); it != m_sourceFragments.end(); ++it) - if (it.data() && it.data()->sourceFile->interpreter == interpreter) - it.data()->sourceFile->interpreter = 0; -} - -SourceFile *KJSDebugWin::getSourceFile(Interpreter *interpreter, TQString url) -{ - TQString key = TQString("%1|%2").arg((long)interpreter).arg(url); - return m_sourceFiles[key]; -} - -void KJSDebugWin::setSourceFile(Interpreter *interpreter, TQString url, SourceFile *sourceFile) -{ - TQString key = TQString("%1|%2").arg((long)interpreter).arg(url); - sourceFile->ref(); - if (SourceFile* oldFile = m_sourceFiles[key]) - oldFile->deref(); - m_sourceFiles[key] = sourceFile; -} - -void KJSDebugWin::removeSourceFile(Interpreter *interpreter, TQString url) -{ - TQString key = TQString("%1|%2").arg((long)interpreter).arg(url); - if (SourceFile* oldFile = m_sourceFiles[key]) - oldFile->deref(); - m_sourceFiles.remove(key); -} - -void KJSDebugWin::checkBreak(ExecState *exec) -{ - if (m_breakpointCount > 0) { - Context ctx = m_execs[m_execsCount-1]->context(); - if (haveBreakpoint(ctx.sourceId(),ctx.curStmtFirstLine(),ctx.curStmtLastLine())) { - m_mode = Next; - m_steppingDepth = m_execsCount-1; - } - } - - if ((m_mode == Step || m_mode == Next) && m_steppingDepth == m_execsCount-1) - enterSession(exec); -} - -void KJSDebugWin::enterSession(ExecState *exec) -{ - // This "enters" a new debugging session, i.e. enables usage of the debugging window - // It re-enters the qt event loop here, allowing execution of other parts of the - // program to continue while the script is stopped. We have to be a bit careful here, - // i.e. make sure the user can't quit the app, and disable other event handlers which - // could interfere with the debugging session. - if (!isVisible()) - show(); - - m_mode = Continue; - - if (m_execStates.isEmpty()) { - disableOtherWindows(); - m_nextAction->setEnabled(true); - m_stepAction->setEnabled(true); - m_continueAction->setEnabled(true); - m_stopAction->setEnabled(true); - m_breakAction->setEnabled(false); - } - m_execStates.push(exec); - - updateContextList(); - - tqApp->enter_loop(); // won't return until leaveSession() is called -} - -void KJSDebugWin::leaveSession() -{ - // Disables debugging for this window and returns to execute the rest of the script - // (or aborts execution, if the user pressed stop). When this returns, the program - // will exit the qt event loop, i.e. return to whatever processing was being done - // before the debugger was stopped. - assert(!m_execStates.isEmpty()); - - m_execStates.pop(); - - if (m_execStates.isEmpty()) { - m_nextAction->setEnabled(false); - m_stepAction->setEnabled(false); - m_continueAction->setEnabled(false); - m_stopAction->setEnabled(false); - m_breakAction->setEnabled(true); - m_sourceDisplay->setCurrentLine(-1); - enableOtherWindows(); - } - - tqApp->exit_loop(); -} - -void KJSDebugWin::updateContextList() -{ - disconnect(m_contextList,TQT_SIGNAL(highlighted(int)),this,TQT_SLOT(slotShowFrame(int))); - - m_contextList->clear(); - for (int i = 0; i < m_execsCount; i++) - m_contextList->insertItem(contextStr(m_execs[i]->context())); - - if (m_execsCount > 0) { - m_contextList->setSelected(m_execsCount-1, true); - Context ctx = m_execs[m_execsCount-1]->context(); - setSourceLine(ctx.sourceId(),ctx.curStmtFirstLine()); - } - - connect(m_contextList,TQT_SIGNAL(highlighted(int)),this,TQT_SLOT(slotShowFrame(int))); -} - -TQString KJSDebugWin::contextStr(const Context &ctx) -{ - TQString str = ""; - SourceFragment *sourceFragment = m_sourceFragments[ctx.sourceId()]; - TQString url = sourceFragment->sourceFile->url; - int fileLineno = sourceFragment->baseLine+ctx.curStmtFirstLine()-1; - - switch (ctx.codeType()) { - case GlobalCode: - str = TQString("Global code at %1:%2").arg(url).arg(fileLineno); - break; - case EvalCode: - str = TQString("Eval code at %1:%2").arg(url).arg(fileLineno); - break; - case FunctionCode: - if (!ctx.functionName().isNull()) - str = TQString("%1() at %2:%3").arg(ctx.functionName().qstring()).arg(url).arg(fileLineno); - else - str = TQString("Anonymous function at %1:%2").arg(url).arg(fileLineno); - break; - } - - return str; -} - -bool KJSDebugWin::setBreakpoint(int sourceId, int lineno) -{ - if (haveBreakpoint(sourceId,lineno,lineno)) - return false; - - m_breakpointCount++; - m_breakpoints = static_cast<Breakpoint*>(realloc(m_breakpoints, - m_breakpointCount*sizeof(Breakpoint))); - m_breakpoints[m_breakpointCount-1].sourceId = sourceId; - m_breakpoints[m_breakpointCount-1].lineno = lineno; - - return true; -} - -bool KJSDebugWin::deleteBreakpoint(int sourceId, int lineno) -{ - for (int i = 0; i < m_breakpointCount; i++) { - if (m_breakpoints[i].sourceId == sourceId && m_breakpoints[i].lineno == lineno) { - - memmove(m_breakpoints+i,m_breakpoints+i+1,(m_breakpointCount-i-1)*sizeof(Breakpoint)); - m_breakpointCount--; - m_breakpoints = static_cast<Breakpoint*>(realloc(m_breakpoints, - m_breakpointCount*sizeof(Breakpoint))); - return true; - } - } - - return false; -} - -bool KJSDebugWin::haveBreakpoint(SourceFile *sourceFile, int line0, int line1) -{ - for (int i = 0; i < m_breakpointCount; i++) { - int sourceId = m_breakpoints[i].sourceId; - int lineno = m_breakpoints[i].lineno; - if (m_sourceFragments.contains(sourceId) && - m_sourceFragments[sourceId]->sourceFile == sourceFile) { - int absLineno = m_sourceFragments[sourceId]->baseLine+lineno-1; - if (absLineno >= line0 && absLineno <= line1) - return true; - } - } - - return false; -} - -#include "kjs_debugwin.moc" - -#endif // KJS_DEBUGGER diff --git a/khtml/ecma/kjs_debugwin.h b/khtml/ecma/kjs_debugwin.h deleted file mode 100644 index dc2368ac2..000000000 --- a/khtml/ecma/kjs_debugwin.h +++ /dev/null @@ -1,285 +0,0 @@ -/* - * This file is part of the KDE libraries - * Copyright (C) 2000-2001 Harri Porten (porten@kde.org) - * Copyright (C) 2001,2003 Peter Kelly (pmk@post.com) - * - * 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 - */ - -#ifndef _KJS_DEBUGGER_H_ -#define _KJS_DEBUGGER_H_ - -#include <tqglobal.h> - -#define KJS_DEBUGGER - -#ifdef KJS_DEBUGGER - -#include <tqwidget.h> -#include <tqmultilineedit.h> -#include <tqpixmap.h> -#include <tqptrlist.h> -#include <tqptrstack.h> -#include <tqcheckbox.h> -#include <kdialogbase.h> -#include <kmainwindow.h> -#include <tqscrollview.h> - -#include <kjs/debugger.h> - -#include "dom/dom_misc.h" - -class TQListBox; -class TQComboBox; -class KActionCollection; -class KAction; - -namespace KJS { - class FunctionImp; - class List; - class Interpreter; - class KJSDebugWin; - - class SourceFile : public DOM::DomShared - { - public: - SourceFile(TQString u, TQString c, Interpreter *interp) - : url(u), code(c), interpreter(interp) {} - TQString getCode(); - TQString url; - TQString code; - Interpreter *interpreter; - }; - - /** - * @internal - * - * When kjs parses some code, it generates a source code fragment (or just "source"). - * This is referenced by its source id in future calls to functions such as atLine() - * and callEvent(). We keep a record of all source fragments parsed in order to display - * then to the user. - * - * For .js files, the source fragment will be the entire file. For js code included - * in html files, however, there may be multiple source fragments within the one file - * (e.g. multiple SCRIPT tags or onclick="..." attributes) - * - * In the case where a single file has multiple source fragments, the source objects - * for these fragments will all point to the same SourceFile for their code. - */ - class SourceFragment - { - public: - SourceFragment(int sid, int bl, int el, SourceFile *sf); - ~SourceFragment(); - - int sourceId; - int baseLine; - int errorLine; - SourceFile *sourceFile; - private: - SourceFragment(const SourceFragment& other); - SourceFragment& operator = (const SourceFragment& other); - }; - - class KJSErrorDialog : public KDialogBase { - Q_OBJECT - public: - KJSErrorDialog(TQWidget *parent, const TQString& errorMessage, bool showDebug); - virtual ~KJSErrorDialog(); - - bool debugSelected() const { return m_debugSelected; } - bool dontShowAgain() const { return m_dontShowAgainCb->isChecked(); } - - protected slots: - virtual void slotUser1(); - - private: - TQCheckBox *m_dontShowAgainCb; - bool m_debugSelected; - }; - - class EvalMultiLineEdit : public TQMultiLineEdit { - Q_OBJECT - public: - EvalMultiLineEdit(TQWidget *parent); - const TQString & code() const { return m_code; } - protected: - void keyPressEvent(TQKeyEvent * e); - private: - TQString m_code; - }; - - class SourceDisplay : public TQScrollView { - Q_OBJECT - public: - SourceDisplay(KJSDebugWin *debugWin, TQWidget *parent, const char *name = 0); - ~SourceDisplay(); - - void setSource(SourceFile *sourceFile); - void setCurrentLine(int lineno, bool doCenter = true); - - signals: - void lineDoubleClicked(int lineno); - - protected: - virtual void contentsMousePressEvent(TQMouseEvent *e); - virtual void showEvent(TQShowEvent *); - virtual void drawContents(TQPainter *p, int clipx, int clipy, int clipw, int cliph); - - TQString m_source; - int m_currentLine; - SourceFile *m_sourceFile; - TQStringList m_lines; - - KJSDebugWin *m_debugWin; - TQFont m_font; - TQPixmap m_breakpointIcon; - }; - - /** - * @internal - * - * KJSDebugWin represents the debugger window that is visible to the user. It contains - * a stack frame list, a code viewer and a source fragment selector, plus buttons - * to control execution including next, step and continue. - * - * There is only one debug window per program. This can be obtained by calling #instance - */ - class KJSDebugWin : public KMainWindow, public Debugger, public TDEInstance - { - Q_OBJECT - friend class SourceDisplay; - public: - KJSDebugWin(TQWidget *parent=0, const char *name=0); - virtual ~KJSDebugWin(); - - static KJSDebugWin *createInstance(); - static void destroyInstance(); - static KJSDebugWin *debugWindow() { return kjs_html_debugger; } - - enum Mode { Disabled = 0, // No break on any statements - Next = 1, // Will break on next statement in current context - Step = 2, // Will break on next statement in current or deeper context - Continue = 3, // Will continue until next breakpoint - Stop = 4 // The script will stop execution completely, - // as soon as possible - }; - - void setSourceLine(int sourceId, int lineno); - void setNextSourceInfo(TQString url, int baseLine); - void sourceChanged(Interpreter *interpreter, TQString url); - bool inSession() const { return !m_execStates.isEmpty(); } - void setMode(Mode m) { m_mode = m; } - void clearInterpreter(Interpreter *interpreter); - ExecState *getExecState() const { return m_execStates.top(); } - - // functions overridden from KJS:Debugger - bool sourceParsed(ExecState *exec, int sourceId, - const UString &source, int errorLine); - bool sourceUnused(ExecState * exec, int sourceId); - bool exception(ExecState *exec, const Value &value, bool inTryCatch); - bool atStatement(ExecState *exec); - bool enterContext(ExecState *exec); - bool exitContext(ExecState *exec, const Completion &completion); - - public slots: - void slotNext(); - void slotStep(); - void slotContinue(); - void slotStop(); - void slotBreakNext(); - void slotToggleBreakpoint(int lineno); - void slotShowFrame(int frameno); - void slotSourceSelected(int sourceSelIndex); - void slotEval(); - - protected: - - void closeEvent(TQCloseEvent *e); - bool eventFilter(TQObject *obj, TQEvent *evt); - void disableOtherWindows(); - void enableOtherWindows(); - - private: - - SourceFile *getSourceFile(Interpreter *interpreter, TQString url); - void setSourceFile(Interpreter *interpreter, TQString url, SourceFile *sourceFile); - void removeSourceFile(Interpreter *interpreter, TQString url); - - void checkBreak(ExecState *exec); - void enterSession(ExecState *exec); - void leaveSession(); - void displaySourceFile(SourceFile *sourceFile, bool forceRefresh); - void updateContextList(); - - TQString contextStr(const Context &ctx); - - struct Breakpoint { - int sourceId; - int lineno; - }; - Breakpoint *m_breakpoints; - int m_breakpointCount; - bool setBreakpoint(int sourceId, int lineno); - bool deleteBreakpoint(int sourceId, int lineno); - bool haveBreakpoint(SourceFile *sourceFile, int line0, int line1); - bool haveBreakpoint(int sourceId, int line0, int line1) const { - for (int i = 0; i < m_breakpointCount; i++) { - if (m_breakpoints[i].sourceId == sourceId && - m_breakpoints[i].lineno >= line0 && - m_breakpoints[i].lineno <= line1) - return true; - } - return false; - } - - SourceFile *m_curSourceFile; - Mode m_mode; - TQString m_nextSourceUrl; - int m_nextSourceBaseLine; - TQPtrStack<ExecState> m_execStates; - ExecState **m_execs; - int m_execsCount; - int m_execsAlloc; - int m_steppingDepth; - - TQMap<TQString,SourceFile*> m_sourceFiles; /* maps url->SourceFile */ - TQMap<int,SourceFragment*> m_sourceFragments; /* maps SourceId->SourceFragment */ - TQPtrList<SourceFile> m_sourceSelFiles; /* maps combobox index->SourceFile */ - - KActionCollection *m_actionCollection; - TQPixmap m_stopIcon; - TQPixmap m_emptyIcon; - SourceDisplay *m_sourceDisplay; - TQListBox *m_contextList; - - KAction *m_stepAction; - KAction *m_nextAction; - KAction *m_continueAction; - KAction *m_stopAction; - KAction *m_breakAction; - - TQComboBox *m_sourceSel; - EvalMultiLineEdit *m_evalEdit; - int m_evalDepth; - - static KJSDebugWin *kjs_html_debugger; - }; - -} // namespace - -#endif // KJS_DEBUGGER - -#endif // _KJS_DEBUGGER_H_ diff --git a/khtml/ecma/kjs_dom.cpp b/khtml/ecma/kjs_dom.cpp deleted file mode 100644 index cc2f3c78a..000000000 --- a/khtml/ecma/kjs_dom.cpp +++ /dev/null @@ -1,1849 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2000 Harri Porten (porten@kde.org) - * 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 <khtmlview.h> -#include "xml/dom2_eventsimpl.h" -#include "rendering/render_canvas.h" -#include "rendering/render_layer.h" -#include "xml/dom_nodeimpl.h" -#include "xml/dom_docimpl.h" -#include "misc/htmltags.h" // ID_* -#include "misc/htmlattrs.h" // ATTR_* -#include "html/html_baseimpl.h" -#include <kdebug.h> -#include <khtml_part.h> - -#include "kjs_dom.h" -#include "kjs_html.h" -#include "kjs_css.h" -#include "kjs_range.h" -#include "kjs_traversal.h" -#include "kjs_events.h" -#include "kjs_views.h" -#include "kjs_window.h" -#include "dom/dom_exception.h" -#include "kjs_dom.lut.h" -#include "khtmlpart_p.h" - -namespace KJS { - -// ------------------------------------------------------------------------- -/* Source for DOMNodeConstantsTable. -@begin DOMNodeConstantsTable 11 - ELEMENT_NODE DOM::Node::ELEMENT_NODE DontDelete|ReadOnly - ATTRIBUTE_NODE DOM::Node::ATTRIBUTE_NODE DontDelete|ReadOnly - TEXT_NODE DOM::Node::TEXT_NODE DontDelete|ReadOnly - CDATA_SECTION_NODE DOM::Node::CDATA_SECTION_NODE DontDelete|ReadOnly - ENTITY_REFERENCE_NODE DOM::Node::ENTITY_REFERENCE_NODE DontDelete|ReadOnly - ENTITY_NODE DOM::Node::ENTITY_NODE DontDelete|ReadOnly - PROCESSING_INSTRUCTION_NODE DOM::Node::PROCESSING_INSTRUCTION_NODE DontDelete|ReadOnly - COMMENT_NODE DOM::Node::COMMENT_NODE DontDelete|ReadOnly - DOCUMENT_NODE DOM::Node::DOCUMENT_NODE DontDelete|ReadOnly - DOCUMENT_TYPE_NODE DOM::Node::DOCUMENT_TYPE_NODE DontDelete|ReadOnly - DOCUMENT_FRAGMENT_NODE DOM::Node::DOCUMENT_FRAGMENT_NODE DontDelete|ReadOnly - NOTATION_NODE DOM::Node::NOTATION_NODE DontDelete|ReadOnly -@end -*/ -IMPLEMENT_CONSTANT_TABLE(DOMNodeConstants,"DOMNodeConstants") -// ------------------------------------------------------------------------- -/* Source for DOMNodeProtoTable. -@begin DOMNodeProtoTable 13 - insertBefore DOMNode::InsertBefore DontDelete|Function 2 - replaceChild DOMNode::ReplaceChild DontDelete|Function 2 - removeChild DOMNode::RemoveChild DontDelete|Function 1 - appendChild DOMNode::AppendChild DontDelete|Function 1 - hasAttributes DOMNode::HasAttributes DontDelete|Function 0 - hasChildNodes DOMNode::HasChildNodes DontDelete|Function 0 - cloneNode DOMNode::CloneNode DontDelete|Function 1 -# DOM2 - normalize DOMNode::Normalize DontDelete|Function 0 - isSupported DOMNode::IsSupported DontDelete|Function 2 -# from the EventTarget interface - addEventListener DOMNode::AddEventListener DontDelete|Function 3 - removeEventListener DOMNode::RemoveEventListener DontDelete|Function 3 - dispatchEvent DOMNode::DispatchEvent DontDelete|Function 1 -# IE extensions - contains DOMNode::Contains DontDelete|Function 1 - insertAdjacentHTML DOMNode::InsertAdjacentHTML DontDelete|Function 2 -# "DOM level 0" (from Gecko DOM reference; also in WinIE) - item DOMNode::Item DontDelete|Function 1 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(DOMNodeProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMNode", DOMNodeProto, DOMNodeProtoFunc) - -const ClassInfo DOMNode::info = { "Node", 0, &DOMNodeTable, 0 }; - -DOMNode::DOMNode(ExecState *exec, const DOM::Node& n) - : DOMObject(DOMNodeProto::self(exec)), node(n) -{ -} - -DOMNode::DOMNode(const Object& proto, const DOM::Node& n) - : DOMObject(proto), node(n) -{ -} - -DOMNode::~DOMNode() -{ - ScriptInterpreter::forgetDOMObject(node.handle()); -} - -bool DOMNode::toBoolean(ExecState *) const -{ - return !node.isNull(); -} - -/* Source for DOMNodeTable. -@begin DOMNodeTable 53 - nodeName DOMNode::NodeName DontDelete|ReadOnly - nodeValue DOMNode::NodeValue DontDelete - nodeType DOMNode::NodeType DontDelete|ReadOnly - parentNode DOMNode::ParentNode DontDelete|ReadOnly - parentElement DOMNode::ParentElement DontDelete|ReadOnly - childNodes DOMNode::ChildNodes DontDelete|ReadOnly - firstChild DOMNode::FirstChild DontDelete|ReadOnly - lastChild DOMNode::LastChild DontDelete|ReadOnly - previousSibling DOMNode::PreviousSibling DontDelete|ReadOnly - nextSibling DOMNode::NextSibling DontDelete|ReadOnly - attributes DOMNode::Attributes DontDelete|ReadOnly - namespaceURI DOMNode::NamespaceURI DontDelete|ReadOnly -# DOM2 - prefix DOMNode::Prefix DontDelete - localName DOMNode::LocalName DontDelete|ReadOnly - ownerDocument DOMNode::OwnerDocument DontDelete|ReadOnly -# DOM3 - textContent DOMNode::TextContent DontDelete -# Event handlers -# IE also has: onactivate, onbefore*, oncontextmenu, oncontrolselect, oncut, -# ondeactivate, ondrag*, ondrop, onfocusin, onfocusout, onhelp, onmousewheel, -# onmove*, onpaste, onpropertychange, onreadystatechange, onresizeend/start, -# onselectionchange, onstop - onabort DOMNode::OnAbort DontDelete - onblur DOMNode::OnBlur DontDelete - onchange DOMNode::OnChange DontDelete - onclick DOMNode::OnClick DontDelete - ondblclick DOMNode::OnDblClick DontDelete - ondragdrop DOMNode::OnDragDrop DontDelete - onerror DOMNode::OnError DontDelete - onfocus DOMNode::OnFocus DontDelete - onkeydown DOMNode::OnKeyDown DontDelete - onkeypress DOMNode::OnKeyPress DontDelete - onkeyup DOMNode::OnKeyUp DontDelete - onload DOMNode::OnLoad DontDelete - onmousedown DOMNode::OnMouseDown DontDelete - onmousemove DOMNode::OnMouseMove DontDelete - onmouseout DOMNode::OnMouseOut DontDelete - onmouseover DOMNode::OnMouseOver DontDelete - onmouseup DOMNode::OnMouseUp DontDelete - onmove DOMNode::OnMove DontDelete - onreset DOMNode::OnReset DontDelete - onresize DOMNode::OnResize DontDelete - onselect DOMNode::OnSelect DontDelete - onsubmit DOMNode::OnSubmit DontDelete - onunload DOMNode::OnUnload DontDelete -# IE extensions - offsetLeft DOMNode::OffsetLeft DontDelete|ReadOnly - offsetTop DOMNode::OffsetTop DontDelete|ReadOnly - offsetWidth DOMNode::OffsetWidth DontDelete|ReadOnly - offsetHeight DOMNode::OffsetHeight DontDelete|ReadOnly - offsetParent DOMNode::OffsetParent DontDelete|ReadOnly - clientWidth DOMNode::ClientWidth DontDelete|ReadOnly - clientHeight DOMNode::ClientHeight DontDelete|ReadOnly - scrollLeft DOMNode::ScrollLeft DontDelete - scrollTop DOMNode::ScrollTop DontDelete - scrollWidth DOMNode::ScrollWidth DontDelete|ReadOnly - scrollHeight DOMNode::ScrollHeight DontDelete|ReadOnly - sourceIndex DOMNode::SourceIndex DontDelete|ReadOnly -@end -*/ -Value DOMNode::tryGet(ExecState *exec, const Identifier &propertyName) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMNode::tryGet " << propertyName.qstring() << endl; -#endif - return DOMObjectLookupGetValue<DOMNode, DOMObject>(exec, propertyName, &DOMNodeTable, this); -} - -static khtml::RenderObject* handleBodyRootQuirk(const DOM::Node& node, khtml::RenderObject* rend, int token) -{ - //This emulates the quirks of various height/width properties on the viewport and root. Note that it - //is (mostly) IE-compatible in quirks, and mozilla-compatible in strict. - if (!rend) return 0; - - bool quirksMode = rend->style() && rend->style()->htmlHacks(); - - //There are a couple quirks here. One is that in quirks mode body is always forwarded to root... - //This is relevant for even the scrollTop/scrollLeft type properties. - if (quirksMode && node.handle()->id() == ID_BODY) { - while (rend->parent() && !rend->isRoot()) - rend = rend->parent(); - } - - //Also, some properties of the root are really done in terms of the viewport. - //These are {offset/client}{Height/Width}. The offset versions do it only in - //quirks mode, the client always. - if (!rend->isRoot()) return rend; //Don't care about non-root things here! - bool needViewport = false; - - switch (token) { - case DOMNode::OffsetHeight: - case DOMNode::OffsetWidth: - needViewport = quirksMode; - break; - case DOMNode::ClientHeight: - case DOMNode::ClientWidth: - needViewport = true; - break; - } - - if (needViewport) { - //Scan up to find the new target - while (rend->parent()) - rend = rend->parent(); - } - return rend; -} - -Value DOMNode::getValueProperty(ExecState *exec, int token) const -{ - switch (token) { - case NodeName: - return String(node.nodeName()); - case NodeValue: - return getString(node.nodeValue()); // initially null, per domts/level1/core/hc_documentcreateelement.html - case NodeType: - return Number((unsigned int)node.nodeType()); - case ParentNode: - return getDOMNode(exec,node.parentNode()); - case ParentElement: // IE only apparently - return getDOMNode(exec,node.parentNode()); - case ChildNodes: - return getDOMNodeList(exec,node.childNodes()); - case FirstChild: - return getDOMNode(exec,node.firstChild()); - case LastChild: - return getDOMNode(exec,node.lastChild()); - case PreviousSibling: - return getDOMNode(exec,node.previousSibling()); - case NextSibling: - return getDOMNode(exec,node.nextSibling()); - case Attributes: - return getDOMNamedNodeMap(exec,node.attributes()); - case NamespaceURI: - return getString(node.namespaceURI()); // Moz returns null if not set (dom/namespaces.html) - case Prefix: - return getString(node.prefix()); // Moz returns null if not set (dom/namespaces.html) - case TextContent: - return getString(node.textContent()); //DOM3 says return null, but I really should test mozilla.. - case LocalName: - return getString(node.localName()); // Moz returns null if not set (dom/namespaces.html) - case OwnerDocument: - return getDOMNode(exec,node.ownerDocument()); - case OnAbort: - return getListener(DOM::EventImpl::ABORT_EVENT); - case OnBlur: - return getListener(DOM::EventImpl::BLUR_EVENT); - case OnChange: - return getListener(DOM::EventImpl::CHANGE_EVENT); - case OnClick: - return getListener(DOM::EventImpl::KHTML_ECMA_CLICK_EVENT); - case OnDblClick: - return getListener(DOM::EventImpl::KHTML_ECMA_DBLCLICK_EVENT); - case OnDragDrop: - return getListener(DOM::EventImpl::KHTML_DRAGDROP_EVENT); - case OnError: - return getListener(DOM::EventImpl::ERROR_EVENT); - case OnFocus: - return getListener(DOM::EventImpl::FOCUS_EVENT); - case OnKeyDown: - return getListener(DOM::EventImpl::KEYDOWN_EVENT); - case OnKeyPress: - return getListener(DOM::EventImpl::KEYPRESS_EVENT); - case OnKeyUp: - return getListener(DOM::EventImpl::KEYUP_EVENT); - case OnLoad: - return getListener(DOM::EventImpl::LOAD_EVENT); - case OnMouseDown: - return getListener(DOM::EventImpl::MOUSEDOWN_EVENT); - case OnMouseMove: - return getListener(DOM::EventImpl::MOUSEMOVE_EVENT); - case OnMouseOut: - return getListener(DOM::EventImpl::MOUSEOUT_EVENT); - case OnMouseOver: - return getListener(DOM::EventImpl::MOUSEOVER_EVENT); - case OnMouseUp: - return getListener(DOM::EventImpl::MOUSEUP_EVENT); - case OnMove: - return getListener(DOM::EventImpl::KHTML_MOVE_EVENT); - case OnReset: - return getListener(DOM::EventImpl::RESET_EVENT); - case OnResize: - return getListener(DOM::EventImpl::RESIZE_EVENT); - case OnSelect: - return getListener(DOM::EventImpl::SELECT_EVENT); - case OnSubmit: - return getListener(DOM::EventImpl::SUBMIT_EVENT); - case OnUnload: - return getListener(DOM::EventImpl::UNLOAD_EVENT); - case SourceIndex: { - // Retrieves the ordinal position of the object, in source order, as the object - // appears in the document's all collection - // i.e. document.all[n.sourceIndex] == n - DOM::Document doc = node.ownerDocument(); - if (doc.isHTMLDocument()) { - DOM::HTMLCollection all = static_cast<DOM::HTMLDocument>(doc).all(); - unsigned long i = 0; - DOM::Node n = all.firstItem(); - for ( ; !n.isNull() && n != node; n = all.nextItem() ) - ++i; - Q_ASSERT( !n.isNull() ); // node not in document.all !? - return Number(i); - } - } - default: - // no DOM standard, found in IE only - - // Make sure our layout is up to date before we allow a query on these attributes. - DOM::DocumentImpl* docimpl = node.handle()->getDocument(); - if (docimpl) { - docimpl->updateLayout(); - } - - khtml::RenderObject *rend = node.handle()->renderer(); - - //In quirks mode, may need to forward if to body. - rend = handleBodyRootQuirk(node, rend, token); - - switch (token) { - case OffsetLeft: - return rend ? static_cast<Value>( Number( rend->offsetLeft() ) ) : Number(0); - case OffsetTop: - return rend ? static_cast<Value>( Number( rend->offsetTop() ) ) : Number(0); - case OffsetWidth: - return rend ? static_cast<Value>( Number( rend->offsetWidth() ) ) : Number(0); - case OffsetHeight: - return rend ? static_cast<Value>( Number( rend->offsetHeight() ) ) : Number(0); - case OffsetParent: - { - khtml::RenderObject* par = rend ? rend->offsetParent() : 0; - return getDOMNode( exec, par ? par->element() : 0 ); - } - case ClientWidth: - return rend ? static_cast<Value>( Number( rend->clientWidth() ) ) : Number(0); - case ClientHeight: - return rend ? static_cast<Value>( Number( rend->clientHeight() ) ) : Number(0); - case ScrollWidth: - return rend ? static_cast<Value>( Number(rend->scrollWidth()) ) : Number(0); - case ScrollHeight: - return rend ? static_cast<Value>( Number(rend->scrollHeight()) ) : Number(0); - case ScrollLeft: - if (rend && rend->layer()) { - if (rend->isRoot() && !rend->style()->hidesOverflow()) - return Number( node.ownerDocument().view() ? node.ownerDocument().view()->contentsX() : 0); - return Number( rend->layer()->scrollXOffset() ); - } - return Number( 0 ); - case ScrollTop: - if (rend && rend->layer()) { - if (rend->isRoot() && !rend->style()->hidesOverflow()) - return Number( node.ownerDocument().view() ? node.ownerDocument().view()->contentsY() : 0); - return Number( rend->layer()->scrollYOffset() ); - } - return Number( 0 ); - default: - kdDebug(6070) << "WARNING: Unhandled token in DOMNode::getValueProperty : " << token << endl; - break; - } - } - return Undefined(); -} - - -void DOMNode::tryPut(ExecState *exec, const Identifier& propertyName, const Value& value, int attr) -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMNode::tryPut " << propertyName.qstring() << endl; -#endif - DOMObjectLookupPut<DOMNode,DOMObject>(exec, propertyName, value, attr, - &DOMNodeTable, this ); -} - -void DOMNode::putValueProperty(ExecState *exec, int token, const Value& value, int /*attr*/) -{ - switch (token) { - case NodeValue: - node.setNodeValue(value.toString(exec).string()); - break; - case Prefix: - node.setPrefix(value.toString(exec).string()); - break; - case TextContent: - node.setTextContent(value.toString(exec).string()); - break; - case OnAbort: - setListener(exec,DOM::EventImpl::ABORT_EVENT,value); - break; - case OnBlur: - setListener(exec,DOM::EventImpl::BLUR_EVENT,value); - break; - case OnChange: - setListener(exec,DOM::EventImpl::CHANGE_EVENT,value); - break; - case OnClick: - setListener(exec,DOM::EventImpl::KHTML_ECMA_CLICK_EVENT,value); - break; - case OnDblClick: - setListener(exec,DOM::EventImpl::KHTML_ECMA_DBLCLICK_EVENT,value); - break; - case OnDragDrop: - setListener(exec,DOM::EventImpl::KHTML_DRAGDROP_EVENT,value); - break; - case OnError: - setListener(exec,DOM::EventImpl::ERROR_EVENT,value); - break; - case OnFocus: - setListener(exec,DOM::EventImpl::FOCUS_EVENT,value); - break; - case OnKeyDown: - setListener(exec,DOM::EventImpl::KEYDOWN_EVENT,value); - break; - case OnKeyPress: - setListener(exec,DOM::EventImpl::KEYPRESS_EVENT,value); - break; - case OnKeyUp: - setListener(exec,DOM::EventImpl::KEYUP_EVENT,value); - break; - case OnLoad: - setListener(exec,DOM::EventImpl::LOAD_EVENT,value); - break; - case OnMouseDown: - setListener(exec,DOM::EventImpl::MOUSEDOWN_EVENT,value); - break; - case OnMouseMove: - setListener(exec,DOM::EventImpl::MOUSEMOVE_EVENT,value); - break; - case OnMouseOut: - setListener(exec,DOM::EventImpl::MOUSEOUT_EVENT,value); - break; - case OnMouseOver: - setListener(exec,DOM::EventImpl::MOUSEOVER_EVENT,value); - break; - case OnMouseUp: - setListener(exec,DOM::EventImpl::MOUSEUP_EVENT,value); - break; - case OnMove: - setListener(exec,DOM::EventImpl::KHTML_MOVE_EVENT,value); - break; - case OnReset: - setListener(exec,DOM::EventImpl::RESET_EVENT,value); - break; - case OnResize: - setListener(exec,DOM::EventImpl::RESIZE_EVENT,value); - break; - case OnSelect: - setListener(exec,DOM::EventImpl::SELECT_EVENT,value); - break; - case OnSubmit: - setListener(exec,DOM::EventImpl::SUBMIT_EVENT,value); - break; - case OnUnload: - setListener(exec,DOM::EventImpl::UNLOAD_EVENT,value); - break; - default: - // Make sure our layout is up to date - DOM::DocumentImpl* docimpl = node.handle()->getDocument(); - if (docimpl) - docimpl->updateLayout(); - - khtml::RenderObject *rend = node.handle() ? node.handle()->renderer() : 0L; - - //In quirks mode, may need to forward. - rend = handleBodyRootQuirk(node, rend, token); - - switch (token) { - case ScrollLeft: - if (rend && rend->layer()) { - if (rend->style()->hidesOverflow()) - rend->layer()->scrollToXOffset(value.toInt32(exec)); - else if (rend->isRoot()) { - TQScrollView* sview = node.ownerDocument().view(); - if (sview) - sview->setContentsPos(value.toInt32(exec), sview->contentsY()); - } - } - break; - case ScrollTop: - if (rend && rend->layer()) { - if (rend->style()->hidesOverflow()) - rend->layer()->scrollToYOffset(value.toInt32(exec)); - else if (rend->isRoot()) { - TQScrollView* sview = node.ownerDocument().view(); - if (sview) - sview->setContentsPos(sview->contentsX(), value.toInt32(exec)); - } - } - break; - default: - kdDebug(6070) << "WARNING: DOMNode::putValueProperty unhandled token " << token << endl; - } - } -} - -Value DOMNode::toPrimitive(ExecState *exec, Type /*preferred*/) const -{ - if (node.isNull()) - return Null(); - - return String(toString(exec)); -} - -UString DOMNode::toString(ExecState *) const -{ - if (node.isNull()) - return "null"; - UString s; - - DOM::Element e = node; - if ( !e.isNull() ) { - s = static_cast<UString>(e.nodeName().string()); - } else - s = className(); // fallback - - return "[object " + s + "]"; -} - -void DOMNode::setListener(ExecState *exec, int eventId, const Value& func) const -{ - node.handle()->setHTMLEventListener(eventId,Window::retrieveActive(exec)->getJSEventListener(func,true)); -} - -Value DOMNode::getListener(int eventId) const -{ - DOM::EventListener *listener = node.handle()->getHTMLEventListener(eventId); - JSEventListener *jsListener = static_cast<JSEventListener*>(listener); - if ( jsListener && jsListener->listenerObjImp() ) - return jsListener->listenerObj(); - else - return Null(); -} - -void DOMNode::pushEventHandlerScope(ExecState *, ScopeChain &) const -{ -} - -Value DOMNodeProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( DOMNode, thisObj ); - DOM::Node node = static_cast<DOMNode *>( thisObj.imp() )->toNode(); - switch (id) { - case DOMNode::HasAttributes: - return Boolean(node.hasAttributes()); - case DOMNode::HasChildNodes: - return Boolean(node.hasChildNodes()); - case DOMNode::CloneNode: - return getDOMNode(exec,node.cloneNode(args[0].toBoolean(exec))); - case DOMNode::Normalize: - node.normalize(); - return Undefined(); - case DOMNode::IsSupported: - return Boolean(node.isSupported(args[0].toString(exec).string(),args[1].toString(exec).string())); - case DOMNode::AddEventListener: { - JSEventListener *listener = Window::retrieveActive(exec)->getJSEventListener(args[1]); - node.addEventListener(args[0].toString(exec).string(),listener,args[2].toBoolean(exec)); - return Undefined(); - } - case DOMNode::RemoveEventListener: { - JSEventListener *listener = Window::retrieveActive(exec)->getJSEventListener(args[1]); - node.removeEventListener(args[0].toString(exec).string(),listener,args[2].toBoolean(exec)); - return Undefined(); - } - case DOMNode::DispatchEvent: - return Boolean(node.dispatchEvent(toEvent(args[0]))); - case DOMNode::AppendChild: - return getDOMNode(exec,node.appendChild(toNode(args[0]))); - case DOMNode::RemoveChild: - return getDOMNode(exec,node.removeChild(toNode(args[0]))); - case DOMNode::InsertBefore: - return getDOMNode(exec,node.insertBefore(toNode(args[0]), toNode(args[1]))); - case DOMNode::ReplaceChild: - return getDOMNode(exec,node.replaceChild(toNode(args[0]), toNode(args[1]))); - case DOMNode::Contains: - { - DOM::Node other = toNode(args[0]); - if (!other.isNull() && node.nodeType()==DOM::Node::ELEMENT_NODE) - { - DOM::NodeBaseImpl *impl = static_cast<DOM::NodeBaseImpl *>(node.handle()); - bool retval = other.handle()->isAncestor(impl); - return Boolean(retval); - } - return Undefined(); - } - case DOMNode::InsertAdjacentHTML: - { - // see http://www.faqts.com/knowledge_base/view.phtml/aid/5756 - // and http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/insertAdjacentHTML.asp - Range range = node.ownerDocument().createRange(); - - range.setStartBefore(node); - - DocumentFragment docFrag = range.createContextualFragment(args[1].toString(exec).string()); - - DOMString where = args[0].toString(exec).string(); - - if (where == "beforeBegin" || where == "BeforeBegin") - node.parentNode().insertBefore(docFrag, node); - else if (where == "afterBegin" || where == "AfterBegin") - node.insertBefore(docFrag, node.firstChild()); - else if (where == "beforeEnd" || where == "BeforeEnd") - return getDOMNode(exec, node.appendChild(docFrag)); - else if (where == "afterEnd" || where == "AfterEnd") - if (!node.nextSibling().isNull()) - node.parentNode().insertBefore(docFrag, node.nextSibling()); - else - node.parentNode().appendChild(docFrag); - - return Undefined(); - } - case DOMNode::Item: - return getDOMNode(exec, node.childNodes().item(static_cast<unsigned long>(args[0].toNumber(exec)))); - } - - return Undefined(); -} - -// ------------------------------------------------------------------------- - -/* -@begin DOMNodeListProtoTable 2 - item DOMNodeList::Item DontDelete|Function 1 -# IE extension (IE treats DOMNodeList like an HTMLCollection) - namedItem DOMNodeList::NamedItem DontDelete|Function 1 -@end -*/ -KJS_DEFINE_PROTOTYPE(DOMNodeListProto) -IMPLEMENT_PROTOFUNC_DOM(DOMNodeListProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMNodeList", DOMNodeListProto, DOMNodeListProtoFunc) - - -const ClassInfo DOMNodeList::info = { "NodeList", 0, 0, 0 }; - -DOMNodeList::DOMNodeList(ExecState *exec, const DOM::NodeList& l) - : DOMObject(DOMNodeListProto::self(exec)), list(l) { } - -DOMNodeList::~DOMNodeList() -{ - ScriptInterpreter::forgetDOMObject(list.handle()); -} - -// We have to implement hasProperty since we don't use a hashtable for 'length' -// ## this breaks "for (..in..)" though. -bool DOMNodeList::hasProperty(ExecState *exec, const Identifier &p) const -{ - if (p == lengthPropertyName) - return true; - - if (ObjectImp::hasProperty(exec, p)) - return true; - - bool ok; - unsigned long pos = p.toULong(&ok); - if (ok && pos < list.length()) - return true; - - // ## missing: accept p if item id... - return false; -} - -Value DOMNodeList::tryGet(ExecState *exec, const Identifier &p) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMNodeList::tryGet " << p.ascii() << endl; -#endif - if (p == lengthPropertyName) - return Number(list.length()); - - // 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,p)) - return proto.get(exec,p); - - Value result; - - // array index ? - bool ok; - long unsigned int idx = p.toULong(&ok); - if (ok) - result = getDOMNode(exec,list.item(idx)); - else { - // Find by ID - DOM::HTMLElement e; - unsigned long l = list.length(); - bool found = false; - - for ( unsigned long i = 0; i < l; i++ ) - if ( ( e = list.item( i ) ).id() == p.string() ) { - result = getDOMNode(exec, list.item( i ) ); - found = true; - break; - } - - if ( !found ) - result = ObjectImp::get(exec, p); - } - - return result; -} - -ReferenceList DOMNodeList::propList(ExecState *exec, bool recursive) -{ - ReferenceList properties = ObjectImp::propList(exec,recursive); - - for (unsigned i = 0; i < list.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; -} - -// Need to support both get and call, so that list[0] and list(0) work. -Value DOMNodeList::call(ExecState *exec, Object &thisObj, const List &args) -{ - // This code duplication is necessary, DOMNodeList 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 DOMNodeList"); - exec->setException(err); - } - return val; -} - -Value DOMNodeList::tryCall(ExecState *exec, Object &, const List &args) -{ - // Do not use thisObj here. See HTMLCollection. - UString s = args[0].toString(exec); - - // index-based lookup? - bool ok; - unsigned int u = s.toULong(&ok); - if (ok) - return getDOMNode(exec,list.item(u)); - - // try lookup by name - // ### NodeList::namedItem() would be cool to have - // ### do we need to support the same two arg overload as in HTMLCollection? - Value result = tryGet(exec, Identifier(s)); - - if (result.isValid()) - return result; - - return Undefined(); -} - -// Not a prototype class currently, but should probably be converted to one -Value DOMNodeListProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMNodeList, thisObj ); - DOM::NodeList list = static_cast<DOMNodeList *>(thisObj.imp())->nodeList(); - switch (id) { - case KJS::DOMNodeList::Item: - return getDOMNode(exec, list.item(args[0].toInt32(exec))); - case KJS::DOMNodeList::NamedItem: - { - // Not a real namedItem implementation like the one HTMLCollection has. - // This is only an IE extension... - DOM::HTMLElement e; - unsigned long len = list.length(); - DOM::DOMString s = args[0].toString(exec).string(); - - for ( unsigned long i = 0; i < len; i++ ) - { - e = list.item( i ); - if ( !e.isNull() && ( - e.id() == s || static_cast<ElementImpl *>(e.handle())->getAttribute(ATTR_NAME) == s ) - ) - { - return getDOMNode(exec, e ); - } - } - return Null(); // see HTMLCollection::NamedItem implementation - } - default: - return Undefined(); - } -} - -// ------------------------------------------------------------------------- - -//### FIXME: link to the node prototype. -const ClassInfo DOMAttr::info = { "Attr", &DOMNode::info, &DOMAttrTable, 0 }; - -/* Source for DOMAttrTable. -@begin DOMAttrTable 5 - name DOMAttr::Name DontDelete|ReadOnly - specified DOMAttr::Specified DontDelete|ReadOnly - value DOMAttr::ValueProperty DontDelete - ownerElement DOMAttr::OwnerElement DontDelete|ReadOnly -@end -*/ -Value DOMAttr::tryGet(ExecState *exec, const Identifier &propertyName) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMAttr::tryGet " << propertyName.qstring() << endl; -#endif - return DOMObjectLookupGetValue<DOMAttr,DOMNode>(exec, propertyName, - &DOMAttrTable, this ); -} - -Value DOMAttr::getValueProperty(ExecState *exec, int token) const -{ - switch (token) { - case Name: - return String(static_cast<DOM::Attr>(node).name()); - case Specified: - return Boolean(static_cast<DOM::Attr>(node).specified()); - case ValueProperty: - return String(static_cast<DOM::Attr>(node).value()); - case OwnerElement: // DOM2 - return getDOMNode(exec,static_cast<DOM::Attr>(node).ownerElement()); - } - return Value(); // not reached -} - -void DOMAttr::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr) -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMAttr::tryPut " << propertyName.qstring() << endl; -#endif - DOMObjectLookupPut<DOMAttr,DOMNode>(exec, propertyName, value, attr, - &DOMAttrTable, this ); -} - -void DOMAttr::putValueProperty(ExecState *exec, int token, const Value& value, int /*attr*/) -{ - switch (token) { - case ValueProperty: - static_cast<DOM::Attr>(node).setValue(value.toString(exec).string()); - return; - default: - kdDebug(6070) << "WARNING: DOMAttr::putValueProperty unhandled token " << token << endl; - } -} - -// ------------------------------------------------------------------------- - -/* Source for DOMDocumentProtoTable. -@begin DOMDocumentProtoTable 23 - createElement DOMDocument::CreateElement DontDelete|Function 1 - createDocumentFragment DOMDocument::CreateDocumentFragment DontDelete|Function 1 - createTextNode DOMDocument::CreateTextNode DontDelete|Function 1 - createComment DOMDocument::CreateComment DontDelete|Function 1 - createCDATASection DOMDocument::CreateCDATASection DontDelete|Function 1 - createProcessingInstruction DOMDocument::CreateProcessingInstruction DontDelete|Function 1 - createAttribute DOMDocument::CreateAttribute DontDelete|Function 1 - createEntityReference DOMDocument::CreateEntityReference DontDelete|Function 1 - getElementsByTagName DOMDocument::GetElementsByTagName DontDelete|Function 1 - importNode DOMDocument::ImportNode DontDelete|Function 2 - createElementNS DOMDocument::CreateElementNS DontDelete|Function 2 - createAttributeNS DOMDocument::CreateAttributeNS DontDelete|Function 2 - getElementsByTagNameNS DOMDocument::GetElementsByTagNameNS DontDelete|Function 2 - getElementById DOMDocument::GetElementById DontDelete|Function 1 - createRange DOMDocument::CreateRange DontDelete|Function 0 - createNodeIterator DOMDocument::CreateNodeIterator DontDelete|Function 3 - createTreeWalker DOMDocument::CreateTreeWalker DontDelete|Function 4 - createEvent DOMDocument::CreateEvent DontDelete|Function 1 - getOverrideStyle DOMDocument::GetOverrideStyle DontDelete|Function 2 - abort DOMDocument::Abort DontDelete|Function 0 - load DOMDocument::Load DontDelete|Function 1 - loadXML DOMDocument::LoadXML DontDelete|Function 2 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(DOMDocumentProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMDocument", DOMDocumentProto, DOMDocumentProtoFunc) -IMPLEMENT_PSEUDO_CONSTRUCTOR(DocumentPseudoCtor, "Document", DOMDocumentProto) - -const ClassInfo DOMDocument::info = { "Document", &DOMNode::info, &DOMDocumentTable, 0 }; - -/* Source for DOMDocumentTable. -@begin DOMDocumentTable 4 - doctype DOMDocument::DocType DontDelete|ReadOnly - implementation DOMDocument::Implementation DontDelete|ReadOnly - characterSet DOMDocument::CharacterSet DontDelete|ReadOnly - documentElement DOMDocument::DocumentElement DontDelete|ReadOnly - styleSheets DOMDocument::StyleSheets DontDelete|ReadOnly - preferredStylesheetSet DOMDocument::PreferredStylesheetSet DontDelete|ReadOnly - selectedStylesheetSet DOMDocument::SelectedStylesheetSet DontDelete - readyState DOMDocument::ReadyState DontDelete|ReadOnly - defaultView DOMDocument::DefaultView DontDelete|ReadOnly - async DOMDocument::Async DontDelete -@end -*/ - -DOMDocument::DOMDocument(ExecState *exec, const DOM::Document& d) - : DOMNode(DOMDocumentProto::self(exec), d) { } - -DOMDocument::DOMDocument(const Object& proto, const DOM::Document& d) - : DOMNode(proto, d) { } - -DOMDocument::~DOMDocument() -{ - ScriptInterpreter::forgetDOMObject(node.handle()); -} - -Value DOMDocument::tryGet(ExecState *exec, const Identifier &propertyName) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMDocument::tryGet " << propertyName.qstring() << endl; -#endif - return DOMObjectLookupGetValue<DOMDocument, DOMNode>( - exec, propertyName, &DOMDocumentTable, this); -} - -Value DOMDocument::getValueProperty(ExecState *exec, int token) const -{ - DOM::Document doc = static_cast<DOM::Document>(node); - - switch(token) { - case DocType: - return getDOMNode(exec,doc.doctype()); - case Implementation: - return getDOMDOMImplementation(exec,doc.implementation()); - case DocumentElement: - return getDOMNode(exec,doc.documentElement()); - case CharacterSet: { - DOM::DocumentImpl* docImpl = static_cast<DOM::DocumentImpl*>(doc.handle()); - if (docImpl->part()) - return String(docImpl->part()->encoding()); - else - return Undefined(); - } - case StyleSheets: - //kdDebug() << "DOMDocument::StyleSheets, returning " << doc.styleSheets().length() << " stylesheets" << endl; - return getDOMStyleSheetList(exec, doc.styleSheets(), doc); - case DOMDocument::DefaultView: // DOM2 - { - KHTMLView *view = node.handle()->getDocument()->view(); - if (view) - return Window::retrieve(view->part()); - return getDOMAbstractView(exec, doc.defaultView()); - } - case PreferredStylesheetSet: - return String(doc.preferredStylesheetSet()); - case SelectedStylesheetSet: - return String(doc.selectedStylesheetSet()); - case ReadyState: - { - DOM::DocumentImpl* docimpl = node.handle()->getDocument(); - if ( docimpl && docimpl->view() ) - { - KHTMLPart* part = docimpl->view()->part(); - if ( part ) { - if (part->d->m_bComplete) return String("complete"); - if (docimpl->parsing()) return String("loading"); - return String("loaded"); - // What does the interactive value mean ? - // Missing support for "uninitialized" - } - } - return Undefined(); - } - case Async: - return Boolean(doc.async()); - default: - kdDebug(6070) << "WARNING: DOMDocument::getValueProperty unhandled token " << token << endl; - return Value(); - } -} - -void DOMDocument::tryPut(ExecState *exec, const Identifier& propertyName, const Value& value, int attr) -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMDocument::tryPut " << propertyName.qstring() << endl; -#endif - DOMObjectLookupPut<DOMDocument,DOMNode>(exec, propertyName, value, attr, &DOMDocumentTable, this ); -} - -void DOMDocument::putValueProperty(ExecState *exec, int token, const Value& value, int /*attr*/) -{ - DOM::Document doc = static_cast<DOM::Document>(node); - switch (token) { - case SelectedStylesheetSet: { - doc.setSelectedStylesheetSet(value.toString(exec).string()); - break; - } - case Async: { - doc.setAsync(value.toBoolean(exec)); - break; - } - } -} - -Value DOMDocumentProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMDocument, thisObj ); - DOM::Node node = static_cast<DOMNode *>( thisObj.imp() )->toNode(); - DOM::Document doc = static_cast<DOM::Document>(node); - String str = args[0].toString(exec); - DOM::DOMString s = str.value().string(); - - switch(id) { - case DOMDocument::CreateElement: - return getDOMNode(exec,doc.createElement(s)); - case DOMDocument::CreateDocumentFragment: - return getDOMNode(exec,doc.createDocumentFragment()); - case DOMDocument::CreateTextNode: - return getDOMNode(exec,doc.createTextNode(s)); - case DOMDocument::CreateComment: - return getDOMNode(exec,doc.createComment(s)); - case DOMDocument::CreateCDATASection: - return getDOMNode(exec,doc.createCDATASection(s)); /* TODO: okay ? */ - case DOMDocument::CreateProcessingInstruction: - return getDOMNode(exec,doc.createProcessingInstruction(args[0].toString(exec).string(), - args[1].toString(exec).string())); - case DOMDocument::CreateAttribute: - return getDOMNode(exec,doc.createAttribute(s)); - case DOMDocument::CreateEntityReference: - return getDOMNode(exec,doc.createEntityReference(args[0].toString(exec).string())); - case DOMDocument::GetElementsByTagName: - return getDOMNodeList(exec,doc.getElementsByTagName(s)); - case DOMDocument::ImportNode: // DOM2 - return getDOMNode(exec,doc.importNode(toNode(args[0]), args[1].toBoolean(exec))); - case DOMDocument::CreateElementNS: // DOM2 - return getDOMNode(exec,doc.createElementNS(args[0].toString(exec).string(), args[1].toString(exec).string())); - case DOMDocument::CreateAttributeNS: // DOM2 - return getDOMNode(exec,doc.createAttributeNS(args[0].toString(exec).string(),args[1].toString(exec).string())); - case DOMDocument::GetElementsByTagNameNS: // DOM2 - return getDOMNodeList(exec,doc.getElementsByTagNameNS(args[0].toString(exec).string(), - args[1].toString(exec).string())); - case DOMDocument::GetElementById: -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMDocument::GetElementById looking for " << args[0].toString(exec).string() << endl; -#endif - return getDOMNode(exec,doc.getElementById(args[0].toString(exec).string())); - case DOMDocument::CreateRange: - return getDOMRange(exec,doc.createRange()); - case DOMDocument::CreateNodeIterator: - if (args[2].isA(NullType)) { - DOM::NodeFilter filter; - return getDOMNodeIterator(exec, - doc.createNodeIterator(toNode(args[0]), - (long unsigned int)(args[1].toNumber(exec)), - filter,args[3].toBoolean(exec))); - } - else { - Object obj = Object::dynamicCast(args[2]); - if (obj.isValid()) - { - DOM::CustomNodeFilter *customFilter = new JSNodeFilter(obj); - DOM::NodeFilter filter = DOM::NodeFilter::createCustom(customFilter); - return getDOMNodeIterator(exec, - doc.createNodeIterator( - toNode(args[0]),(long unsigned int)(args[1].toNumber(exec)), - filter,args[3].toBoolean(exec))); - }// else? - } - case DOMDocument::CreateTreeWalker: - return getDOMTreeWalker(exec,doc.createTreeWalker(toNode(args[0]),(long unsigned int)(args[1].toNumber(exec)), - toNodeFilter(args[2]),args[3].toBoolean(exec))); - case DOMDocument::CreateEvent: - return getDOMEvent(exec,doc.createEvent(s)); - case DOMDocument::GetOverrideStyle: { - DOM::Node arg0 = toNode(args[0]); - if (arg0.nodeType() != DOM::Node::ELEMENT_NODE) - return Undefined(); // throw exception? - else - return getDOMCSSStyleDeclaration(exec,doc.getOverrideStyle(static_cast<DOM::Element>(arg0),args[1].toString(exec).string())); - } - case DOMDocument::Abort: - doc.abort(); - break; - case DOMDocument::Load: { - Window* active = Window::retrieveActive(exec); - // Complete the URL using the "active part" (running interpreter). We do this for the security - // check and to make sure we load exactly the same url as we have verified to be safe - KHTMLPart *khtmlpart = ::tqqt_cast<KHTMLPart *>(active->part()); - if (khtmlpart) { - // Security: only allow documents to be loaded from the same host - TQString dstUrl = khtmlpart->htmlDocument().completeURL(s).string(); - KParts::ReadOnlyPart *part = static_cast<KJS::ScriptInterpreter*>(exec->interpreter())->part(); - if (part->url().host() == KURL(dstUrl).host()) { - kdDebug(6070) << "JavaScript: access granted for document.load() of " << dstUrl << endl; - doc.load(dstUrl); - } - else { - kdDebug(6070) << "JavaScript: access denied for document.load() of " << dstUrl << endl; - } - } - break; - } - case DOMDocument::LoadXML: - doc.loadXML(s); - break; - default: - break; - } - - return Undefined(); -} - -// ------------------------------------------------------------------------- - -/* Source for DOMElementProtoTable. -@begin DOMElementProtoTable 17 - getAttribute DOMElement::GetAttribute DontDelete|Function 1 - setAttribute DOMElement::SetAttribute DontDelete|Function 2 - removeAttribute DOMElement::RemoveAttribute DontDelete|Function 1 - getAttributeNode DOMElement::GetAttributeNode DontDelete|Function 1 - setAttributeNode DOMElement::SetAttributeNode DontDelete|Function 2 - removeAttributeNode DOMElement::RemoveAttributeNode DontDelete|Function 1 - getElementsByTagName DOMElement::GetElementsByTagName DontDelete|Function 1 - hasAttribute DOMElement::HasAttribute DontDelete|Function 1 - getAttributeNS DOMElement::GetAttributeNS DontDelete|Function 2 - setAttributeNS DOMElement::SetAttributeNS DontDelete|Function 3 - removeAttributeNS DOMElement::RemoveAttributeNS DontDelete|Function 2 - getAttributeNodeNS DOMElement::GetAttributeNodeNS DontDelete|Function 2 - setAttributeNodeNS DOMElement::SetAttributeNodeNS DontDelete|Function 1 - getElementsByTagNameNS DOMElement::GetElementsByTagNameNS DontDelete|Function 2 - hasAttributeNS DOMElement::HasAttributeNS DontDelete|Function 2 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(DOMElementProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMElement", DOMElementProto, DOMElementProtoFunc) - -IMPLEMENT_PSEUDO_CONSTRUCTOR(ElementPseudoCtor, "Element", DOMElementProto) - -const ClassInfo DOMElement::info = { "Element", &DOMNode::info, &DOMElementTable, 0 }; -/* Source for DOMElementTable. -@begin DOMElementTable 3 - tagName DOMElement::TagName DontDelete|ReadOnly - style DOMElement::Style DontDelete|ReadOnly -@end -*/ -DOMElement::DOMElement(ExecState *exec, const DOM::Element& e) - : DOMNode(DOMElementProto::self(exec), e) { } - -DOMElement::DOMElement(const Object& proto, const DOM::Element& e) - : DOMNode(proto, e) { } - -Value DOMElement::tryGet(ExecState *exec, const Identifier &propertyName) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMElement::tryGet " << propertyName.qstring() << endl; -#endif - DOM::Element element = static_cast<DOM::Element>(node); - - const HashEntry* entry = Lookup::findEntry(&DOMElementTable, propertyName); - if (entry) - { - switch( entry->value ) { - case TagName: - return String(element.tagName()); - case Style: - return getDOMCSSStyleDeclaration(exec,element.style()); - default: - kdDebug(6070) << "WARNING: Unhandled token in DOMElement::tryGet : " << entry->value << endl; - break; - } - } - // We have to check in DOMNode before giving access to attributes, otherwise - // onload="..." would make onload return the string (attribute value) instead of - // the listener object (function). - if (DOMNode::hasProperty(exec, propertyName)) - return DOMNode::tryGet(exec, propertyName); - - DOM::DOMString attr = element.getAttribute( propertyName.string() ); - // Give access to attributes - if ( !attr.isNull() ) - return String( attr ); - - return Undefined(); -} - -Value DOMElementProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMNode, thisObj ); // node should be enough here, given the cast - DOM::Node node = static_cast<DOMNode *>( thisObj.imp() )->toNode(); - DOM::Element element = static_cast<DOM::Element>(node); - - switch(id) { - case DOMElement::GetAttribute: - /** In theory, we should not return null here, as per DOM. In practice, that - breaks websites - */ - return getString(element.getAttribute(args[0].toString(exec).string())); - case DOMElement::SetAttribute: - element.setAttribute(args[0].toString(exec).string(),args[1].toString(exec).string()); - return Undefined(); - case DOMElement::RemoveAttribute: - element.removeAttribute(args[0].toString(exec).string()); - return Undefined(); - case DOMElement::GetAttributeNode: - return getDOMNode(exec,element.getAttributeNode(args[0].toString(exec).string())); - case DOMElement::SetAttributeNode: - return getDOMNode(exec,element.setAttributeNode(KJS::toNode(args[0]))); - case DOMElement::RemoveAttributeNode: - return getDOMNode(exec,element.removeAttributeNode(KJS::toNode(args[0]))); - case DOMElement::GetElementsByTagName: - return getDOMNodeList(exec,element.getElementsByTagName(args[0].toString(exec).string())); - case DOMElement::HasAttribute: // DOM2 - return Boolean(element.hasAttribute(args[0].toString(exec).string())); - case DOMElement::GetAttributeNS: // DOM2 - return String(element.getAttributeNS(args[0].toString(exec).string(),args[1].toString(exec).string())); - case DOMElement::SetAttributeNS: // DOM2 - element.setAttributeNS(args[0].toString(exec).string(),args[1].toString(exec).string(),args[2].toString(exec).string()); - return Undefined(); - case DOMElement::RemoveAttributeNS: // DOM2 - element.removeAttributeNS(args[0].toString(exec).string(),args[1].toString(exec).string()); - return Undefined(); - case DOMElement::GetAttributeNodeNS: // DOM2 - return getDOMNode(exec,element.getAttributeNodeNS(args[0].toString(exec).string(),args[1].toString(exec).string())); - case DOMElement::SetAttributeNodeNS: // DOM2 - return getDOMNode(exec,element.setAttributeNodeNS(KJS::toNode(args[0]))); - case DOMElement::GetElementsByTagNameNS: // DOM2 - return getDOMNodeList(exec,element.getElementsByTagNameNS(args[0].toString(exec).string(),args[1].toString(exec).string())); - case DOMElement::HasAttributeNS: // DOM2 - return Boolean(element.hasAttributeNS(args[0].toString(exec).string(),args[1].toString(exec).string())); - default: - return Undefined(); - } -} - -// ------------------------------------------------------------------------- - -/* Source for DOMDOMImplementationProtoTable. -@begin DOMDOMImplementationProtoTable 5 - hasFeature DOMDOMImplementation::HasFeature DontDelete|Function 2 - createCSSStyleSheet DOMDOMImplementation::CreateCSSStyleSheet DontDelete|Function 2 -# DOM2 - createDocumentType DOMDOMImplementation::CreateDocumentType DontDelete|Function 3 - createDocument DOMDOMImplementation::CreateDocument DontDelete|Function 3 - createHTMLDocument DOMDOMImplementation::CreateHTMLDocument DontDelete|Function 1 -@end -*/ -KJS_DEFINE_PROTOTYPE(DOMDOMImplementationProto) -IMPLEMENT_PROTOFUNC_DOM(DOMDOMImplementationProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMImplementation", DOMDOMImplementationProto, DOMDOMImplementationProtoFunc) - -const ClassInfo DOMDOMImplementation::info = { "DOMImplementation", 0, 0, 0 }; - -DOMDOMImplementation::DOMDOMImplementation(ExecState *exec, const DOM::DOMImplementation& i) - : DOMObject(DOMDOMImplementationProto::self(exec)), implementation(i) { } - -DOMDOMImplementation::~DOMDOMImplementation() -{ - ScriptInterpreter::forgetDOMObject(implementation.handle()); -} - -Value DOMDOMImplementationProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMDOMImplementation, thisObj ); - DOM::DOMImplementation implementation = static_cast<DOMDOMImplementation *>( thisObj.imp() )->toImplementation(); - - switch(id) { - case DOMDOMImplementation::HasFeature: - return Boolean(implementation.hasFeature(args[0].toString(exec).string(),args[1].toString(exec).string())); - case DOMDOMImplementation::CreateDocumentType: // DOM2 - return getDOMNode(exec,implementation.createDocumentType(args[0].toString(exec).string(),args[1].toString(exec).string(),args[2].toString(exec).string())); - case DOMDOMImplementation::CreateDocument: { // DOM2 - // Initially set the URL to document of the creator... this is so that it resides in the same - // host/domain for security checks. The URL will be updated if Document.load() is called. - KHTMLPart *part = ::tqqt_cast<KHTMLPart*>(static_cast<KJS::ScriptInterpreter*>(exec->interpreter())->part()); - if (part) { - Document doc = implementation.createDocument(args[0].toString(exec).string(),args[1].toString(exec).string(),toNode(args[2])); - KURL url = static_cast<DocumentImpl*>(part->document().handle())->URL(); - static_cast<DocumentImpl*>(doc.handle())->setURL(url.url()); - return getDOMNode(exec,doc); - } - break; - } - case DOMDOMImplementation::CreateCSSStyleSheet: // DOM2 - return getDOMStyleSheet(exec,implementation.createCSSStyleSheet(args[0].toString(exec).string(),args[1].toString(exec).string())); - case DOMDOMImplementation::CreateHTMLDocument: // DOM2-HTML - return getDOMNode(exec, implementation.createHTMLDocument(args[0].toString(exec).string())); - default: - break; - } - return Undefined(); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMDocumentType::info = { "DocumentType", &DOMNode::info, &DOMDocumentTypeTable, 0 }; - -/* Source for DOMDocumentTypeTable. -@begin DOMDocumentTypeTable 6 - name DOMDocumentType::Name DontDelete|ReadOnly - entities DOMDocumentType::Entities DontDelete|ReadOnly - notations DOMDocumentType::Notations DontDelete|ReadOnly -# DOM2 - publicId DOMDocumentType::PublicId DontDelete|ReadOnly - systemId DOMDocumentType::SystemId DontDelete|ReadOnly - internalSubset DOMDocumentType::InternalSubset DontDelete|ReadOnly -@end -*/ -DOMDocumentType::DOMDocumentType(ExecState *exec, const DOM::DocumentType& dt) - : DOMNode( /*### no proto yet*/exec, dt ) { } - -Value DOMDocumentType::tryGet(ExecState *exec, const Identifier &propertyName) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMDocumentType::tryGet " << propertyName.qstring() << endl; -#endif - return DOMObjectLookupGetValue<DOMDocumentType, DOMNode>(exec, propertyName, &DOMDocumentTypeTable, this); -} - -Value DOMDocumentType::getValueProperty(ExecState *exec, int token) const -{ - DOM::DocumentType type = static_cast<DOM::DocumentType>(node); - switch (token) { - case Name: - return String(type.name()); - case Entities: - return getDOMNamedNodeMap(exec,type.entities()); - case Notations: - return getDOMNamedNodeMap(exec,type.notations()); - case PublicId: // DOM2 - return String(type.publicId()); - case SystemId: // DOM2 - return String(type.systemId()); - case InternalSubset: // DOM2 - return getString(type.internalSubset()); // can be null, see domts/level2/core/internalSubset01.html - default: - kdDebug(6070) << "WARNING: DOMDocumentType::getValueProperty unhandled token " << token << endl; - return Value(); - } -} - -// ------------------------------------------------------------------------- - -/* Source for DOMNamedNodeMapProtoTable. -@begin DOMNamedNodeMapProtoTable 7 - getNamedItem DOMNamedNodeMap::GetNamedItem DontDelete|Function 1 - setNamedItem DOMNamedNodeMap::SetNamedItem DontDelete|Function 1 - removeNamedItem DOMNamedNodeMap::RemoveNamedItem DontDelete|Function 1 - item DOMNamedNodeMap::Item DontDelete|Function 1 -# DOM2 - getNamedItemNS DOMNamedNodeMap::GetNamedItemNS DontDelete|Function 2 - setNamedItemNS DOMNamedNodeMap::SetNamedItemNS DontDelete|Function 1 - removeNamedItemNS DOMNamedNodeMap::RemoveNamedItemNS DontDelete|Function 2 -@end -@begin DOMNamedNodeMapTable 7 - length DOMNamedNodeMap::Length DontDelete|Function 1 -@end -*/ -KJS_DEFINE_PROTOTYPE(DOMNamedNodeMapProto) -IMPLEMENT_PROTOFUNC_DOM(DOMNamedNodeMapProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("NamedNodeMap", DOMNamedNodeMapProto, DOMNamedNodeMapProtoFunc) - -const ClassInfo DOMNamedNodeMap::info = { "NamedNodeMap", 0, &DOMNamedNodeMapTable, 0 }; - -DOMNamedNodeMap::DOMNamedNodeMap(ExecState *exec, const DOM::NamedNodeMap& m) - : DOMObject(DOMNamedNodeMapProto::self(exec)), map(m) { } - -DOMNamedNodeMap::~DOMNamedNodeMap() -{ - ScriptInterpreter::forgetDOMObject(map.handle()); -} - -bool DOMNamedNodeMap::hasProperty(ExecState *exec, const Identifier &p) const -{ - // ## missing? array index - return DOMObject::hasProperty(exec, p); -} - -Value DOMNamedNodeMap::tryGet(ExecState* exec, const Identifier &p) const -{ - if (p == lengthPropertyName) - return Number(map.length()); - - // array index ? - bool ok; - long unsigned int idx = p.toULong(&ok); - if (ok) - return getDOMNode(exec,map.item(idx)); - - // Anything else (including functions, defined in the prototype) - return DOMObject::tryGet(exec, p); -} - -Value DOMNamedNodeMapProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMNamedNodeMap, thisObj ); - DOM::NamedNodeMap map = static_cast<DOMNamedNodeMap *>(thisObj.imp())->toMap(); - - switch(id) { - case DOMNamedNodeMap::GetNamedItem: - return getDOMNode(exec, map.getNamedItem(args[0].toString(exec).string())); - case DOMNamedNodeMap::SetNamedItem: - return getDOMNode(exec, map.setNamedItem(KJS::toNode(args[0]))); - case DOMNamedNodeMap::RemoveNamedItem: - return getDOMNode(exec, map.removeNamedItem(args[0].toString(exec).string())); - case DOMNamedNodeMap::Item: - return getDOMNode(exec, map.item(args[0].toInt32(exec))); - case DOMNamedNodeMap::GetNamedItemNS: // DOM2 - return getDOMNode(exec, map.getNamedItemNS(args[0].toString(exec).string(),args[1].toString(exec).string())); - case DOMNamedNodeMap::SetNamedItemNS: // DOM2 - return getDOMNode(exec, map.setNamedItemNS(toNode(args[0]))); - case DOMNamedNodeMap::RemoveNamedItemNS: // DOM2 - return getDOMNode(exec, map.removeNamedItemNS(args[0].toString(exec).string(),args[1].toString(exec).string())); - default: - break; - } - - return Undefined(); -} - -// ------------------------------------------------------------------------- -//### FIXME: proto -const ClassInfo DOMProcessingInstruction::info = { "ProcessingInstruction", &DOMNode::info, &DOMProcessingInstructionTable, 0 }; - -/* Source for DOMProcessingInstructionTable. -@begin DOMProcessingInstructionTable 3 - target DOMProcessingInstruction::Target DontDelete|ReadOnly - data DOMProcessingInstruction::Data DontDelete - sheet DOMProcessingInstruction::Sheet DontDelete|ReadOnly -@end -*/ -Value DOMProcessingInstruction::tryGet(ExecState *exec, const Identifier &propertyName) const -{ - return DOMObjectLookupGetValue<DOMProcessingInstruction, DOMNode>(exec, propertyName, &DOMProcessingInstructionTable, this); -} - -Value DOMProcessingInstruction::getValueProperty(ExecState *exec, int token) const -{ - switch (token) { - case Target: - return String(static_cast<DOM::ProcessingInstruction>(node).target()); - case Data: - return String(static_cast<DOM::ProcessingInstruction>(node).data()); - case Sheet: - return getDOMStyleSheet(exec,static_cast<DOM::ProcessingInstruction>(node).sheet()); - default: - kdDebug(6070) << "WARNING: DOMProcessingInstruction::getValueProperty unhandled token " << token << endl; - return Value(); - } -} - -void DOMProcessingInstruction::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr) -{ - // Not worth using the hashtable for this one ;) - if (propertyName == "data") - static_cast<DOM::ProcessingInstruction>(node).setData(value.toString(exec).string()); - else - DOMNode::tryPut(exec, propertyName,value,attr); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMNotation::info = { "Notation", &DOMNode::info, &DOMNotationTable, 0 }; - -/* Source for DOMNotationTable. -@begin DOMNotationTable 2 - publicId DOMNotation::PublicId DontDelete|ReadOnly - systemId DOMNotation::SystemId DontDelete|ReadOnly -@end -*/ -Value DOMNotation::tryGet(ExecState *exec, const Identifier &propertyName) const -{ - return DOMObjectLookupGetValue<DOMNotation, DOMNode>(exec, propertyName, &DOMNotationTable, this); -} - -Value DOMNotation::getValueProperty(ExecState *, int token) const -{ - switch (token) { - case PublicId: - return String(static_cast<DOM::Notation>(node).publicId()); - case SystemId: - return String(static_cast<DOM::Notation>(node).systemId()); - default: - kdDebug(6070) << "WARNING: DOMNotation::getValueProperty unhandled token " << token << endl; - return Value(); - } -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMEntity::info = { "Entity", &DOMNode::info, 0, 0 }; - -/* Source for DOMEntityTable. -@begin DOMEntityTable 2 - publicId DOMEntity::PublicId DontDelete|ReadOnly - systemId DOMEntity::SystemId DontDelete|ReadOnly - notationName DOMEntity::NotationName DontDelete|ReadOnly -@end -*/ -Value DOMEntity::tryGet(ExecState *exec, const Identifier &propertyName) const -{ - return DOMObjectLookupGetValue<DOMEntity, DOMNode>(exec, propertyName, &DOMEntityTable, this); -} - -Value DOMEntity::getValueProperty(ExecState *, int token) const -{ - switch (token) { - case PublicId: - return String(static_cast<DOM::Entity>(node).publicId()); - case SystemId: - return String(static_cast<DOM::Entity>(node).systemId()); - case NotationName: - return String(static_cast<DOM::Entity>(node).notationName()); - default: - kdDebug(6070) << "WARNING: DOMEntity::getValueProperty unhandled token " << token << endl; - return Value(); - } -} - -// ------------------------------------------------------------------------- - -bool checkNodeSecurity(ExecState *exec, const DOM::Node& n) -{ - // Check to see if the currently executing interpreter is allowed to access the specified node - if (n.isNull()) - return true; - KHTMLView *view = n.handle()->getDocument()->view(); - Window* win = view && view->part() ? Window::retrieveWindow(view->part()) : 0L; - if ( !win || !win->isSafeScript(exec) ) - return false; - return true; -} - -Value getDOMNode(ExecState *exec, const DOM::Node& n) -{ - DOMObject *ret = 0; - if (n.isNull()) - return Null(); - ScriptInterpreter* interp = static_cast<ScriptInterpreter *>(exec->interpreter()); - if ((ret = interp->getDOMObject(n.handle()))) - return Value(ret); - - switch (n.nodeType()) { - case DOM::Node::ELEMENT_NODE: - if (static_cast<DOM::Element>(n).isHTMLElement()) - ret = new HTMLElement(exec, static_cast<DOM::HTMLElement>(n)); - else - ret = new DOMElement(exec, static_cast<DOM::Element>(n)); - break; - case DOM::Node::ATTRIBUTE_NODE: - ret = new DOMAttr(exec, static_cast<DOM::Attr>(n)); - break; - case DOM::Node::TEXT_NODE: - case DOM::Node::CDATA_SECTION_NODE: - ret = new DOMText(exec, static_cast<DOM::Text>(n)); - break; - case DOM::Node::ENTITY_REFERENCE_NODE: - ret = new DOMNode(exec, n); - break; - case DOM::Node::ENTITY_NODE: - ret = new DOMEntity(exec, static_cast<DOM::Entity>(n)); - break; - case DOM::Node::PROCESSING_INSTRUCTION_NODE: - ret = new DOMProcessingInstruction(exec, static_cast<DOM::ProcessingInstruction>(n)); - break; - case DOM::Node::COMMENT_NODE: - ret = new DOMCharacterData(exec, static_cast<DOM::CharacterData>(n)); - break; - case DOM::Node::DOCUMENT_NODE: - if (static_cast<DOM::Document>(n).isHTMLDocument()) - ret = new HTMLDocument(exec, static_cast<DOM::HTMLDocument>(n)); - else - ret = new DOMDocument(exec, static_cast<DOM::Document>(n)); - break; - case DOM::Node::DOCUMENT_TYPE_NODE: - ret = new DOMDocumentType(exec, static_cast<DOM::DocumentType>(n)); - break; - case DOM::Node::DOCUMENT_FRAGMENT_NODE: - ret = new DOMNode(exec, n); - break; - case DOM::Node::NOTATION_NODE: - ret = new DOMNotation(exec, static_cast<DOM::Notation>(n)); - break; - default: - ret = new DOMNode(exec, n); - } - interp->putDOMObject(n.handle(),ret); - - return Value(ret); -} - -Value getDOMNamedNodeMap(ExecState *exec, const DOM::NamedNodeMap& m) -{ - return Value(cacheDOMObject<DOM::NamedNodeMap, KJS::DOMNamedNodeMap>(exec, m)); -} - -Value getDOMNodeList(ExecState *exec, const DOM::NodeList& l) -{ - return Value(cacheDOMObject<DOM::NodeList, KJS::DOMNodeList>(exec, l)); -} - -Value getDOMDOMImplementation(ExecState *exec, const DOM::DOMImplementation& i) -{ - return Value(cacheDOMObject<DOM::DOMImplementation, KJS::DOMDOMImplementation>(exec, i)); -} - -// ------------------------------------------------------------------------- -IMPLEMENT_PSEUDO_CONSTRUCTOR_WITH_PARENT(NodeConstructor, "NodeConstructor", DOMNodeProto, DOMNodeConstants) -// ------------------------------------------------------------------------- - -const ClassInfo DOMExceptionConstructor::info = { "DOMExceptionConstructor", 0, 0, 0 }; - -/* Source for DOMExceptionConstructorTable. -@begin DOMExceptionConstructorTable 15 - INDEX_SIZE_ERR DOM::DOMException::INDEX_SIZE_ERR DontDelete|ReadOnly - DOMSTRING_SIZE_ERR DOM::DOMException::DOMSTRING_SIZE_ERR DontDelete|ReadOnly - HIERARCHY_REQUEST_ERR DOM::DOMException::HIERARCHY_REQUEST_ERR DontDelete|ReadOnly - WRONG_DOCUMENT_ERR DOM::DOMException::WRONG_DOCUMENT_ERR DontDelete|ReadOnly - INVALID_CHARACTER_ERR DOM::DOMException::INVALID_CHARACTER_ERR DontDelete|ReadOnly - NO_DATA_ALLOWED_ERR DOM::DOMException::NO_DATA_ALLOWED_ERR DontDelete|ReadOnly - NO_MODIFICATION_ALLOWED_ERR DOM::DOMException::NO_MODIFICATION_ALLOWED_ERR DontDelete|ReadOnly - NOT_FOUND_ERR DOM::DOMException::NOT_FOUND_ERR DontDelete|ReadOnly - NOT_SUPPORTED_ERR DOM::DOMException::NOT_SUPPORTED_ERR DontDelete|ReadOnly - INUSE_ATTRIBUTE_ERR DOM::DOMException::INUSE_ATTRIBUTE_ERR DontDelete|ReadOnly - INVALID_STATE_ERR DOM::DOMException::INVALID_STATE_ERR DontDelete|ReadOnly - SYNTAX_ERR DOM::DOMException::SYNTAX_ERR DontDelete|ReadOnly - INVALID_MODIFICATION_ERR DOM::DOMException::INVALID_MODIFICATION_ERR DontDelete|ReadOnly - NAMESPACE_ERR DOM::DOMException::NAMESPACE_ERR DontDelete|ReadOnly - INVALID_ACCESS_ERR DOM::DOMException::INVALID_ACCESS_ERR DontDelete|ReadOnly -@end -*/ - -DOMExceptionConstructor::DOMExceptionConstructor(ExecState* exec) - : DOMObject(exec->interpreter()->builtinObjectPrototype()) -{ -} - -Value DOMExceptionConstructor::tryGet(ExecState *exec, const Identifier &propertyName) const -{ - return DOMObjectLookupGetValue<DOMExceptionConstructor, DOMObject>(exec, propertyName, &DOMExceptionConstructorTable, this); -} - -Value DOMExceptionConstructor::getValueProperty(ExecState *, int token) const -{ - // We use the token as the value to return directly - return Number((unsigned int)token); -#if 0 - switch (token) { - case INDEX_SIZE_ERR: - return Number((unsigned int)DOM::DOMException::INDEX_SIZE_ERR); - case DOMSTRING_SIZE_ERR: - return Number((unsigned int)DOM::DOMException::DOMSTRING_SIZE_ERR); - case HIERARCHY_REQUEST_ERR: - return Number((unsigned int)DOM::DOMException::HIERARCHY_REQUEST_ERR); - case WRONG_DOCUMENT_ERR: - return Number((unsigned int)DOM::DOMException::WRONG_DOCUMENT_ERR); - case INVALID_CHARACTER_ERR: - return Number((unsigned int)DOM::DOMException::INVALID_CHARACTER_ERR); - case NO_DATA_ALLOWED_ERR: - return Number((unsigned int)DOM::DOMException::NO_DATA_ALLOWED_ERR); - case NO_MODIFICATION_ALLOWED_ERR: - return Number((unsigned int)DOM::DOMException::NO_MODIFICATION_ALLOWED_ERR); - case NOT_FOUND_ERR: - return Number((unsigned int)DOM::DOMException::NOT_FOUND_ERR); - case NOT_SUPPORTED_ERR: - return Number((unsigned int)DOM::DOMException::NOT_SUPPORTED_ERR); - case INUSE_ATTRIBUTE_ERR: - return Number((unsigned int)DOM::DOMException::INUSE_ATTRIBUTE_ERR); - case INVALID_STATE_ERR: - return Number((unsigned int)DOM::DOMException::INVALID_STATE_ERR); - case SYNTAX_ERR: - return Number((unsigned int)DOM::DOMException::SYNTAX_ERR); - case INVALID_MODIFICATION_ERR: - return Number((unsigned int)DOM::DOMException::INVALID_MODIFICATION_ERR); - case NAMESPACE_ERR: - return Number((unsigned int)DOM::DOMException::NAMESPACE_ERR); - case INVALID_ACCESS_ERR: - return Number((unsigned int)DOM::DOMException::INVALID_ACCESS_ERR); - default: - kdDebug(6070) << "WARNING: DOMExceptionConstructor::getValueProperty unhandled token " << token << endl; - return Value(); - } -#endif -} - -Object getDOMExceptionConstructor(ExecState *exec) -{ - return cacheGlobalObject<DOMExceptionConstructor>(exec, "[[DOMException.constructor]]"); -} - -// ------------------------------------------------------------------------- - -/* Source for DOMNamedNodesCollection. -@begin DOMNamedNodesCollectionTable 1 - length KJS::DOMNamedNodesCollection::Length DontDelete|ReadOnly -@end -*/ -const ClassInfo KJS::DOMNamedNodesCollection::info = { "DOMNamedNodesCollection", 0, &DOMNamedNodesCollectionTable, 0 }; - -// Such a collection is usually very short-lived, it only exists -// for constructs like document.forms.<name>[1], -// so it shouldn't be a problem that it's storing all the nodes (with the same name). (David) -DOMNamedNodesCollection::DOMNamedNodesCollection(ExecState *exec, const TQValueList<DOM::Node>& nodes ) - : DOMObject(exec->interpreter()->builtinObjectPrototype()), - m_nodes(nodes) -{ - // Maybe we should ref (and deref in the dtor) the nodes, though ? -} - -Value DOMNamedNodesCollection::tryGet(ExecState *exec, const Identifier &propertyName) const -{ - kdDebug(6070) << k_funcinfo << propertyName.ascii() << endl; - if (propertyName == lengthPropertyName) - return Number(m_nodes.count()); - // index? - bool ok; - unsigned int u = propertyName.toULong(&ok); - if (ok && u < m_nodes.count()) { - DOM::Node node = m_nodes[u]; - return getDOMNode(exec,node); - } - return DOMObject::tryGet(exec,propertyName); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMCharacterData::info = { "CharacterImp", - &DOMNode::info, &DOMCharacterDataTable, 0 }; -/* -@begin DOMCharacterDataTable 2 - data DOMCharacterData::Data DontDelete - length DOMCharacterData::Length DontDelete|ReadOnly -@end -@begin DOMCharacterDataProtoTable 7 - substringData DOMCharacterData::SubstringData DontDelete|Function 2 - appendData DOMCharacterData::AppendData DontDelete|Function 1 - insertData DOMCharacterData::InsertData DontDelete|Function 2 - deleteData DOMCharacterData::DeleteData DontDelete|Function 2 - replaceData DOMCharacterData::ReplaceData DontDelete|Function 2 -@end -*/ -KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(DOMCharacterDataProto, DOMNodeProto) -IMPLEMENT_PROTOFUNC_DOM(DOMCharacterDataProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMCharacterData", DOMCharacterDataProto, DOMCharacterDataProtoFunc) - -DOMCharacterData::DOMCharacterData(ExecState *exec, const DOM::CharacterData& d) - : DOMNode(DOMCharacterDataProto::self(exec), d) {} - -DOMCharacterData::DOMCharacterData(const Object& proto, const DOM::CharacterData& d) - : DOMNode(proto, d) {} - -Value DOMCharacterData::tryGet(ExecState *exec, const Identifier &p) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070)<<"DOMCharacterData::tryGet "<<p.string().string()<<endl; -#endif - return DOMObjectLookupGetValue<DOMCharacterData,DOMNode>(exec,p,&DOMCharacterDataTable,this); -} - -Value DOMCharacterData::getValueProperty(ExecState *, int token) const -{ - DOM::CharacterData data = static_cast<DOM::CharacterData>(node); - switch (token) { - case Data: - return String(data.data()); - case Length: - return Number(data.length()); - default: - kdDebug(6070) << "WARNING: Unhandled token in DOMCharacterData::getValueProperty : " << token << endl; - return Value(); - } -} - -void DOMCharacterData::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr) -{ - if (propertyName == "data") - static_cast<DOM::CharacterData>(node).setData(value.toString(exec).string()); - else - DOMNode::tryPut(exec, propertyName,value,attr); -} - -Value DOMCharacterDataProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMCharacterData, thisObj ); - DOM::CharacterData data = static_cast<DOMCharacterData *>(thisObj.imp())->toData(); - switch(id) { - case DOMCharacterData::SubstringData: - return String(data.substringData(args[0].toInteger(exec),args[1].toInteger(exec))); - case DOMCharacterData::AppendData: - data.appendData(args[0].toString(exec).string()); - return Undefined(); - break; - case DOMCharacterData::InsertData: - data.insertData(args[0].toInteger(exec),args[1].toString(exec).string()); - return Undefined(); - break; - case DOMCharacterData::DeleteData: - data.deleteData(args[0].toInteger(exec),args[1].toInteger(exec)); - return Undefined(); - break; - case DOMCharacterData::ReplaceData: - data.replaceData(args[0].toInteger(exec),args[1].toInteger(exec),args[2].toString(exec).string()); - return Undefined(); - default: - break; - } - return Undefined(); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMText::info = { "Text", - &DOMCharacterData::info, 0, 0 }; -/* -@begin DOMTextProtoTable 1 - splitText DOMText::SplitText DontDelete|Function 1 -@end -*/ -KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(DOMTextProto, DOMCharacterDataProto) -IMPLEMENT_PROTOFUNC_DOM(DOMTextProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMText", DOMTextProto, DOMTextProtoFunc) - -DOMText::DOMText(ExecState *exec, const DOM::Text& t) - : DOMCharacterData(DOMTextProto::self(exec), t) { } - -Value DOMText::tryGet(ExecState *exec, const Identifier &p) const -{ - if (p.isEmpty()) - return Undefined(); // ### TODO - else - return DOMCharacterData::tryGet(exec, p); -} - -Value DOMTextProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMText, thisObj ); - DOM::Text text = static_cast<DOMText *>(thisObj.imp())->toText(); - switch(id) { - case DOMText::SplitText: - return getDOMNode(exec,text.splitText(args[0].toInteger(exec))); - default: - break; - } - return Undefined(); -} - -} diff --git a/khtml/ecma/kjs_dom.h b/khtml/ecma/kjs_dom.h deleted file mode 100644 index b17488592..000000000 --- a/khtml/ecma/kjs_dom.h +++ /dev/null @@ -1,299 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2000 Harri Porten (porten@kde.org) - * 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 - */ - -#ifndef _KJS_DOM_H_ -#define _KJS_DOM_H_ - -#include "dom/dom_node.h" -#include "dom/dom_doc.h" -#include "dom/dom_element.h" -#include "dom/dom_xml.h" - -#include "ecma/kjs_binding.h" - - -namespace KJS { - - class DOMNode : public DOMObject { - public: - // Build a DOMNode - DOMNode(ExecState *exec, const DOM::Node& n); - // Constructor for inherited classes - DOMNode(const Object& proto, const DOM::Node& n); - ~DOMNode(); - virtual bool toBoolean(ExecState *) const; - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - - virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None); - void putValueProperty(ExecState *exec, int token, const Value& value, int attr); - virtual DOM::Node toNode() const { return node; } - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - - virtual Value toPrimitive(ExecState *exec, Type preferred = UndefinedType) const; - virtual UString toString(ExecState *exec) const; - void setListener(ExecState *exec, int eventId, const Value& func) const; - Value getListener(int eventId) const; - virtual void pushEventHandlerScope(ExecState *exec, ScopeChain &scope) const; - - enum { NodeName, NodeValue, NodeType, ParentNode, ParentElement, - ChildNodes, FirstChild, LastChild, PreviousSibling, NextSibling, Item, - Attributes, NamespaceURI, Prefix, LocalName, OwnerDocument, InsertBefore, - ReplaceChild, RemoveChild, AppendChild, HasAttributes, HasChildNodes, - CloneNode, Normalize, IsSupported, AddEventListener, RemoveEventListener, - DispatchEvent, Contains, InsertAdjacentHTML, - OnAbort, OnBlur, OnChange, OnClick, OnDblClick, OnDragDrop, OnError, - OnFocus, OnKeyDown, OnKeyPress, OnKeyUp, OnLoad, OnMouseDown, - OnMouseMove, OnMouseOut, OnMouseOver, OnMouseUp, OnMove, OnReset, - OnResize, OnSelect, OnSubmit, OnUnload, - OffsetLeft, OffsetTop, OffsetWidth, OffsetHeight, OffsetParent, - ClientWidth, ClientHeight, ScrollLeft, ScrollTop, - ScrollWidth, ScrollHeight, SourceIndex, TextContent }; - - protected: - DOM::Node node; - }; - - DEFINE_CONSTANT_TABLE(DOMNodeConstants) - KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(DOMNodeProto, DOMNodeConstants) - DEFINE_PSEUDO_CONSTRUCTOR(NodeConstructor) - - class DOMNodeList : public DOMObject { - public: - DOMNodeList(ExecState *, const DOM::NodeList& l); - ~DOMNodeList(); - virtual bool hasProperty(ExecState *exec, const Identifier &p) const; - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - virtual Value call(ExecState *exec, Object &thisObj, const List&args); - virtual Value tryCall(ExecState *exec, Object &thisObj, const List&args); - virtual bool implementsCall() const { return true; } - virtual ReferenceList propList(ExecState *exec, bool recursive); - - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - virtual bool toBoolean(ExecState *) const { return true; } - static const ClassInfo info; - DOM::NodeList nodeList() const { return list; } - enum { Item, NamedItem }; - private: - DOM::NodeList list; - }; - - class DOMDocument : public DOMNode { - public: - // Build a DOMDocument - DOMDocument(ExecState *exec, const DOM::Document& d); - // Constructor for inherited classes - DOMDocument(const Object& proto, const DOM::Document& d); - virtual ~DOMDocument(); - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None); - void putValueProperty(ExecState *exec, int token, const Value& value, int attr); - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { DocType, Implementation, DocumentElement, CharacterSet, - // Functions - CreateElement, CreateDocumentFragment, CreateTextNode, CreateComment, - CreateCDATASection, CreateProcessingInstruction, CreateAttribute, - CreateEntityReference, GetElementsByTagName, ImportNode, CreateElementNS, - CreateAttributeNS, GetElementsByTagNameNS, GetElementById, - CreateRange, CreateNodeIterator, CreateTreeWalker, DefaultView, - CreateEvent, StyleSheets, GetOverrideStyle, Abort, Load, LoadXML, - PreferredStylesheetSet, SelectedStylesheetSet, ReadyState, Async }; - }; - - KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(DOMDocumentProto, DOMNodeProto) - - DEFINE_PSEUDO_CONSTRUCTOR(DocumentPseudoCtor) - - class DOMAttr : public DOMNode { - public: - DOMAttr(ExecState *exec, const DOM::Attr& a) : DOMNode(exec, a) { } - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None); - Value getValueProperty(ExecState *exec, int token) const; - void putValueProperty(ExecState *exec, int token, const Value& value, int attr); - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Name, Specified, ValueProperty, OwnerElement }; - }; - - class DOMElement : public DOMNode { - public: - // Build a DOMElement - DOMElement(ExecState *exec, const DOM::Element& e); - // Constructor for inherited classes - DOMElement(const Object& proto, const DOM::Element& e); - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { TagName, Style, - GetAttribute, SetAttribute, RemoveAttribute, GetAttributeNode, - SetAttributeNode, RemoveAttributeNode, GetElementsByTagName, - GetAttributeNS, SetAttributeNS, RemoveAttributeNS, GetAttributeNodeNS, - SetAttributeNodeNS, GetElementsByTagNameNS, HasAttribute, HasAttributeNS }; - }; - - KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(DOMElementProto, DOMNodeProto) - DEFINE_PSEUDO_CONSTRUCTOR(ElementPseudoCtor) - - class DOMDOMImplementation : public DOMObject { - public: - // Build a DOMDOMImplementation - DOMDOMImplementation(ExecState *, const DOM::DOMImplementation& i); - ~DOMDOMImplementation(); - // no put - all functions - virtual const ClassInfo* classInfo() const { return &info; } - virtual bool toBoolean(ExecState *) const { return true; } - static const ClassInfo info; - enum { HasFeature, CreateDocumentType, CreateDocument, CreateCSSStyleSheet, CreateHTMLDocument }; - DOM::DOMImplementation toImplementation() const { return implementation; } - private: - DOM::DOMImplementation implementation; - }; - - class DOMDocumentType : public DOMNode { - public: - // Build a DOMDocumentType - DOMDocumentType(ExecState *exec, const DOM::DocumentType& dt); - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Name, Entities, Notations, PublicId, SystemId, InternalSubset }; - }; - - class DOMNamedNodeMap : public DOMObject { - public: - DOMNamedNodeMap(ExecState *, const DOM::NamedNodeMap& m); - ~DOMNamedNodeMap(); - virtual bool hasProperty(ExecState *exec, const Identifier &p) const; - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - virtual bool toBoolean(ExecState *) const { return true; } - static const ClassInfo info; - enum { GetNamedItem, SetNamedItem, RemoveNamedItem, Item, Length, - GetNamedItemNS, SetNamedItemNS, RemoveNamedItemNS }; - DOM::NamedNodeMap toMap() const { return map; } - private: - DOM::NamedNodeMap map; - }; - - class DOMProcessingInstruction : public DOMNode { - public: - DOMProcessingInstruction(ExecState *exec, const DOM::ProcessingInstruction& pi) : DOMNode(exec, pi) { } - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None); - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Target, Data, Sheet }; - }; - - class DOMNotation : public DOMNode { - public: - DOMNotation(ExecState *exec, const DOM::Notation& n) : DOMNode(exec, n) { } - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { PublicId, SystemId }; - }; - - class DOMEntity : public DOMNode { - public: - DOMEntity(ExecState *exec, const DOM::Entity& e) : DOMNode(exec, e) { } - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { PublicId, SystemId, NotationName }; - }; - - // Constructor for DOMException - constructor stuff not implemented yet - class DOMExceptionConstructor : public DOMObject { - public: - DOMExceptionConstructor(ExecState *); - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - }; - - bool checkNodeSecurity(ExecState *exec, const DOM::Node& n); - KDE_EXPORT Value getDOMNode(ExecState *exec, const DOM::Node& n); - Value getDOMNamedNodeMap(ExecState *exec, const DOM::NamedNodeMap& m); - Value getDOMNodeList(ExecState *exec, const DOM::NodeList& l); - Value getDOMDOMImplementation(ExecState *exec, const DOM::DOMImplementation& i); - Object getDOMExceptionConstructor(ExecState *exec); - - // Internal class, used for the collection return by e.g. document.forms.myinput - // when multiple nodes have the same name. - class DOMNamedNodesCollection : public DOMObject { - public: - DOMNamedNodesCollection(ExecState *exec, const TQValueList<DOM::Node>& nodes ); - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - const TQValueList<DOM::Node>& nodes() const { return m_nodes; } - enum { Length }; - private: - TQValueList<DOM::Node> m_nodes; - }; - - class DOMCharacterData : public DOMNode { - public: - // Build a DOMCharacterData - DOMCharacterData(ExecState *exec, const DOM::CharacterData& d); - // Constructor for inherited classes - DOMCharacterData(const Object& proto, const DOM::CharacterData& d); - virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const; - Value getValueProperty(ExecState *, int token) const; - virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None); - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - DOM::CharacterData toData() const { return static_cast<DOM::CharacterData>(node); } - enum { Data, Length, - SubstringData, AppendData, InsertData, DeleteData, ReplaceData }; - }; - - class DOMText : public DOMCharacterData { - public: - DOMText(ExecState *exec, const DOM::Text& t); - virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const; - Value getValueProperty(ExecState *, int token) const; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - DOM::Text toText() const { return static_cast<DOM::Text>(node); } - enum { SplitText }; - }; - -} // namespace - -#endif diff --git a/khtml/ecma/kjs_events.cpp b/khtml/ecma/kjs_events.cpp deleted file mode 100644 index a0daf19c8..000000000 --- a/khtml/ecma/kjs_events.cpp +++ /dev/null @@ -1,993 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * 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 "kjs_window.h" -#include "kjs_events.h" -#include "kjs_events.lut.h" -#include "kjs_views.h" -#include "kjs_proxy.h" -#include "xml/dom_nodeimpl.h" -#include "xml/dom_docimpl.h" -#include "xml/dom2_eventsimpl.h" -#include "rendering/render_object.h" -#include "rendering/render_canvas.h" -#include "xml/dom2_eventsimpl.h" -#include "khtml_part.h" - -#include <kdebug.h> - -using namespace DOM; - -namespace KJS { - -// ------------------------------------------------------------------------- - -JSEventListener::JSEventListener(Object _listener, ObjectImp *_compareListenerImp, const Object &_win, bool _html) - : listener( _listener ), compareListenerImp( _compareListenerImp ), html( _html ), win( _win ) -{ - //fprintf(stderr,"JSEventListener::JSEventListener this=%p listener=%p\n",this,listener.imp()); - if (compareListenerImp) { - static_cast<Window*>(win.imp())->jsEventListeners.insert(compareListenerImp, this); - } -} - -JSEventListener::~JSEventListener() -{ - if (compareListenerImp) { - static_cast<Window*>(win.imp())->jsEventListeners.remove(compareListenerImp); - } - //fprintf(stderr,"JSEventListener::~JSEventListener this=%p listener=%p\n",this,listener.imp()); -} - -void JSEventListener::handleEvent(DOM::Event &evt) -{ -#ifdef KJS_DEBUGGER - if (KJSDebugWin::debugWindow() && KJSDebugWin::debugWindow()->inSession()) - return; -#endif - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(static_cast<Window*>(win.imp())->part()); - KJSProxy *proxy = 0L; - if (part) - proxy = part->jScript(); - - if (proxy && listener.isValid() && listener.implementsCall()) { - ref(); - - KJS::ScriptInterpreter *interpreter = static_cast<KJS::ScriptInterpreter *>(proxy->interpreter()); - ExecState *exec = interpreter->globalExec(); - - List args; - args.append(getDOMEvent(exec,evt)); - - // Set "this" to the event's current target - Object thisObj = Object::dynamicCast(getDOMNode(exec,evt.currentTarget())); - if ( !thisObj.isValid() ) { - // Window events (window.onload/window.onresize etc.) must have 'this' set to the window. - // DocumentImpl::defaultEventHandler sets currentTarget to 0 to mean 'window'. - thisObj = win; - } - - Window *window = static_cast<Window*>(win.imp()); - // Set the event we're handling in the Window object - window->setCurrentEvent( &evt ); - // ... and in the interpreter - interpreter->setCurrentEvent( &evt ); - - KJSCPUGuard guard; - guard.start(); - Value retval = listener.call(exec, thisObj, args); - guard.stop(); - - window->setCurrentEvent( 0 ); - interpreter->setCurrentEvent( 0 ); - if ( exec->hadException() ) - exec->clearException(); - else if (html) - { - TQVariant ret = ValueToVariant(exec, retval); - if (ret.type() == TQVariant::Bool && ret.toBool() == false) - evt.preventDefault(); - } - window->afterScriptExecution(); - deref(); - } -} - -DOM::DOMString JSEventListener::eventListenerType() -{ - if (html) - return "_khtml_HTMLEventListener"; - else - return "_khtml_JSEventListener"; -} - -Object JSEventListener::listenerObj() const -{ - return listener; -} - -JSLazyEventListener::JSLazyEventListener(const TQString &_code, const TQString &_name, const Object &_win, DOM::NodeImpl* _originalNode) - : JSEventListener(Object(), 0, _win, true), - code(_code), name(_name), - parsed(false) -{ - // We don't retain the original node, because we assume it - // will stay alive as long as this handler object is around - // and we need to avoid a reference cycle. If JS transfers - // this handler to another node, parseCode will be called and - // then originalNode is no longer needed. - - originalNode = _originalNode; -} - -JSLazyEventListener::~JSLazyEventListener() -{ - if (listener.isValid()) { - static_cast<Window*>(win.imp())->jsEventListeners.remove(listener.imp()); - } -} - -void JSLazyEventListener::handleEvent(DOM::Event &evt) -{ - parseCode(); - if (listener.isValid()) { - JSEventListener::handleEvent(evt); - } -} - - -Object JSLazyEventListener::listenerObj() const -{ - parseCode(); - return listener; -} - -void JSLazyEventListener::parseCode() const -{ - if (!parsed) { - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(static_cast<Window*>(win.imp())->part()); - KJSProxy *proxy = 0L; - if (part) - proxy = part->jScript(); - - if (proxy) { - KJS::ScriptInterpreter *interpreter = static_cast<KJS::ScriptInterpreter *>(proxy->interpreter()); - ExecState *exec = interpreter->globalExec(); - - //KJS::Constructor constr(KJS::Global::current().get("Function").imp()); - KJS::Object constr = interpreter->builtinFunction(); - KJS::List args; - - static KJS::String eventString("event"); - - args.append(eventString); - args.append(KJS::String(code)); - listener = constr.construct(exec, args); // ### is globalExec ok ? - - if (exec->hadException()) { - exec->clearException(); - - // failed to parse, so let's just make this listener a no-op - listener = Object(); - } else if (!listener.inherits(&DeclaredFunctionImp::info)) { - listener = Object();// Error creating function - } else { - DeclaredFunctionImp *declFunc = static_cast<DeclaredFunctionImp*>(listener.imp()); - declFunc->setName(Identifier(static_cast<UString>(name))); - - if (originalNode) - { - // Add the event's home element to the scope - // (and the document, and the form - see KJS::HTMLElement::eventHandlerScope) - ScopeChain scope = listener.scope(); - - Object thisObj = Object::dynamicCast(getDOMNode(exec, originalNode)); - - if (thisObj.isValid()) { - static_cast<DOMNode*>(thisObj.imp())->pushEventHandlerScope(exec, scope); - - listener.setScope(scope); - } - } - } - } - - // no more need to keep the unparsed code around - code = TQString(); - - if (listener.isValid()) { - static_cast<Window*>(win.imp())->jsEventListeners.insert(listener.imp(), - (KJS::JSEventListener *)(this)); - } - - parsed = true; - } -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMEvent::info = { "Event", 0, &DOMEventTable, 0 }; -/* -@begin DOMEventTable 7 - type DOMEvent::Type DontDelete|ReadOnly - target DOMEvent::Target DontDelete|ReadOnly - currentTarget DOMEvent::CurrentTarget DontDelete|ReadOnly - srcElement DOMEvent::SrcElement DontDelete|ReadOnly - eventPhase DOMEvent::EventPhase DontDelete|ReadOnly - bubbles DOMEvent::Bubbles DontDelete|ReadOnly - cancelable DOMEvent::Cancelable DontDelete|ReadOnly - timeStamp DOMEvent::TimeStamp DontDelete|ReadOnly - returnValue DOMEvent::ReturnValue DontDelete - cancelBubble DOMEvent::CancelBubble DontDelete -@end -@begin DOMEventProtoTable 3 - stopPropagation DOMEvent::StopPropagation DontDelete|Function 0 - preventDefault DOMEvent::PreventDefault DontDelete|Function 0 - initEvent DOMEvent::InitEvent DontDelete|Function 3 -@end -*/ -KJS_DEFINE_PROTOTYPE(DOMEventProto) -IMPLEMENT_PROTOFUNC_DOM(DOMEventProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMEvent", DOMEventProto, DOMEventProtoFunc) - -DOMEvent::DOMEvent(ExecState *exec, DOM::Event e) - : DOMObject(DOMEventProto::self(exec)), event(e) { } - -DOMEvent::DOMEvent(const Object &proto, DOM::Event e) - : DOMObject(proto), event(e) { } - -DOMEvent::~DOMEvent() -{ - ScriptInterpreter::forgetDOMObject(event.handle()); -} - -Value DOMEvent::tryGet(ExecState *exec, const Identifier &p) const -{ -#ifdef KJS_VERBOSE - kdDebug() << "KJS::DOMEvent::tryGet " << p.qstring() << endl; -#endif - return DOMObjectLookupGetValue<DOMEvent,DOMObject>(exec, p, &DOMEventTable, this ); -} - -Value DOMEvent::getValueProperty(ExecState *exec, int token) const -{ - switch (token) { - case Type: - return String(event.type()); - case Target: - case SrcElement: /*MSIE extension - "the object that fired the event"*/ - return getDOMNode(exec,event.target()); - case CurrentTarget: - return getDOMNode(exec,event.currentTarget()); - case EventPhase: - return Number((unsigned int)event.eventPhase()); - case Bubbles: - return Boolean(event.bubbles()); - case Cancelable: - return Boolean(event.cancelable()); - case TimeStamp: - return Number((long unsigned int)event.timeStamp()); // ### long long ? - case ReturnValue: // MSIE extension - // return false == cancel, so this returns the -opposite- of defaultPrevented - return Boolean(!event.handle()->defaultPrevented()); - case CancelBubble: // MSIE extension - return Boolean(event.handle()->propagationStopped()); - default: - kdDebug(6070) << "WARNING: Unhandled token in DOMEvent::getValueProperty : " << token << endl; - return Value(); - } -} - -Value DOMEvent::defaultValue(ExecState *exec, KJS::Type hint) const -{ - if (event.handle()->id() == EventImpl::ERROR_EVENT && !event.handle()->message().isNull()) { - return String(event.handle()->message()); - } - else - return DOMObject::defaultValue(exec,hint); -} - -void DOMEvent::tryPut(ExecState *exec, const Identifier &propertyName, - const Value& value, int attr) -{ - DOMObjectLookupPut<DOMEvent, DOMObject>(exec, propertyName, value, attr, - &DOMEventTable, this); -} - -void DOMEvent::putValueProperty(ExecState *exec, int token, const Value& value, int) -{ - switch (token) { - case ReturnValue: // MSIE equivalent for "preventDefault" (but with a way to reset it) - // returnValue=false means "default action of the event on the source object is canceled", - // which means preventDefault(true). Hence the '!'. - event.handle()->preventDefault(!value.toBoolean(exec)); - break; - case CancelBubble: // MSIE equivalent for "stopPropagation" (but with a way to reset it) - event.handle()->stopPropagation(value.toBoolean(exec)); - break; - default: - break; - } -} - -Value DOMEventProtoFunc::tryCall(ExecState *exec, Object & thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMEvent, thisObj ); - DOM::Event event = static_cast<DOMEvent *>( thisObj.imp() )->toEvent(); - switch (id) { - case DOMEvent::StopPropagation: - event.stopPropagation(); - return Undefined(); - case DOMEvent::PreventDefault: - event.preventDefault(); - return Undefined(); - case DOMEvent::InitEvent: - event.initEvent(args[0].toString(exec).string(),args[1].toBoolean(exec),args[2].toBoolean(exec)); - return Undefined(); - }; - return Undefined(); -} - -Value getDOMEvent(ExecState *exec, DOM::Event e) -{ - DOM::EventImpl *ei = e.handle(); - if (!ei) - return Null(); - ScriptInterpreter* interp = static_cast<ScriptInterpreter *>(exec->interpreter()); - DOMObject *ret = interp->getDOMObject(ei); - if (!ret) { - if (ei->isTextInputEvent()) - ret = new DOMTextEvent(exec, e); - else if (ei->isKeyboardEvent()) - ret = new DOMKeyboardEvent(exec, e); - else if (ei->isMouseEvent()) - ret = new DOMMouseEvent(exec, e); - else if (ei->isUIEvent()) - ret = new DOMUIEvent(exec, e); - else if (ei->isMutationEvent()) - ret = new DOMMutationEvent(exec, e); - else - ret = new DOMEvent(exec, e); - - interp->putDOMObject(ei, ret); - } - - return Value(ret); -} - -DOM::Event toEvent(const Value& val) -{ - Object obj = Object::dynamicCast(val); - if (!obj.isValid() || !obj.inherits(&DOMEvent::info)) - return DOM::Event(); - - const DOMEvent *dobj = static_cast<const DOMEvent*>(obj.imp()); - return dobj->toEvent(); -} - -// ------------------------------------------------------------------------- -/* -@begin EventConstantsTable 23 - CAPTURING_PHASE DOM::Event::CAPTURING_PHASE DontDelete|ReadOnly - AT_TARGET DOM::Event::AT_TARGET DontDelete|ReadOnly - BUBBLING_PHASE DOM::Event::BUBBLING_PHASE DontDelete|ReadOnly -# Reverse-engineered from Netscape - MOUSEDOWN 1 DontDelete|ReadOnly - MOUSEUP 2 DontDelete|ReadOnly - MOUSEOVER 4 DontDelete|ReadOnly - MOUSEOUT 8 DontDelete|ReadOnly - MOUSEMOVE 16 DontDelete|ReadOnly - MOUSEDRAG 32 DontDelete|ReadOnly - CLICK 64 DontDelete|ReadOnly - DBLCLICK 128 DontDelete|ReadOnly - KEYDOWN 256 DontDelete|ReadOnly - KEYUP 512 DontDelete|ReadOnly - KEYPRESS 1024 DontDelete|ReadOnly - DRAGDROP 2048 DontDelete|ReadOnly - FOCUS 4096 DontDelete|ReadOnly - BLUR 8192 DontDelete|ReadOnly - SELECT 16384 DontDelete|ReadOnly - CHANGE 32768 DontDelete|ReadOnly -@end -*/ -DEFINE_CONSTANT_TABLE(EventConstants) -IMPLEMENT_CONSTANT_TABLE(EventConstants, "EventConstants") - -IMPLEMENT_PSEUDO_CONSTRUCTOR_WITH_PARENT(EventConstructor, "EventConstructor", DOMEventProto, EventConstants) -// ------------------------------------------------------------------------- - - -const ClassInfo EventExceptionConstructor::info = { "EventExceptionConstructor", 0, &EventExceptionConstructorTable, 0 }; -/* -@begin EventExceptionConstructorTable 1 - UNSPECIFIED_EVENT_TYPE_ERR DOM::EventException::UNSPECIFIED_EVENT_TYPE_ERR DontDelete|ReadOnly -@end -*/ -EventExceptionConstructor::EventExceptionConstructor(ExecState *exec) - : DOMObject(exec->interpreter()->builtinObjectPrototype()) -{ -} - -Value EventExceptionConstructor::tryGet(ExecState *exec, const Identifier &p) const -{ - return DOMObjectLookupGetValue<EventExceptionConstructor, DOMObject>(exec,p,&EventExceptionConstructorTable,this); -} - -Value EventExceptionConstructor::getValueProperty(ExecState *, int token) const -{ - // We use the token as the value to return directly - return Number(token); -} - -Value getEventExceptionConstructor(ExecState *exec) -{ - return cacheGlobalObject<EventExceptionConstructor>(exec, "[[eventException.constructor]]"); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMUIEvent::info = { "UIEvent", &DOMEvent::info, &DOMUIEventTable, 0 }; -/* -@begin DOMUIEventTable 7 - view DOMUIEvent::View DontDelete|ReadOnly - detail DOMUIEvent::Detail DontDelete|ReadOnly - keyCode DOMUIEvent::KeyCode DontDelete|ReadOnly - charCode DOMUIEvent::CharCode DontDelete|ReadOnly - layerX DOMUIEvent::LayerX DontDelete|ReadOnly - layerY DOMUIEvent::LayerY DontDelete|ReadOnly - pageX DOMUIEvent::PageX DontDelete|ReadOnly - pageY DOMUIEvent::PageY DontDelete|ReadOnly - which DOMUIEvent::Which DontDelete|ReadOnly -@end -@begin DOMUIEventProtoTable 1 - initUIEvent DOMUIEvent::InitUIEvent DontDelete|Function 5 -@end -*/ -KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(DOMUIEventProto, DOMEventProto) -IMPLEMENT_PROTOFUNC_DOM(DOMUIEventProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMUIEvent", DOMUIEventProto, DOMUIEventProtoFunc) - -DOMUIEvent::DOMUIEvent(ExecState *exec, DOM::UIEvent ue) : - DOMEvent(DOMUIEventProto::self(exec), ue) {} - -DOMUIEvent::DOMUIEvent(const Object &proto, DOM::UIEvent ue) : - DOMEvent(proto, ue) {} - -DOMUIEvent::~DOMUIEvent() -{ -} - -Value DOMUIEvent::tryGet(ExecState *exec, const Identifier &p) const -{ - return DOMObjectLookupGetValue<DOMUIEvent,DOMEvent>(exec,p,&DOMUIEventTable,this); -} - -Value DOMUIEvent::getValueProperty(ExecState *exec, int token) const -{ - switch (token) { - case View: - return getDOMAbstractView(exec,static_cast<DOM::UIEvent>(event).view()); - case Detail: - return Number(static_cast<DOM::UIEvent>(event).detail()); - case KeyCode: - // IE-compatibility - return Number(static_cast<DOM::UIEvent>(event).keyCode()); - case CharCode: - // IE-compatibility - return Number(static_cast<DOM::UIEvent>(event).charCode()); - case LayerX: - // NS-compatibility - return Number(static_cast<DOM::UIEvent>(event).layerX()); - case LayerY: - // NS-compatibility - return Number(static_cast<DOM::UIEvent>(event).layerY()); - case PageX: - // NS-compatibility - return Number(static_cast<DOM::UIEvent>(event).pageX()); - case PageY: - // NS-compatibility - return Number(static_cast<DOM::UIEvent>(event).pageY()); - case Which: - // NS-compatibility - return Number(static_cast<DOM::UIEvent>(event).which()); - default: - kdDebug(6070) << "WARNING: Unhandled token in DOMUIEvent::getValueProperty : " << token << endl; - return Undefined(); - } -} - -Value DOMUIEventProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMUIEvent, thisObj ); - DOM::UIEvent uiEvent = static_cast<DOMUIEvent *>(thisObj.imp())->toUIEvent(); - switch (id) { - case DOMUIEvent::InitUIEvent: { - DOM::AbstractView v = toAbstractView(args[3]); - static_cast<DOM::UIEvent>(uiEvent).initUIEvent(args[0].toString(exec).string(), - args[1].toBoolean(exec), - args[2].toBoolean(exec), - v, - args[4].toInteger(exec)); - } - return Undefined(); - } - return Undefined(); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMMouseEvent::info = { "MouseEvent", &DOMUIEvent::info, &DOMMouseEventTable, 0 }; - -/* -@begin DOMMouseEventTable 2 - screenX DOMMouseEvent::ScreenX DontDelete|ReadOnly - screenY DOMMouseEvent::ScreenY DontDelete|ReadOnly - clientX DOMMouseEvent::ClientX DontDelete|ReadOnly - x DOMMouseEvent::X DontDelete|ReadOnly - clientY DOMMouseEvent::ClientY DontDelete|ReadOnly - y DOMMouseEvent::Y DontDelete|ReadOnly - offsetX DOMMouseEvent::OffsetX DontDelete|ReadOnly - offsetY DOMMouseEvent::OffsetY DontDelete|ReadOnly - ctrlKey DOMMouseEvent::CtrlKey DontDelete|ReadOnly - shiftKey DOMMouseEvent::ShiftKey DontDelete|ReadOnly - altKey DOMMouseEvent::AltKey DontDelete|ReadOnly - metaKey DOMMouseEvent::MetaKey DontDelete|ReadOnly - button DOMMouseEvent::Button DontDelete|ReadOnly - relatedTarget DOMMouseEvent::RelatedTarget DontDelete|ReadOnly - fromElement DOMMouseEvent::FromElement DontDelete|ReadOnly - toElement DOMMouseEvent::ToElement DontDelete|ReadOnly -@end -@begin DOMMouseEventProtoTable 1 - initMouseEvent DOMMouseEvent::InitMouseEvent DontDelete|Function 15 -@end -*/ -KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(DOMMouseEventProto, DOMUIEventProto) -IMPLEMENT_PROTOFUNC_DOM(DOMMouseEventProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMMouseEvent", DOMMouseEventProto, DOMMouseEventProtoFunc) - -DOMMouseEvent::DOMMouseEvent(ExecState *exec, DOM::MouseEvent me) : - DOMUIEvent(DOMMouseEventProto::self(exec), me) {} - -DOMMouseEvent::~DOMMouseEvent() -{ -} - -Value DOMMouseEvent::tryGet(ExecState *exec, const Identifier &p) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMMouseEvent::tryGet " << p.qstring() << endl; -#endif - return DOMObjectLookupGetValue<DOMMouseEvent,DOMUIEvent>(exec,p,&DOMMouseEventTable,this); -} - -Value DOMMouseEvent::getValueProperty(ExecState *exec, int token) const -{ - switch (token) { - case ScreenX: - return Number(static_cast<DOM::MouseEvent>(event).screenX()); - case ScreenY: - return Number(static_cast<DOM::MouseEvent>(event).screenY()); - case ClientX: - case X: - return Number(static_cast<DOM::MouseEvent>(event).clientX()); - case ClientY: - case Y: - return Number(static_cast<DOM::MouseEvent>(event).clientY()); - case OffsetX: - case OffsetY: // MSIE extension - { - DOM::Node node = event.target(); - khtml::RenderObject *rend = 0; - if (node.handle()) { - node.handle()->getDocument()->updateRendering(); - rend = node.handle()->renderer(); - } - int x = static_cast<DOM::MouseEvent>(event).clientX(); - int y = static_cast<DOM::MouseEvent>(event).clientY(); - if ( rend ) { - int xPos, yPos; - if ( rend->absolutePosition( xPos, yPos ) ) { - //kdDebug() << "DOMMouseEvent::getValueProperty rend=" << rend << " xPos=" << xPos << " yPos=" << yPos << endl; - x -= xPos; - y -= yPos; - } - if ( rend->canvas() ) { - int cYPos, cXPos; - rend->canvas()->absolutePosition( cXPos, cYPos, true ); - x += cXPos; - y += cYPos; - } - } - return Number( token == OffsetX ? x : y ); - } - case CtrlKey: - return Boolean(static_cast<DOM::MouseEvent>(event).ctrlKey()); - case ShiftKey: - return Boolean(static_cast<DOM::MouseEvent>(event).shiftKey()); - case AltKey: - return Boolean(static_cast<DOM::MouseEvent>(event).altKey()); - case MetaKey: - return Boolean(static_cast<DOM::MouseEvent>(event).metaKey()); - case Button: - { - if ( exec->interpreter()->compatMode() == Interpreter::NetscapeCompat ) { - return Number(static_cast<DOM::MouseEvent>(event).button()); - } - // Tricky. The DOM (and khtml) use 0 for LMB, 1 for MMB and 2 for RMB - // but MSIE uses 1=LMB, 2=RMB, 4=MMB, as a bitfield - int domButton = static_cast<DOM::MouseEvent>(event).button(); - int button = domButton==0 ? 1 : domButton==1 ? 4 : domButton==2 ? 2 : 0; - return Number( (unsigned int)button ); - } - case ToElement: - // MSIE extension - "the object toward which the user is moving the mouse pointer" - if (event.handle()->id() == DOM::EventImpl::MOUSEOUT_EVENT) - return getDOMNode(exec,static_cast<DOM::MouseEvent>(event).relatedTarget()); - return getDOMNode(exec,static_cast<DOM::MouseEvent>(event).target()); - case FromElement: - // MSIE extension - "object from which activation - // or the mouse pointer is exiting during the event" (huh?) - if (event.handle()->id() == DOM::EventImpl::MOUSEOUT_EVENT) - return getDOMNode(exec,static_cast<DOM::MouseEvent>(event).target()); - /* fall through */ - case RelatedTarget: - return getDOMNode(exec,static_cast<DOM::MouseEvent>(event).relatedTarget()); - default: - kdDebug(6070) << "WARNING: Unhandled token in DOMMouseEvent::getValueProperty : " << token << endl; - return Value(); - } -} - -Value DOMMouseEventProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMMouseEvent, thisObj ); - DOM::MouseEvent mouseEvent = static_cast<DOMMouseEvent *>(thisObj.imp())->toMouseEvent(); - switch (id) { - case DOMMouseEvent::InitMouseEvent: - mouseEvent.initMouseEvent(args[0].toString(exec).string(), // typeArg - args[1].toBoolean(exec), // canBubbleArg - args[2].toBoolean(exec), // cancelableArg - toAbstractView(args[3]), // viewArg - args[4].toInteger(exec), // detailArg - args[5].toInteger(exec), // screenXArg - args[6].toInteger(exec), // screenYArg - args[7].toInteger(exec), // clientXArg - args[8].toInteger(exec), // clientYArg - args[9].toBoolean(exec), // ctrlKeyArg - args[10].toBoolean(exec), // altKeyArg - args[11].toBoolean(exec), // shiftKeyArg - args[12].toBoolean(exec), // metaKeyArg - args[13].toInteger(exec), // buttonArg - toNode(args[14])); // relatedTargetArg - return Undefined(); - } - return Undefined(); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMKeyEventBase::info = { "KeyEventBase", &DOMUIEvent::info, &DOMKeyEventBaseTable, 0 }; - -/* -@begin DOMKeyEventBaseTable 5 - keyVal DOMKeyEventBase::Key DontDelete|ReadOnly - virtKeyVal DOMKeyEventBase::VirtKey DontDelete|ReadOnly - ctrlKey DOMKeyEventBase::CtrlKey DontDelete|ReadOnly - altKey DOMKeyEventBase::AltKey DontDelete|ReadOnly - shiftKey DOMKeyEventBase::ShiftKey DontDelete|ReadOnly - altKey DOMKeyEventBase::AltKey DontDelete|ReadOnly -@end -*/ - -DOMKeyEventBase::DOMKeyEventBase(const Object &proto, DOM::TextEvent ke) : - DOMUIEvent(proto, ke) {} - -DOMKeyEventBase::~DOMKeyEventBase() -{} - -Value DOMKeyEventBase::tryGet(ExecState *exec,const Identifier &p) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMKeyEventBase::tryGet " << p.qstring() << endl; -#endif - return DOMObjectLookupGetValue<DOMKeyEventBase,DOMUIEvent>(exec,p,&DOMKeyEventBaseTable,this); -} - -Value DOMKeyEventBase::getValueProperty(ExecState *, int token) const -{ - DOM::KeyEventBaseImpl* tevent = impl(); - switch (token) { - case Key: - return Number(tevent->keyVal()); - case VirtKey: - return Number(tevent->virtKeyVal()); - // these modifier attributes actually belong into a KeyboardEvent interface, - // but we want them on "keypress" as well. - case CtrlKey: - return Boolean(tevent->ctrlKey()); - case ShiftKey: - return Boolean(tevent->shiftKey()); - case AltKey: - return Boolean(tevent->altKey()); - case MetaKey: - return Boolean(tevent->metaKey()); - default: - kdDebug(6070) << "WARNING: Unhandled token in DOMTextEvent::getValueProperty : " << token << endl; - return KJS::Undefined(); - } -} - -// ------------------------------------------------------------------------- -const ClassInfo DOMTextEvent::info = { "TextEvent", &DOMKeyEventBase::info, &DOMTextEventTable, 0 }; - -/* -@begin DOMTextEventTable 1 - data DOMTextEvent::Data DontDelete|ReadOnly -@end -@begin DOMTextEventProtoTable 1 - initTextEvent DOMTextEvent::InitTextEvent DontDelete|Function 5 - # Missing: initTextEventNS -@end -*/ -KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(DOMTextEventProto, DOMUIEventProto) //Note: no proto in KeyBase -IMPLEMENT_PROTOFUNC_DOM(DOMTextEventProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMTextEvent", DOMTextEventProto, DOMTextEventProtoFunc) - -DOMTextEvent::DOMTextEvent(ExecState *exec, DOM::TextEvent ke) : - DOMKeyEventBase(DOMTextEventProto::self(exec), ke) {} - -DOMTextEvent::~DOMTextEvent() -{ -} - -Value DOMTextEvent::tryGet(ExecState *exec, const Identifier &p) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMTextEvent::tryGet " << p.qstring() << endl; -#endif - return DOMObjectLookupGetValue<DOMTextEvent,DOMKeyEventBase>(exec,p,&DOMTextEventTable,this); -} - -Value DOMTextEvent::getValueProperty(ExecState *, int token) const -{ - DOM::TextEventImpl* tevent = impl(); - switch (token) { - case Data: - return String(tevent->data()); - default: - kdDebug(6070) << "WARNING: Unhandled token in DOMTextEvent::getValueProperty : " << token << endl; - return KJS::Undefined(); - } -} - -Value DOMTextEventProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMTextEvent, thisObj ); - DOM::TextEventImpl* keyEvent = static_cast<DOMTextEvent *>(thisObj.imp())->impl(); - switch (id) { - case DOMTextEvent::InitTextEvent: - keyEvent->initTextEvent(args[0].toString(exec).string(), // typeArg - args[1].toBoolean(exec), // canBubbleArg - args[2].toBoolean(exec), // cancelableArg - toAbstractView(args[3]), // viewArg - args[4].toString(exec).string()); // dataArg - - return Undefined(); - } - return Undefined(); -} -// ------------------------------------------------------------------------- -const ClassInfo DOMKeyboardEvent::info = { "KeyboardEvent", &DOMKeyEventBase::info, &DOMKeyboardEventTable, 0 }; - -/* -@begin DOMKeyboardEventTable 2 - keyIdentifier DOMKeyboardEvent::KeyIdentifier DontDelete|ReadOnly - keyLocation DOMKeyboardEvent::KeyLocation DontDelete|ReadOnly -@end -@begin DOMKeyboardEventProtoTable 2 - initKeyboardEvent DOMKeyboardEvent::InitKeyboardEvent DontDelete|Function 7 - getModifierState DOMKeyboardEvent::GetModifierState DontDelete|Function 1 -@end -*/ -KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(DOMKeyboardEventProto, DOMUIEventProto) //Note: no proto in KeyBase -IMPLEMENT_PROTOFUNC_DOM(DOMKeyboardEventProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMKeyboardEvent", DOMKeyboardEventProto, DOMKeyboardEventProtoFunc) - -DOMKeyboardEvent::DOMKeyboardEvent(ExecState *exec, DOM::TextEvent ke) : - DOMKeyEventBase(DOMKeyboardEventProto::self(exec), ke) {} - -DOMKeyboardEvent::~DOMKeyboardEvent() -{ -} - -Value DOMKeyboardEvent::tryGet(ExecState *exec, const Identifier &p) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "DOMKeyboardEvent::tryGet " << p.qstring() << endl; -#endif - return DOMObjectLookupGetValue<DOMKeyboardEvent,DOMKeyEventBase>(exec,p,&DOMKeyboardEventTable,this); -} - -Value DOMKeyboardEvent::getValueProperty(ExecState *, int token) const -{ - DOM::KeyboardEventImpl* tevent = impl(); - switch (token) { - case KeyIdentifier: - return String(tevent->keyIdentifier()); - case KeyLocation: - return Number(tevent->keyLocation()); - default: - kdDebug(6070) << "WARNING: Unhandled token in DOMKeyboardEvent::getValueProperty : " << token << endl; - return KJS::Undefined(); - } -} - -Value DOMKeyboardEventProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMKeyboardEvent, thisObj ); - DOM::KeyboardEventImpl* keyEvent = static_cast<DOMKeyboardEvent *>(thisObj.imp())->impl(); - switch (id) { - case DOMKeyboardEvent::InitKeyboardEvent: - keyEvent->initKeyboardEvent(args[0].toString(exec).string(), // typeArg - args[1].toBoolean(exec), // canBubbleArg - args[2].toBoolean(exec), // cancelableArg - toAbstractView(args[3]), // viewArg - args[4].toString(exec).string(), // keyIdentifierArg - args[5].toInteger(exec), // keyLocationArg - args[6].toString(exec).string()); //modifiersList - break; - case DOMKeyboardEvent::GetModifierState: - return Boolean(keyEvent->getModifierState(args[0].toString(exec).string())); - } - return Undefined(); -} - -// ------------------------------------------------------------------------- -const ClassInfo KeyboardEventConstructor::info = { "KeyboardEventConstructor", 0, &KeyboardEventConstructorTable, 0 }; -/* -@begin KeyboardEventConstructorTable 4 - DOM_KEY_LOCATION_STANDARD DOM::KeyboardEventImpl::DOM_KEY_LOCATION_STANDARD DontDelete|ReadOnly - DOM_KEY_LOCATION_LEFT DOM::KeyboardEventImpl::DOM_KEY_LOCATION_LEFT DontDelete|ReadOnly - DOM_KEY_LOCATION_RIGHT DOM::KeyboardEventImpl::DOM_KEY_LOCATION_RIGHT DontDelete|ReadOnly - DOM_KEY_LOCATION_NUMPAD DOM::KeyboardEventImpl::DOM_KEY_LOCATION_NUMPAD DontDelete|ReadOnly -@end -*/ -KeyboardEventConstructor::KeyboardEventConstructor(ExecState* exec) - : DOMObject(exec->interpreter()->builtinObjectPrototype()) -{} - -Value KeyboardEventConstructor::tryGet(ExecState *exec, const Identifier &p) const -{ - return DOMObjectLookupGetValue<KeyboardEventConstructor,DOMObject>(exec,p,&KeyboardEventConstructorTable,this); -} - -Value KeyboardEventConstructor::getValueProperty(ExecState *, int token) const -{ - // We use the token as the value to return directly - return Number(token); -} - -Value getKeyboardEventConstructor(ExecState *exec) -{ - return cacheGlobalObject<KeyboardEventConstructor>(exec, "[[keyboardEvent.constructor]]"); -} - - -// ------------------------------------------------------------------------- -const ClassInfo MutationEventConstructor::info = { "MutationEventConstructor", 0, &MutationEventConstructorTable, 0 }; -/* -@begin MutationEventConstructorTable 3 - MODIFICATION DOM::MutationEvent::MODIFICATION DontDelete|ReadOnly - ADDITION DOM::MutationEvent::ADDITION DontDelete|ReadOnly - REMOVAL DOM::MutationEvent::REMOVAL DontDelete|ReadOnly -@end -*/ -MutationEventConstructor::MutationEventConstructor(ExecState* exec) - : DOMObject(exec->interpreter()->builtinObjectPrototype()) -{ -} - -Value MutationEventConstructor::tryGet(ExecState *exec, const Identifier &p) const -{ - return DOMObjectLookupGetValue<MutationEventConstructor,DOMObject>(exec,p,&MutationEventConstructorTable,this); -} - -Value MutationEventConstructor::getValueProperty(ExecState *, int token) const -{ - // We use the token as the value to return directly - return Number(token); -} - -Value getMutationEventConstructor(ExecState *exec) -{ - return cacheGlobalObject<MutationEventConstructor>(exec, "[[mutationEvent.constructor]]"); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMMutationEvent::info = { "MutationEvent", &DOMEvent::info, &DOMMutationEventTable, 0 }; -/* -@begin DOMMutationEventTable 5 - relatedNode DOMMutationEvent::RelatedNode DontDelete|ReadOnly - prevValue DOMMutationEvent::PrevValue DontDelete|ReadOnly - newValue DOMMutationEvent::NewValue DontDelete|ReadOnly - attrName DOMMutationEvent::AttrName DontDelete|ReadOnly - attrChange DOMMutationEvent::AttrChange DontDelete|ReadOnly -@end -@begin DOMMutationEventProtoTable 1 - initMutationEvent DOMMutationEvent::InitMutationEvent DontDelete|Function 8 -@end -*/ -KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(DOMMutationEventProto, DOMEventProto) -IMPLEMENT_PROTOFUNC_DOM(DOMMutationEventProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMMutationEvent", DOMMutationEventProto, DOMMutationEventProtoFunc) - -DOMMutationEvent::DOMMutationEvent(ExecState *exec, DOM::MutationEvent me) : - DOMEvent(DOMMutationEventProto::self(exec), me) {} - -DOMMutationEvent::~DOMMutationEvent() -{ -} - -Value DOMMutationEvent::tryGet(ExecState *exec, const Identifier &p) const -{ - return DOMObjectLookupGetValue<DOMMutationEvent,DOMEvent>(exec,p,&DOMMutationEventTable,this); -} - -Value DOMMutationEvent::getValueProperty(ExecState *exec, int token) const -{ - switch (token) { - case RelatedNode: - return getDOMNode(exec,static_cast<DOM::MutationEvent>(event).relatedNode()); - case PrevValue: - return String(static_cast<DOM::MutationEvent>(event).prevValue()); - case NewValue: - return String(static_cast<DOM::MutationEvent>(event).newValue()); - case AttrName: - return String(static_cast<DOM::MutationEvent>(event).attrName()); - case AttrChange: - return Number((unsigned int)static_cast<DOM::MutationEvent>(event).attrChange()); - default: - kdDebug(6070) << "WARNING: Unhandled token in DOMMutationEvent::getValueProperty : " << token << endl; - return Value(); - } -} - -Value DOMMutationEventProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMMutationEvent, thisObj ); - DOM::MutationEvent mutationEvent = static_cast<DOMMutationEvent *>(thisObj.imp())->toMutationEvent(); - switch (id) { - case DOMMutationEvent::InitMutationEvent: - mutationEvent.initMutationEvent(args[0].toString(exec).string(), // typeArg, - args[1].toBoolean(exec), // canBubbleArg - args[2].toBoolean(exec), // cancelableArg - toNode(args[3]), // relatedNodeArg - args[4].toString(exec).string(), // prevValueArg - args[5].toString(exec).string(), // newValueArg - args[6].toString(exec).string(), // attrNameArg - args[7].toInteger(exec)); // attrChangeArg - return Undefined(); - } - return Undefined(); -} - -} //namespace KJS diff --git a/khtml/ecma/kjs_events.h b/khtml/ecma/kjs_events.h deleted file mode 100644 index e48276031..000000000 --- a/khtml/ecma/kjs_events.h +++ /dev/null @@ -1,250 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * 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 - */ - -#ifndef _KJS_EVENTS_H_ -#define _KJS_EVENTS_H_ - -#include "ecma/kjs_dom.h" -#include "dom/dom2_events.h" -#include "dom/dom_misc.h" -#include "xml/dom2_eventsimpl.h" - -namespace KJS { - - class Window; - - class JSEventListener : public DOM::EventListener { - public: - /** - * @param _listener the function object, that will be called when the event is emitted - * @param _compareListenerImp Compare Listener implementation. - * @param _win Window object, for memory management and caching. - * @param _html \c true if it is HTML. - * Never create a JSEventListener directly, use Window::getJSEventListener. - */ - JSEventListener(Object _listener, ObjectImp *_compareListenerImp, const Object &_win, bool _html = false); - virtual ~JSEventListener(); - virtual void handleEvent(DOM::Event &evt); - virtual DOM::DOMString eventListenerType(); - // Return the KJS function object executed when this event is emitted - virtual Object listenerObj() const; - ObjectImp *listenerObjImp() const { return listenerObj().imp(); } - // for Window::clear(). This is a bad hack though. The JSEventListener might not get deleted - // if it was added to a DOM node in another frame (#61467). But calling removeEventListener on - // all nodes we're listening to is quite difficult. - void clear() { listener = Object(); } - bool isHTMLEventListener() const { return html; } - - protected: - mutable Object listener; - // Storing a different ObjectImp ptr is needed to support addEventListener(.. [Object] ..) calls - // In the real-life case (where a 'function' is passed to addEventListener) we can directly call - // the 'listener' object and can cache the 'listener.imp()'. If the event listener should be removed - // the implementation will call removeEventListener(.. [Function] ..), and we can lookup the event - // listener by the passed function's imp() ptr. - // In the only dom-approved way (passing an Object to add/removeEventListener), the 'listener' - // variable stores the function object 'passedListener.handleEvent'. But we need to cache - // the imp() ptr of the 'passedListener' function _object_, as the implementation will - // call removeEventListener(.. [Object ..] on removal, and now we can successfully lookup - // the correct event listener, as well as the 'listener.handleEvent' function, we need to call. - mutable ObjectImp *compareListenerImp; - bool html; - Object win; - }; - - class JSLazyEventListener : public JSEventListener { - public: - JSLazyEventListener(const TQString &_code, const TQString &_name, const Object &_win, DOM::NodeImpl* node); - ~JSLazyEventListener(); - virtual void handleEvent(DOM::Event &evt); - Object listenerObj() const; - private: - void parseCode() const; - - mutable TQString code; - mutable TQString name; - mutable bool parsed; - DOM::NodeImpl *originalNode; - }; - - // Constructor for Event - currently only used for some global vars - DEFINE_PSEUDO_CONSTRUCTOR(EventConstructor) - - class DOMEvent : public DOMObject { - public: - // Build a DOMEvent - DOMEvent(ExecState *exec, DOM::Event e); - // Constructor for inherited classes - DOMEvent(const Object &proto, DOM::Event e); - ~DOMEvent(); - virtual Value tryGet(ExecState *exec,const Identifier &p) const; - Value getValueProperty(ExecState *, int token) const; - virtual void tryPut(ExecState *exec, const Identifier &propertyName, - const Value& value, int attr = None); - virtual Value defaultValue(ExecState *exec, KJS::Type hint) const; - void putValueProperty(ExecState *exec, int token, const Value& value, int); - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Type, Target, CurrentTarget, EventPhase, Bubbles, - Cancelable, TimeStamp, StopPropagation, PreventDefault, InitEvent, - // MS IE equivalents - SrcElement, ReturnValue, CancelBubble }; - DOM::Event toEvent() const { return event; } - protected: - DOM::Event event; - }; - - Value getDOMEvent(ExecState *exec, DOM::Event e); - - /** - * Convert an object to an Event. Returns a null Event if not possible. - */ - DOM::Event toEvent(const Value&); - - // Constructor object EventException - class EventExceptionConstructor : public DOMObject { - public: - EventExceptionConstructor(ExecState *); - virtual Value tryGet(ExecState *exec,const Identifier &p) const; - Value getValueProperty(ExecState *, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - }; - - Value getEventExceptionConstructor(ExecState *exec); - - class DOMUIEvent : public DOMEvent { - public: - // Build a DOMUIEvent - DOMUIEvent(ExecState *exec, DOM::UIEvent ue); - // Constructor for inherited classes - DOMUIEvent(const Object &proto, DOM::UIEvent ue); - ~DOMUIEvent(); - virtual Value tryGet(ExecState *exec,const Identifier &p) const; - Value getValueProperty(ExecState *, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { View, Detail, KeyCode, CharCode, LayerX, LayerY, PageX, PageY, Which, InitUIEvent }; - DOM::UIEvent toUIEvent() const { return static_cast<DOM::UIEvent>(event); } - }; - - class DOMMouseEvent : public DOMUIEvent { - public: - DOMMouseEvent(ExecState *exec, DOM::MouseEvent me); - ~DOMMouseEvent(); - virtual Value tryGet(ExecState *exec,const Identifier &p) const; - Value getValueProperty(ExecState *, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { ScreenX, ScreenY, ClientX, X, ClientY, Y, OffsetX, OffsetY, - CtrlKey, ShiftKey, AltKey, - MetaKey, Button, RelatedTarget, FromElement, ToElement, - InitMouseEvent - }; - DOM::MouseEvent toMouseEvent() const { return static_cast<DOM::MouseEvent>(event); } - }; - - class DOMKeyEventBase : public DOMUIEvent { - public: - DOMKeyEventBase(const Object &proto, DOM::TextEvent ke); - ~DOMKeyEventBase(); - - virtual Value tryGet(ExecState *exec,const Identifier &p) const; - Value getValueProperty(ExecState *, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Key, VirtKey, CtrlKey, ShiftKey, AltKey, MetaKey }; - DOM::KeyEventBaseImpl* impl() const { return static_cast<DOM::KeyEventBaseImpl*>(event.handle()); } - }; - - class DOMTextEvent : public DOMKeyEventBase { - public: - DOMTextEvent(ExecState *exec, DOM::TextEvent ke); - ~DOMTextEvent(); - virtual Value tryGet(ExecState *exec,const Identifier &p) const; - Value getValueProperty(ExecState *, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum {Data, InitTextEvent}; - DOM::TextEventImpl* impl() const { return static_cast<DOM::TextEventImpl*>(event.handle()); } - }; - - class DOMKeyboardEvent : public DOMKeyEventBase { - public: - DOMKeyboardEvent(ExecState *exec, DOM::TextEvent ke); - ~DOMKeyboardEvent(); - virtual Value tryGet(ExecState *exec,const Identifier &p) const; - Value getValueProperty(ExecState *, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum {KeyIdentifier, KeyLocation, GetModifierState, InitKeyboardEvent}; - DOM::KeyboardEventImpl* impl() const { return static_cast<DOM::KeyboardEventImpl*>(event.handle()); } - }; - - // Constructor object KeyboardEvent - class KeyboardEventConstructor : public DOMObject { - public: - KeyboardEventConstructor(ExecState *); - virtual Value tryGet(ExecState *exec,const Identifier &p) const; - Value getValueProperty(ExecState *, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - }; - - Value getKeyboardEventConstructor(ExecState *exec); - - // Constructor object MutationEvent - class MutationEventConstructor : public DOMObject { - public: - MutationEventConstructor(ExecState *); - virtual Value tryGet(ExecState *exec,const Identifier &p) const; - Value getValueProperty(ExecState *, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - }; - - Value getMutationEventConstructor(ExecState *exec); - - class DOMMutationEvent : public DOMEvent { - public: - DOMMutationEvent(ExecState *exec, DOM::MutationEvent me); - ~DOMMutationEvent(); - virtual Value tryGet(ExecState *exec,const Identifier &p) const; - Value getValueProperty(ExecState *, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { AttrChange, RelatedNode, AttrName, PrevValue, NewValue, - InitMutationEvent }; - DOM::MutationEvent toMutationEvent() const { return static_cast<DOM::MutationEvent>(event); } - }; - -} // namespace - -#endif diff --git a/khtml/ecma/kjs_html.cpp b/khtml/ecma/kjs_html.cpp deleted file mode 100644 index 57762ffd3..000000000 --- a/khtml/ecma/kjs_html.cpp +++ /dev/null @@ -1,3946 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 1999-2002 Harri Porten (porten@kde.org) - * Copyright (C) 2001-2003 David Faure (faure@kde.org) - * 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 <kparts/browserextension.h> - -#include "khtml_part.h" -#include "khtmlview.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 khtmltests/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<khtml::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(); - khtml::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 diff --git a/khtml/ecma/kjs_html.h b/khtml/ecma/kjs_html.h deleted file mode 100644 index 53da38462..000000000 --- a/khtml/ecma/kjs_html.h +++ /dev/null @@ -1,294 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 1999 Harri Porten (porten@kde.org) - * 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 - */ - -#ifndef _KJS_HTML_H_ -#define _KJS_HTML_H_ - -#include "dom/html_document.h" -#include "dom/html_base.h" -#include "dom/html_misc.h" -#include "dom/html_form.h" -#include "misc/loader_client.h" - -#include "ecma/kjs_binding.h" -#include "ecma/kjs_dom.h" -#include "xml/dom_nodeimpl.h" // for NodeImpl::Id - -namespace KJS { - - class HTMLElement; - - class HTMLDocument : public DOMDocument { - public: - HTMLDocument(ExecState *exec, const DOM::HTMLDocument& d); - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None); - void putValueProperty(ExecState *exec, int token, const Value& value, int /*attr*/); - virtual bool hasProperty(ExecState *exec, const Identifier &propertyName) const; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Title, Referrer, Domain, URL, Body, Location, Cookie, - Images, Applets, Links, Forms, Layers, Anchors, Scripts, All, Clear, Open, Close, - Write, WriteLn, GetElementsByName, GetSelection, CaptureEvents, ReleaseEvents, - BgColor, FgColor, AlinkColor, LinkColor, VlinkColor, LastModified, - Height, Width, Dir, Frames, CompatMode }; - DOM::Document toDocument() const { return static_cast<DOM::Document>( node ); } - }; - - DEFINE_PSEUDO_CONSTRUCTOR(HTMLDocumentPseudoCtor) - - class HTMLElement : public DOMElement { - public: - HTMLElement(ExecState *exec, const DOM::HTMLElement& e); - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None); - void putValueProperty(ExecState *exec, int token, const Value& value, int); - virtual bool hasProperty(ExecState *exec, const Identifier &propertyName) const; - virtual UString toString(ExecState *exec) const; - virtual void pushEventHandlerScope(ExecState *exec, ScopeChain &scope) const; - virtual const ClassInfo* classInfo() const; - static const ClassInfo info; - - static const ClassInfo html_info, head_info, link_info, title_info, - meta_info, base_info, isIndex_info, style_info, body_info, form_info, - select_info, optGroup_info, option_info, input_info, textArea_info, - button_info, label_info, fieldSet_info, legend_info, ul_info, ol_info, - dl_info, dir_info, menu_info, li_info, div_info, p_info, heading_info, - blockQuote_info, q_info, pre_info, br_info, baseFont_info, font_info, - hr_info, mod_info, a_info, img_info, object_info, param_info, - applet_info, map_info, area_info, script_info, table_info, - caption_info, col_info, tablesection_info, tr_info, - tablecell_info, frameSet_info, frame_info, iFrame_info, marquee_info, layer_info; - - enum { HtmlVersion, HeadProfile, LinkHref, LinkRel, LinkMedia, - LinkCharset, LinkDisabled, LinkHrefLang, LinkRev, LinkTarget, LinkType, - LinkSheet, TitleText, MetaName, MetaHttpEquiv, MetaContent, MetaScheme, - BaseHref, BaseTarget, IsIndexForm, IsIndexPrompt, StyleDisabled, - StyleSheet, StyleType, StyleMedia, BodyBackground, BodyVLink, BodyText, - BodyLink, BodyALink, BodyBgColor, BodyOnLoad, BodyFocus, - FormAction, FormEncType, FormElements, FormLength, FormAcceptCharset, - FormReset, FormTarget, FormName, FormMethod, FormSubmit, SelectAdd, - SelectTabIndex, SelectValue, SelectSelectedIndex, SelectLength, - SelectRemove, SelectForm, SelectBlur, SelectType, SelectOptions, - SelectDisabled, SelectMultiple, SelectName, SelectSize, SelectFocus, - OptGroupDisabled, OptGroupLabel, OptionIndex, OptionSelected, - OptionForm, OptionText, OptionDefaultSelected, OptionDisabled, - OptionLabel, OptionValue, InputBlur, InputReadOnly, InputAccept, - InputSize, InputDefaultValue, InputTabIndex, InputValue, InputType, - InputFocus, InputMaxLength, InputDefaultChecked, InputDisabled, - InputChecked, InputIndeterminate, InputForm, InputAccessKey, InputAlign, InputAlt, - InputName, InputSrc, InputUseMap, InputSelect, InputClick, - InputSelectionStart, InputSelectionEnd, InputSetSelectionRange, - TextAreaAccessKey, TextAreaName, TextAreaDefaultValue, TextAreaSelect, - TextAreaCols, TextAreaDisabled, TextAreaForm, TextAreaType, - TextAreaTabIndex, TextAreaReadOnly, TextAreaRows, TextAreaValue, - TextAreaBlur, TextAreaFocus, TextAreaSelectionStart, TextAreaSelectionEnd, TextAreaSetSelectionRange, - TextAreaTextLength, ButtonBlur, ButtonFocus, ButtonForm, ButtonTabIndex, ButtonName, - ButtonDisabled, ButtonAccessKey, ButtonType, ButtonValue, LabelHtmlFor, - LabelForm, LabelAccessKey, FieldSetForm, LegendForm, LegendAccessKey, - LegendAlign, UListType, UListCompact, OListStart, OListCompact, - OListType, DListCompact, DirectoryCompact, MenuCompact, LIType, - LIValue, DivAlign, ParagraphAlign, HeadingAlign, BlockQuoteCite, - QuoteCite, PreWidth, BRClear, BaseFontColor, BaseFontSize, - BaseFontFace, FontColor, FontSize, FontFace, HRWidth, HRNoShade, - HRAlign, HRSize, ModCite, ModDateTime, AnchorShape, AnchorRel, - AnchorAccessKey, AnchorCoords, AnchorHref, AnchorProtocol, AnchorHost, - AnchorCharset, AnchorHrefLang, AnchorHostname, AnchorType, AnchorFocus, - AnchorPort, AnchorPathName, AnchorHash, AnchorSearch, AnchorName, - AnchorRev, AnchorTabIndex, AnchorTarget, AnchorText, AnchorBlur, AnchorClick, - ImageName, ImageAlign, ImageHspace, ImageVspace, ImageUseMap, ImageAlt, - ImageLowSrc, ImageWidth, ImageIsMap, ImageBorder, ImageHeight, - ImageLongDesc, ImageSrc, ImageX, ImageY, ImageComplete, ObjectHspace, ObjectHeight, ObjectAlign, - ObjectBorder, ObjectCode, ObjectType, ObjectVspace, ObjectArchive, - ObjectDeclare, ObjectForm, ObjectCodeBase, ObjectCodeType, ObjectData, - ObjectName, ObjectStandby, ObjectTabIndex, ObjectUseMap, ObjectWidth, ObjectContentDocument, - ParamName, ParamType, ParamValueType, ParamValue, AppletArchive, - AppletAlt, AppletCode, AppletWidth, AppletAlign, AppletCodeBase, - AppletName, AppletHeight, AppletHspace, AppletObject, AppletVspace, - MapAreas, MapName, AreaHash, AreaHref, AreaTarget, AreaPort, AreaShape, - AreaCoords, AreaAlt, AreaAccessKey, AreaNoHref, AreaHost, AreaProtocol, - AreaHostName, AreaPathName, AreaSearch, AreaTabIndex, ScriptEvent, - ScriptType, ScriptHtmlFor, ScriptText, ScriptSrc, ScriptCharset, - ScriptDefer, TableSummary, TableTBodies, TableTHead, TableCellPadding, - TableDeleteCaption, TableCreateCaption, TableCaption, TableWidth, - TableCreateTFoot, TableAlign, TableTFoot, TableDeleteRow, - TableCellSpacing, TableRows, TableBgColor, TableBorder, TableFrame, - TableRules, TableCreateTHead, TableDeleteTHead, TableDeleteTFoot, - TableInsertRow, TableCaptionAlign, TableColCh, TableColChOff, - TableColAlign, TableColSpan, TableColVAlign, TableColWidth, - TableSectionCh, TableSectionDeleteRow, TableSectionChOff, - TableSectionRows, TableSectionAlign, TableSectionVAlign, - TableSectionInsertRow, TableRowSectionRowIndex, TableRowRowIndex, - TableRowChOff, TableRowCells, TableRowVAlign, TableRowCh, - TableRowAlign, TableRowBgColor, TableRowDeleteCell, TableRowInsertCell, - TableCellColSpan, TableCellNoWrap, TableCellAbbr, TableCellHeight, - TableCellWidth, TableCellCellIndex, TableCellChOff, TableCellBgColor, - TableCellCh, TableCellVAlign, TableCellRowSpan, TableCellHeaders, - TableCellAlign, TableCellAxis, TableCellScope, FrameSetCols, - FrameSetRows, FrameSrc, FrameLocation, FrameFrameBorder, FrameScrolling, - FrameMarginWidth, FrameLongDesc, FrameMarginHeight, FrameName, - FrameContentDocument, FrameContentWindow, - FrameNoResize, FrameWidth, FrameHeight, IFrameLongDesc, IFrameAlign, - IFrameFrameBorder, IFrameSrc, IFrameName, IFrameHeight, - IFrameMarginHeight, IFrameMarginWidth, IFrameScrolling, IFrameWidth, - IFrameContentDocument, IFrameContentWindow, - MarqueeStart, MarqueeStop, - LayerTop, LayerLeft, LayerVisibility, LayerBgColor, LayerClip, LayerDocument, LayerLayers, - ElementInnerHTML, ElementTitle, ElementId, ElementDir, ElementLang, - ElementClassName, ElementInnerText, ElementDocument, - ElementChildren, ElementAll, ElementScrollIntoView }; - - DOM::HTMLElement toElement() const { return static_cast<DOM::HTMLElement>(node); } - }; - - class HTMLElementFunction : public DOMFunction { - public: - HTMLElementFunction(ExecState *exec, int i, int len); - virtual Value tryCall(ExecState *exec, Object &thisObj, const List&args); - private: - int id; - }; - - class HTMLCollection : public DOMObject { - public: - HTMLCollection(ExecState *exec, const DOM::HTMLCollection& c); - HTMLCollection(const KJS::Object& proto, const DOM::HTMLCollection& c); - ~HTMLCollection(); - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - virtual Value call(ExecState *exec, Object &thisObj, const List&args); - virtual Value tryCall(ExecState *exec, Object &thisObj, const List&args); - virtual bool implementsCall() const { return true; } - virtual bool toBoolean(ExecState *) const; - virtual bool hasProperty(ExecState *exec, const Identifier &p) const; - virtual ReferenceList propList(ExecState *exec, bool recursive); - enum { Item, NamedItem, Tags }; - Value getNamedItems(ExecState *exec, const Identifier &propertyName) const; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - DOM::HTMLCollection toCollection() const { return collection; } - virtual void hide() { hidden = true; } - protected: - DOM::HTMLCollection collection; - bool hidden; - }; - - class HTMLSelectCollection : public HTMLCollection { - public: - enum { Add }; - HTMLSelectCollection(ExecState *exec, const DOM::HTMLCollection& c, const DOM::HTMLSelectElement& e); - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None); - - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - - DOM::HTMLSelectElement toElement() const { return element; } - private: - DOM::HTMLSelectElement element; - }; - - ////////////////////// Option Object //////////////////////// - - class OptionConstructorImp : public ObjectImp { - public: - OptionConstructorImp(ExecState *exec, const DOM::Document &d); - virtual bool implementsConstruct() const; - virtual Object construct(ExecState *exec, const List &args); - private: - DOM::Document doc; - }; - - ////////////////////// Image Object //////////////////////// - - class ImageConstructorImp : public ObjectImp { - public: - ImageConstructorImp(ExecState *exec, const DOM::Document &d); - virtual bool implementsConstruct() const; - virtual Object construct(ExecState *exec, const List &args); - private: - DOM::Document doc; - }; - - Value getHTMLCollection(ExecState *exec, const DOM::HTMLCollection& c, bool hide=false); - Value getSelectHTMLCollection(ExecState *exec, const DOM::HTMLCollection& c, const DOM::HTMLSelectElement& e); - - - //All the pseudo constructors.. - DEFINE_PSEUDO_CONSTRUCTOR(HTMLElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLHtmlElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLHeadElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLLinkElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLTitleElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLMetaElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLBaseElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLIsIndexElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLStyleElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLBodyElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLFormElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLSelectElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLOptGroupElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLOptionElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLInputElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLTextAreaElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLButtonElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLLabelElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLFieldSetElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLLegendElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLUListElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLOListElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLDListElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLDirectoryElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLMenuElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLLIElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLDivElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLParagraphElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLHeadingElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLBlockQuoteElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLQuoteElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLPreElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLBRElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLBaseFontElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLFontElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLHRElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLModElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLAnchorElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLImageElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLObjectElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLParamElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLAppletElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLMapElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLAreaElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLScriptElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLTableElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLTableCaptionElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLTableColElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLTableSectionElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLTableRowElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLTableCellElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLFrameSetElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLLayerElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLFrameElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLIFrameElementPseudoCtor) - DEFINE_PSEUDO_CONSTRUCTOR(HTMLMarqueeElementPseudoCtor) -} // namespace - -#endif diff --git a/khtml/ecma/kjs_mozilla.cpp b/khtml/ecma/kjs_mozilla.cpp deleted file mode 100644 index 1a5555c42..000000000 --- a/khtml/ecma/kjs_mozilla.cpp +++ /dev/null @@ -1,94 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (c) 2003 George Staikos (staikos@kde.org) - * - * 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 <klocale.h> -#include <kdebug.h> - -#include "kjs_mozilla.h" -#include "kjs/lookup.h" -#include "kjs_binding.h" -#include "khtml_part.h" -#include "kjs_mozilla.lut.h" - -using namespace KJS; - -namespace KJS { - -const ClassInfo MozillaSidebarExtension::info = { "sidebar", 0, &MozillaSidebarExtensionTable, 0 }; -/* -@begin MozillaSidebarExtensionTable 1 - addPanel MozillaSidebarExtension::addPanel DontDelete|Function 0 -@end -*/ -} -IMPLEMENT_PROTOFUNC_DOM(MozillaSidebarExtensionFunc) - -MozillaSidebarExtension::MozillaSidebarExtension(ExecState *exec, KHTMLPart *p) - : ObjectImp(exec->interpreter()->builtinObjectPrototype()), m_part(p) { } - -Value MozillaSidebarExtension::get(ExecState *exec, const Identifier &propertyName) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "MozillaSidebarExtension::get " << propertyName.ascii() << endl; -#endif - return lookupGet<MozillaSidebarExtensionFunc,MozillaSidebarExtension,ObjectImp>(exec,propertyName,&MozillaSidebarExtensionTable,this); -} - -Value MozillaSidebarExtension::getValueProperty(ExecState *exec, int token) const -{ - Q_UNUSED(exec); - switch (token) { - default: - kdDebug(6070) << "WARNING: Unhandled token in MozillaSidebarExtension::getValueProperty : " << token << endl; - return Value(); - } -} - -Value MozillaSidebarExtensionFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::MozillaSidebarExtension, thisObj ); - MozillaSidebarExtension *mse = static_cast<MozillaSidebarExtension*>(thisObj.imp()); - - KHTMLPart *part = mse->part(); - if (!part) - return Undefined(); - - // addPanel() id == 0 - KParts::BrowserExtension *ext = part->browserExtension(); - if (ext) { - TQString url, name; - if (args.size() == 1) { // I've seen this, don't know if it's legal. - name = TQString::null; - url = args[0].toString(exec).qstring(); - } else if (args.size() == 2 || args.size() == 3) { - name = args[0].toString(exec).qstring(); - url = args[1].toString(exec).qstring(); - // 2 is the "CURL" which I don't understand and don't think we need. - } else { - return Boolean(false); - } - emit ext->addWebSideBar(KURL( url ), name); - return Boolean(true); - } - - return Undefined(); -} - - diff --git a/khtml/ecma/kjs_mozilla.h b/khtml/ecma/kjs_mozilla.h deleted file mode 100644 index 220094f63..000000000 --- a/khtml/ecma/kjs_mozilla.h +++ /dev/null @@ -1,44 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2003 George Staikos (staikos@kde.org) - * - * 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 - */ - -#ifndef _KJS_MOZILLA_H_ -#define _KJS_MOZILLA_H_ - -#include <kjs/object.h> - -class KHTMLPart; - -namespace KJS { - - class MozillaSidebarExtension : public ObjectImp { - public: - MozillaSidebarExtension(ExecState *exec, KHTMLPart *p); - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { addPanel }; - KHTMLPart *part() const { return m_part; } - private: - KHTMLPart *m_part; - }; -} // namespace - -#endif diff --git a/khtml/ecma/kjs_navigator.cpp b/khtml/ecma/kjs_navigator.cpp deleted file mode 100644 index 9bd99ada7..000000000 --- a/khtml/ecma/kjs_navigator.cpp +++ /dev/null @@ -1,670 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2000 Harri Porten (porten@kde.org) - * Copyright (c) 2000 Daniel Molkentin (molkentin@kde.org) - * Copyright (c) 2000 Stefan Schimanski (schimmi@kde.org) - * 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 <klocale.h> - -#include <kstandarddirs.h> -#include <kconfig.h> -#include <kdebug.h> - -#include <kio/kprotocolmanager.h> -#include <kio/kmimetype.h> -#include <kio/kservice.h> -#include <kio/ktrader.h> -#include "kjs_navigator.h" -#include "kjs/lookup.h" -#include "kjs_binding.h" -#include "khtml_part.h" -#include <sys/utsname.h> -#include "kjs_navigator.lut.h" - -using namespace KJS; - -namespace KJS { - - // All objects that need plugin info must inherit from PluginBase - // Its ctor and dtor take care of the refcounting on the static lists. - class PluginBase : public ObjectImp { - public: - PluginBase(ExecState *exec, bool loadPluginInfo); - virtual ~PluginBase(); - - struct MimeClassInfo; - struct PluginInfo; - - struct MimeClassInfo { - TQString type; - TQString desc; - TQString suffixes; - PluginInfo *plugin; - }; - - struct PluginInfo { - TQString name; - TQString file; - TQString desc; - TQPtrList<MimeClassInfo> mimes; - }; - - static TQPtrList<PluginInfo> *plugins; - static TQPtrList<MimeClassInfo> *mimes; - - private: - static int m_refCount; - }; - - - class Plugins : public PluginBase { - public: - Plugins(ExecState *exec, bool pluginsEnabled) - : PluginBase(exec, pluginsEnabled), - m_pluginsEnabled(pluginsEnabled) {}; - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - Value pluginByName( ExecState* exec, const TQString& name ) const; - bool pluginsEnabled() const { return m_pluginsEnabled; }; - private: - bool m_pluginsEnabled; - }; - - - class MimeTypes : public PluginBase { - public: - MimeTypes(ExecState *exec, bool pluginsEnabled) - : PluginBase(exec, pluginsEnabled), - m_pluginsEnabled(pluginsEnabled) {}; - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - Value getValueProperty(ExecState *exec, int token) const; - Value mimeTypeByName( ExecState* exec, const TQString& name ) const; - bool pluginsEnabled() const { return m_pluginsEnabled; }; - private: - bool m_pluginsEnabled; - }; - - - class Plugin : public PluginBase { - public: - Plugin( ExecState *exec, PluginBase::PluginInfo *info ) - : PluginBase( exec, true ) - { m_info = info; }; - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - Value mimeByName(ExecState* exec, const TQString& name ) const; - Value getValueProperty(ExecState *exec, int token) const; - PluginBase::PluginInfo *pluginInfo() const { return m_info; } - private: - PluginBase::PluginInfo *m_info; - }; - - - class MimeType : public PluginBase { - public: - MimeType( ExecState *exec, PluginBase::MimeClassInfo *info ) - : PluginBase( exec, true ) - { m_info = info; }; - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - Value getValueProperty(ExecState *exec, int token) const; - private: - PluginBase::MimeClassInfo *m_info; - }; - -} - - -TQPtrList<PluginBase::PluginInfo> *KJS::PluginBase::plugins = 0; -TQPtrList<PluginBase::MimeClassInfo> *KJS::PluginBase::mimes = 0; -int KJS::PluginBase::m_refCount = 0; - -const ClassInfo Navigator::info = { "Navigator", 0, &NavigatorTable, 0 }; -/* -@begin NavigatorTable 12 - appCodeName Navigator::AppCodeName DontDelete|ReadOnly - appName Navigator::AppName DontDelete|ReadOnly - appVersion Navigator::AppVersion DontDelete|ReadOnly - language Navigator::Language DontDelete|ReadOnly - userAgent Navigator::UserAgent DontDelete|ReadOnly - userLanguage Navigator::UserLanguage DontDelete|ReadOnly - browserLanguage Navigator::BrowserLanguage DontDelete|ReadOnly - platform Navigator::Platform DontDelete|ReadOnly - cpuClass Navigator::CpuClass DontDelete|ReadOnly - plugins Navigator::_Plugins DontDelete|ReadOnly - mimeTypes Navigator::_MimeTypes DontDelete|ReadOnly - product Navigator::Product DontDelete|ReadOnly - vendor Navigator::Vendor DontDelete|ReadOnly - productSub Navigator::ProductSub DontDelete|ReadOnly - cookieEnabled Navigator::CookieEnabled DontDelete|ReadOnly - javaEnabled Navigator::JavaEnabled DontDelete|Function 0 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(NavigatorFunc) - -Navigator::Navigator(ExecState *exec, KHTMLPart *p) - : ObjectImp(exec->interpreter()->builtinObjectPrototype()), m_part(p) { } - -Value Navigator::get(ExecState *exec, const Identifier &propertyName) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "Navigator::get " << propertyName.ascii() << endl; -#endif - return lookupGet<NavigatorFunc,Navigator,ObjectImp>(exec,propertyName,&NavigatorTable,this); -} - -Value Navigator::getValueProperty(ExecState *exec, int token) const -{ - KURL url = m_part->url(); - TQString userAgent = url.host(); - if (userAgent.isEmpty()) - userAgent = "localhost"; - userAgent = KProtocolManager::userAgentForHost(userAgent); - switch (token) { - case AppCodeName: - return String("Mozilla"); - case AppName: - // If we find "Mozilla" but not "(compatible, ...)" we are a real Netscape - if (userAgent.find(TQString::fromLatin1("Mozilla")) >= 0 && - userAgent.find(TQString::fromLatin1("compatible")) == -1) - { - //kdDebug() << "appName -> Mozilla" << endl; - return String("Netscape"); - } - if (userAgent.find(TQString::fromLatin1("Microsoft")) >= 0 || - userAgent.find(TQString::fromLatin1("MSIE")) >= 0) - { - //kdDebug() << "appName -> IE" << endl; - return String("Microsoft Internet Explorer"); - } - //kdDebug() << "appName -> Konqueror" << endl; - return String("Konqueror"); - case AppVersion: - // We assume the string is something like Mozilla/version (properties) - return String(userAgent.mid(userAgent.find('/') + 1)); - case Product: - // We are pretending to be Mozilla or Safari - if (userAgent.find(TQString::fromLatin1("Mozilla")) >= 0 && - userAgent.find(TQString::fromLatin1("compatible")) == -1) - { - return String("Gecko"); - } - // When spoofing as IE, we use Undefined(). - if (userAgent.find(TQString::fromLatin1("Microsoft")) >= 0 || - userAgent.find(TQString::fromLatin1("MSIE")) >= 0) - { - return Undefined(); - } - // We are acting straight - return String("Konqueror/khtml"); - case ProductSub: - { - int ix = userAgent.find("Gecko"); - if (ix >= 0 && userAgent.length() >= (uint)ix+14 && userAgent.unicode()[ix+5] == TQChar('/') && - userAgent.find(TQRegExp("\\d{8}"), ix+6) == ix+6) - { - // We have Gecko/<productSub> in the UA string - return String(userAgent.mid(ix+6, 8)); - } - else if (ix >= 0) - { - return String("20040107"); - } - } - return Undefined(); - case Vendor: - return String("KDE"); - case BrowserLanguage: - case Language: - case UserLanguage: - return String(TDEGlobal::locale()->language()); - case UserAgent: - return String(userAgent); - case Platform: - // yet another evil hack, but necessary to spoof some sites... - if ( (userAgent.find(TQString::fromLatin1("Win"),0,false)>=0) ) - return String(TQString::fromLatin1("Win32")); - else if ( (userAgent.find(TQString::fromLatin1("Macintosh"),0,false)>=0) || - (userAgent.find(TQString::fromLatin1("Mac_PowerPC"),0,false)>=0) ) - return String(TQString::fromLatin1("MacPPC")); - else - { - struct utsname name; - int ret = uname(&name); - if ( ret >= 0 ) - return String(TQString(TQString::fromLatin1("%1 %1 X11").arg(name.sysname).arg(name.machine))); - else // can't happen - return String(TQString(TQString::fromLatin1("Unix X11"))); - } - case CpuClass: - { - struct utsname name; - int ret = uname(&name); - if ( ret >= 0 ) - return String(name.machine); - else // can't happen - return String("x86"); - } - case _Plugins: - return Value(new Plugins(exec, m_part->pluginsEnabled())); - case _MimeTypes: - return Value(new MimeTypes(exec, m_part->pluginsEnabled())); - case CookieEnabled: - return Boolean(true); /// ##### FIXME - default: - kdDebug(6070) << "WARNING: Unhandled token in DOMEvent::getValueProperty : " << token << endl; - return Value(); - } -} - -/*******************************************************************/ - -PluginBase::PluginBase(ExecState *exec, bool loadPluginInfo) - : ObjectImp(exec->interpreter()->builtinObjectPrototype() ) -{ - if ( loadPluginInfo && !plugins ) { - plugins = new TQPtrList<PluginInfo>; - mimes = new TQPtrList<MimeClassInfo>; - plugins->setAutoDelete( true ); - mimes->setAutoDelete( true ); - - // read in using KTrader - KTrader::OfferList offers = KTrader::self()->query("Browser/View"); - KTrader::OfferList::iterator it; - for ( it = offers.begin(); it != offers.end(); ++it ) { - - TQVariant pluginsinfo = (**it).property( "X-TDE-BrowserView-PluginsInfo" ); - if ( !pluginsinfo.isValid() ) { - // <backwards compatible> - if ((**it).library() == TQString("libnsplugin")) - pluginsinfo = TQVariant("nsplugins/pluginsinfo"); - else - // </backwards compatible> - continue; - } - // read configuration - TDEConfig kc( locate ("data", pluginsinfo.toString()) ); - unsigned num = (unsigned int) kc.readNumEntry("number"); - for ( unsigned n = 0; n < num; n++ ) { - kc.setGroup( TQString::number(n) ); - PluginInfo *plugin = new PluginInfo; - - plugin->name = kc.readEntry("name"); - plugin->file = kc.readPathEntry("file"); - plugin->desc = kc.readEntry("description"); - - plugins->append( plugin ); - - // get mime types from string - TQStringList types = TQStringList::split( ';', kc.readEntry("mime") ); - TQStringList::Iterator type; - for ( type=types.begin(); type!=types.end(); ++type ) { - - // get mime information - TQStringList tokens = TQStringList::split(':', *type, true); - if ( tokens.count() < 3 ) // we need 3 items - continue; - - MimeClassInfo *mime = new MimeClassInfo; - TQStringList::Iterator token = tokens.begin(); - mime->type = (*token).lower(); - //kdDebug(6070) << "mime->type=" << mime->type << endl; - ++token; - - mime->suffixes = *token; - ++token; - - mime->desc = *token; - ++token; - - mime->plugin = plugin; - - mimes->append( mime ); - plugin->mimes.append( mime ); - - } - } - } - } - - m_refCount++; -} - -PluginBase::~PluginBase() -{ - m_refCount--; - if ( m_refCount==0 ) { - delete plugins; - delete mimes; - plugins = 0; - mimes = 0; - } -} - - -/*******************************************************************/ - -const ClassInfo Plugins::info = { "PluginArray", 0, &PluginsTable, 0 }; -/* -@begin PluginsTable 4 - length Plugins_Length DontDelete|ReadOnly - refresh Plugins_Refresh DontDelete|Function 0 - item Plugins_Item DontDelete|Function 1 - namedItem Plugins_NamedItem DontDelete|Function 1 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(PluginsFunc) - -Value Plugins::get(ExecState *exec, const Identifier &propertyName) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "Plugins::get " << propertyName.qstring() << endl; -#endif - if (!pluginsEnabled()) { - if (propertyName == lengthPropertyName ) - return Number(0); - } else { - if ( propertyName == lengthPropertyName ) - return Number(plugins->count()); - - // plugins[#] - bool ok; - unsigned int i = propertyName.toULong(&ok); - if( ok && i<plugins->count() ) - return Value( new Plugin( exec, plugins->at(i) ) ); - - // plugin[name] - Value val = pluginByName( exec, propertyName.qstring() ); - if (!val.isA(UndefinedType)) - return val; - } - - return lookupGet<PluginsFunc,Plugins,ObjectImp>(exec,propertyName,&PluginsTable,this); -} - -Value Plugins::pluginByName( ExecState* exec, const TQString& name ) const -{ - Q_ASSERT(plugins); - for ( PluginInfo *pl = plugins->first(); pl!=0; pl = plugins->next() ) { - if ( pl->name == name ) - return Value( new Plugin( exec, pl ) ); - } - return Undefined(); -} - -Value Plugins::getValueProperty(ExecState* /*exec*/, int token) const -{ - kdDebug(6070) << "WARNING: Unhandled token in Plugins::getValueProperty : " << token << endl; - return Undefined(); -} - -Value PluginsFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::Plugins, thisObj ); - KJS::Plugins* base = static_cast<KJS::Plugins *>(thisObj.imp()); - if (!base->pluginsEnabled()) { - if (id == Plugins_Refresh || //## TODO - id == Plugins_Item || - id == Plugins_NamedItem) - return Undefined(); - } else { - switch( id ) { - case Plugins_Refresh: - return Undefined(); //## TODO - case Plugins_Item: - { - bool ok; - unsigned int i = args[0].toString(exec).toArrayIndex(&ok); - if( ok && i<base->plugins->count() ) - return Value( new Plugin( exec, base->plugins->at(i) ) ); - return Undefined(); - } - case Plugins_NamedItem: - UString s = args[0].toString(exec); - return base->pluginByName( exec, s.qstring() ); - } - } - kdDebug(6070) << "WARNING: Unhandled token in PluginsFunc::tryCall : " << id << endl; - return Undefined(); -} - -/*******************************************************************/ - -const ClassInfo MimeTypes::info = { "MimeTypeArray", 0, &MimeTypesTable, 0 }; -/* -@begin MimeTypesTable 3 - length MimeTypes_Length DontDelete|ReadOnly - item MimeTypes_Item DontDelete|Function 1 - namedItem MimeTypes_NamedItem DontDelete|Function 1 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(MimeTypesFunc) - -Value MimeTypes::get(ExecState *exec, const Identifier &propertyName) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "MimeTypes::get " << propertyName.qstring() << endl; -#endif - if (!pluginsEnabled()) { - if (propertyName == lengthPropertyName ) - return Number(0); - } else { - if( propertyName==lengthPropertyName ) - return Number( mimes->count() ); - - // mimeTypes[#] - bool ok; - unsigned int i = propertyName.toULong(&ok); - if( ok && i<mimes->count() ) - return Value( new MimeType( exec, mimes->at(i) ) ); - - // mimeTypes[name] - Value val = mimeTypeByName( exec, propertyName.qstring() ); - if (!val.isA(UndefinedType)) - return val; - } - - return lookupGet<MimeTypesFunc,MimeTypes,ObjectImp>(exec,propertyName,&MimeTypesTable,this); -} - -Value MimeTypes::mimeTypeByName( ExecState* exec, const TQString& name ) const -{ - //kdDebug(6070) << "MimeTypes[" << name << "]" << endl; - Q_ASSERT(mimes); - for ( MimeClassInfo *m = mimes->first(); m!=0; m = mimes->next() ) { - if ( m->type == name ) - return Value( new MimeType( exec, m ) ); - } - return Undefined(); -} - -Value MimeTypes::getValueProperty(ExecState* /*exec*/, int token) const -{ - kdDebug(6070) << "WARNING: Unhandled token in MimeTypes::getValueProperty : " << token << endl; - return Undefined(); -} - -Value MimeTypesFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::MimeTypes, thisObj ); - KJS::MimeTypes* base = static_cast<KJS::MimeTypes *>(thisObj.imp()); - if (!base->pluginsEnabled()) { - if (id == MimeTypes_Item || - id == MimeTypes_NamedItem) - return Undefined(); - } else { - switch( id ) { - case MimeTypes_Item: - { - bool ok; - unsigned int i = args[0].toString(exec).toArrayIndex(&ok); - if( ok && i<base->mimes->count() ) - return Value( new MimeType( exec, base->mimes->at(i) ) ); - return Undefined(); - } - case MimeTypes_NamedItem: - UString s = args[0].toString(exec); - return base->mimeTypeByName( exec, s.qstring() ); - } - } - kdDebug(6070) << "WARNING: Unhandled token in MimeTypesFunc::tryCall : " << id << endl; - return Undefined(); -} - -/************************************************************************/ -const ClassInfo Plugin::info = { "Plugin", 0, &PluginTable, 0 }; -/* -@begin PluginTable 7 - name Plugin_Name DontDelete|ReadOnly - filename Plugin_FileName DontDelete|ReadOnly - description Plugin_Description DontDelete|ReadOnly - length Plugin_Length DontDelete|ReadOnly - item Plugin_Item DontDelete|Function 1 - namedItem Plugin_NamedItem DontDelete|Function 1 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(PluginFunc) - -Value Plugin::get(ExecState *exec, const Identifier &propertyName) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "Plugin::get " << propertyName.qstring() << endl; -#endif - if ( propertyName == lengthPropertyName ) - return Number( m_info->mimes.count() ); - - // plugin[#] - bool ok; - unsigned int i = propertyName.toULong(&ok); - //kdDebug(6070) << "Plugin::get plugin[" << i << "]" << endl; - if( ok && i<m_info->mimes.count() ) - { - //kdDebug(6070) << "returning mimetype " << m_info->mimes.at(i)->type << endl; - return Value(new MimeType(exec, m_info->mimes.at(i))); - } - - // plugin["name"] - Value val = mimeByName( exec, propertyName.qstring() ); - if (!val.isA(UndefinedType)) - return val; - - return lookupGet<PluginFunc,Plugin,ObjectImp>(exec, propertyName, &PluginTable, this ); -} - -Value Plugin::mimeByName(ExecState* exec, const TQString& name) const -{ - for ( PluginBase::MimeClassInfo *m = m_info->mimes.first(); - m != 0; m = m_info->mimes.next() ) { - if ( m->type == name ) - return Value(new MimeType(exec, m)); - } - return Undefined(); -} - -Value Plugin::getValueProperty(ExecState* /*exec*/, int token) const -{ - switch( token ) { - case Plugin_Name: - return String( m_info->name ); - case Plugin_FileName: - return String( m_info->file ); - case Plugin_Description: - return String( m_info->desc ); - default: - kdDebug(6070) << "WARNING: Unhandled token in Plugin::getValueProperty : " << token << endl; - return Undefined(); - } -} - -Value PluginFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::Plugin, thisObj ); - KJS::Plugin* plugin = static_cast<KJS::Plugin *>(thisObj.imp()); - switch( id ) { - case Plugin_Item: - { - bool ok; - unsigned int i = args[0].toString(exec).toArrayIndex(&ok); - if( ok && i< plugin->pluginInfo()->mimes.count() ) - return Value( new MimeType( exec, plugin->pluginInfo()->mimes.at(i) ) ); - return Undefined(); - } - case Plugin_NamedItem: - { - UString s = args[0].toString(exec); - return plugin->mimeByName( exec, s.qstring() ); - } - default: - kdDebug(6070) << "WARNING: Unhandled token in PluginFunc::tryCall : " << id << endl; - return Undefined(); - } -} - -/*****************************************************************************/ - -const ClassInfo MimeType::info = { "MimeType", 0, &MimeTypeTable, 0 }; -/* -@begin MimeTypeTable 4 - description MimeType_Description DontDelete|ReadOnly - enabledPlugin MimeType_EnabledPlugin DontDelete|ReadOnly - suffixes MimeType_Suffixes DontDelete|ReadOnly - type MimeType_Type DontDelete|ReadOnly -@end -*/ - -Value MimeType::get(ExecState *exec, const Identifier &propertyName) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "MimeType::get " << propertyName.qstring() << endl; -#endif - return lookupGetValue<MimeType,ObjectImp>(exec, propertyName, &MimeTypeTable, this ); -} - -Value MimeType::getValueProperty(ExecState* exec, int token) const -{ - switch( token ) { - case MimeType_Type: - return String( m_info->type ); - case MimeType_Suffixes: - return String( m_info->suffixes ); - case MimeType_Description: - return String( m_info->desc ); - case MimeType_EnabledPlugin: - return Value(new Plugin(exec, m_info->plugin)); - default: - kdDebug(6070) << "WARNING: Unhandled token in MimeType::getValueProperty : " << token << endl; - return Undefined(); - } -} - - -Value NavigatorFunc::tryCall(ExecState *exec, Object &thisObj, const List &) -{ - KJS_CHECK_THIS( KJS::Navigator, thisObj ); - Navigator *nav = static_cast<Navigator *>(thisObj.imp()); - // javaEnabled() - return Boolean(nav->part()->javaEnabled()); -} diff --git a/khtml/ecma/kjs_navigator.h b/khtml/ecma/kjs_navigator.h deleted file mode 100644 index ccd1ba63b..000000000 --- a/khtml/ecma/kjs_navigator.h +++ /dev/null @@ -1,53 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2000 Harri Porten (porten@kde.org) - * - * 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 - */ - -#ifndef _KJS_NAVIGATOR_H_ -#define _KJS_NAVIGATOR_H_ - -#include <kjs/object.h> - -class KHTMLPart; - -namespace KJS { - - class Navigator : public ObjectImp { - public: - Navigator(ExecState *exec, KHTMLPart *p); - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { AppCodeName, AppName, AppVersion, Language, UserAgent, UserLanguage, Platform, - _Plugins, _MimeTypes, Product, ProductSub, Vendor, CookieEnabled, JavaEnabled, - BrowserLanguage, CpuClass }; - KHTMLPart *part() const { return m_part; } - private: - KHTMLPart *m_part; - }; - - // Hashtable enums - enum { Plugins_Refresh, Plugins_Length, Plugins_Item, Plugins_NamedItem }; - enum { MimeTypes_Length, MimeTypes_Item, MimeTypes_NamedItem }; - enum { Plugin_Name, Plugin_FileName, Plugin_Description, Plugin_Length, Plugin_Item, Plugin_NamedItem }; - enum { MimeType_Type, MimeType_Description, MimeType_EnabledPlugin, MimeType_Suffixes }; - -} // namespace - -#endif diff --git a/khtml/ecma/kjs_proxy.cpp b/khtml/ecma/kjs_proxy.cpp deleted file mode 100644 index ca26c5a0b..000000000 --- a/khtml/ecma/kjs_proxy.cpp +++ /dev/null @@ -1,411 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 1999-2001 Harri Porten (porten@kde.org) - * Copyright (C) 2001,2003 Peter Kelly (pmk@post.com) - * Copyright (C) 2001-2003 David Faure (faure@kde.org) - * - * 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 <config.h> - -#if defined(HAVE_VALGRIND_MEMCHECK_H) && !defined(NDEBUG) - -#include <valgrind/memcheck.h> -#define VALGRIND_SUPPORT - -#endif - - -#include "kjs_proxy.h" - -#include "kjs_window.h" -#include "kjs_events.h" -#include "kjs_debugwin.h" -#include "xml/dom_nodeimpl.h" -#include "khtmlpart_p.h" -#include <khtml_part.h> -#include <kprotocolmanager.h> -#include <kdebug.h> -#include <kmessagebox.h> -#include <klocale.h> -#include <unistd.h> -#include <signal.h> -#include <sys/time.h> -#include <assert.h> -#include <kjs/function.h> - -using namespace KJS; - -extern "C" { - KJSProxy *kjs_html_init(khtml::ChildFrame *childframe); -} - -namespace KJS { - -class KJSProxyImpl : public KJSProxy { -public: - KJSProxyImpl(khtml::ChildFrame *frame); - virtual ~KJSProxyImpl(); - virtual TQVariant evaluate(TQString filename, int baseLine, const TQString &, const DOM::Node &n, - Completion *completion = 0); - virtual void clear(); - virtual DOM::EventListener *createHTMLEventHandler(TQString sourceUrl, TQString name, TQString code, DOM::NodeImpl *node); - virtual void finishedWithEvent(const DOM::Event &event); - virtual KJS::Interpreter *interpreter(); - - virtual void setDebugEnabled(bool enabled); - virtual void showDebugWindow(bool show=true); - virtual bool paused() const; - virtual void dataReceived(); - - void initScript(); - void applyUserAgent(); - -private: - KJS::ScriptInterpreter* m_script; - bool m_debugEnabled; -#ifndef NDEBUG - static int s_count; -#endif -}; - -} // namespace KJS - -#ifndef NDEBUG -int KJSProxyImpl::s_count = 0; -#endif - -KJSProxyImpl::KJSProxyImpl(khtml::ChildFrame *frame) -{ - m_script = 0; - m_frame = frame; - m_debugEnabled = false; -#ifndef NDEBUG - s_count++; -#endif -} - -KJSProxyImpl::~KJSProxyImpl() -{ - if ( m_script ) { - //kdDebug() << "KJSProxyImpl::~KJSProxyImpl clearing global object " << m_script->globalObject().imp() << endl; - // This allows to delete the global-object properties, like all the protos - static_cast<ObjectImp*>(m_script->globalObject().imp())->deleteAllProperties( m_script->globalExec() ); - //kdDebug() << "KJSProxyImpl::~KJSProxyImpl garbage collecting" << endl; - while (KJS::Interpreter::collect()) - ; - //kdDebug() << "KJSProxyImpl::~KJSProxyImpl deleting interpreter " << m_script << endl; - delete m_script; - //kdDebug() << "KJSProxyImpl::~KJSProxyImpl garbage collecting again" << endl; - // Garbage collect - as many times as necessary - // (we could delete an object which was holding another object, so - // the deref() will happen too late for deleting the impl of the 2nd object). - while (KJS::Interpreter::collect()) - ; - } - -#ifndef NDEBUG - s_count--; - // If it was the last interpreter, we should have nothing left -#ifdef KJS_DEBUG_MEM - if ( s_count == 0 ) - Interpreter::finalCheck(); -#endif -#endif -} - -TQVariant KJSProxyImpl::evaluate(TQString filename, int baseLine, - const TQString&str, const DOM::Node &n, Completion *completion) { - // evaluate code. Returns the JS return value or an invalid QVariant - // if there was none, an error occurred or the type couldn't be converted. - - initScript(); - // inlineCode is true for <a href="javascript:doSomething()"> - // and false for <script>doSomething()</script>. Check if it has the - // expected value in all cases. - // See smart window.open policy for where this is used. - bool inlineCode = filename.isNull(); - //kdDebug(6070) << "KJSProxyImpl::evaluate inlineCode=" << inlineCode << endl; - -#ifdef KJS_DEBUGGER - if (inlineCode) - filename = "(unknown file)"; - if (KJSDebugWin::debugWindow()) { - KJSDebugWin::debugWindow()->attach(m_script); - KJSDebugWin::debugWindow()->setNextSourceInfo(filename,baseLine); - // KJSDebugWin::debugWindow()->setMode(KJSDebugWin::Step); - } -#else - Q_UNUSED(baseLine); -#endif - - m_script->setInlineCode(inlineCode); - Window* window = Window::retrieveWindow( m_frame->m_part ); - KJS::Value thisNode = n.isNull() ? Window::retrieve( m_frame->m_part ) : getDOMNode(m_script->globalExec(),n); - - UString code( str ); - - KJSCPUGuard guard; - guard.start(); - Completion comp = m_script->evaluate(code, thisNode); - guard.stop(); - - bool success = ( comp.complType() == Normal ) || ( comp.complType() == ReturnValue ); - - if (completion) - *completion = comp; - -#ifdef KJS_DEBUGGER - // KJSDebugWin::debugWindow()->setCode(TQString::null); -#endif - - window->afterScriptExecution(); - - // let's try to convert the return value - if (success && comp.value().isValid()) - return ValueToVariant( m_script->globalExec(), comp.value()); - else - { - if ( comp.complType() == Throw ) - { - UString msg = comp.value().toString(m_script->globalExec()); - kdDebug(6070) << "WARNING: Script threw exception: " << msg.qstring() << endl; - } - return TQVariant(); - } -} - -// Implementation of the debug() function -class TestFunctionImp : public ObjectImp { -public: - TestFunctionImp() : ObjectImp() {} - virtual bool implementsCall() const { return true; } - virtual Value call(ExecState *exec, Object &thisObj, const List &args); -}; - -Value TestFunctionImp::call(ExecState *exec, Object &/*thisObj*/, const List &args) -{ - fprintf(stderr,"--> %s\n",args[0].toString(exec).ascii()); - return Undefined(); -} - -void KJSProxyImpl::clear() { - // clear resources allocated by the interpreter, and make it ready to be used by another page - // We have to keep it, so that the Window object for the part remains the same. - // (we used to delete and re-create it, previously) - if (m_script) { -#ifdef KJS_DEBUGGER - // ### - KJSDebugWin *debugWin = KJSDebugWin::debugWindow(); - if (debugWin) { - if (debugWin->getExecState() && - debugWin->getExecState()->interpreter() == m_script) - debugWin->slotStop(); - debugWin->clearInterpreter(m_script); - } -#endif - m_script->clear(); - - Window *win = static_cast<Window *>(m_script->globalObject().imp()); - if (win) { - win->clear( m_script->globalExec() ); - // re-add "debug", clear() removed it - m_script->globalObject().put(m_script->globalExec(), - "debug", Value(new TestFunctionImp()), Internal); - if ( win->part() ) - applyUserAgent(); - } - - // Really delete everything that can be, so that the DOM nodes get deref'ed - //kdDebug() << k_funcinfo << "all done -> collecting" << endl; - while (KJS::Interpreter::collect()) - ; - } -} - -DOM::EventListener *KJSProxyImpl::createHTMLEventHandler(TQString sourceUrl, TQString name, TQString code, DOM::NodeImpl *node) -{ - initScript(); - -#ifdef KJS_DEBUGGER - if (KJSDebugWin::debugWindow()) { - KJSDebugWin::debugWindow()->attach(m_script); - KJSDebugWin::debugWindow()->setNextSourceInfo(sourceUrl,m_handlerLineno); - } -#else - Q_UNUSED(sourceUrl); -#endif - - return KJS::Window::retrieveWindow(m_frame->m_part)->getJSLazyEventListener(code,name,node); -} - -void KJSProxyImpl::finishedWithEvent(const DOM::Event &event) -{ - // This is called when the DOM implementation has finished with a particular event. This - // is the case in sitations where an event has been created just for temporary usage, - // e.g. an image load or mouse move. Once the event has been dispatched, it is forgotten - // by the DOM implementation and so does not need to be cached still by the interpreter - ScriptInterpreter::forgetDOMObject(event.handle()); -} - -KJS::Interpreter *KJSProxyImpl::interpreter() -{ - if (!m_script) - initScript(); - return m_script; -} - -void KJSProxyImpl::setDebugEnabled(bool enabled) -{ -#ifdef KJS_DEBUGGER - m_debugEnabled = enabled; - //if (m_script) - // m_script->setDebuggingEnabled(enabled); - // NOTE: this is consistent across all KJSProxyImpl instances, as we only - // ever have 1 debug window - if (!enabled && KJSDebugWin::debugWindow()) { - KJSDebugWin::destroyInstance(); - } - else if (enabled && !KJSDebugWin::debugWindow()) { - KJSDebugWin::createInstance(); - initScript(); - KJSDebugWin::debugWindow()->attach(m_script); - } -#else - Q_UNUSED(enabled); -#endif -} - -void KJSProxyImpl::showDebugWindow(bool /*show*/) -{ -#ifdef KJS_DEBUGGER - if (KJSDebugWin::debugWindow()) - KJSDebugWin::debugWindow()->show(); -#else - //Q_UNUSED(show); -#endif -} - -bool KJSProxyImpl::paused() const -{ -#ifdef KJS_DEBUGGER - if (KJSDebugWin::debugWindow()) - return KJSDebugWin::debugWindow()->inSession(); -#endif - return false; -} - -void KJSProxyImpl::dataReceived() -{ -#ifdef KJS_DEBUGGER - if (KJSDebugWin::debugWindow() && m_frame->m_part) - KJSDebugWin::debugWindow()->sourceChanged(m_script,m_frame->m_part->url().url()); -#endif -} - -void KJSProxyImpl::initScript() -{ - if (m_script) - return; - - // Build the global object - which is a Window instance - Object globalObject( new Window(m_frame) ); - - // Create a KJS interpreter for this part - m_script = new KJS::ScriptInterpreter(globalObject, m_frame); - static_cast<ObjectImp*>(globalObject.imp())->setPrototype(m_script->builtinObjectPrototype()); - -#ifdef KJS_DEBUGGER - //m_script->setDebuggingEnabled(m_debugEnabled); -#endif - //m_script->enableDebug(); - globalObject.put(m_script->globalExec(), - "debug", Value(new TestFunctionImp()), Internal); - applyUserAgent(); -} - -void KJSProxyImpl::applyUserAgent() -{ - assert( m_script ); - TQString host = m_frame->m_part->url().isLocalFile() ? "localhost" : m_frame->m_part->url().host(); - TQString userAgent = KProtocolManager::userAgentForHost(host); - if (userAgent.find(TQString::fromLatin1("Microsoft")) >= 0 || - userAgent.find(TQString::fromLatin1("MSIE")) >= 0) - { - m_script->setCompatMode(Interpreter::IECompat); -#ifdef KJS_VERBOSE - kdDebug() << "Setting IE compat mode" << endl; -#endif - } - else - // If we find "Mozilla" but not "(compatible, ...)" we are a real Netscape - if (userAgent.find(TQString::fromLatin1("Mozilla")) >= 0 && - userAgent.find(TQString::fromLatin1("compatible")) == -1 && - userAgent.find(TQString::fromLatin1("KHTML")) == -1) - { - m_script->setCompatMode(Interpreter::NetscapeCompat); -#ifdef KJS_VERBOSE - kdDebug() << "Setting NS compat mode" << endl; -#endif - } -} - -// Helper method, so that all classes which need jScript() don't need to be added -// as friend to KHTMLPart -KJSProxy * KJSProxy::proxy( KHTMLPart *part ) -{ - return part->jScript(); -} - -// initialize HTML module -KJSProxy *kjs_html_init(khtml::ChildFrame *childframe) -{ - return new KJSProxyImpl(childframe); -} - -void KJSCPUGuard::start(unsigned int ms, unsigned int i_ms) -{ -#ifdef VALGRIND_SUPPORT - if (RUNNING_ON_VALGRIND) { - ms *= 50; - i_ms *= 50; - } -#endif - - oldAlarmHandler = signal(SIGVTALRM, alarmHandler); - itimerval tv = { - { i_ms / 1000, (i_ms % 1000) * 1000 }, - { ms / 1000, (ms % 1000) * 1000 } - }; - setitimer(ITIMER_VIRTUAL, &tv, &oldtv); -} - -void KJSCPUGuard::stop() -{ - setitimer(ITIMER_VIRTUAL, &oldtv, 0L); - signal(SIGVTALRM, oldAlarmHandler); -} - -bool KJSCPUGuard::confirmTerminate() { - kdDebug(6070) << "alarmhandler" << endl; - return KMessageBox::warningYesNo(0L, i18n("A script on this page is causing KHTML to freeze. If it continues to run, other applications may become less responsive.\nDo you want to abort the script?"), i18n("JavaScript"), i18n("&Abort"), KStdGuiItem::cont(), "kjscupguard_alarmhandler") == KMessageBox::Yes; -} - -void KJSCPUGuard::alarmHandler(int) { - ExecState::requestTerminate(); - ExecState::confirmTerminate = KJSCPUGuard::confirmTerminate; -} diff --git a/khtml/ecma/kjs_proxy.h b/khtml/ecma/kjs_proxy.h deleted file mode 100644 index dde30b070..000000000 --- a/khtml/ecma/kjs_proxy.h +++ /dev/null @@ -1,91 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 1999 Harri Porten (porten@kde.org) - * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * - * 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 - */ - -#ifndef _KJS_PROXY_H_ -#define _KJS_PROXY_H_ - -#include <tqvariant.h> -#include <tqstring.h> -#include <sys/time.h> - -class KHTMLPart; - -namespace DOM { - class Node; - class NodeImpl; - class EventListener; - class Event; -} - -namespace KJS { - class List; - class Interpreter; - class Completion; - class KJSDebugWin; -} - -namespace khtml { - class ChildFrame; -} - -/** - * @internal - * - * @short Proxy class serving as interface when being dlopen'ed. - */ -class KJSProxy { -public: - KJSProxy() { m_handlerLineno = 0; } - virtual ~KJSProxy() { } - virtual TQVariant evaluate(TQString filename, int baseLine, const TQString &, const DOM::Node &n, - KJS::Completion *completion = 0) = 0; - virtual void clear() = 0; - virtual DOM::EventListener *createHTMLEventHandler(TQString sourceUrl, TQString name, TQString code, DOM::NodeImpl* node) = 0; - virtual void finishedWithEvent(const DOM::Event &event) = 0; - virtual KJS::Interpreter *interpreter() = 0; - - virtual void setDebugEnabled(bool enabled) = 0; - virtual void showDebugWindow(bool show=true) = 0; - virtual bool paused() const = 0; - virtual void dataReceived() = 0; - - void setEventHandlerLineno(int lineno) { m_handlerLineno = lineno; } - - khtml::ChildFrame *m_frame; - int m_handlerLineno; - - // Helper method, to access the private KHTMLPart::jScript() - static KJSProxy *proxy( KHTMLPart *part ); -}; - -class KJSCPUGuard { -public: - KJSCPUGuard() {} - void start(unsigned int msec=5000, unsigned int i_msec=10000); - void stop(); -private: - void (*oldAlarmHandler)(int); - static void alarmHandler(int); - static bool confirmTerminate(); - itimerval oldtv; -}; - -#endif diff --git a/khtml/ecma/kjs_range.cpp b/khtml/ecma/kjs_range.cpp deleted file mode 100644 index bf148ffe8..000000000 --- a/khtml/ecma/kjs_range.cpp +++ /dev/null @@ -1,233 +0,0 @@ - -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * 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 "kjs_range.h" -#include "kjs_range.lut.h" -#include <kdebug.h> - -namespace KJS { - -// ------------------------------------------------------------------------- - -const ClassInfo DOMRange::info = { "Range", 0, &DOMRangeTable, 0 }; -/* -@begin DOMRangeTable 7 - startContainer DOMRange::StartContainer DontDelete|ReadOnly - startOffset DOMRange::StartOffset DontDelete|ReadOnly - endContainer DOMRange::EndContainer DontDelete|ReadOnly - endOffset DOMRange::EndOffset DontDelete|ReadOnly - collapsed DOMRange::Collapsed DontDelete|ReadOnly - commonAncestorContainer DOMRange::CommonAncestorContainer DontDelete|ReadOnly -@end -@begin DOMRangeProtoTable 17 -setStart DOMRange::SetStart DontDelete|Function 2 - setEnd DOMRange::SetEnd DontDelete|Function 2 - setStartBefore DOMRange::SetStartBefore DontDelete|Function 1 - setStartAfter DOMRange::SetStartAfter DontDelete|Function 1 - setEndBefore DOMRange::SetEndBefore DontDelete|Function 1 - setEndAfter DOMRange::SetEndAfter DontDelete|Function 1 - collapse DOMRange::Collapse DontDelete|Function 1 - selectNode DOMRange::SelectNode DontDelete|Function 1 - selectNodeContents DOMRange::SelectNodeContents DontDelete|Function 1 - compareBoundaryPoints DOMRange::CompareBoundaryPoints DontDelete|Function 2 - deleteContents DOMRange::DeleteContents DontDelete|Function 0 - extractContents DOMRange::ExtractContents DontDelete|Function 0 - cloneContents DOMRange::CloneContents DontDelete|Function 0 - insertNode DOMRange::InsertNode DontDelete|Function 1 - surroundContents DOMRange::SurroundContents DontDelete|Function 1 - cloneRange DOMRange::CloneRange DontDelete|Function 0 - toString DOMRange::ToString DontDelete|Function 0 - detach DOMRange::Detach DontDelete|Function 0 - createContextualFragment DOMRange::CreateContextualFragment DontDelete|Function 1 -@end -*/ -KJS_DEFINE_PROTOTYPE(DOMRangeProto) -IMPLEMENT_PROTOFUNC_DOM(DOMRangeProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMRange",DOMRangeProto,DOMRangeProtoFunc) - -DOMRange::DOMRange(ExecState *exec, DOM::Range r) - : DOMObject(DOMRangeProto::self(exec)), range(r) {} - -DOMRange::~DOMRange() -{ - ScriptInterpreter::forgetDOMObject(range.handle()); -} - -Value DOMRange::tryGet(ExecState *exec, const Identifier &p) const -{ - return DOMObjectLookupGetValue<DOMRange,DOMObject>(exec,p,&DOMRangeTable,this); -} - -Value DOMRange::getValueProperty(ExecState *exec, int token) const -{ - switch (token) { - case StartContainer: - return getDOMNode(exec,range.startContainer()); - case StartOffset: - return Number(range.startOffset()); - case EndContainer: - return getDOMNode(exec,range.endContainer()); - case EndOffset: - return Number(range.endOffset()); - case Collapsed: - return Boolean(range.collapsed()); - case CommonAncestorContainer: { - DOM::Range range2 = range; // avoid const error - return getDOMNode(exec,range2.commonAncestorContainer()); - } - default: - kdDebug(6070) << "WARNING: Unhandled token in DOMRange::getValueProperty : " << token << endl; - return Value(); - } -} - -Value DOMRangeProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMRange, thisObj ); - DOM::Range range = static_cast<DOMRange *>(thisObj.imp())->toRange(); - Value result; - - switch (id) { - case DOMRange::SetStart: - range.setStart(toNode(args[0]),args[1].toInteger(exec)); - result = Undefined(); - break; - case DOMRange::SetEnd: - range.setEnd(toNode(args[0]),args[1].toInteger(exec)); - result = Undefined(); - break; - case DOMRange::SetStartBefore: - range.setStartBefore(toNode(args[0])); - result = Undefined(); - break; - case DOMRange::SetStartAfter: - range.setStartAfter(toNode(args[0])); - result = Undefined(); - break; - case DOMRange::SetEndBefore: - range.setEndBefore(toNode(args[0])); - result = Undefined(); - break; - case DOMRange::SetEndAfter: - range.setEndAfter(toNode(args[0])); - result = Undefined(); - break; - case DOMRange::Collapse: - range.collapse(args[0].toBoolean(exec)); - result = Undefined(); - break; - case DOMRange::SelectNode: - range.selectNode(toNode(args[0])); - result = Undefined(); - break; - case DOMRange::SelectNodeContents: - range.selectNodeContents(toNode(args[0])); - result = Undefined(); - break; - case DOMRange::CompareBoundaryPoints: - result = Number(range.compareBoundaryPoints(static_cast<DOM::Range::CompareHow>(args[0].toInteger(exec)),toRange(args[1]))); - break; - case DOMRange::DeleteContents: - range.deleteContents(); - result = Undefined(); - break; - case DOMRange::ExtractContents: - result = getDOMNode(exec,range.extractContents()); - break; - case DOMRange::CloneContents: - result = getDOMNode(exec,range.cloneContents()); - break; - case DOMRange::InsertNode: - range.insertNode(toNode(args[0])); - result = Undefined(); - break; - case DOMRange::SurroundContents: - range.surroundContents(toNode(args[0])); - result = Undefined(); - break; - case DOMRange::CloneRange: - result = getDOMRange(exec,range.cloneRange()); - break; - case DOMRange::ToString: - result = String(range.toString()); - break; - case DOMRange::Detach: - range.detach(); - result = Undefined(); - break; - case DOMRange::CreateContextualFragment: - Value value = args[0]; - DOM::DOMString str = value.isA(NullType) ? DOM::DOMString() : value.toString(exec).string(); - result = getDOMNode(exec, range.createContextualFragment(str)); - break; - }; - - return result; -} - -Value getDOMRange(ExecState *exec, DOM::Range r) -{ - return cacheDOMObject<DOM::Range, KJS::DOMRange>(exec, r); -} - -// ------------------------------------------------------------------------- - -const ClassInfo RangeConstructor::info = { "RangeConstructor", 0, &RangeConstructorTable, 0 }; -/* -@begin RangeConstructorTable 5 - START_TO_START DOM::Range::START_TO_START DontDelete|ReadOnly - START_TO_END DOM::Range::START_TO_END DontDelete|ReadOnly - END_TO_END DOM::Range::END_TO_END DontDelete|ReadOnly - END_TO_START DOM::Range::END_TO_START DontDelete|ReadOnly -@end -*/ - -RangeConstructor::RangeConstructor(ExecState *exec) - : DOMObject(exec->interpreter()->builtinObjectPrototype()) { } - -Value RangeConstructor::tryGet(ExecState *exec, const Identifier &p) const -{ - return DOMObjectLookupGetValue<RangeConstructor,DOMObject>(exec,p,&RangeConstructorTable,this); -} - -Value RangeConstructor::getValueProperty(ExecState *, int token) const -{ - return Number(token); -} - -Value getRangeConstructor(ExecState *exec) -{ - return cacheGlobalObject<RangeConstructor>(exec, "[[range.constructor]]"); -} - - -DOM::Range toRange(const Value& val) -{ - Object obj = Object::dynamicCast(val); - if (!obj.isValid() || !obj.inherits(&DOMRange::info)) - return DOM::Range(); - - const DOMRange *dobj = static_cast<const DOMRange*>(obj.imp()); - return dobj->toRange(); -} - -} //namespace KJS diff --git a/khtml/ecma/kjs_range.h b/khtml/ecma/kjs_range.h deleted file mode 100644 index fbf47020f..000000000 --- a/khtml/ecma/kjs_range.h +++ /dev/null @@ -1,71 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * - * 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 - */ - -#ifndef _KJS_RANGE_H_ -#define _KJS_RANGE_H_ - -#include "ecma/kjs_dom.h" -#include "dom/dom2_range.h" - -namespace KJS { - - class DOMRange : public DOMObject { - public: - DOMRange(ExecState *exec, DOM::Range r); - ~DOMRange(); - virtual Value tryGet(ExecState *exec,const Identifier &p) const; - Value getValueProperty(ExecState *exec, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { StartContainer, StartOffset, EndContainer, EndOffset, Collapsed, - CommonAncestorContainer, - SetStart, SetEnd, SetStartBefore, SetStartAfter, SetEndBefore, - SetEndAfter, Collapse, SelectNode, SelectNodeContents, - CompareBoundaryPoints, DeleteContents, ExtractContents, - CloneContents, InsertNode, SurroundContents, CloneRange, ToString, - Detach, CreateContextualFragment }; - DOM::Range toRange() const { return range; } - protected: - DOM::Range range; - }; - - // Constructor object Range - class RangeConstructor : public DOMObject { - public: - RangeConstructor(ExecState *); - virtual Value tryGet(ExecState *exec,const Identifier &p) const; - Value getValueProperty(ExecState *, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - }; - - Value getDOMRange(ExecState *exec, DOM::Range r); - Value getRangeConstructor(ExecState *exec); - - /** - * Convert an object to a Range. Returns a null Node if not possible. - */ - DOM::Range toRange(const Value&); - -} // namespace - -#endif diff --git a/khtml/ecma/kjs_traversal.cpp b/khtml/ecma/kjs_traversal.cpp deleted file mode 100644 index 5b521b6d5..000000000 --- a/khtml/ecma/kjs_traversal.cpp +++ /dev/null @@ -1,327 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * - * 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 "kjs_traversal.h" -#include "kjs_traversal.lut.h" -#include "kjs_proxy.h" -#include <dom/dom_node.h> -#include <xml/dom_nodeimpl.h> -#include <xml/dom_docimpl.h> -#include <khtmlview.h> -#include <khtml_part.h> -#include <kdebug.h> - -namespace KJS { - -// ------------------------------------------------------------------------- - -const ClassInfo DOMNodeIterator::info = { "NodeIterator", 0, &DOMNodeIteratorTable, 0 }; -/* -@begin DOMNodeIteratorTable 5 - root DOMNodeIterator::Root DontDelete|ReadOnly - whatToShow DOMNodeIterator::WhatToShow DontDelete|ReadOnly - filter DOMNodeIterator::Filter DontDelete|ReadOnly - expandEntityReferences DOMNodeIterator::ExpandEntityReferences DontDelete|ReadOnly -@end -@begin DOMNodeIteratorProtoTable 3 - nextNode DOMNodeIterator::NextNode DontDelete|Function 0 - previousNode DOMNodeIterator::PreviousNode DontDelete|Function 0 - detach DOMNodeIterator::Detach DontDelete|Function 0 -@end -*/ -KJS_DEFINE_PROTOTYPE(DOMNodeIteratorProto) -IMPLEMENT_PROTOFUNC_DOM(DOMNodeIteratorProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMNodeIterator", DOMNodeIteratorProto,DOMNodeIteratorProtoFunc) - -DOMNodeIterator::DOMNodeIterator(ExecState *exec, DOM::NodeIterator ni) - : DOMObject(DOMNodeIteratorProto::self(exec)), nodeIterator(ni) {} - -DOMNodeIterator::~DOMNodeIterator() -{ - ScriptInterpreter::forgetDOMObject(nodeIterator.handle()); -} - -Value DOMNodeIterator::tryGet(ExecState *exec, const Identifier &p) const -{ - return DOMObjectLookupGetValue<DOMNodeIterator,DOMObject>(exec,p,&DOMNodeIteratorTable,this); -} - -Value DOMNodeIterator::getValueProperty(ExecState *exec, int token) const -{ - DOM::NodeIterator ni(nodeIterator); - switch (token) { - case Root: - return getDOMNode(exec,ni.root()); - case WhatToShow: - return Number(ni.whatToShow()); - case Filter: - return getDOMNodeFilter(exec,ni.filter()); - case ExpandEntityReferences: - return Boolean(ni.expandEntityReferences()); - default: - kdDebug(6070) << "WARNING: Unhandled token in DOMNodeIterator::getValueProperty : " << token << endl; - return Value(); - } -} - -Value DOMNodeIteratorProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &) -{ - KJS_CHECK_THIS( KJS::DOMNodeIterator, thisObj ); - DOM::NodeIterator nodeIterator = static_cast<DOMNodeIterator *>(thisObj.imp())->toNodeIterator(); - switch (id) { - case DOMNodeIterator::PreviousNode: - return getDOMNode(exec,nodeIterator.previousNode()); - case DOMNodeIterator::NextNode: - return getDOMNode(exec,nodeIterator.nextNode()); - case DOMNodeIterator::Detach: - nodeIterator.detach(); - return Undefined(); - } - return Undefined(); -} - -Value getDOMNodeIterator(ExecState *exec, DOM::NodeIterator ni) -{ - return cacheDOMObject<DOM::NodeIterator, DOMNodeIterator>(exec, ni); -} - - -// ------------------------------------------------------------------------- - -const ClassInfo NodeFilterConstructor::info = { "NodeFilterConstructor", 0, &NodeFilterConstructorTable, 0 }; -/* -@begin NodeFilterConstructorTable 17 - FILTER_ACCEPT DOM::NodeFilter::FILTER_ACCEPT DontDelete|ReadOnly - FILTER_REJECT DOM::NodeFilter::FILTER_REJECT DontDelete|ReadOnly - FILTER_SKIP DOM::NodeFilter::FILTER_SKIP DontDelete|ReadOnly - SHOW_ALL DOM::NodeFilter::SHOW_ALL DontDelete|ReadOnly - SHOW_ELEMENT DOM::NodeFilter::SHOW_ELEMENT DontDelete|ReadOnly - SHOW_ATTRIBUTE DOM::NodeFilter::SHOW_ATTRIBUTE DontDelete|ReadOnly - SHOW_TEXT DOM::NodeFilter::SHOW_TEXT DontDelete|ReadOnly - SHOW_CDATA_SECTION DOM::NodeFilter::SHOW_CDATA_SECTION DontDelete|ReadOnly - SHOW_ENTITY_REFERENCE DOM::NodeFilter::SHOW_ENTITY_REFERENCE DontDelete|ReadOnly - SHOW_ENTITY DOM::NodeFilter::SHOW_ENTITY DontDelete|ReadOnly - SHOW_PROCESSING_INSTRUCTION DOM::NodeFilter::SHOW_PROCESSING_INSTRUCTION DontDelete|ReadOnly - SHOW_COMMENT DOM::NodeFilter::SHOW_COMMENT DontDelete|ReadOnly - SHOW_DOCUMENT DOM::NodeFilter::SHOW_DOCUMENT DontDelete|ReadOnly - SHOW_DOCUMENT_TYPE DOM::NodeFilter::SHOW_DOCUMENT_TYPE DontDelete|ReadOnly - SHOW_DOCUMENT_FRAGMENT DOM::NodeFilter::SHOW_DOCUMENT_FRAGMENT DontDelete|ReadOnly - SHOW_NOTATION DOM::NodeFilter::SHOW_NOTATION DontDelete|ReadOnly -@end -*/ - -NodeFilterConstructor::NodeFilterConstructor(ExecState* exec) - : DOMObject(exec->interpreter()->builtinObjectPrototype()) -{ -} - -Value NodeFilterConstructor::tryGet(ExecState *exec, const Identifier &p) const -{ - return DOMObjectLookupGetValue<NodeFilterConstructor,DOMObject>(exec,p,&NodeFilterConstructorTable,this); -} - -Value NodeFilterConstructor::getValueProperty(ExecState *, int token) const -{ - // We use the token as the value to return directly - return Number(token); -} - -Value getNodeFilterConstructor(ExecState *exec) -{ - return cacheGlobalObject<NodeFilterConstructor>(exec, "[[nodeFilter.constructor]]"); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMNodeFilter::info = { "NodeFilter", 0, 0, 0 }; -/* -@begin DOMNodeFilterProtoTable 1 - acceptNode DOMNodeFilter::AcceptNode DontDelete|Function 0 -@end -*/ -KJS_DEFINE_PROTOTYPE(DOMNodeFilterProto) -IMPLEMENT_PROTOFUNC_DOM(DOMNodeFilterProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMNodeFilter",DOMNodeFilterProto,DOMNodeFilterProtoFunc) - -DOMNodeFilter::DOMNodeFilter(ExecState *exec, DOM::NodeFilter nf) - : DOMObject(DOMNodeFilterProto::self(exec)), nodeFilter(nf) {} - -DOMNodeFilter::~DOMNodeFilter() -{ - ScriptInterpreter::forgetDOMObject(nodeFilter.handle()); -} - -Value DOMNodeFilterProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMNodeFilter, thisObj ); - DOM::NodeFilter nodeFilter = static_cast<DOMNodeFilter *>(thisObj.imp())->toNodeFilter(); - switch (id) { - case DOMNodeFilter::AcceptNode: - return Number(nodeFilter.acceptNode(toNode(args[0]))); - } - return Undefined(); -} - -Value getDOMNodeFilter(ExecState *exec, DOM::NodeFilter nf) -{ - return cacheDOMObject<DOM::NodeFilter, DOMNodeFilter>(exec, nf); -} - -// ------------------------------------------------------------------------- - -const ClassInfo DOMTreeWalker::info = { "TreeWalker", 0, &DOMTreeWalkerTable, 0 }; -/* -@begin DOMTreeWalkerTable 5 - root DOMTreeWalker::Root DontDelete|ReadOnly - whatToShow DOMTreeWalker::WhatToShow DontDelete|ReadOnly - filter DOMTreeWalker::Filter DontDelete|ReadOnly - expandEntityReferences DOMTreeWalker::ExpandEntityReferences DontDelete|ReadOnly - currentNode DOMTreeWalker::CurrentNode DontDelete -@end -@begin DOMTreeWalkerProtoTable 7 - parentNode DOMTreeWalker::ParentNode DontDelete|Function 0 - firstChild DOMTreeWalker::FirstChild DontDelete|Function 0 - lastChild DOMTreeWalker::LastChild DontDelete|Function 0 - previousSibling DOMTreeWalker::PreviousSibling DontDelete|Function 0 - nextSibling DOMTreeWalker::NextSibling DontDelete|Function 0 - previousNode DOMTreeWalker::PreviousNode DontDelete|Function 0 - nextNode DOMTreeWalker::NextNode DontDelete|Function 0 -@end -*/ -KJS_DEFINE_PROTOTYPE(DOMTreeWalkerProto) -IMPLEMENT_PROTOFUNC_DOM(DOMTreeWalkerProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("DOMTreeWalker", DOMTreeWalkerProto,DOMTreeWalkerProtoFunc) - -DOMTreeWalker::DOMTreeWalker(ExecState *exec, DOM::TreeWalker tw) - : DOMObject(DOMTreeWalkerProto::self(exec)), treeWalker(tw) {} - -DOMTreeWalker::~DOMTreeWalker() -{ - ScriptInterpreter::forgetDOMObject(treeWalker.handle()); -} - -Value DOMTreeWalker::tryGet(ExecState *exec, const Identifier &p) const -{ - return DOMObjectLookupGetValue<DOMTreeWalker,DOMObject>(exec,p,&DOMTreeWalkerTable,this); -} - -Value DOMTreeWalker::getValueProperty(ExecState *exec, int token) const -{ - DOM::TreeWalker tw(treeWalker); - switch (token) { - case Root: - return getDOMNode(exec,tw.root()); - case WhatToShow: - return Number(tw.whatToShow()); - case Filter: - return getDOMNodeFilter(exec,tw.filter()); - case ExpandEntityReferences: - return Boolean(tw.expandEntityReferences()); - case CurrentNode: - return getDOMNode(exec,tw.currentNode()); - default: - kdDebug(6070) << "WARNING: Unhandled token in DOMTreeWalker::getValueProperty : " << token << endl; - return Value(); - } -} - -void DOMTreeWalker::tryPut(ExecState *exec, const Identifier &propertyName, - const Value& value, int attr) -{ - if (propertyName == "currentNode") { - treeWalker.setCurrentNode(toNode(value)); - } - else - ObjectImp::put(exec, propertyName, value, attr); -} - -Value DOMTreeWalkerProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &) -{ - KJS_CHECK_THIS( KJS::DOMTreeWalker, thisObj ); - DOM::TreeWalker treeWalker = static_cast<DOMTreeWalker *>(thisObj.imp())->toTreeWalker(); - switch (id) { - case DOMTreeWalker::ParentNode: - return getDOMNode(exec,treeWalker.parentNode()); - case DOMTreeWalker::FirstChild: - return getDOMNode(exec,treeWalker.firstChild()); - case DOMTreeWalker::LastChild: - return getDOMNode(exec,treeWalker.lastChild()); - case DOMTreeWalker::PreviousSibling: - return getDOMNode(exec,treeWalker.previousSibling()); - case DOMTreeWalker::NextSibling: - return getDOMNode(exec,treeWalker.nextSibling()); - case DOMTreeWalker::PreviousNode: - return getDOMNode(exec,treeWalker.previousSibling()); - case DOMTreeWalker::NextNode: - return getDOMNode(exec,treeWalker.nextNode()); - } - return Undefined(); -} - -Value getDOMTreeWalker(ExecState *exec, DOM::TreeWalker tw) -{ - return cacheDOMObject<DOM::TreeWalker, DOMTreeWalker>(exec, tw); -} - -DOM::NodeFilter toNodeFilter(const Value& val) -{ - Object obj = Object::dynamicCast(val); - if (!obj.isValid() || !obj.inherits(&DOMNodeFilter::info)) - return DOM::NodeFilter(); - - const DOMNodeFilter *dobj = static_cast<const DOMNodeFilter*>(obj.imp()); - return dobj->toNodeFilter(); -} - -// ------------------------------------------------------------------------- - -JSNodeFilter::JSNodeFilter(Object & _filter) : DOM::CustomNodeFilter(), filter( _filter ) -{ -} - -JSNodeFilter::~JSNodeFilter() -{ -} - -short JSNodeFilter::acceptNode(const DOM::Node &n) -{ - KHTMLView *view = static_cast<DOM::DocumentImpl *>( n.handle()->docPtr() )->view(); - if (!view) - return DOM::NodeFilter::FILTER_REJECT; - - KHTMLPart *part = view->part(); - KJSProxy *proxy = part->jScript(); - if (proxy) { - ExecState *exec = proxy->interpreter()->globalExec(); - Object acceptNodeFunc = Object::dynamicCast( filter.get(exec, "acceptNode") ); - if (!acceptNodeFunc.isNull() && acceptNodeFunc.implementsCall()) { - List args; - args.append(getDOMNode(exec,n)); - Value result = acceptNodeFunc.call(exec,filter,args); - if (exec->hadException()) - exec->clearException(); - return result.toInteger(exec); - } - } - - return DOM::NodeFilter::FILTER_REJECT; -} - -} //namespace KJS diff --git a/khtml/ecma/kjs_traversal.h b/khtml/ecma/kjs_traversal.h deleted file mode 100644 index fd7e064b1..000000000 --- a/khtml/ecma/kjs_traversal.h +++ /dev/null @@ -1,108 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * - * 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 - */ - -#ifndef _KJS_TRAVERSAL_H_ -#define _KJS_TRAVERSAL_H_ - -#include "ecma/kjs_dom.h" -#include "dom/dom2_traversal.h" - -namespace KJS { - - class DOMNodeIterator : public DOMObject { - public: - DOMNodeIterator(ExecState *exec, DOM::NodeIterator ni); - ~DOMNodeIterator(); - virtual Value tryGet(ExecState *exec,const Identifier &p) const; - Value getValueProperty(ExecState *exec, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Filter, Root, WhatToShow, ExpandEntityReferences, - NextNode, PreviousNode, Detach }; - DOM::NodeIterator toNodeIterator() const { return nodeIterator; } - protected: - DOM::NodeIterator nodeIterator; - }; - - // Constructor object NodeFilter - class NodeFilterConstructor : public DOMObject { - public: - NodeFilterConstructor(ExecState *); - virtual Value tryGet(ExecState *exec,const Identifier &p) const; - Value getValueProperty(ExecState *exec, int token) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - }; - - class DOMNodeFilter : public DOMObject { - public: - DOMNodeFilter(ExecState *exec, DOM::NodeFilter nf); - ~DOMNodeFilter(); - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - virtual DOM::NodeFilter toNodeFilter() const { return nodeFilter; } - enum { AcceptNode }; - protected: - DOM::NodeFilter nodeFilter; - }; - - class DOMTreeWalker : public DOMObject { - public: - DOMTreeWalker(ExecState *exec, DOM::TreeWalker tw); - ~DOMTreeWalker(); - virtual Value tryGet(ExecState *exec,const Identifier &p) const; - Value getValueProperty(ExecState *exec, int token) const; - virtual void tryPut(ExecState *exec, const Identifier &propertyName, - const Value& value, int attr = None); - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Root, WhatToShow, Filter, ExpandEntityReferences, CurrentNode, - ParentNode, FirstChild, LastChild, PreviousSibling, NextSibling, - PreviousNode, NextNode }; - DOM::TreeWalker toTreeWalker() const { return treeWalker; } - protected: - DOM::TreeWalker treeWalker; - }; - - Value getDOMNodeIterator(ExecState *exec, DOM::NodeIterator ni); - Value getNodeFilterConstructor(ExecState *exec); - Value getDOMNodeFilter(ExecState *exec, DOM::NodeFilter nf); - Value getDOMTreeWalker(ExecState *exec, DOM::TreeWalker tw); - - /** - * Convert an object to a NodeFilter. Returns a null Node if not possible. - */ - DOM::NodeFilter toNodeFilter(const Value&); - - class JSNodeFilter : public DOM::CustomNodeFilter { - public: - JSNodeFilter(Object & _filter); - virtual ~JSNodeFilter(); - virtual short acceptNode (const DOM::Node &n); - protected: - Object filter; - }; - -} // namespace - -#endif diff --git a/khtml/ecma/kjs_views.cpp b/khtml/ecma/kjs_views.cpp deleted file mode 100644 index dbf354ce8..000000000 --- a/khtml/ecma/kjs_views.cpp +++ /dev/null @@ -1,91 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * - * 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 "ecma/kjs_views.h" -#include "ecma/kjs_css.h" -#include "ecma/kjs_window.h" -#include "kjs_views.lut.h" - -using namespace KJS; - -// ------------------------------------------------------------------------- - -const ClassInfo DOMAbstractView::info = { "AbstractView", 0, &DOMAbstractViewTable, 0 }; -/* -@begin DOMAbstractViewTable 2 - document DOMAbstractView::Document DontDelete|ReadOnly - getComputedStyle DOMAbstractView::GetComputedStyle DontDelete|Function 2 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(DOMAbstractViewFunc) - -DOMAbstractView::DOMAbstractView(ExecState *exec, DOM::AbstractView av) - : DOMObject(exec->interpreter()->builtinObjectPrototype()), abstractView(av) {} - -DOMAbstractView::~DOMAbstractView() -{ - ScriptInterpreter::forgetDOMObject(abstractView.handle()); -} - -Value DOMAbstractView::tryGet(ExecState *exec, const Identifier &p) const -{ - if ( p == "document" ) - return getDOMNode(exec,abstractView.document()); - else if ( p == "getComputedStyle" ) - return lookupOrCreateFunction<DOMAbstractViewFunc>(exec,p,this,DOMAbstractView::GetComputedStyle,2,DontDelete|Function); - else - return DOMObject::tryGet(exec,p); -} - -Value DOMAbstractViewFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( KJS::DOMAbstractView, thisObj ); - DOM::AbstractView abstractView = static_cast<DOMAbstractView *>(thisObj.imp())->toAbstractView(); - switch (id) { - case DOMAbstractView::GetComputedStyle: { - DOM::Node arg0 = toNode(args[0]); - if (arg0.nodeType() != DOM::Node::ELEMENT_NODE) - return Undefined(); // throw exception? - else - return getDOMCSSStyleDeclaration(exec,abstractView.getComputedStyle(static_cast<DOM::Element>(arg0), - args[1].toString(exec).string())); - } - } - return Undefined(); -} - -Value KJS::getDOMAbstractView(ExecState *exec, DOM::AbstractView av) -{ - return cacheDOMObject<DOM::AbstractView, DOMAbstractView>(exec, av); -} - -DOM::AbstractView KJS::toAbstractView (const Value& val) -{ - Object obj = Object::dynamicCast(val); - if (!obj.isValid() || !obj.inherits(&DOMAbstractView::info)) - return DOM::AbstractView (); - - // the Window object is considered for all practical purposes as a descendant of AbstractView - if (obj.inherits(&Window::info)) - return static_cast<const Window *>(obj.imp())->toAbstractView(); - - const DOMAbstractView *dobj = static_cast<const DOMAbstractView *>(obj.imp()); - return dobj->toAbstractView (); -} diff --git a/khtml/ecma/kjs_views.h b/khtml/ecma/kjs_views.h deleted file mode 100644 index 11e103fde..000000000 --- a/khtml/ecma/kjs_views.h +++ /dev/null @@ -1,53 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * - * 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 - */ - -#ifndef _KJS_VIEWS_H_ -#define _KJS_VIEWS_H_ - -#include "ecma/kjs_dom.h" -#include "dom/dom2_views.h" - -namespace KJS { - - - class DOMAbstractView : public DOMObject { - public: - DOMAbstractView(ExecState *, DOM::AbstractView av); - ~DOMAbstractView(); - virtual Value tryGet(ExecState *exec,const Identifier &p) const; - // no put - all read-only - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - virtual DOM::AbstractView toAbstractView() const { return abstractView; } - enum { Document, GetComputedStyle }; - protected: - DOM::AbstractView abstractView; - }; - - Value getDOMAbstractView(ExecState *exec, DOM::AbstractView av); - - /** - * Convert an object to an AbstractView. Returns a null Node if not possible. - */ - DOM::AbstractView toAbstractView(const Value&); - -} // namespace - -#endif diff --git a/khtml/ecma/kjs_window.cpp b/khtml/ecma/kjs_window.cpp deleted file mode 100644 index e557497e0..000000000 --- a/khtml/ecma/kjs_window.cpp +++ /dev/null @@ -1,2935 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2000-2003 Harri Porten (porten@kde.org) - * Copyright (C) 2001-2003 David Faure (faure@kde.org) - * 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 "config.h" - -#include "khtmlview.h" -#include "khtml_part.h" -#include "khtmlpart_p.h" -#include "khtml_settings.h" -#include "xml/dom2_eventsimpl.h" -#include "xml/dom_docimpl.h" -#include "misc/htmltags.h" -#include "html/html_documentimpl.h" -#include "rendering/render_frames.h" - -#include <tqstylesheet.h> -#include <tqtimer.h> -#include <tqpaintdevicemetrics.h> -#include <tqapplication.h> -#include <kdebug.h> -#include <kmessagebox.h> -#include <kinputdialog.h> -#include <klocale.h> -#include <kmdcodec.h> -#include <kparts/browserinterface.h> -#include <twin.h> - -#if defined Q_WS_X11 && ! defined K_WS_QTONLY -#include <twinmodule.h> // schroder -#endif - -#ifndef KONQ_EMBEDDED -#include <kbookmarkmanager.h> -#endif -#include <kglobalsettings.h> -#include <assert.h> -#include <tqstyle.h> -#include <tqobjectlist.h> -#include <kstringhandler.h> - -#include "kjs_proxy.h" -#include "kjs_window.h" -#include "kjs_navigator.h" -#include "kjs_mozilla.h" -#include "kjs_html.h" -#include "kjs_range.h" -#include "kjs_traversal.h" -#include "kjs_css.h" -#include "kjs_events.h" -#include "kjs_views.h" -#include "xmlhttprequest.h" -#include "xmlserializer.h" -#include "domparser.h" - -using namespace KJS; - -namespace KJS { - - class History : public ObjectImp { - friend class HistoryFunc; - public: - History(ExecState *exec, KHTMLPart *p) - : ObjectImp(exec->interpreter()->builtinObjectPrototype()), part(p) { } - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Back, Forward, Go, Length }; - private: - TQGuardedPtr<KHTMLPart> part; - }; - - class External : public ObjectImp { - friend class ExternalFunc; - public: - External(ExecState *exec, KHTMLPart *p) - : ObjectImp(exec->interpreter()->builtinObjectPrototype()), part(p) { } - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { AddFavorite }; - private: - TQGuardedPtr<KHTMLPart> part; - }; - - class FrameArray : public ObjectImp { - public: - FrameArray(ExecState *exec, KHTMLPart *p) - : ObjectImp(exec->interpreter()->builtinObjectPrototype()), part(p) { } - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - virtual Value call(ExecState *exec, Object &thisObj, const List &args); - virtual bool implementsCall() const { return true; } - private: - TQGuardedPtr<KHTMLPart> part; - }; - -#ifdef Q_WS_QWS - class KonquerorFunc : public DOMFunction { - public: - KonquerorFunc(ExecState *exec, const Konqueror* k, const char* name) - : DOMFunction(exec), konqueror(k), m_name(name) { } - virtual Value tryCall(ExecState *exec, Object &thisObj, const List &args); - - private: - const Konqueror* konqueror; - TQCString m_name; - }; -#endif -} // namespace KJS - -#include "kjs_window.lut.h" -#include "rendering/render_replaced.h" - -////////////////////// Screen Object //////////////////////// -namespace KJS { -// table for screen object -/* -@begin ScreenTable 7 - height Screen::Height DontEnum|ReadOnly - width Screen::Width DontEnum|ReadOnly - colorDepth Screen::ColorDepth DontEnum|ReadOnly - pixelDepth Screen::PixelDepth DontEnum|ReadOnly - availLeft Screen::AvailLeft DontEnum|ReadOnly - availTop Screen::AvailTop DontEnum|ReadOnly - availHeight Screen::AvailHeight DontEnum|ReadOnly - availWidth Screen::AvailWidth DontEnum|ReadOnly -@end -*/ - -const ClassInfo Screen::info = { "Screen", 0, &ScreenTable, 0 }; - -// We set the object prototype so that toString is implemented -Screen::Screen(ExecState *exec) - : ObjectImp(exec->interpreter()->builtinObjectPrototype()) {} - -Value Screen::get(ExecState *exec, const Identifier &p) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "Screen::get " << p.qstring() << endl; -#endif - return lookupGetValue<Screen,ObjectImp>(exec,p,&ScreenTable,this); -} - -Value Screen::getValueProperty(ExecState *exec, int token) const -{ -#if defined Q_WS_X11 && ! defined K_WS_QTONLY - KWinModule info(0, KWinModule::INFO_DESKTOP); -#endif - TQWidget *thisWidget = Window::retrieveActive(exec)->part()->widget(); - TQRect sg = TDEGlobalSettings::desktopGeometry(thisWidget); - - switch( token ) { - case Height: - return Number(sg.height()); - case Width: - return Number(sg.width()); - case ColorDepth: - case PixelDepth: { - TQPaintDeviceMetrics m(TQApplication::desktop()); - return Number(m.depth()); - } - case AvailLeft: { -#if defined Q_WS_X11 && ! defined K_WS_QTONLY - TQRect clipped = info.workArea().intersect(sg); - return Number(clipped.x()-sg.x()); -#else - return Number(10); -#endif - } - case AvailTop: { -#if defined Q_WS_X11 && ! defined K_WS_QTONLY - TQRect clipped = info.workArea().intersect(sg); - return Number(clipped.y()-sg.y()); -#else - return Number(10); -#endif - } - case AvailHeight: { -#if defined Q_WS_X11 && ! defined K_WS_QTONLY - TQRect clipped = info.workArea().intersect(sg); - return Number(clipped.height()); -#else - return Number(100); -#endif - } - case AvailWidth: { -#if defined Q_WS_X11 && ! defined K_WS_QTONLY - TQRect clipped = info.workArea().intersect(sg); - return Number(clipped.width()); -#else - return Number(100); -#endif - } - default: - kdDebug(6070) << "WARNING: Screen::getValueProperty unhandled token " << token << endl; - return Undefined(); - } -} - -////////////////////// Window Object //////////////////////// - -const ClassInfo Window::info = { "Window", &DOMAbstractView::info, &WindowTable, 0 }; - -/* -@begin WindowTable 162 - atob Window::AToB DontDelete|Function 1 - btoa Window::BToA DontDelete|Function 1 - closed Window::Closed DontDelete|ReadOnly - crypto Window::Crypto DontDelete|ReadOnly - defaultStatus Window::DefaultStatus DontDelete - defaultstatus Window::DefaultStatus DontDelete - status Window::Status DontDelete - document Window::Document DontDelete|ReadOnly - frameElement Window::FrameElement DontDelete|ReadOnly - frames Window::Frames DontDelete|ReadOnly - history Window::_History DontDelete|ReadOnly - external Window::_External DontDelete|ReadOnly - event Window::Event DontDelete|ReadOnly - innerHeight Window::InnerHeight DontDelete|ReadOnly - innerWidth Window::InnerWidth DontDelete|ReadOnly - length Window::Length DontDelete|ReadOnly - location Window::_Location DontDelete - name Window::Name DontDelete - navigator Window::_Navigator DontDelete|ReadOnly - clientInformation Window::ClientInformation DontDelete|ReadOnly - konqueror Window::_Konqueror DontDelete|ReadOnly - offscreenBuffering Window::OffscreenBuffering DontDelete|ReadOnly - opener Window::Opener DontDelete|ReadOnly - outerHeight Window::OuterHeight DontDelete|ReadOnly - outerWidth Window::OuterWidth DontDelete|ReadOnly - pageXOffset Window::PageXOffset DontDelete|ReadOnly - pageYOffset Window::PageYOffset DontDelete|ReadOnly - parent Window::Parent DontDelete|ReadOnly - personalbar Window::Personalbar DontDelete|ReadOnly - screenX Window::ScreenX DontDelete|ReadOnly - screenY Window::ScreenY DontDelete|ReadOnly - scrollbars Window::Scrollbars DontDelete|ReadOnly - scroll Window::Scroll DontDelete|Function 2 - scrollBy Window::ScrollBy DontDelete|Function 2 - scrollTo Window::ScrollTo DontDelete|Function 2 - scrollX Window::ScrollX DontDelete|ReadOnly - scrollY Window::ScrollY DontDelete|ReadOnly - moveBy Window::MoveBy DontDelete|Function 2 - moveTo Window::MoveTo DontDelete|Function 2 - resizeBy Window::ResizeBy DontDelete|Function 2 - resizeTo Window::ResizeTo DontDelete|Function 2 - self Window::Self DontDelete|ReadOnly - window Window::_Window DontDelete|ReadOnly - top Window::Top DontDelete|ReadOnly - screen Window::_Screen DontDelete|ReadOnly - alert Window::Alert DontDelete|Function 1 - confirm Window::Confirm DontDelete|Function 1 - prompt Window::Prompt DontDelete|Function 2 - open Window::Open DontDelete|Function 3 - setTimeout Window::SetTimeout DontDelete|Function 2 - clearTimeout Window::ClearTimeout DontDelete|Function 1 - focus Window::Focus DontDelete|Function 0 - blur Window::Blur DontDelete|Function 0 - close Window::Close DontDelete|Function 0 - setInterval Window::SetInterval DontDelete|Function 2 - clearInterval Window::ClearInterval DontDelete|Function 1 - captureEvents Window::CaptureEvents DontDelete|Function 0 - releaseEvents Window::ReleaseEvents DontDelete|Function 0 - print Window::Print DontDelete|Function 0 - addEventListener Window::AddEventListener DontDelete|Function 3 - removeEventListener Window::RemoveEventListener DontDelete|Function 3 -# Normally found in prototype. Add to window object itself to make them -# accessible in closed and cross-site windows - valueOf Window::ValueOf DontDelete|Function 0 - toString Window::ToString DontDelete|Function 0 -# IE extension - navigate Window::Navigate DontDelete|Function 1 -# Mozilla extension - sidebar Window::SideBar DontDelete|ReadOnly - getComputedStyle Window::GetComputedStyle DontDelete|Function 2 - -# Warning, when adding a function to this object you need to add a case in Window::get - -# Event handlers -# IE also has: onactivate, onbefore/afterprint, onbeforedeactivate/unload, oncontrolselect, -# ondeactivate, onhelp, onmovestart/end, onresizestart/end, onscroll. -# It doesn't have onabort, onchange, ondragdrop (but NS has that last one). - onabort Window::Onabort DontDelete - onblur Window::Onblur DontDelete - onchange Window::Onchange DontDelete - onclick Window::Onclick DontDelete - ondblclick Window::Ondblclick DontDelete - ondragdrop Window::Ondragdrop DontDelete - onerror Window::Onerror DontDelete - onfocus Window::Onfocus DontDelete - onkeydown Window::Onkeydown DontDelete - onkeypress Window::Onkeypress DontDelete - onkeyup Window::Onkeyup DontDelete - onload Window::Onload DontDelete - onmousedown Window::Onmousedown DontDelete - onmousemove Window::Onmousemove DontDelete - onmouseout Window::Onmouseout DontDelete - onmouseover Window::Onmouseover DontDelete - onmouseup Window::Onmouseup DontDelete - onmove Window::Onmove DontDelete - onreset Window::Onreset DontDelete - onresize Window::Onresize DontDelete - onselect Window::Onselect DontDelete - onsubmit Window::Onsubmit DontDelete - onunload Window::Onunload DontDelete - -# Constructors/constant tables - Node Window::Node DontDelete - Event Window::EventCtor DontDelete - Range Window::Range DontDelete - NodeFilter Window::NodeFilter DontDelete - DOMException Window::DOMException DontDelete - CSSRule Window::CSSRule DontDelete - MutationEvent Window::MutationEventCtor DontDelete - KeyboardEvent Window::KeyboardEventCtor DontDelete - EventException Window::EventExceptionCtor DontDelete - Image Window::Image DontDelete|ReadOnly - Option Window::Option DontDelete|ReadOnly - XMLHttpRequest Window::XMLHttpRequest DontDelete|ReadOnly - XMLSerializer Window::XMLSerializer DontDelete|ReadOnly - DOMParser Window::DOMParser DontDelete|ReadOnly - -# Mozilla dom emulation ones. - Element Window::ElementCtor DontDelete - Document Window::DocumentCtor DontDelete - #this one is an alias since we don't have a separate XMLDocument - XMLDocument Window::DocumentCtor DontDelete - HTMLElement Window::HTMLElementCtor DontDelete - HTMLDocument Window::HTMLDocumentCtor DontDelete - HTMLHtmlElement Window::HTMLHtmlElementCtor DontDelete - HTMLHeadElement Window::HTMLHeadElementCtor DontDelete - HTMLLinkElement Window::HTMLLinkElementCtor DontDelete - HTMLTitleElement Window::HTMLTitleElementCtor DontDelete - HTMLMetaElement Window::HTMLMetaElementCtor DontDelete - HTMLBaseElement Window::HTMLBaseElementCtor DontDelete - HTMLIsIndexElement Window::HTMLIsIndexElementCtor DontDelete - HTMLStyleElement Window::HTMLStyleElementCtor DontDelete - HTMLBodyElement Window::HTMLBodyElementCtor DontDelete - HTMLFormElement Window::HTMLFormElementCtor DontDelete - HTMLSelectElement Window::HTMLSelectElementCtor DontDelete - HTMLOptGroupElement Window::HTMLOptGroupElementCtor DontDelete - HTMLOptionElement Window::HTMLOptionElementCtor DontDelete - HTMLInputElement Window::HTMLInputElementCtor DontDelete - HTMLTextAreaElement Window::HTMLTextAreaElementCtor DontDelete - HTMLButtonElement Window::HTMLButtonElementCtor DontDelete - HTMLLabelElement Window::HTMLLabelElementCtor DontDelete - HTMLFieldSetElement Window::HTMLFieldSetElementCtor DontDelete - HTMLLegendElement Window::HTMLLegendElementCtor DontDelete - HTMLUListElement Window::HTMLUListElementCtor DontDelete - HTMLOListElement Window::HTMLOListElementCtor DontDelete - HTMLDListElement Window::HTMLDListElementCtor DontDelete - HTMLDirectoryElement Window::HTMLDirectoryElementCtor DontDelete - HTMLMenuElement Window::HTMLMenuElementCtor DontDelete - HTMLLIElement Window::HTMLLIElementCtor DontDelete - HTMLDivElement Window::HTMLDivElementCtor DontDelete - HTMLParagraphElement Window::HTMLParagraphElementCtor DontDelete - HTMLHeadingElement Window::HTMLHeadingElementCtor DontDelete - HTMLBlockQuoteElement Window::HTMLBlockQuoteElementCtor DontDelete - HTMLQuoteElement Window::HTMLQuoteElementCtor DontDelete - HTMLPreElement Window::HTMLPreElementCtor DontDelete - HTMLBRElement Window::HTMLBRElementCtor DontDelete - HTMLBaseFontElement Window::HTMLBaseFontElementCtor DontDelete - HTMLFontElement Window::HTMLFontElementCtor DontDelete - HTMLHRElement Window::HTMLHRElementCtor DontDelete - HTMLModElement Window::HTMLModElementCtor DontDelete - HTMLAnchorElement Window::HTMLAnchorElementCtor DontDelete - HTMLImageElement Window::HTMLImageElementCtor DontDelete - HTMLObjectElement Window::HTMLObjectElementCtor DontDelete - HTMLParamElement Window::HTMLParamElementCtor DontDelete - HTMLAppletElement Window::HTMLAppletElementCtor DontDelete - HTMLMapElement Window::HTMLMapElementCtor DontDelete - HTMLAreaElement Window::HTMLAreaElementCtor DontDelete - HTMLScriptElement Window::HTMLScriptElementCtor DontDelete - HTMLTableElement Window::HTMLTableElementCtor DontDelete - HTMLTableCaptionElement Window::HTMLTableCaptionElementCtor DontDelete - HTMLTableColElement Window::HTMLTableColElementCtor DontDelete - HTMLTableSectionElement Window::HTMLTableSectionElementCtor DontDelete - HTMLTableRowElement Window::HTMLTableRowElementCtor DontDelete - HTMLTableCellElement Window::HTMLTableCellElementCtor DontDelete - HTMLFrameSetElement Window::HTMLFrameSetElementCtor DontDelete - HTMLLayerElement Window::HTMLLayerElementCtor DontDelete - HTMLFrameElement Window::HTMLFrameElementCtor DontDelete - HTMLIFrameElement Window::HTMLIFrameElementCtor DontDelete - CSSStyleDeclaration Window::CSSStyleDeclarationCtor DontDelete -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(WindowFunc) - -Window::Window(khtml::ChildFrame *p) - : ObjectImp(/*no proto*/), m_frame(p), screen(0), history(0), external(0), m_frames(0), loc(0), m_evt(0) -{ - winq = new WindowQObject(this); - //kdDebug(6070) << "Window::Window this=" << this << " part=" << m_part << " " << m_part->name() << endl; -} - -Window::~Window() -{ - delete winq; -} - -Window *Window::retrieveWindow(KParts::ReadOnlyPart *p) -{ - Object obj = Object::dynamicCast( retrieve( p ) ); -#ifndef NDEBUG - // obj should never be null, except when javascript has been disabled in that part. - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(p); - if ( part && part->jScriptEnabled() ) - { - assert( obj.isValid() ); -#ifndef QWS - assert( dynamic_cast<KJS::Window*>(obj.imp()) ); // type checking -#endif - } -#endif - if ( !obj.isValid() ) // JS disabled - return 0; - return static_cast<KJS::Window*>(obj.imp()); -} - -Window *Window::retrieveActive(ExecState *exec) -{ - ValueImp *imp = exec->interpreter()->globalObject().imp(); - assert( imp ); -#ifndef QWS - assert( dynamic_cast<KJS::Window*>(imp) ); -#endif - return static_cast<KJS::Window*>(imp); -} - -Value Window::retrieve(KParts::ReadOnlyPart *p) -{ - assert(p); - KHTMLPart * part = ::tqqt_cast<KHTMLPart *>(p); - KJSProxy *proxy = 0L; - if (!part) { - part = ::tqqt_cast<KHTMLPart *>(p->parent()); - if (part) - proxy = part->framejScript(p); - } else - proxy = part->jScript(); - if (proxy) { -#ifdef KJS_VERBOSE - kdDebug(6070) << "Window::retrieve part=" << part << " '" << part->name() << "' interpreter=" << proxy->interpreter() << " window=" << proxy->interpreter()->globalObject().imp() << endl; -#endif - return proxy->interpreter()->globalObject(); // the Global object is the "window" - } else { -#ifdef KJS_VERBOSE - kdDebug(6070) << "Window::retrieve part=" << p << " '" << p->name() << "' no jsproxy." << endl; -#endif - return Undefined(); // This can happen with JS disabled on the domain of that window - } -} - -Location *Window::location() const -{ - if (!loc) - const_cast<Window*>(this)->loc = new Location(m_frame); - return loc; -} - -ObjectImp* Window::frames( ExecState* exec ) const -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (part) - return m_frames ? m_frames : - (const_cast<Window*>(this)->m_frames = new FrameArray(exec, part)); - return 0L; -} - -// reference our special objects during garbage collection -void Window::mark() -{ - ObjectImp::mark(); - if (screen && !screen->marked()) - screen->mark(); - if (history && !history->marked()) - history->mark(); - if (external && !external->marked()) - external->mark(); - if (m_frames && !m_frames->marked()) - m_frames->mark(); - //kdDebug(6070) << "Window::mark " << this << " marking loc=" << loc << endl; - if (loc && !loc->marked()) - loc->mark(); - if (winq) - winq->mark(); -} - -bool Window::hasProperty(ExecState *exec, const Identifier &p) const -{ - // we don't want any operations on a closed window - if (m_frame.isNull() || m_frame->m_part.isNull()) - return ( p == "closed" ); - - if (ObjectImp::hasProperty(exec, p)) - return true; - - if (Lookup::findEntry(&WindowTable, p)) - return true; - - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (!part) - return false; - - TQString q = p.qstring(); - if (part->findFramePart(p.qstring())) - return true; - // allow window[1] or parent[1] etc. (#56983) - bool ok; - unsigned int i = p.toArrayIndex(&ok); - if (ok) { - TQPtrList<KParts::ReadOnlyPart> frames = part->frames(); - unsigned int len = frames.count(); - if (i < len) - return true; - } - - // allow shortcuts like 'Image1' instead of document.images.Image1 - if (part->document().isHTMLDocument()) { // might be XML - DOM::HTMLDocument doc = part->htmlDocument(); - // Keep in sync with tryGet - - if (static_cast<DOM::DocumentImpl*>(doc.handle())->underDocNamedCache().get(p.qstring())) - return true; - - return !doc.getElementById(p.string()).isNull(); - } - - return false; -} - -UString Window::toString(ExecState *) const -{ - return "[object Window]"; -} - -Value Window::get(ExecState *exec, const Identifier &p) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "Window("<<this<<")::get " << p.qstring() << endl; -#endif - // we want only limited operations on a closed window - if (m_frame.isNull() || m_frame->m_part.isNull()) { - const HashEntry* entry = Lookup::findEntry(&WindowTable, p); - if (entry) { - switch (entry->value) { - case Closed: - return Boolean(true); - case _Location: - return Null(); - case ValueOf: - case ToString: - return lookupOrCreateFunction<WindowFunc>(exec,p, this, entry->value, - entry->params, entry->attr); - default: - break; - } - } - return Undefined(); - } - - // Look for overrides first - ValueImp *val = getDirect(p); - if (val) { - //kdDebug(6070) << "Window::get found dynamic property '" << p.ascii() << "'" << endl; - return isSafeScript(exec) ? Value(val) : Undefined(); - } - - const HashEntry* entry = Lookup::findEntry(&WindowTable, p); - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - - // properties that work on all windows - if (entry) { - // ReadOnlyPart first - switch(entry->value) { - case Closed: - return Boolean( false ); - case _Location: - // No isSafeScript test here, we must be able to _set_ location.href (#49819) - return Value(location()); - case _Window: - case Self: - return retrieve(m_frame->m_part); - default: - break; - } - if (!part) - return Undefined(); - // KHTMLPart next - switch(entry->value) { - case Frames: - return Value(frames(exec)); - case Opener: - if (!part->opener()) - return Null(); // ### a null Window might be better, but == null - else // doesn't work yet - return retrieve(part->opener()); - case Parent: - return retrieve(part->parentPart() ? part->parentPart() : (KHTMLPart*)part); - case Top: { - KHTMLPart *p = part; - while (p->parentPart()) - p = p->parentPart(); - return retrieve(p); - } - case Alert: - case Confirm: - case Prompt: - case Open: - case Close: - case Focus: - case Blur: - case AToB: - case BToA: - case GetComputedStyle: - case ValueOf: - case ToString: - return lookupOrCreateFunction<WindowFunc>(exec,p,this,entry->value,entry->params,entry->attr); - default: - break; - } - } else if (!part) { - // not a KHTMLPart - TQString rvalue; - KParts::LiveConnectExtension::Type rtype; - unsigned long robjid; - if (m_frame->m_liveconnect && - isSafeScript(exec) && - m_frame->m_liveconnect->get(0, p.qstring(), rtype, robjid, rvalue)) - return getLiveConnectValue(m_frame->m_liveconnect, p.qstring(), rtype, rvalue, robjid); - return Undefined(); - } - // properties that only work on safe windows - if (isSafeScript(exec) && entry) - { - //kdDebug(6070) << "token: " << entry->value << endl; - switch( entry->value ) { - case Crypto: - return Undefined(); // ### - case DefaultStatus: - return String(UString(part->jsDefaultStatusBarText())); - case Status: - return String(UString(part->jsStatusBarText())); - case Document: - if (part->document().isNull()) { - kdDebug(6070) << "Document.write: adding <HTML><BODY> to create document" << endl; - part->begin(); - part->write("<HTML><BODY>"); - part->end(); - } - return getDOMNode(exec,part->document()); - case FrameElement: - if (m_frame->m_frame) - return getDOMNode(exec,m_frame->m_frame->element()); - else - return Undefined(); - case Node: - return NodeConstructor::self(exec); - case Range: - return getRangeConstructor(exec); - case NodeFilter: - return getNodeFilterConstructor(exec); - case DOMException: - return getDOMExceptionConstructor(exec); - case CSSRule: - return getCSSRuleConstructor(exec); - case ElementCtor: - return ElementPseudoCtor::self(exec); - case HTMLElementCtor: - return HTMLElementPseudoCtor::self(exec); - case HTMLHtmlElementCtor: - return HTMLHtmlElementPseudoCtor::self(exec); - case HTMLHeadElementCtor: - return HTMLHeadElementPseudoCtor::self(exec); - case HTMLLinkElementCtor: - return HTMLLinkElementPseudoCtor::self(exec); - case HTMLTitleElementCtor: - return HTMLTitleElementPseudoCtor::self(exec); - case HTMLMetaElementCtor: - return HTMLMetaElementPseudoCtor::self(exec); - case HTMLBaseElementCtor: - return HTMLBaseElementPseudoCtor::self(exec); - case HTMLIsIndexElementCtor: - return HTMLIsIndexElementPseudoCtor::self(exec); - case HTMLStyleElementCtor: - return HTMLStyleElementPseudoCtor::self(exec); - case HTMLBodyElementCtor: - return HTMLBodyElementPseudoCtor::self(exec); - case HTMLFormElementCtor: - return HTMLFormElementPseudoCtor::self(exec); - case HTMLSelectElementCtor: - return HTMLSelectElementPseudoCtor::self(exec); - case HTMLOptGroupElementCtor: - return HTMLOptGroupElementPseudoCtor::self(exec); - case HTMLOptionElementCtor: - return HTMLOptionElementPseudoCtor::self(exec); - case HTMLInputElementCtor: - return HTMLInputElementPseudoCtor::self(exec); - case HTMLTextAreaElementCtor: - return HTMLTextAreaElementPseudoCtor::self(exec); - case HTMLButtonElementCtor: - return HTMLButtonElementPseudoCtor::self(exec); - case HTMLLabelElementCtor: - return HTMLLabelElementPseudoCtor::self(exec); - case HTMLFieldSetElementCtor: - return HTMLFieldSetElementPseudoCtor::self(exec); - case HTMLLegendElementCtor: - return HTMLLegendElementPseudoCtor::self(exec); - case HTMLUListElementCtor: - return HTMLUListElementPseudoCtor::self(exec); - case HTMLOListElementCtor: - return HTMLOListElementPseudoCtor::self(exec); - case HTMLDListElementCtor: - return HTMLDListElementPseudoCtor::self(exec); - case HTMLDirectoryElementCtor: - return HTMLDirectoryElementPseudoCtor::self(exec); - case HTMLMenuElementCtor: - return HTMLMenuElementPseudoCtor::self(exec); - case HTMLLIElementCtor: - return HTMLLIElementPseudoCtor::self(exec); - case HTMLDivElementCtor: - return HTMLDivElementPseudoCtor::self(exec); - case HTMLParagraphElementCtor: - return HTMLParagraphElementPseudoCtor::self(exec); - case HTMLHeadingElementCtor: - return HTMLHeadingElementPseudoCtor::self(exec); - case HTMLBlockQuoteElementCtor: - return HTMLBlockQuoteElementPseudoCtor::self(exec); - case HTMLQuoteElementCtor: - return HTMLQuoteElementPseudoCtor::self(exec); - case HTMLPreElementCtor: - return HTMLPreElementPseudoCtor::self(exec); - case HTMLBRElementCtor: - return HTMLBRElementPseudoCtor::self(exec); - case HTMLBaseFontElementCtor: - return HTMLBaseFontElementPseudoCtor::self(exec); - case HTMLFontElementCtor: - return HTMLFontElementPseudoCtor::self(exec); - case HTMLHRElementCtor: - return HTMLHRElementPseudoCtor::self(exec); - case HTMLModElementCtor: - return HTMLModElementPseudoCtor::self(exec); - case HTMLAnchorElementCtor: - return HTMLAnchorElementPseudoCtor::self(exec); - case HTMLImageElementCtor: - return HTMLImageElementPseudoCtor::self(exec); - case HTMLObjectElementCtor: - return HTMLObjectElementPseudoCtor::self(exec); - case HTMLParamElementCtor: - return HTMLParamElementPseudoCtor::self(exec); - case HTMLAppletElementCtor: - return HTMLAppletElementPseudoCtor::self(exec); - case HTMLMapElementCtor: - return HTMLMapElementPseudoCtor::self(exec); - case HTMLAreaElementCtor: - return HTMLAreaElementPseudoCtor::self(exec); - case HTMLScriptElementCtor: - return HTMLScriptElementPseudoCtor::self(exec); - case HTMLTableElementCtor: - return HTMLTableElementPseudoCtor::self(exec); - case HTMLTableCaptionElementCtor: - return HTMLTableCaptionElementPseudoCtor::self(exec); - case HTMLTableColElementCtor: - return HTMLTableColElementPseudoCtor::self(exec); - case HTMLTableSectionElementCtor: - return HTMLTableSectionElementPseudoCtor::self(exec); - case HTMLTableRowElementCtor: - return HTMLTableRowElementPseudoCtor::self(exec); - case HTMLTableCellElementCtor: - return HTMLTableCellElementPseudoCtor::self(exec); - case HTMLFrameSetElementCtor: - return HTMLFrameSetElementPseudoCtor::self(exec); - case HTMLLayerElementCtor: - return HTMLLayerElementPseudoCtor::self(exec); - case HTMLFrameElementCtor: - return HTMLFrameElementPseudoCtor::self(exec); - case HTMLIFrameElementCtor: - return HTMLIFrameElementPseudoCtor::self(exec); - case DocumentCtor: - return DocumentPseudoCtor::self(exec); - case HTMLDocumentCtor: - return HTMLDocumentPseudoCtor::self(exec); - case CSSStyleDeclarationCtor: - return CSSStyleDeclarationPseudoCtor::self(exec); - case EventCtor: - return EventConstructor::self(exec); - case MutationEventCtor: - return getMutationEventConstructor(exec); - case KeyboardEventCtor: - return getKeyboardEventConstructor(exec); - case EventExceptionCtor: - return getEventExceptionConstructor(exec); - case _History: - return Value(history ? history : - (const_cast<Window*>(this)->history = new History(exec,part))); - - case _External: - return Value(external ? external : - (const_cast<Window*>(this)->external = new External(exec,part))); - - case Event: - if (m_evt) - return getDOMEvent(exec,*m_evt); - else { -#ifdef KJS_VERBOSE - kdDebug(6070) << "WARNING: window(" << this << "," << part->name() << ").event, no event!" << endl; -#endif - return Undefined(); - } - case InnerHeight: - if (!part->view()) - return Undefined(); - khtml::RenderWidget::flushWidgetResizes(); // make sure frames have their final size - return Number(part->view()->visibleHeight()); - case InnerWidth: - if (!part->view()) - return Undefined(); - khtml::RenderWidget::flushWidgetResizes(); // make sure frames have their final size - return Number(part->view()->visibleWidth()); - case Length: - return Number(part->frames().count()); - case Name: - return String(part->name()); - case SideBar: - return Value(new MozillaSidebarExtension(exec, part)); - case _Navigator: - case ClientInformation: { - // Store the navigator in the object so we get the same one each time. - Value nav( new Navigator(exec, part) ); - const_cast<Window *>(this)->put(exec, "navigator", nav, DontDelete|ReadOnly|Internal); - const_cast<Window *>(this)->put(exec, "clientInformation", nav, DontDelete|ReadOnly|Internal); - return nav; - } -#ifdef Q_WS_QWS - case _Konqueror: { - Value k( new Konqueror(part) ); - const_cast<Window *>(this)->put(exec, "konqueror", k, DontDelete|ReadOnly|Internal); - return k; - } -#endif - case OffscreenBuffering: - return Boolean(true); - case OuterHeight: - case OuterWidth: - { -#if defined Q_WS_X11 && ! defined K_WS_QTONLY - if (!part->widget()) - return Number(0); - KWin::WindowInfo inf = KWin::windowInfo(part->widget()->topLevelWidget()->winId()); - return Number(entry->value == OuterHeight ? - inf.geometry().height() : inf.geometry().width()); -#else - return Number(entry->value == OuterHeight ? - part->view()->height() : part->view()->width()); -#endif - } - case PageXOffset: - return Number(part->view()->contentsX()); - case PageYOffset: - return Number(part->view()->contentsY()); - case Personalbar: - return Undefined(); // ### - case ScreenLeft: - case ScreenX: { - if (!part->view()) - return Undefined(); - TQRect sg = TDEGlobalSettings::desktopGeometry(part->view()); - return Number(part->view()->mapToGlobal(TQPoint(0,0)).x() + sg.x()); - } - case ScreenTop: - case ScreenY: { - if (!part->view()) - return Undefined(); - TQRect sg = TDEGlobalSettings::desktopGeometry(part->view()); - return Number(part->view()->mapToGlobal(TQPoint(0,0)).y() + sg.y()); - } - case ScrollX: { - if (!part->view()) - return Undefined(); - return Number(part->view()->contentsX()); - } - case ScrollY: { - if (!part->view()) - return Undefined(); - return Number(part->view()->contentsY()); - } - case Scrollbars: - return Undefined(); // ### - case _Screen: - return Value(screen ? screen : - (const_cast<Window*>(this)->screen = new Screen(exec))); - case Image: - return Value(new ImageConstructorImp(exec, part->document())); - case Option: - return Value(new OptionConstructorImp(exec, part->document())); - case XMLHttpRequest: - return Value(new XMLHttpRequestConstructorImp(exec, part->document())); - case XMLSerializer: - return Value(new XMLSerializerConstructorImp(exec)); - case DOMParser: - return Value(new DOMParserConstructorImp(exec, part->xmlDocImpl())); - case Scroll: // compatibility - case ScrollBy: - case ScrollTo: - case MoveBy: - case MoveTo: - case ResizeBy: - case ResizeTo: - case CaptureEvents: - case ReleaseEvents: - case AddEventListener: - case RemoveEventListener: - case SetTimeout: - case ClearTimeout: - case SetInterval: - case ClearInterval: - case Print: - return lookupOrCreateFunction<WindowFunc>(exec,p,this,entry->value,entry->params,entry->attr); - // IE extension - case Navigate: - // Disabled in NS-compat mode. Supported by default - can't hurt, unless someone uses - // if (navigate) to test for IE (unlikely). - if ( exec->interpreter()->compatMode() == Interpreter::NetscapeCompat ) - return Undefined(); - return lookupOrCreateFunction<WindowFunc>(exec,p,this,entry->value,entry->params,entry->attr); - case Onabort: - return getListener(exec,DOM::EventImpl::ABORT_EVENT); - case Onblur: - return getListener(exec,DOM::EventImpl::BLUR_EVENT); - case Onchange: - return getListener(exec,DOM::EventImpl::CHANGE_EVENT); - case Onclick: - return getListener(exec,DOM::EventImpl::KHTML_ECMA_CLICK_EVENT); - case Ondblclick: - return getListener(exec,DOM::EventImpl::KHTML_ECMA_DBLCLICK_EVENT); - case Ondragdrop: - return getListener(exec,DOM::EventImpl::KHTML_DRAGDROP_EVENT); - case Onerror: - return getListener(exec,DOM::EventImpl::ERROR_EVENT); - case Onfocus: - return getListener(exec,DOM::EventImpl::FOCUS_EVENT); - case Onkeydown: - return getListener(exec,DOM::EventImpl::KEYDOWN_EVENT); - case Onkeypress: - return getListener(exec,DOM::EventImpl::KEYPRESS_EVENT); - case Onkeyup: - return getListener(exec,DOM::EventImpl::KEYUP_EVENT); - case Onload: - return getListener(exec,DOM::EventImpl::LOAD_EVENT); - case Onmousedown: - return getListener(exec,DOM::EventImpl::MOUSEDOWN_EVENT); - case Onmousemove: - return getListener(exec,DOM::EventImpl::MOUSEMOVE_EVENT); - case Onmouseout: - return getListener(exec,DOM::EventImpl::MOUSEOUT_EVENT); - case Onmouseover: - return getListener(exec,DOM::EventImpl::MOUSEOVER_EVENT); - case Onmouseup: - return getListener(exec,DOM::EventImpl::MOUSEUP_EVENT); - case Onmove: - return getListener(exec,DOM::EventImpl::KHTML_MOVE_EVENT); - case Onreset: - return getListener(exec,DOM::EventImpl::RESET_EVENT); - case Onresize: - return getListener(exec,DOM::EventImpl::RESIZE_EVENT); - case Onselect: - return getListener(exec,DOM::EventImpl::SELECT_EVENT); - case Onsubmit: - return getListener(exec,DOM::EventImpl::SUBMIT_EVENT); - case Onunload: - return getListener(exec,DOM::EventImpl::UNLOAD_EVENT); - } - } - - // doing the remainder of ObjectImp::get() that is not covered by - // the getDirect() call above. - // #### guessed position. move further up or down? - Object proto = Object::dynamicCast(prototype()); - assert(proto.isValid()); - if (p == specialPrototypePropertyName) - return isSafeScript(exec) ? Value(proto) : Undefined(); - Value val2 = proto.get(exec, p); - if (!val2.isA(UndefinedType)) { - return isSafeScript(exec) ? val2 : Undefined(); - } - - KParts::ReadOnlyPart *rop = part->findFramePart( p.qstring() ); - if (rop) - return retrieve(rop); - - // allow window[1] or parent[1] etc. (#56983) - bool ok; - unsigned int i = p.toArrayIndex(&ok); - if (ok) { - TQPtrList<KParts::ReadOnlyPart> frames = part->frames(); - unsigned int len = frames.count(); - if (i < len) { - KParts::ReadOnlyPart* frame = frames.at(i); - if (frame) - return Window::retrieve(frame); - } - } - - //Check for images, forms, objects, etc. - if (isSafeScript(exec) && part->document().isHTMLDocument()) { // might be XML - DOM::DocumentImpl* docImpl = part->xmlDocImpl(); - DOM::ElementMappingCache::ItemInfo* info = docImpl->underDocNamedCache().get(p.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 = p.string(); - if (info->nd && DOM::HTMLMappedNameCollectionImpl::matchesName(info->nd, - DOM::HTMLCollectionImpl::WINDOW_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, DOM::HTMLCollectionImpl::WINDOW_NAMED_ITEMS, propertyDOMString); - - if (coll.length() == 1) - return getDOMNode(exec, coll.firstItem()); - else if (coll.length() > 1) - return getHTMLCollection(exec, coll); - } - } - DOM::Element element = part->document().getElementById(p.string()); - if ( !element.isNull() ) - return getDOMNode(exec, element ); - } - - // This isn't necessarily a bug. Some code uses if(!window.blah) window.blah=1 - // But it can also mean something isn't loaded or implemented, hence the WARNING to help grepping. -#ifdef KJS_VERBOSE - kdDebug(6070) << "WARNING: Window::get property not found: " << p.qstring() << endl; -#endif - return Undefined(); -} - -void Window::put(ExecState* exec, const Identifier &propertyName, const Value &value, int attr) -{ - // we don't want any operations on a closed window - if (m_frame.isNull() || m_frame->m_part.isNull()) { - // ### throw exception? allow setting of some props like location? - return; - } - - // Called by an internal KJS call (e.g. InterpreterImp's constructor) ? - // If yes, save time and jump directly to ObjectImp. - if ( (attr != None && attr != DontDelete) || - // Same thing if we have a local override (e.g. "var location") - ( isSafeScript( exec ) && ObjectImp::getDirect(propertyName) ) ) - { - ObjectImp::put( exec, propertyName, value, attr ); - return; - } - - const HashEntry* entry = Lookup::findEntry(&WindowTable, propertyName); - if (entry && !m_frame.isNull() && !m_frame->m_part.isNull()) - { -#ifdef KJS_VERBOSE - kdDebug(6070) << "Window("<<this<<")::put " << propertyName.qstring() << endl; -#endif - switch( entry->value) { - case _Location: - goURL(exec, value.toString(exec).qstring(), false /*don't lock history*/); - return; - default: - break; - } - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (part) { - switch( entry->value ) { - case Status: { - if (isSafeScript(exec) && part->settings()->windowStatusPolicy(part->url().host()) - == KHTMLSettings::KJSWindowStatusAllow) { - String s = value.toString(exec); - part->setJSStatusBarText(s.value().qstring()); - } - return; - } - case DefaultStatus: { - if (isSafeScript(exec) && part->settings()->windowStatusPolicy(part->url().host()) - == KHTMLSettings::KJSWindowStatusAllow) { - String s = value.toString(exec); - part->setJSDefaultStatusBarText(s.value().qstring()); - } - return; - } - case Onabort: - if (isSafeScript(exec)) - setListener(exec, DOM::EventImpl::ABORT_EVENT,value); - return; - case Onblur: - if (isSafeScript(exec)) - setListener(exec, DOM::EventImpl::BLUR_EVENT,value); - return; - case Onchange: - if (isSafeScript(exec)) - setListener(exec, DOM::EventImpl::CHANGE_EVENT,value); - return; - case Onclick: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::KHTML_ECMA_CLICK_EVENT,value); - return; - case Ondblclick: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::KHTML_ECMA_DBLCLICK_EVENT,value); - return; - case Ondragdrop: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::KHTML_DRAGDROP_EVENT,value); - return; - case Onerror: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::ERROR_EVENT,value); - return; - case Onfocus: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::FOCUS_EVENT,value); - return; - case Onkeydown: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::KEYDOWN_EVENT,value); - return; - case Onkeypress: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::KEYPRESS_EVENT,value); - return; - case Onkeyup: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::KEYUP_EVENT,value); - return; - case Onload: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::LOAD_EVENT,value); - return; - case Onmousedown: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::MOUSEDOWN_EVENT,value); - return; - case Onmousemove: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::MOUSEMOVE_EVENT,value); - return; - case Onmouseout: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::MOUSEOUT_EVENT,value); - return; - case Onmouseover: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::MOUSEOVER_EVENT,value); - return; - case Onmouseup: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::MOUSEUP_EVENT,value); - return; - case Onmove: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::KHTML_MOVE_EVENT,value); - return; - case Onreset: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::RESET_EVENT,value); - return; - case Onresize: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::RESIZE_EVENT,value); - return; - case Onselect: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::SELECT_EVENT,value); - return; - case Onsubmit: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::SUBMIT_EVENT,value); - return; - case Onunload: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::UNLOAD_EVENT,value); - return; - case Name: - if (isSafeScript(exec)) - part->setName( value.toString(exec).qstring().local8Bit().data() ); - return; - default: - break; - } - } - } - if (m_frame->m_liveconnect && - isSafeScript(exec) && - m_frame->m_liveconnect->put(0, propertyName.qstring(), value.toString(exec).qstring())) - return; - if (isSafeScript(exec)) { - //kdDebug(6070) << "Window("<<this<<")::put storing " << propertyName.qstring() << endl; - ObjectImp::put(exec, propertyName, value, attr); - } -} - -bool Window::toBoolean(ExecState *) const -{ - return !m_frame.isNull() && !m_frame->m_part.isNull(); -} - -DOM::AbstractView Window::toAbstractView() const -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (!part) - return DOM::AbstractView(); - return part->document().defaultView(); -} - -void Window::scheduleClose() -{ - kdDebug(6070) << "Window::scheduleClose window.close() " << m_frame << endl; - Q_ASSERT(winq); - TQTimer::singleShot( 0, winq, TQT_SLOT( timeoutClose() ) ); -} - -void Window::closeNow() -{ - if (m_frame.isNull() || m_frame->m_part.isNull()) { - kdDebug(6070) << k_funcinfo << "part is deleted already" << endl; - } else { - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (!part) { - kdDebug(6070) << "closeNow on non KHTML part" << endl; - } else { - //kdDebug(6070) << k_funcinfo << " -> closing window" << endl; - // We want to make sure that window.open won't find this part by name. - part->setName( 0 ); - part->deleteLater(); - part = 0; - } - } -} - -void Window::afterScriptExecution() -{ - DOM::DocumentImpl::updateDocumentsRendering(); - TQValueList<DelayedAction> delayedActions = m_delayed; - m_delayed.clear(); - TQValueList<DelayedAction>::Iterator it = delayedActions.begin(); - for ( ; it != delayedActions.end() ; ++it ) - { - switch ((*it).actionId) { - case DelayedClose: - scheduleClose(); - return; // stop here, in case of multiple actions - case DelayedGoHistory: - goHistory( (*it).param.toInt() ); - break; - case NullAction: - // FIXME: anything needs to be done here? This is warning anyways. - break; - }; - } -} - -bool Window::checkIsSafeScript(KParts::ReadOnlyPart *activePart) const -{ - if (m_frame.isNull() || m_frame->m_part.isNull()) { // part deleted ? can't grant access - kdDebug(6070) << "Window::isSafeScript: accessing deleted part !" << endl; - return false; - } - if (!activePart) { - kdDebug(6070) << "Window::isSafeScript: current interpreter's part is 0L!" << endl; - return false; - } - if ( activePart == m_frame->m_part ) // Not calling from another frame, no problem. - return true; - - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (!part) - return true; // not a KHTMLPart - - if ( part->document().isNull() ) - return true; // allow to access a window that was just created (e.g. with window.open("about:blank")) - - DOM::HTMLDocument thisDocument = part->htmlDocument(); - if ( thisDocument.isNull() ) { - kdDebug(6070) << "Window::isSafeScript: trying to access an XML document !?" << endl; - return false; - } - - KHTMLPart *activeKHTMLPart = ::tqqt_cast<KHTMLPart *>(activePart); - if (!activeKHTMLPart) - return true; // not a KHTMLPart - - DOM::HTMLDocument actDocument = activeKHTMLPart->htmlDocument(); - if ( actDocument.isNull() ) { - kdDebug(6070) << "Window::isSafeScript: active part has no document!" << endl; - return false; - } - DOM::DOMString actDomain = actDocument.domain(); - DOM::DOMString thisDomain = thisDocument.domain(); - - if ( actDomain == thisDomain ) { -#ifdef KJS_VERBOSE - //kdDebug(6070) << "JavaScript: access granted, domain is '" << actDomain.string() << "'" << endl; -#endif - return true; - } - - kdDebug(6070) << "WARNING: JavaScript: access denied for current frame '" << actDomain.string() << "' to frame '" << thisDomain.string() << "'" << endl; - // TODO after 3.1: throw security exception (exec->setException()) - return false; -} - -void Window::setListener(ExecState *exec, int eventId, Value func) -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (!part || !isSafeScript(exec)) - return; - DOM::DocumentImpl *doc = static_cast<DOM::DocumentImpl*>(part->htmlDocument().handle()); - if (!doc) - return; - - doc->setHTMLWindowEventListener(eventId,getJSEventListener(func,true)); -} - -Value Window::getListener(ExecState *exec, int eventId) const -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (!part || !isSafeScript(exec)) - return Undefined(); - DOM::DocumentImpl *doc = static_cast<DOM::DocumentImpl*>(part->htmlDocument().handle()); - if (!doc) - return Undefined(); - - DOM::EventListener *listener = doc->getHTMLWindowEventListener(eventId); - if (listener && static_cast<JSEventListener*>(listener)->listenerObjImp()) - return static_cast<JSEventListener*>(listener)->listenerObj(); - else - return Null(); -} - - -JSEventListener *Window::getJSEventListener(const Value& val, bool html) -{ - // This function is so hot that it's worth coding it directly with imps. - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (!part || val.type() != ObjectType) - return 0; - - // It's ObjectType, so it must be valid. - Object listenerObject = Object::dynamicCast(val); - ObjectImp *listenerObjectImp = listenerObject.imp(); - - // 'listener' is not a simple ecma function. (Always use sanity checks: Better safe than sorry!) - if (!listenerObject.implementsCall() && part && part->jScript() && part->jScript()->interpreter()) - { - Interpreter *interpreter = part->jScript()->interpreter(); - - // 'listener' probably is an EventListener object containing a 'handleEvent' function. - Value handleEventValue = listenerObject.get(interpreter->globalExec(), Identifier("handleEvent")); - Object handleEventObject = Object::dynamicCast(handleEventValue); - - if(handleEventObject.isValid() && handleEventObject.implementsCall()) - { - listenerObject = handleEventObject; - listenerObjectImp = handleEventObject.imp(); - } - } - - JSEventListener *existingListener = jsEventListeners[listenerObjectImp]; - if (existingListener) { - if ( existingListener->isHTMLEventListener() != html ) - // The existingListener will have the wrong type, so onclick= will behave like addEventListener or vice versa. - kdWarning() << "getJSEventListener: event listener already found but with html=" << !html << " - please report this, we thought it would never happen" << endl; - return existingListener; - } - - // Note that the JSEventListener constructor adds it to our jsEventListeners list - return new JSEventListener(listenerObject, listenerObjectImp, Object(this), html); -} - -JSLazyEventListener *Window::getJSLazyEventListener(const TQString& code, const TQString& name, DOM::NodeImpl *node) -{ - return new JSLazyEventListener(code, name, Object(this), node); -} - -void Window::clear( ExecState *exec ) -{ - delete winq; - winq = 0L; - // Get rid of everything, those user vars could hold references to DOM nodes - deleteAllProperties( exec ); - - // Break the dependency between the listeners and their object - TQPtrDictIterator<JSEventListener> it(jsEventListeners); - for (; it.current(); ++it) - it.current()->clear(); - // Forget about the listeners (the DOM::NodeImpls will delete them) - jsEventListeners.clear(); - - if (m_frame) { - KJSProxy* proxy = m_frame->m_jscript; - if (proxy) // i.e. JS not disabled - { - winq = new WindowQObject(this); - // Now recreate a working global object for the next URL that will use us - KJS::Interpreter *interpreter = proxy->interpreter(); - interpreter->initGlobalObject(); - } - } -} - -void Window::setCurrentEvent( DOM::Event *evt ) -{ - m_evt = evt; - //kdDebug(6070) << "Window " << this << " (part=" << m_part << ")::setCurrentEvent m_evt=" << evt << endl; -} - -void Window::goURL(ExecState* exec, const TQString& url, bool lockHistory) -{ - Window* active = Window::retrieveActive(exec); - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - KHTMLPart *active_part = ::tqqt_cast<KHTMLPart *>(active->part()); - // Complete the URL using the "active part" (running interpreter) - if (active_part && part) { - if (url[0] == TQChar('#')) { - part->gotoAnchor(url.mid(1)); - } else { - TQString dstUrl = active_part->htmlDocument().completeURL(url).string(); - kdDebug(6070) << "Window::goURL dstUrl=" << dstUrl << endl; - - // check if we're allowed to inject javascript - // SYNC check with khtml_part.cpp::slotRedirect! - if ( isSafeScript(exec) || - dstUrl.find(TQString::fromLatin1("javascript:"), 0, false) != 0 ) - part->scheduleRedirection(-1, - dstUrl, - lockHistory); - } - } else if (!part && !m_frame->m_part.isNull()) { - KParts::BrowserExtension *b = KParts::BrowserExtension::childObject(m_frame->m_part); - if (b) - b->emit openURLRequest(m_frame->m_frame->element()->getDocument()->completeURL(url)); - kdDebug() << "goURL for ROPart" << endl; - } -} - -KParts::ReadOnlyPart *Window::part() const { - return m_frame.isNull() ? 0L : static_cast<KParts::ReadOnlyPart *>(m_frame->m_part); -} - -void Window::delayedGoHistory( int steps ) -{ - m_delayed.append( DelayedAction( DelayedGoHistory, steps ) ); -} - -void Window::goHistory( int steps ) -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if(!part) - // TODO history readonlypart - return; - KParts::BrowserExtension *ext = part->browserExtension(); - if(!ext) - return; - KParts::BrowserInterface *iface = ext->browserInterface(); - - if ( !iface ) - return; - - iface->callMethod( "goHistory(int)", steps ); - //emit ext->goHistory(steps); -} - -void KJS::Window::resizeTo(TQWidget* tl, int width, int height) -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if(!part) - // TODO resizeTo readonlypart - return; - KParts::BrowserExtension *ext = part->browserExtension(); - if (!ext) { - kdDebug(6070) << "Window::resizeTo found no browserExtension" << endl; - return; - } - - // Security check: within desktop limits and bigger than 100x100 (per spec) - if ( width < 100 || height < 100 ) { - kdDebug(6070) << "Window::resizeTo refused, window would be too small ("<<width<<","<<height<<")" << endl; - return; - } - - TQRect sg = TDEGlobalSettings::desktopGeometry(tl); - - if ( width > sg.width() || height > sg.height() ) { - kdDebug(6070) << "Window::resizeTo refused, window would be too big ("<<width<<","<<height<<")" << endl; - return; - } - - kdDebug(6070) << "resizing to " << width << "x" << height << endl; - - emit ext->resizeTopLevelWidget( width, height ); - - // If the window is out of the desktop, move it up/left - // (maybe we should use workarea instead of sg, otherwise the window ends up below kicker) - int right = tl->x() + tl->frameGeometry().width(); - int bottom = tl->y() + tl->frameGeometry().height(); - int moveByX = 0; - int moveByY = 0; - if ( right > sg.right() ) - moveByX = - right + sg.right(); // always <0 - if ( bottom > sg.bottom() ) - moveByY = - bottom + sg.bottom(); // always <0 - if ( moveByX || moveByY ) - emit ext->moveTopLevelWidget( tl->x() + moveByX , tl->y() + moveByY ); -} - -Value Window::openWindow(ExecState *exec, const List& args) -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (!part) - return Undefined(); - KHTMLView *widget = part->view(); - Value v = args[0]; - TQString str; - if (v.isValid() && !v.isA(UndefinedType)) - str = v.toString(exec).qstring(); - - // prepare arguments - KURL url; - if (!str.isEmpty()) - { - KHTMLPart* p = ::tqqt_cast<KHTMLPart *>(Window::retrieveActive(exec)->m_frame->m_part); - if ( p ) - url = p->htmlDocument().completeURL(str).string(); - if ( !p || - !static_cast<DOM::DocumentImpl*>(p->htmlDocument().handle())->isURLAllowed(url.url()) ) - return Undefined(); - } - - KHTMLSettings::KJSWindowOpenPolicy policy = - part->settings()->windowOpenPolicy(part->url().host()); - if ( policy == KHTMLSettings::KJSWindowOpenAsk ) { - emit part->browserExtension()->requestFocus(part); - TQString caption; - if (!part->url().host().isEmpty()) - caption = part->url().host() + " - "; - caption += i18n( "Confirmation: JavaScript Popup" ); - if ( KMessageBox::questionYesNo(widget, - str.isEmpty() ? - i18n( "This site is requesting to open up a new browser " - "window via JavaScript.\n" - "Do you want to allow this?" ) : - i18n( "<qt>This site is requesting to open<p>%1</p>in a new browser window via JavaScript.<br />" - "Do you want to allow this?</qt>").arg(KStringHandler::csqueeze(url.htmlURL(), 100)), - caption, i18n("Allow"), i18n("Do Not Allow") ) == KMessageBox::Yes ) - policy = KHTMLSettings::KJSWindowOpenAllow; - } else if ( policy == KHTMLSettings::KJSWindowOpenSmart ) - { - // window.open disabled unless from a key/mouse event - if (static_cast<ScriptInterpreter *>(exec->interpreter())->isWindowOpenAllowed()) - policy = KHTMLSettings::KJSWindowOpenAllow; - } - - TQString frameName = args.size() > 1 ? args[1].toString(exec).qstring() : TQString("_blank"); - - v = args[2]; - TQString features; - if (!v.isNull() && v.type() != UndefinedType && v.toString(exec).size() > 0) { - features = v.toString(exec).qstring(); - // Buggy scripts have ' at beginning and end, cut those - if (features.startsWith("\'") && features.endsWith("\'")) - features = features.mid(1, features.length()-2); - } - - if ( policy != KHTMLSettings::KJSWindowOpenAllow ) { - if ( url.isEmpty() ) - part->setSuppressedPopupIndicator(true, 0); - else { - part->setSuppressedPopupIndicator(true, part); - m_suppressedWindowInfo.append( SuppressedWindowInfo( url, frameName, features ) ); - } - return Undefined(); - } else { - return executeOpenWindow(exec, url, frameName, features); - } -} - -Value Window::executeOpenWindow(ExecState *exec, const KURL& url, const TQString& frameName, const TQString& features) -{ - KHTMLPart *p = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - KHTMLView *widget = p->view(); - KParts::WindowArgs winargs; - - // scan feature argument - if (!features.isEmpty()) { - // specifying window params means false defaults - winargs.menuBarVisible = false; - winargs.toolBarsVisible = false; - winargs.statusBarVisible = false; - winargs.scrollBarsVisible = false; - TQStringList flist = TQStringList::split(',', features); - TQStringList::ConstIterator it = flist.begin(); - while (it != flist.end()) { - TQString s = *it++; - TQString key, val; - int pos = s.find('='); - if (pos >= 0) { - key = s.left(pos).stripWhiteSpace().lower(); - val = s.mid(pos + 1).stripWhiteSpace().lower(); - TQRect screen = TDEGlobalSettings::desktopGeometry(widget->topLevelWidget()); - - if (key == "left" || key == "screenx") { - winargs.x = (int)val.toFloat() + screen.x(); - if (winargs.x < screen.x() || winargs.x > screen.right()) - winargs.x = screen.x(); // only safe choice until size is determined - } else if (key == "top" || key == "screeny") { - winargs.y = (int)val.toFloat() + screen.y(); - if (winargs.y < screen.y() || winargs.y > screen.bottom()) - winargs.y = screen.y(); // only safe choice until size is determined - } else if (key == "height") { - winargs.height = (int)val.toFloat() + 2*tqApp->style().pixelMetric( TQStyle::PM_DefaultFrameWidth ) + 2; - if (winargs.height > screen.height()) // should actually check workspace - winargs.height = screen.height(); - if (winargs.height < 100) - winargs.height = 100; - } else if (key == "width") { - winargs.width = (int)val.toFloat() + 2*tqApp->style().pixelMetric( TQStyle::PM_DefaultFrameWidth ) + 2; - if (winargs.width > screen.width()) // should actually check workspace - winargs.width = screen.width(); - if (winargs.width < 100) - winargs.width = 100; - } else { - goto boolargs; - } - continue; - } else { - // leaving away the value gives true - key = s.stripWhiteSpace().lower(); - val = "1"; - } - boolargs: - if (key == "menubar") - winargs.menuBarVisible = (val == "1" || val == "yes"); - else if (key == "toolbar") - winargs.toolBarsVisible = (val == "1" || val == "yes"); - else if (key == "location") // ### missing in WindowArgs - winargs.toolBarsVisible = (val == "1" || val == "yes"); - else if (key == "status" || key == "statusbar") - winargs.statusBarVisible = (val == "1" || val == "yes"); - else if (key == "scrollbars") - winargs.scrollBarsVisible = (val == "1" || val == "yes"); - else if (key == "resizable") - winargs.resizable = (val == "1" || val == "yes"); - else if (key == "fullscreen") - winargs.fullscreen = (val == "1" || val == "yes"); - } - } - - KParts::URLArgs uargs; - uargs.frameName = frameName; - - if ( uargs.frameName.lower() == "_top" ) - { - while ( p->parentPart() ) - p = p->parentPart(); - Window::retrieveWindow(p)->goURL(exec, url.url(), false /*don't lock history*/); - return Window::retrieve(p); - } - if ( uargs.frameName.lower() == "_parent" ) - { - if ( p->parentPart() ) - p = p->parentPart(); - Window::retrieveWindow(p)->goURL(exec, url.url(), false /*don't lock history*/); - return Window::retrieve(p); - } - if ( uargs.frameName.lower() == "_self") - { - Window::retrieveWindow(p)->goURL(exec, url.url(), false /*don't lock history*/); - return Window::retrieve(p); - } - if ( uargs.frameName.lower() == "replace" ) - { - Window::retrieveWindow(p)->goURL(exec, url.url(), true /*lock history*/); - return Window::retrieve(p); - } - uargs.serviceType = "text/html"; - - // request window (new or existing if framename is set) - KParts::ReadOnlyPart *newPart = 0L; - emit p->browserExtension()->createNewWindow(KURL(), uargs,winargs,newPart); - if (newPart && ::tqqt_cast<KHTMLPart*>(newPart)) { - KHTMLPart *khtmlpart = static_cast<KHTMLPart*>(newPart); - //tqDebug("opener set to %p (this Window's part) in new Window %p (this Window=%p)",part,win,window); - khtmlpart->setOpener(p); - khtmlpart->setOpenedByJS(true); - if (khtmlpart->document().isNull()) { - khtmlpart->begin(); - khtmlpart->write("<HTML><BODY>"); - khtmlpart->end(); - if ( p->docImpl() ) { - //kdDebug(6070) << "Setting domain to " << p->docImpl()->domain().string() << endl; - khtmlpart->docImpl()->setDomain( p->docImpl()->domain()); - khtmlpart->docImpl()->setBaseURL( p->docImpl()->baseURL() ); - } - } - uargs.serviceType = TQString::null; - if (uargs.frameName.lower() == "_blank") - uargs.frameName = TQString::null; - if (!url.isEmpty()) - emit khtmlpart->browserExtension()->openURLRequest(url,uargs); - return Window::retrieve(khtmlpart); // global object - } else - return Undefined(); -} - -void Window::forgetSuppressedWindows() -{ - m_suppressedWindowInfo.clear(); -} - -void Window::showSuppressedWindows() -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>( m_frame->m_part ); - KJS::Interpreter *interpreter = part->jScript()->interpreter(); - ExecState *exec = interpreter->globalExec(); - - TQValueList<SuppressedWindowInfo> suppressedWindowInfo = m_suppressedWindowInfo; - m_suppressedWindowInfo.clear(); - TQValueList<SuppressedWindowInfo>::Iterator it = suppressedWindowInfo.begin(); - for ( ; it != suppressedWindowInfo.end() ; ++it ) { - executeOpenWindow(exec, (*it).url, (*it).frameName, (*it).features); - } -} - -Value WindowFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( Window, thisObj ); - - // these should work no matter whether the window is already - // closed or not - if (id == Window::ValueOf || id == Window::ToString) { - return String("[object Window]"); - } - - Window *window = static_cast<Window *>(thisObj.imp()); - TQString str, str2; - - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(window->m_frame->m_part); - if (!part) - return Undefined(); - - KHTMLView *widget = part->view(); - Value v = args[0]; - UString s; - if (v.isValid() && !v.isA(UndefinedType)) { - s = v.toString(exec); - str = s.qstring(); - } - - TQString caption; - if (part && !part->url().host().isEmpty()) - caption = part->url().host() + " - "; - caption += "JavaScript"; // TODO: i18n - // functions that work everywhere - switch(id) { - case Window::Alert: - if (!widget->dialogsAllowed()) - return Undefined(); - if ( part && part->xmlDocImpl() ) - part->xmlDocImpl()->updateRendering(); - if ( part ) - emit part->browserExtension()->requestFocus(part); - KMessageBox::error(widget, TQStyleSheet::convertFromPlainText(str, TQStyleSheetItem::WhiteSpaceNormal), caption); - return Undefined(); - case Window::Confirm: - if (!widget->dialogsAllowed()) - return Undefined(); - if ( part && part->xmlDocImpl() ) - part->xmlDocImpl()->updateRendering(); - if ( part ) - emit part->browserExtension()->requestFocus(part); - return Boolean((KMessageBox::warningYesNo(widget, TQStyleSheet::convertFromPlainText(str), caption, - KStdGuiItem::ok(), KStdGuiItem::cancel()) == KMessageBox::Yes)); - case Window::Prompt: -#ifndef KONQ_EMBEDDED - if (!widget->dialogsAllowed()) - return Undefined(); - if ( part && part->xmlDocImpl() ) - part->xmlDocImpl()->updateRendering(); - if ( part ) - emit part->browserExtension()->requestFocus(part); - bool ok; - if (args.size() >= 2) - str2 = KInputDialog::getText(caption, - TQStyleSheet::convertFromPlainText(str), - args[1].toString(exec).qstring(), &ok, widget); - else - str2 = KInputDialog::getText(caption, - TQStyleSheet::convertFromPlainText(str), - TQString::null, &ok, widget); - if ( ok ) - return String(str2); - else - return Null(); -#else - return Undefined(); -#endif - case Window::GetComputedStyle: { - if ( !part || !part->xmlDocImpl() ) - return Undefined(); - DOM::Node arg0 = toNode(args[0]); - if (arg0.nodeType() != DOM::Node::ELEMENT_NODE) - return Undefined(); // throw exception? - else - return getDOMCSSStyleDeclaration(exec, part->document().defaultView().getComputedStyle(static_cast<DOM::Element>(arg0), - args[1].toString(exec).string())); - } - case Window::Open: - return window->openWindow(exec, args); - case Window::Close: { - /* From http://developer.netscape.com/docs/manuals/js/client/jsref/window.htm : - The close method closes only windows opened by JavaScript using the open method. - If you attempt to close any other window, a confirm is generated, which - lets the user choose whether the window closes. - This is a security feature to prevent "mail bombs" containing self.close(). - However, if the window has only one document (the current one) in its - session history, the close is allowed without any confirm. This is a - special case for one-off windows that need to open other windows and - then dispose of themselves. - */ - bool doClose = false; - if (!part->openedByJS()) - { - // To conform to the SPEC, we only ask if the window - // has more than one entry in the history (NS does that too). - History history(exec,part); - - if ( history.get( exec, "length" ).toInt32(exec) <= 1 ) - { - doClose = true; - } - else - { - // Can we get this dialog with tabs??? Does it close the window or the tab in that case? - emit part->browserExtension()->requestFocus(part); - if ( KMessageBox::questionYesNo( window->part()->widget(), - i18n("Close window?"), i18n("Confirmation Required"), - KStdGuiItem::close(), KStdGuiItem::cancel() ) - == KMessageBox::Yes ) - doClose = true; - } - } - else - doClose = true; - - if (doClose) - { - // If this is the current window (the one the interpreter runs in), - // then schedule a delayed close (so that the script terminates first). - // But otherwise, close immediately. This fixes w=window.open("","name");w.close();window.open("name"); - if ( Window::retrieveActive(exec) == window ) { - if (widget) { - // quit all dialogs of this view - // this fixes 'setTimeout('self.close()',1000); alert("Hi");' crash - widget->closeChildDialogs(); - } - //kdDebug() << "scheduling delayed close" << endl; - // We'll close the window at the end of the script execution - Window* w = const_cast<Window*>(window); - w->m_delayed.append( Window::DelayedAction( Window::DelayedClose ) ); - } else { - //kdDebug() << "closing NOW" << endl; - (const_cast<Window*>(window))->closeNow(); - } - } - return Undefined(); - } - case Window::Navigate: - window->goURL(exec, args[0].toString(exec).qstring(), false /*don't lock history*/); - return Undefined(); - case Window::Focus: { - KHTMLSettings::KJSWindowFocusPolicy policy = - part->settings()->windowFocusPolicy(part->url().host()); - if(policy == KHTMLSettings::KJSWindowFocusAllow && widget) { - widget->topLevelWidget()->raise(); - KWin::deIconifyWindow( widget->topLevelWidget()->winId() ); - widget->setActiveWindow(); - emit part->browserExtension()->requestFocus(part); - } - return Undefined(); - } - case Window::Blur: - // TODO - return Undefined(); - case Window::BToA: - case Window::AToB: { - if (!s.is8Bit()) - return Undefined(); - TQByteArray in, out; - char *binData = s.ascii(); - in.setRawData( binData, s.size() ); - if (id == Window::AToB) - KCodecs::base64Decode( in, out ); - else - KCodecs::base64Encode( in, out ); - in.resetRawData( binData, s.size() ); - UChar *d = new UChar[out.size()]; - for (uint i = 0; i < out.size(); i++) - d[i].uc = (uchar) out[i]; - UString ret(d, out.size(), false /*no copy*/); - return String(ret); - } - - }; - - - // now unsafe functions.. - if (!window->isSafeScript(exec)) - return Undefined(); - - switch (id) { - case Window::ScrollBy: - if(args.size() == 2 && widget) - widget->scrollBy(args[0].toInt32(exec), args[1].toInt32(exec)); - return Undefined(); - case Window::Scroll: - case Window::ScrollTo: - if(args.size() == 2 && widget) - widget->setContentsPos(args[0].toInt32(exec), args[1].toInt32(exec)); - return Undefined(); - case Window::MoveBy: { - KHTMLSettings::KJSWindowMovePolicy policy = - part->settings()->windowMovePolicy(part->url().host()); - if(policy == KHTMLSettings::KJSWindowMoveAllow && args.size() == 2 && widget) - { - KParts::BrowserExtension *ext = part->browserExtension(); - if (ext) { - TQWidget * tl = widget->topLevelWidget(); - TQRect sg = TDEGlobalSettings::desktopGeometry(tl); - - TQPoint dest = tl->pos() + TQPoint( args[0].toInt32(exec), args[1].toInt32(exec) ); - // Security check (the spec talks about UniversalBrowserWrite to disable this check...) - if ( dest.x() >= sg.x() && dest.y() >= sg.x() && - dest.x()+tl->width() <= sg.width()+sg.x() && - dest.y()+tl->height() <= sg.height()+sg.y() ) - emit ext->moveTopLevelWidget( dest.x(), dest.y() ); - } - } - return Undefined(); - } - case Window::MoveTo: { - KHTMLSettings::KJSWindowMovePolicy policy = - part->settings()->windowMovePolicy(part->url().host()); - if(policy == KHTMLSettings::KJSWindowMoveAllow && args.size() == 2 && widget) - { - KParts::BrowserExtension *ext = part->browserExtension(); - if (ext) { - TQWidget * tl = widget->topLevelWidget(); - TQRect sg = TDEGlobalSettings::desktopGeometry(tl); - - TQPoint dest( args[0].toInt32(exec)+sg.x(), args[1].toInt32(exec)+sg.y() ); - // Security check (the spec talks about UniversalBrowserWrite to disable this check...) - if ( dest.x() >= sg.x() && dest.y() >= sg.y() && - dest.x()+tl->width() <= sg.width()+sg.x() && - dest.y()+tl->height() <= sg.height()+sg.y() ) - emit ext->moveTopLevelWidget( dest.x(), dest.y() ); - } - } - return Undefined(); - } - case Window::ResizeBy: { - KHTMLSettings::KJSWindowResizePolicy policy = - part->settings()->windowResizePolicy(part->url().host()); - if(policy == KHTMLSettings::KJSWindowResizeAllow - && args.size() == 2 && widget) - { - TQWidget * tl = widget->topLevelWidget(); - TQRect geom = tl->frameGeometry(); - window->resizeTo( tl, - geom.width() + args[0].toInt32(exec), - geom.height() + args[1].toInt32(exec) ); - } - return Undefined(); - } - case Window::ResizeTo: { - KHTMLSettings::KJSWindowResizePolicy policy = - part->settings()->windowResizePolicy(part->url().host()); - if(policy == KHTMLSettings::KJSWindowResizeAllow - && args.size() == 2 && widget) - { - TQWidget * tl = widget->topLevelWidget(); - window->resizeTo( tl, args[0].toInt32(exec), args[1].toInt32(exec) ); - } - return Undefined(); - } - case Window::SetTimeout: - case Window::SetInterval: { - bool singleShot; - int i; // timeout interval - if (args.size() == 0) - return Undefined(); - if (args.size() > 1) { - singleShot = (id == Window::SetTimeout); - i = args[1].toInt32(exec); - } else { - // second parameter is missing. Emulate Mozilla behavior. - singleShot = true; - i = 4; - } - if (v.isA(StringType)) { - int r = (const_cast<Window*>(window))->winq->installTimeout(Identifier(s), i, singleShot ); - return Number(r); - } - else if (v.isA(ObjectType) && Object::dynamicCast(v).implementsCall()) { - Object func = Object::dynamicCast(v); - List funcArgs; - ListIterator it = args.begin(); - int argno = 0; - while (it != args.end()) { - Value arg = it++; - if (argno++ >= 2) - funcArgs.append(arg); - } - if (args.size() < 2) - funcArgs.append(Number(i)); - int r = (const_cast<Window*>(window))->winq->installTimeout(func, funcArgs, i, singleShot ); - return Number(r); - } - else - return Undefined(); - } - case Window::ClearTimeout: - case Window::ClearInterval: - (const_cast<Window*>(window))->winq->clearTimeout(v.toInt32(exec)); - return Undefined(); - case Window::Print: - if ( widget ) { - // ### TODO emit onbeforeprint event - widget->print(); - // ### TODO emit onafterprint event - } - case Window::CaptureEvents: - case Window::ReleaseEvents: - // Do nothing for now. These are NS-specific legacy calls. - break; - case Window::AddEventListener: { - JSEventListener *listener = Window::retrieveActive(exec)->getJSEventListener(args[1]); - if (listener) { - DOM::DocumentImpl* docimpl = static_cast<DOM::DocumentImpl *>(part->document().handle()); - docimpl->addWindowEventListener(DOM::EventImpl::typeToId(args[0].toString(exec).string()),listener,args[2].toBoolean(exec)); - } - return Undefined(); - } - case Window::RemoveEventListener: { - JSEventListener *listener = Window::retrieveActive(exec)->getJSEventListener(args[1]); - if (listener) { - DOM::DocumentImpl* docimpl = static_cast<DOM::DocumentImpl *>(part->document().handle()); - docimpl->removeWindowEventListener(DOM::EventImpl::typeToId(args[0].toString(exec).string()),listener,args[2].toBoolean(exec)); - } - return Undefined(); - } - - } - return Undefined(); -} - -////////////////////// ScheduledAction //////////////////////// - -// KDE 4: Make those parameters const ... & -ScheduledAction::ScheduledAction(Object _func, List _args, DateTimeMS _nextTime, int _interval, bool _singleShot, - int _timerId) -{ - //kdDebug(6070) << "ScheduledAction::ScheduledAction(isFunction) " << this << endl; - func = static_cast<ObjectImp*>(_func.imp()); - args = _args; - isFunction = true; - singleShot = _singleShot; - nextTime = _nextTime; - interval = _interval; - executing = false; - timerId = _timerId; -} - -// KDE 4: Make it const TQString & -ScheduledAction::ScheduledAction(TQString _code, DateTimeMS _nextTime, int _interval, bool _singleShot, int _timerId) -{ - //kdDebug(6070) << "ScheduledAction::ScheduledAction(!isFunction) " << this << endl; - //func = 0; - //args = 0; - func = 0; - code = _code; - isFunction = false; - singleShot = _singleShot; - nextTime = _nextTime; - interval = _interval; - executing = false; - timerId = _timerId; -} - -bool ScheduledAction::execute(Window *window) -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(window->m_frame->m_part); - if (!part || !part->jScriptEnabled()) - return false; - ScriptInterpreter *interpreter = static_cast<ScriptInterpreter *>(part->jScript()->interpreter()); - - interpreter->setProcessingTimerCallback(true); - - //kdDebug(6070) << "ScheduledAction::execute " << this << endl; - if (isFunction) { - if (func->implementsCall()) { - // #### check this - Q_ASSERT( part ); - if ( part ) - { - KJS::Interpreter *interpreter = part->jScript()->interpreter(); - ExecState *exec = interpreter->globalExec(); - Q_ASSERT( window == interpreter->globalObject().imp() ); - Object obj( window ); - func->call(exec,obj,args); // note that call() creates its own execution state for the func call - if (exec->hadException()) - exec->clearException(); - - // Update our document's rendering following the execution of the timeout callback. - part->document().updateRendering(); - } - } - } - else { - part->executeScript(DOM::Node(), code); - } - - interpreter->setProcessingTimerCallback(false); - return true; -} - -void ScheduledAction::mark() -{ - if (func && !func->marked()) - func->mark(); - args.mark(); -} - -ScheduledAction::~ScheduledAction() -{ - //kdDebug(6070) << "ScheduledAction::~ScheduledAction " << this << endl; -} - -////////////////////// WindowQObject //////////////////////// - -WindowQObject::WindowQObject(Window *w) - : parent(w) -{ - //kdDebug(6070) << "WindowQObject::WindowQObject " << this << endl; - if ( !parent->m_frame ) - kdDebug(6070) << "WARNING: null part in " << k_funcinfo << endl; - else - connect( parent->m_frame, TQT_SIGNAL( destroyed() ), - this, TQT_SLOT( parentDestroyed() ) ); - pausedTime = 0; - lastTimerId = 0; - currentlyDispatching = false; -} - -WindowQObject::~WindowQObject() -{ - //kdDebug(6070) << "WindowQObject::~WindowQObject " << this << endl; - parentDestroyed(); // reuse same code -} - -void WindowQObject::parentDestroyed() -{ - killTimers(); - - TQPtrListIterator<ScheduledAction> it(scheduledActions); - for (; it.current(); ++it) - delete it.current(); - scheduledActions.clear(); -} - -int WindowQObject::installTimeout(const Identifier &handler, int t, bool singleShot) -{ - int id = ++lastTimerId; - if (t < 10) t = 10; - DateTimeMS nextTime = DateTimeMS::now().addMSecs(-pausedTime + t); - - ScheduledAction *action = new ScheduledAction(handler.qstring(),nextTime,t,singleShot,id); - scheduledActions.append(action); - setNextTimer(); - return id; -} - -int WindowQObject::installTimeout(const Value &func, List args, int t, bool singleShot) -{ - Object objFunc = Object::dynamicCast( func ); - if (!objFunc.isValid()) - return 0; - int id = ++lastTimerId; - if (t < 10) t = 10; - - DateTimeMS nextTime = DateTimeMS::now().addMSecs(-pausedTime + t); - ScheduledAction *action = new ScheduledAction(objFunc,args,nextTime,t,singleShot,id); - scheduledActions.append(action); - setNextTimer(); - return id; -} - -void WindowQObject::clearTimeout(int timerId) -{ - TQPtrListIterator<ScheduledAction> it(scheduledActions); - for (; it.current(); ++it) { - ScheduledAction *action = it.current(); - if (action->timerId == timerId) { - scheduledActions.removeRef(action); - if (!action->executing) - delete action; - return; - } - } -} - -bool WindowQObject::hasTimers() const -{ - return scheduledActions.count(); -} - -void WindowQObject::mark() -{ - TQPtrListIterator<ScheduledAction> it(scheduledActions); - for (; it.current(); ++it) - it.current()->mark(); -} - -void WindowQObject::timerEvent(TQTimerEvent *) -{ - killTimers(); - - if (scheduledActions.isEmpty()) - return; - - currentlyDispatching = true; - - - DateTimeMS currentActual = DateTimeMS::now(); - DateTimeMS currentAdjusted = currentActual.addMSecs(-pausedTime); - - // Work out which actions are to be executed. We take a separate copy of - // this list since the main one may be modified during action execution - TQPtrList<ScheduledAction> toExecute; - TQPtrListIterator<ScheduledAction> it(scheduledActions); - for (; it.current(); ++it) - if (currentAdjusted >= it.current()->nextTime) - toExecute.append(it.current()); - - // ### verify that the window can't be closed (and action deleted) during execution - it = TQPtrListIterator<ScheduledAction>(toExecute); - for (; it.current(); ++it) { - ScheduledAction *action = it.current(); - if (!scheduledActions.containsRef(action)) // removed by clearTimeout() - continue; - - action->executing = true; // prevent deletion in clearTimeout() - - if (parent->part()) { - bool ok = action->execute(parent); - if ( !ok ) // e.g. JS disabled - scheduledActions.removeRef( action ); - } - - if (action->singleShot) { - scheduledActions.removeRef(action); - } - - action->executing = false; - - if (!scheduledActions.containsRef(action)) - delete action; - else - action->nextTime = action->nextTime.addMSecs(action->interval); - } - - pausedTime += currentActual.msecsTo(DateTimeMS::now()); - - currentlyDispatching = false; - - // Work out when next event is to occur - setNextTimer(); -} - -DateTimeMS DateTimeMS::addMSecs(int s) const -{ - DateTimeMS c = *this; - c.mTime = TQT_TQTIME_OBJECT(mTime.addMSecs(s)); - if (s > 0) - { - if (c.mTime < mTime) - c.mDate = TQT_TQDATE_OBJECT(mDate.addDays(1)); - } - else - { - if (c.mTime > mTime) - c.mDate = TQT_TQDATE_OBJECT(mDate.addDays(-1)); - } - return c; -} - -bool DateTimeMS::operator >(const DateTimeMS &other) const -{ - if (mDate > other.mDate) - return true; - - if (mDate < other.mDate) - return false; - - return mTime > other.mTime; -} - -bool DateTimeMS::operator >=(const DateTimeMS &other) const -{ - if (mDate > other.mDate) - return true; - - if (mDate < other.mDate) - return false; - - return mTime >= other.mTime; -} - -int DateTimeMS::msecsTo(const DateTimeMS &other) const -{ - int d = mDate.daysTo(other.mDate); - int ms = mTime.msecsTo(other.mTime); - return d*24*60*60*1000 + ms; -} - - -DateTimeMS DateTimeMS::now() -{ - DateTimeMS t; - TQTime before = TQTime::currentTime(); - t.mDate = TQDate::currentDate(); - t.mTime = TQTime::currentTime(); - if (t.mTime < before) - t.mDate = TQDate::currentDate(); // prevent race condition in hacky way :) - return t; -} - -void WindowQObject::setNextTimer() -{ - if (currentlyDispatching) - return; // Will schedule at the end - - if (scheduledActions.isEmpty()) - return; - - TQPtrListIterator<ScheduledAction> it(scheduledActions); - DateTimeMS nextTime = it.current()->nextTime; - for (++it; it.current(); ++it) - if (nextTime > it.current()->nextTime) - nextTime = it.current()->nextTime; - - DateTimeMS nextTimeActual = nextTime.addMSecs(pausedTime); - int nextInterval = DateTimeMS::now().msecsTo(nextTimeActual); - if (nextInterval < 0) - nextInterval = 0; - startTimer(nextInterval); -} - -void WindowQObject::timeoutClose() -{ - parent->closeNow(); -} - -Value FrameArray::get(ExecState *exec, const Identifier &p) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "FrameArray::get " << p.qstring() << " part=" << (void*)part << endl; -#endif - if (part.isNull()) - return Undefined(); - - TQPtrList<KParts::ReadOnlyPart> frames = part->frames(); - unsigned int len = frames.count(); - if (p == lengthPropertyName) - return Number(len); - else if (p== "location") // non-standard property, but works in NS and IE - { - Object obj = Object::dynamicCast( Window::retrieve( part ) ); - if ( obj.isValid() ) - return obj.get( exec, "location" ); - return Undefined(); - } - - // check for the name or number - KParts::ReadOnlyPart *frame = part->findFramePart(p.qstring()); - if (!frame) { - bool ok; - unsigned int i = p.toArrayIndex(&ok); - if (ok && i < len) - frame = frames.at(i); - } - - // we are potentially fetching a reference to a another Window object here. - // i.e. we may be accessing objects from another interpreter instance. - // Therefore we have to be a bit careful with memory management. - if (frame) { - return Window::retrieve(frame); - } - - // Fun IE quirk: name lookup in there is actually done by document.all - // hence, it can find non-frame things (and even let them hide frame ones!) - // We don't quite do that, but do this as a fallback. - DOM::DocumentImpl* doc = static_cast<DOM::DocumentImpl*>(part->document().handle()); - if (doc) { - DOM::HTMLCollectionImpl docuAll(doc, DOM::HTMLCollectionImpl::DOC_ALL); - DOM::NodeImpl* node = docuAll.namedItem(p.string()); - if (node) { - if (node->id() == ID_FRAME || node->id() == ID_IFRAME) { - //Return the Window object. - KHTMLPart* part = static_cast<DOM::HTMLFrameElementImpl*>(node)->contentPart(); - if (part) - return Value(Window::retrieveWindow(part)); - else - return Undefined(); - } else { - //Just a regular node.. - return getDOMNode(exec, node); - } - } - } else { - kdWarning(6070) << "Missing own document in FrameArray::get()" << endl; - } - - return ObjectImp::get(exec, p); -} - -Value FrameArray::call(ExecState *exec, Object &/*thisObj*/, const List &args) -{ - //IE supports a subset of the get functionality as call... - //... basically, when the return is a window, it supports that, otherwise it - //errors out. We do a cheap-and-easy emulation of that, and just do the same - //thing as get does. - if (args.size() == 1) - return get(exec, Identifier(args[0].toString(exec))); - - return Undefined(); -} - - -////////////////////// Location Object //////////////////////// - -const ClassInfo Location::info = { "Location", 0, &LocationTable, 0 }; -/* -@begin LocationTable 11 - hash Location::Hash DontDelete - host Location::Host DontDelete - hostname Location::Hostname DontDelete - href Location::Href DontDelete - pathname Location::Pathname DontDelete - port Location::Port DontDelete - protocol Location::Protocol DontDelete - search Location::Search DontDelete - [[==]] Location::EqualEqual DontDelete|ReadOnly - assign Location::Assign DontDelete|Function 1 - toString Location::ToString DontDelete|Function 0 - replace Location::Replace DontDelete|Function 1 - reload Location::Reload DontDelete|Function 0 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(LocationFunc) -Location::Location(khtml::ChildFrame *f) : m_frame(f) -{ - //kdDebug(6070) << "Location::Location " << this << " m_part=" << (void*)m_part << endl; -} - -Location::~Location() -{ - //kdDebug(6070) << "Location::~Location " << this << " m_part=" << (void*)m_part << endl; -} - -KParts::ReadOnlyPart *Location::part() const { - return m_frame ? static_cast<KParts::ReadOnlyPart *>(m_frame->m_part) : 0L; -} - -Value Location::get(ExecState *exec, const Identifier &p) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "Location::get " << p.qstring() << " m_part=" << (void*)m_frame->m_part << endl; -#endif - - if (m_frame.isNull() || m_frame->m_part.isNull()) - return Undefined(); - - const HashEntry *entry = Lookup::findEntry(&LocationTable, p); - - // properties that work on all Location objects - if ( entry && entry->value == Replace ) - return lookupOrCreateFunction<LocationFunc>(exec,p,this,entry->value,entry->params,entry->attr); - - // XSS check - const Window* window = Window::retrieveWindow( m_frame->m_part ); - if ( !window || !window->isSafeScript(exec) ) - return Undefined(); - - KURL url = m_frame->m_part->url(); - if (entry) - switch (entry->value) { - case Hash: - return String( url.ref().isNull() ? TQString("") : "#" + url.ref() ); - case Host: { - UString str = url.host(); - if (url.port()) - str += ":" + TQString::number((int)url.port()); - return String(str); - // Note: this is the IE spec. The NS spec swaps the two, it says - // "The hostname property is the concatenation of the host and port properties, separated by a colon." - // Bleh. - } - case Hostname: - return String( url.host() ); - case Href: - if (url.isEmpty()) - return String("about:blank"); - else if (!url.hasPath()) - return String( url.prettyURL()+"/" ); - else - return String( url.prettyURL() ); - case Pathname: - if (url.isEmpty()) - return String(""); - return String( url.path().isEmpty() ? TQString("/") : url.path() ); - case Port: - return String( url.port() ? TQString::number((int)url.port()) : TQString::fromLatin1("") ); - case Protocol: - return String( url.protocol()+":" ); - case Search: - return String( url.query() ); - case EqualEqual: // [[==]] - return String(toString(exec)); - case ToString: - return lookupOrCreateFunction<LocationFunc>(exec,p,this,entry->value,entry->params,entry->attr); - } - // Look for overrides - ValueImp * val = ObjectImp::getDirect(p); - if (val) - return Value(val); - if (entry && (entry->attr & Function)) - return lookupOrCreateFunction<LocationFunc>(exec,p,this,entry->value,entry->params,entry->attr); - - return Undefined(); -} - -void Location::put(ExecState *exec, const Identifier &p, const Value &v, int attr) -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "Location::put " << p.qstring() << " m_part=" << (void*)m_frame->m_part << endl; -#endif - if (m_frame.isNull() || m_frame->m_part.isNull()) - return; - - const Window* window = Window::retrieveWindow( m_frame->m_part ); - if ( !window ) - return; - - KURL url = m_frame->m_part->url(); - - const HashEntry *entry = Lookup::findEntry(&LocationTable, p); - - if (entry) { - - // XSS check. Only new hrefs can be set from other sites - if (entry->value != Href && !window->isSafeScript(exec)) - return; - - TQString str = v.toString(exec).qstring(); - switch (entry->value) { - case Href: { - KHTMLPart* p =::tqqt_cast<KHTMLPart*>(Window::retrieveActive(exec)->part()); - if ( p ) - url = p->htmlDocument().completeURL( str ).string(); - else - url = str; - break; - } - case Hash: - // when the hash is already the same ignore it - if (str == url.ref()) return; - url.setRef(str); - break; - case Host: { - TQString host = str.left(str.find(":")); - TQString port = str.mid(str.find(":")+1); - url.setHost(host); - url.setPort(port.toUInt()); - break; - } - case Hostname: - url.setHost(str); - break; - case Pathname: - url.setPath(str); - break; - case Port: - url.setPort(str.toUInt()); - break; - case Protocol: - url.setProtocol(str); - break; - case Search: - url.setQuery(str); - break; - } - } else { - ObjectImp::put(exec, p, v, attr); - return; - } - - Window::retrieveWindow(m_frame->m_part)->goURL(exec, url.url(), false /* don't lock history*/ ); -} - -Value Location::toPrimitive(ExecState *exec, Type) const -{ - if (m_frame) { - Window* window = Window::retrieveWindow( m_frame->m_part ); - if ( window && window->isSafeScript(exec) ) - return String(toString(exec)); - } - return Undefined(); -} - -UString Location::toString(ExecState *exec) const -{ - if (m_frame) { - Window* window = Window::retrieveWindow( m_frame->m_part ); - if ( window && window->isSafeScript(exec) ) - { - KURL url = m_frame->m_part->url(); - if (url.isEmpty()) - return "about:blank"; - else if (!url.hasPath()) - return url.prettyURL()+"/"; - else - return url.prettyURL(); - } - } - return ""; -} - -Value LocationFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( Location, thisObj ); - Location *location = static_cast<Location *>(thisObj.imp()); - KParts::ReadOnlyPart *part = location->part(); - - if (!part) return Undefined(); - - Window* window = Window::retrieveWindow(part); - - if ( !window->isSafeScript(exec) && id != Location::Replace) - return Undefined(); - - switch (id) { - case Location::Assign: - case Location::Replace: - Window::retrieveWindow(part)->goURL(exec, args[0].toString(exec).qstring(), - id == Location::Replace); - break; - case Location::Reload: { - KHTMLPart *khtmlpart = ::tqqt_cast<KHTMLPart *>(part); - if (khtmlpart) - khtmlpart->scheduleRedirection(-1, part->url().url(), true/*lock history*/); - else - part->openURL(part->url()); - break; - } - case Location::ToString: - return String(location->toString(exec)); - } - return Undefined(); -} - -////////////////////// External Object //////////////////////// - -const ClassInfo External::info = { "External", 0, 0, 0 }; -/* -@begin ExternalTable 4 - addFavorite External::AddFavorite DontDelete|Function 1 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(ExternalFunc) - -Value External::get(ExecState *exec, const Identifier &p) const -{ - return lookupGetFunction<ExternalFunc,ObjectImp>(exec,p,&ExternalTable,this); -} - -Value ExternalFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( External, thisObj ); - External *external = static_cast<External *>(thisObj.imp()); - - KHTMLPart *part = external->part; - if (!part) - return Undefined(); - - KHTMLView *widget = part->view(); - - switch (id) { - case External::AddFavorite: - { -#ifndef KONQ_EMBEDDED - if (!widget->dialogsAllowed()) - return Undefined(); - part->xmlDocImpl()->updateRendering(); - if (args.size() != 1 && args.size() != 2) - return Undefined(); - - TQString url = args[0].toString(exec).qstring(); - TQString title; - if (args.size() == 2) - title = args[1].toString(exec).qstring(); - - // AK - don't do anything yet, for the moment i - // just wanted the base js handling code in cvs - return Undefined(); - - TQString question; - if ( title.isEmpty() ) - question = i18n("Do you want a bookmark pointing to the location \"%1\" to be added to your collection?") - .arg(url); - else - question = i18n("Do you want a bookmark pointing to the location \"%1\" titled \"%2\" to be added to your collection?") - .arg(url).arg(title); - - emit part->browserExtension()->requestFocus(part); - - TQString caption; - if (!part->url().host().isEmpty()) - caption = part->url().host() + " - "; - caption += i18n("JavaScript Attempted Bookmark Insert"); - - if (KMessageBox::warningYesNo( - widget, question, caption, - i18n("Insert"), i18n("Disallow")) == KMessageBox::Yes) - { - KBookmarkManager *mgr = KBookmarkManager::userBookmarksManager(); - mgr->addBookmarkDialog(url,title); - } -#else - return Undefined(); -#endif - break; - } - default: - return Undefined(); - } - - return Undefined(); -} - -////////////////////// History Object //////////////////////// - -const ClassInfo History::info = { "History", 0, 0, 0 }; -/* -@begin HistoryTable 4 - length History::Length DontDelete|ReadOnly - back History::Back DontDelete|Function 0 - forward History::Forward DontDelete|Function 0 - go History::Go DontDelete|Function 1 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(HistoryFunc) - -Value History::get(ExecState *exec, const Identifier &p) const -{ - return lookupGet<HistoryFunc,History,ObjectImp>(exec,p,&HistoryTable,this); -} - -Value History::getValueProperty(ExecState *, int token) const -{ - // if previous or next is implemented, make sure its not a major - // privacy leak (see i.e. http://security.greymagic.com/adv/gm005-op/) - switch (token) { - case Length: - { - if ( !part ) - return Number( 0 ); - - KParts::BrowserExtension *ext = part->browserExtension(); - if ( !ext ) - return Number( 0 ); - - KParts::BrowserInterface *iface = ext->browserInterface(); - if ( !iface ) - return Number( 0 ); - - TQVariant length = iface->property( "historyLength" ); - - if ( length.type() != TQVariant::UInt ) - return Number( 0 ); - - return Number( length.toUInt() ); - } - default: - kdDebug(6070) << "WARNING: Unhandled token in History::getValueProperty : " << token << endl; - return Undefined(); - } -} - -Value HistoryFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( History, thisObj ); - History *history = static_cast<History *>(thisObj.imp()); - - Value v = args[0]; - Number n; - if(v.isValid()) - n = v.toInteger(exec); - - int steps; - switch (id) { - case History::Back: - steps = -1; - break; - case History::Forward: - steps = 1; - break; - case History::Go: - steps = n.intValue(); - break; - default: - return Undefined(); - } - - // Special case for go(0) from a frame -> reload only the frame - // go(i!=0) from a frame navigates into the history of the frame only, - // in both IE and NS (but not in Mozilla).... we can't easily do that - // in Konqueror... - if (!steps) // add && history->part->parentPart() to get only frames, but doesn't matter - { - history->part->openURL( history->part->url() ); /// ## need args.reload=true? - } else - { - // Delay it. - // Testcase: history.back(); alert("hello"); - Window* window = Window::retrieveWindow( history->part ); - window->delayedGoHistory( steps ); - } - return Undefined(); -} - -///////////////////////////////////////////////////////////////////////////// - -#ifdef Q_WS_QWS - -const ClassInfo Konqueror::info = { "Konqueror", 0, 0, 0 }; - -bool Konqueror::hasProperty(ExecState *exec, const Identifier &p) const -{ - if ( p.qstring().startsWith( "goHistory" ) ) return false; - - return true; -} - -Value Konqueror::get(ExecState *exec, const Identifier &p) const -{ - if ( p == "goHistory" || part->url().protocol() != "http" || part->url().host() != "localhost" ) - return Undefined(); - - KParts::BrowserExtension *ext = part->browserExtension(); - if ( ext ) { - KParts::BrowserInterface *iface = ext->browserInterface(); - if ( iface ) { - TQVariant prop = iface->property( p.qstring().latin1() ); - - if ( prop.isValid() ) { - switch( prop.type() ) { - case TQVariant::Int: - return Number( prop.toInt() ); - case TQVariant::String: - return String( prop.toString() ); - default: - break; - } - } - } - } - - return Value( new KonquerorFunc(exec, this, p.qstring().latin1() ) ); -} - -Value KonquerorFunc::tryCall(ExecState *exec, Object &, const List &args) -{ - KParts::BrowserExtension *ext = konqueror->part->browserExtension(); - - if (!ext) - return Undefined(); - - KParts::BrowserInterface *iface = ext->browserInterface(); - - if ( !iface ) - return Undefined(); - - TQCString n = m_name.data(); - n += "()"; - iface->callMethod( n.data(), TQVariant() ); - - return Undefined(); -} - -UString Konqueror::toString(ExecState *) const -{ - return UString("[object Konqueror]"); -} - -#endif -///////////////////////////////////////////////////////////////////////////// -} //namespace KJS - -#include "kjs_window.moc" diff --git a/khtml/ecma/kjs_window.h b/khtml/ecma/kjs_window.h deleted file mode 100644 index 2f5eb45f5..000000000 --- a/khtml/ecma/kjs_window.h +++ /dev/null @@ -1,309 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2000 Harri Porten (porten@kde.org) - * 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 - */ - -#ifndef _KJS_WINDOW_H_ -#define _KJS_WINDOW_H_ - -#include <tqobject.h> -#include <tqguardedptr.h> -#include <tqmap.h> -#include <tqptrlist.h> -#include <tqdatetime.h> - -#include "kjs_binding.h" -#include "kjs_views.h" - -class TQTimer; -class KHTMLView; -class KHTMLPart; - -namespace KParts { - class ReadOnlyPart; -} - -namespace khtml { - class ChildFrame; -} - -namespace KJS { - - class WindowFunc; - class WindowQObject; - class Location; - class History; - class External; - class FrameArray; - class JSEventListener; - class JSLazyEventListener; - - class Screen : public ObjectImp { - public: - Screen(ExecState *exec); - enum { - Height, Width, ColorDepth, PixelDepth, AvailLeft, AvailTop, AvailHeight, - AvailWidth - }; - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - private: - KHTMLView *view; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - }; - - class KDE_EXPORT Window : public ObjectImp { - friend TQGuardedPtr<KHTMLPart> getInstance(); - friend class Location; - friend class WindowFunc; - friend class WindowQObject; - friend class ScheduledAction; - public: - Window(khtml::ChildFrame *p); - public: - ~Window(); - /** - * Returns and registers a window object. In case there's already a Window - * for the specified part p this will be returned in order to have unique - * bindings. - */ - static Value retrieve(KParts::ReadOnlyPart *p); - /** - * Returns the Window object for a given part - */ - static Window *retrieveWindow(KParts::ReadOnlyPart *p); - /** - * returns a pointer to the Window object this javascript interpreting instance - * was called from. - */ - static Window *retrieveActive(ExecState *exec); - KParts::ReadOnlyPart *part() const; - virtual void mark(); - virtual bool hasProperty(ExecState *exec, const Identifier &p) const; - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - virtual void put(ExecState *exec, const Identifier &propertyName, const Value &value, int attr = None); - virtual bool toBoolean(ExecState *exec) const; - virtual DOM::AbstractView toAbstractView() const; - void scheduleClose(); - void closeNow(); - void delayedGoHistory(int steps); - void goHistory(int steps); - void goURL(ExecState* exec, const TQString& url, bool lockHistory); - Value openWindow(ExecState *exec, const List &args); - Value executeOpenWindow(ExecState *exec, const KURL& url, const TQString& frameName, const TQString& features); - void resizeTo(TQWidget* tl, int width, int height); - void afterScriptExecution(); - bool isSafeScript(ExecState *exec) const { - KParts::ReadOnlyPart *activePart = static_cast<KJS::ScriptInterpreter *>( exec->interpreter() )->part(); - if ( activePart == part() ) return true; - return checkIsSafeScript( activePart ); - } - Location *location() const; - ObjectImp* frames( ExecState* exec ) const; - JSEventListener *getJSEventListener(const Value &val, bool html = false); - JSLazyEventListener *getJSLazyEventListener(const TQString &code, const TQString &name, DOM::NodeImpl* node); - void clear( ExecState *exec ); - virtual UString toString(ExecState *exec) const; - - // Set the current "event" object - void setCurrentEvent( DOM::Event *evt ); - - TQPtrDict<JSEventListener> jsEventListeners; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Closed, Crypto, DefaultStatus, Status, Document, Node, EventCtor, Range, - NodeFilter, DOMException, CSSRule, Frames, _History, _External, Event, InnerHeight, - InnerWidth, Length, _Location, Navigate, Name, _Navigator, _Konqueror, ClientInformation, - OffscreenBuffering, Opener, OuterHeight, OuterWidth, PageXOffset, PageYOffset, - Parent, Personalbar, ScreenX, ScreenY, Scrollbars, Scroll, ScrollBy, - ScreenTop, ScreenLeft, AToB, BToA, FrameElement, GetComputedStyle, - ScrollTo, ScrollX, ScrollY, MoveBy, MoveTo, ResizeBy, ResizeTo, Self, _Window, Top, _Screen, - Image, Option, Alert, Confirm, Prompt, Open, SetTimeout, ClearTimeout, - XMLHttpRequest, XMLSerializer, DOMParser, - Focus, Blur, Close, SetInterval, ClearInterval, CaptureEvents, ReleaseEvents, - Print, AddEventListener, RemoveEventListener, SideBar, - ValueOf, ToString, - Onabort, Onblur, - Onchange, Onclick, Ondblclick, Ondragdrop, Onerror, Onfocus, - Onkeydown, Onkeypress, Onkeyup, Onload, Onmousedown, Onmousemove, - Onmouseout, Onmouseover, Onmouseup, Onmove, Onreset, Onresize, - Onselect, Onsubmit, Onunload, - MutationEventCtor, KeyboardEventCtor, EventExceptionCtor, - ElementCtor, DocumentCtor, HTMLDocumentCtor, - HTMLElementCtor, HTMLHtmlElementCtor, HTMLHeadElementCtor, HTMLLinkElementCtor, - HTMLTitleElementCtor, HTMLMetaElementCtor, HTMLBaseElementCtor, HTMLIsIndexElementCtor, - HTMLStyleElementCtor, HTMLBodyElementCtor, HTMLFormElementCtor, HTMLSelectElementCtor, - HTMLOptGroupElementCtor, HTMLOptionElementCtor, HTMLInputElementCtor, HTMLTextAreaElementCtor, - HTMLButtonElementCtor, HTMLLabelElementCtor, HTMLFieldSetElementCtor, HTMLLegendElementCtor, - HTMLUListElementCtor, HTMLOListElementCtor, HTMLDListElementCtor, HTMLDirectoryElementCtor, - HTMLMenuElementCtor, HTMLLIElementCtor, HTMLDivElementCtor, HTMLParagraphElementCtor, - HTMLHeadingElementCtor, HTMLBlockQuoteElementCtor, HTMLQuoteElementCtor, HTMLPreElementCtor, - HTMLBRElementCtor, HTMLBaseFontElementCtor, HTMLFontElementCtor, HTMLHRElementCtor, HTMLModElementCtor, - HTMLAnchorElementCtor, HTMLImageElementCtor, HTMLObjectElementCtor, HTMLParamElementCtor, - HTMLAppletElementCtor, HTMLMapElementCtor, HTMLAreaElementCtor, HTMLScriptElementCtor, - HTMLTableElementCtor, HTMLTableCaptionElementCtor, HTMLTableColElementCtor, - HTMLTableSectionElementCtor, HTMLTableRowElementCtor, HTMLTableCellElementCtor, - HTMLFrameSetElementCtor, HTMLLayerElementCtor, HTMLFrameElementCtor, HTMLIFrameElementCtor, - CSSStyleDeclarationCtor}; - WindowQObject *winq; - - void forgetSuppressedWindows(); - void showSuppressedWindows(); - - protected: - enum DelayedActionId { NullAction, DelayedClose, DelayedGoHistory }; - - Value getListener(ExecState *exec, int eventId) const; - void setListener(ExecState *exec, int eventId, Value func); - private: - struct DelayedAction; - friend struct DelayedAction; - - bool checkIsSafeScript( KParts::ReadOnlyPart* activePart ) const; - - TQGuardedPtr<khtml::ChildFrame> m_frame; - Screen *screen; - History *history; - External *external; - FrameArray *m_frames; - Location *loc; - DOM::Event *m_evt; - - struct DelayedAction { - DelayedAction() : actionId(NullAction) {} // for QValueList - DelayedAction( DelayedActionId id, TQVariant p = TQVariant() ) : actionId(id), param(p) {} - DelayedActionId actionId; - TQVariant param; // just in case - }; - TQValueList<DelayedAction> m_delayed; - - struct SuppressedWindowInfo { - SuppressedWindowInfo() {} // for QValueList - SuppressedWindowInfo( KURL u, TQString fr, TQString fe ) : url(u), frameName(fr), features(fe) {} - KURL url; - TQString frameName; - TQString features; - }; - TQValueList<SuppressedWindowInfo> m_suppressedWindowInfo; - }; - - /** - * like TQDateTime, but properly handles milliseconds - */ - class DateTimeMS - { - TQDate mDate; - TQTime mTime; - public: - DateTimeMS addMSecs(int s) const; - bool operator >(const DateTimeMS &other) const; - bool operator >=(const DateTimeMS &other) const; - - int msecsTo(const DateTimeMS &other) const; - - static DateTimeMS now(); - }; - - /** - * An action (either function or string) to be executed after a specified - * time interval, either once or repeatedly. Used for window.setTimeout() - * and window.setInterval() - */ - class ScheduledAction { - public: - ScheduledAction(Object _func, List _args, DateTimeMS _nextTime, int _interval, bool _singleShot, int _timerId); - ScheduledAction(TQString _code, DateTimeMS _nextTime, int _interval, bool _singleShot, int _timerId); - ~ScheduledAction(); - bool execute(Window *window); - void mark(); - - ObjectImp *func; - List args; - TQString code; - bool isFunction; - bool singleShot; - - DateTimeMS nextTime; - int interval; - bool executing; - int timerId; - }; - - class KDE_EXPORT WindowQObject : public TQObject { - Q_OBJECT - public: - WindowQObject(Window *w); - ~WindowQObject(); - int installTimeout(const Identifier &handler, int t, bool singleShot); - int installTimeout(const Value &func, List args, int t, bool singleShot); - void clearTimeout(int timerId); - void mark(); - bool hasTimers() const; - public slots: - void timeoutClose(); - protected slots: - void parentDestroyed(); - protected: - void timerEvent(TQTimerEvent *e); - void setNextTimer(); - private: - Window *parent; - TQPtrList<ScheduledAction> scheduledActions; - int pausedTime; - int lastTimerId; - bool currentlyDispatching; - }; - - class Location : public ObjectImp { - public: - ~Location(); - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - virtual void put(ExecState *exec, const Identifier &propertyName, const Value &value, int attr = None); - virtual Value toPrimitive(ExecState *exec, Type preferred) const; - virtual UString toString(ExecState *exec) const; - enum { Hash, Href, Hostname, Host, Pathname, Port, Protocol, Search, EqualEqual, - Assign, Replace, Reload, ToString }; - KParts::ReadOnlyPart *part() const; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - private: - friend class Window; - Location(khtml::ChildFrame *f); - TQGuardedPtr<khtml::ChildFrame> m_frame; - }; - -#ifdef Q_WS_QWS - class Konqueror : public ObjectImp { - friend class KonquerorFunc; - public: - Konqueror(KHTMLPart *p) : part(p) { } - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - virtual bool hasProperty(ExecState *exec, const Identifier &p) const; - virtual UString toString(ExecState *exec) const; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - private: - KHTMLPart *part; - }; -#endif - -} // namespace - -#endif diff --git a/khtml/ecma/testecma.cpp b/khtml/ecma/testecma.cpp deleted file mode 100644 index 44cd7ecb0..000000000 --- a/khtml/ecma/testecma.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This file is part of the KDE libraries - * Copyright (C) 2000 Harri Porten (porten@kde.org) - * - * 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 - */ - -/** - * An interactive interpreter to test the ECMA Script language bindings - * for the DOM of KHTML. - * The 'document' property is preset to an instance of Document and serves - * as an entrypoint. - * - * Example session: - * - * KJS> text = document.createTextNode('foo'); - * KJS> document.appendChild(text); - * KJS> debug(document.firstChild.nodeValue); - * ---> foo - */ - -#include <stdio.h> -#include <kjs/object.h> -#include <kjs/interpreter.h> -#include "dom/dom_doc.h" -#include "dom/dom_string.h" -#include "ecma/kjs_dom.h" - - -using namespace KJS; - -int main(int, char **) -{ - KJScript kjs; - kjs.enableDebug(); - DOM::Document doc; - - DOMDocument *dd = new DOMDocument(&doc); - Global::current().put("document", KJSO(dd)); - - printf("Entering interactive mode.\n" - "You may access the DOM via the 'document' property.\n" - "Use debug() to print to the console. Press C-d or C-c to exit.\n\n"); - - char buffer[1000]; - FILE *in = fdopen(0, "r"); - - while (1) { - printf("KJS> "); - if (!fgets(buffer, 999, in)) - break; - kjs.evaluate(buffer); - } - printf("\n"); -} diff --git a/khtml/ecma/xmlhttprequest.cpp b/khtml/ecma/xmlhttprequest.cpp deleted file mode 100644 index 8a8a86c16..000000000 --- a/khtml/ecma/xmlhttprequest.cpp +++ /dev/null @@ -1,810 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * 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 Lesser 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser 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 "xmlhttprequest.h" -#include "xmlhttprequest.lut.h" -#include "kjs_window.h" -#include "kjs_events.h" - -#include "dom/dom_doc.h" -#include "dom/dom_exception.h" -#include "dom/dom_string.h" -#include "misc/loader.h" -#include "html/html_documentimpl.h" -#include "xml/dom2_eventsimpl.h" - -#include "khtml_part.h" -#include "khtmlview.h" - -#include <kio/scheduler.h> -#include <kio/job.h> -#include <tqobject.h> -#include <kdebug.h> - -#ifdef APPLE_CHANGES -#include "KWQLoader.h" -#else -#include <kio/netaccess.h> -using TDEIO::NetAccess; -#endif - -#define BANNED_HTTP_HEADERS "authorization,proxy-authorization,"\ - "content-length,host,connect,copy,move,"\ - "delete,head,trace,put,propfind,proppatch,"\ - "mkcol,lock,unlock,options,via,"\ - "accept-charset,accept-encoding,expect,date,"\ - "keep-alive,te,trailer,"\ - "transfer-encoding,upgrade" - -using khtml::Decoder; - -namespace KJS { - -////////////////////// XMLHttpRequest Object //////////////////////// - -/* Source for XMLHttpRequestProtoTable. -@begin XMLHttpRequestProtoTable 7 - abort XMLHttpRequest::Abort DontDelete|Function 0 - getAllResponseHeaders XMLHttpRequest::GetAllResponseHeaders DontDelete|Function 0 - getResponseHeader XMLHttpRequest::GetResponseHeader DontDelete|Function 1 - open XMLHttpRequest::Open DontDelete|Function 5 - overrideMimeType XMLHttpRequest::OverrideMIMEType DontDelete|Function 1 - send XMLHttpRequest::Send DontDelete|Function 1 - setRequestHeader XMLHttpRequest::SetRequestHeader DontDelete|Function 2 -@end -*/ -KJS_DEFINE_PROTOTYPE(XMLHttpRequestProto) -IMPLEMENT_PROTOFUNC_DOM(XMLHttpRequestProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("XMLHttpRequest", XMLHttpRequestProto,XMLHttpRequestProtoFunc) - - -XMLHttpRequestQObject::XMLHttpRequestQObject(XMLHttpRequest *_jsObject) -{ - jsObject = _jsObject; -} - -#ifdef APPLE_CHANGES -void XMLHttpRequestQObject::slotData( TDEIO::Job* job, const char *data, int size ) -{ - jsObject->slotData(job, data, size); -} -#else -void XMLHttpRequestQObject::slotData( TDEIO::Job* job, const TQByteArray &data ) -{ - jsObject->slotData(job, data); -} -#endif - -void XMLHttpRequestQObject::slotFinished( TDEIO::Job* job ) -{ - jsObject->slotFinished(job); -} - -void XMLHttpRequestQObject::slotRedirection( TDEIO::Job* job, const KURL& url) -{ - jsObject->slotRedirection( job, url ); -} - -XMLHttpRequestConstructorImp::XMLHttpRequestConstructorImp(ExecState *, const DOM::Document &d) - : ObjectImp(), doc(d) -{ -} - -bool XMLHttpRequestConstructorImp::implementsConstruct() const -{ - return true; -} - -Object XMLHttpRequestConstructorImp::construct(ExecState *exec, const List &) -{ - return Object(new XMLHttpRequest(exec, doc)); -} - -const ClassInfo XMLHttpRequest::info = { "XMLHttpRequest", 0, &XMLHttpRequestTable, 0 }; - - -/* Source for XMLHttpRequestTable. -@begin XMLHttpRequestTable 7 - readyState XMLHttpRequest::ReadyState DontDelete|ReadOnly - responseText XMLHttpRequest::ResponseText DontDelete|ReadOnly - responseXML XMLHttpRequest::ResponseXML DontDelete|ReadOnly - status XMLHttpRequest::Status DontDelete|ReadOnly - statusText XMLHttpRequest::StatusText DontDelete|ReadOnly - onreadystatechange XMLHttpRequest::Onreadystatechange DontDelete - onload XMLHttpRequest::Onload DontDelete -@end -*/ - -Value XMLHttpRequest::tryGet(ExecState *exec, const Identifier &propertyName) const -{ - return DOMObjectLookupGetValue<XMLHttpRequest,DOMObject>(exec, propertyName, &XMLHttpRequestTable, this); -} - -Value XMLHttpRequest::getValueProperty(ExecState *exec, int token) const -{ - switch (token) { - case ReadyState: - return Number(state); - case ResponseText: - return getString(DOM::DOMString(response)); - case ResponseXML: - if (state != Completed) { - return Null(); - } - if (!createdDocument) { - TQString mimeType = "text/xml"; - - if (!m_mimeTypeOverride.isEmpty()) { - mimeType = m_mimeTypeOverride; - } else { - Value header = getResponseHeader("Content-Type"); - if (header.type() != UndefinedType) { - mimeType = TQStringList::split(";", header.toString(exec).qstring())[0].stripWhiteSpace(); - } - } - - if (mimeType == "text/xml" || mimeType == "application/xml" || mimeType == "application/xhtml+xml") { - responseXML = DOM::Document(doc->implementation()->createDocument()); - - DOM::DocumentImpl *docImpl = static_cast<DOM::DocumentImpl *>(responseXML.handle()); - - docImpl->open(); - docImpl->write(response); - docImpl->finishParsing(); - docImpl->close(); - - typeIsXML = true; - } else { - typeIsXML = false; - } - createdDocument = true; - } - - if (!typeIsXML) { - return Undefined(); - } - - return getDOMNode(exec,responseXML); - case Status: - return getStatus(); - case StatusText: - return getStatusText(); - case Onreadystatechange: - if (onReadyStateChangeListener && onReadyStateChangeListener->listenerObjImp()) { - return onReadyStateChangeListener->listenerObj(); - } else { - return Null(); - } - case Onload: - if (onLoadListener && onLoadListener->listenerObjImp()) { - return onLoadListener->listenerObj(); - } else { - return Null(); - } - default: - kdWarning() << "XMLHttpRequest::getValueProperty unhandled token " << token << endl; - return Value(); - } -} - -void XMLHttpRequest::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr) -{ - DOMObjectLookupPut<XMLHttpRequest,DOMObject>(exec, propertyName, value, attr, &XMLHttpRequestTable, this ); -} - -void XMLHttpRequest::putValueProperty(ExecState *exec, int token, const Value& value, int /*attr*/) -{ - JSEventListener* newListener; - switch(token) { - case Onreadystatechange: - newListener = Window::retrieveActive(exec)->getJSEventListener(value, true); - if (newListener != onReadyStateChangeListener) { - if (onReadyStateChangeListener) onReadyStateChangeListener->deref(); - onReadyStateChangeListener = newListener; - if (onReadyStateChangeListener) onReadyStateChangeListener->ref(); - } - break; - case Onload: - newListener = Window::retrieveActive(exec)->getJSEventListener(value, true); - if (newListener != onLoadListener) { - if (onLoadListener) onLoadListener->deref(); - onLoadListener = newListener; - if (onLoadListener) onLoadListener->ref(); - } - break; - default: - kdWarning() << "XMLHttpRequest::putValue unhandled token " << token << endl; - } -} - -XMLHttpRequest::XMLHttpRequest(ExecState *exec, const DOM::Document &d) - : DOMObject(XMLHttpRequestProto::self(exec)), - qObject(new XMLHttpRequestQObject(this)), - doc(static_cast<DOM::DocumentImpl*>(d.handle())), - async(true), - contentType(TQString::null), - job(0), - state(Uninitialized), - onReadyStateChangeListener(0), - onLoadListener(0), - decoder(0), - createdDocument(false), - aborted(false) -{ -} - -XMLHttpRequest::~XMLHttpRequest() -{ - if (onReadyStateChangeListener) - onReadyStateChangeListener->deref(); - if (onLoadListener) - onLoadListener->deref(); - delete qObject; - qObject = 0; - delete decoder; - decoder = 0; -} - -void XMLHttpRequest::changeState(XMLHttpRequestState newState) -{ - if (state != newState) { - state = newState; - - ref(); - - if (onReadyStateChangeListener != 0 && doc->view() && doc->view()->part()) { - DOM::Event ev = doc->view()->part()->document().createEvent("HTMLEvents"); - ev.initEvent("readystatechange", true, true); - onReadyStateChangeListener->handleEvent(ev); - } - - if (state == Completed && onLoadListener != 0 && doc->view() && doc->view()->part()) { - DOM::Event ev = doc->view()->part()->document().createEvent("HTMLEvents"); - ev.initEvent("load", true, true); - onLoadListener->handleEvent(ev); - } - - deref(); - } -} - -bool XMLHttpRequest::urlMatchesDocumentDomain(const KURL& _url) const -{ - // No need to do work if _url is not valid... - if (!_url.isValid()) - return false; - - KURL documentURL(doc->URL()); - - // a local file can load anything - if (documentURL.protocol().lower() == "file") { - return true; - } - - // but a remote document can only load from the same port on the server - if (documentURL.protocol().lower() == _url.protocol().lower() && - documentURL.host().lower() == _url.host().lower() && - documentURL.port() == _url.port()) { - return true; - } - - return false; -} - -void XMLHttpRequest::open(const TQString& _method, const KURL& _url, bool _async) -{ - abort(); - aborted = false; - - // clear stuff from possible previous load - requestHeaders.clear(); - responseHeaders = TQString(); - response = TQString(); - createdDocument = false; - responseXML = DOM::Document(); - - changeState(Uninitialized); - - if (aborted) { - return; - } - - if (!urlMatchesDocumentDomain(_url)) { - return; - } - - - method = _method.lower(); - url = _url; - async = _async; - - changeState(Loading); -} - -void XMLHttpRequest::send(const TQString& _body) -{ - aborted = false; - - const TQString protocol = url.protocol().lower(); - // Abandon the request when the protocol is other than "http", - // instead of blindly doing a TDEIO::get on other protocols like file:/. - if (!protocol.startsWith("http") && !protocol.startsWith("webdav")) - { - abort(); - return; - } - - if (method == "post") { - - // FIXME: determine post encoding correctly by looking in headers - // for charset. - TQByteArray buf; - TQCString str = _body.utf8(); - buf.duplicate(str.data(), str.size() - 1); - - job = TDEIO::http_post( url, buf, false ); - if(contentType.isNull()) - job->addMetaData( "content-type", "Content-type: text/plain" ); - else - job->addMetaData( "content-type", contentType ); - } - else { - job = TDEIO::get( url, false, false ); - } - - if (!requestHeaders.isEmpty()) { - TQString rh; - TQMap<TQString, TQString>::ConstIterator begin = requestHeaders.begin(); - TQMap<TQString, TQString>::ConstIterator end = requestHeaders.end(); - for (TQMap<TQString, TQString>::ConstIterator i = begin; i != end; ++i) { - TQString key = i.key(); - TQString value = i.data(); - if (key == "accept") { - // The HTTP KIO slave supports an override this way - job->addMetaData("accept", value); - } else { - if (i != begin) - rh += "\r\n"; - rh += key + ": " + value; - } - } - - job->addMetaData("customHTTPHeader", rh); - } - - job->addMetaData("PropagateHttpHeader", "true"); - - // Set the default referrer if one is not already supplied - // through setRequestHeader. NOTE: the user can still disable - // this feature at the protocol level (kio_http). - // ### does find() ever succeed? the headers are stored in lower case! - if (requestHeaders.find("Referer") == requestHeaders.end()) { - KURL documentURL(doc->URL()); - documentURL.setPass(TQString::null); - documentURL.setUser(TQString::null); - job->addMetaData("referrer", documentURL.url()); - // kdDebug() << "Adding referrer: " << documentURL << endl; - } - - if (!async) { - TQByteArray data; - KURL finalURL; - TQString headers; - -#ifdef APPLE_CHANGES - data = KWQServeSynchronousRequest(khtml::Cache::loader(), doc->docLoader(), job, finalURL, headers); -#else - TQMap<TQString, TQString> metaData; - if ( NetAccess::synchronousRun( job, 0, &data, &finalURL, &metaData ) ) { - headers = metaData[ "HTTP-Headers" ]; - } -#endif - job = 0; - processSyncLoadResults(data, finalURL, headers); - return; - } - - qObject->connect( job, TQT_SIGNAL( result( TDEIO::Job* ) ), - TQT_SLOT( slotFinished( TDEIO::Job* ) ) ); -#ifdef APPLE_CHANGES - qObject->connect( job, TQT_SIGNAL( data( TDEIO::Job*, const char*, int ) ), - TQT_SLOT( slotData( TDEIO::Job*, const char*, int ) ) ); -#else - qObject->connect( job, TQT_SIGNAL( data( TDEIO::Job*, const TQByteArray& ) ), - TQT_SLOT( slotData( TDEIO::Job*, const TQByteArray& ) ) ); -#endif - qObject->connect( job, TQT_SIGNAL(redirection(TDEIO::Job*, const KURL& ) ), - TQT_SLOT( slotRedirection(TDEIO::Job*, const KURL&) ) ); - -#ifdef APPLE_CHANGES - KWQServeRequest(khtml::Cache::loader(), doc->docLoader(), job); -#else - TDEIO::Scheduler::scheduleJob( job ); -#endif -} - -void XMLHttpRequest::abort() -{ - if (job) { - job->kill(); - job = 0; - } - delete decoder; - decoder = 0; - aborted = true; -} - -void XMLHttpRequest::overrideMIMEType(const TQString& override) -{ - m_mimeTypeOverride = override; -} - -void XMLHttpRequest::setRequestHeader(const TQString& _name, const TQString &value) -{ - TQString name = _name.lower().stripWhiteSpace(); - - // Content-type needs to be set seperately from the other headers - if(name == "content-type") { - contentType = "Content-type: " + value; - return; - } - - // Sanitize the referrer header to protect against spoofing... - if(name == "referer") { - KURL referrerURL(value); - if (urlMatchesDocumentDomain(referrerURL)) - requestHeaders[name] = referrerURL.url(); - return; - } - - // Sanitize the request headers below and handle them as if they are - // calls to open. Otherwise, we will end up ignoring them all together! - // TODO: Do something about "put" which kio_http sort of supports and - // the webDAV headers such as PROPFIND etc... - if (name == "get" || name == "post") { - KURL reqURL (doc->URL(), value.stripWhiteSpace()); - open(name, reqURL, async); - return; - } - - // Reject all banned headers. See BANNED_HTTP_HEADERS above. - // kdDebug() << "Banned HTTP Headers: " << BANNED_HTTP_HEADERS << endl; - TQStringList bannedHeaders = TQStringList::split(',', - TQString::fromLatin1(BANNED_HTTP_HEADERS)); - - if (bannedHeaders.contains(name)) - return; // Denied - - requestHeaders[name] = value.stripWhiteSpace(); -} - -Value XMLHttpRequest::getAllResponseHeaders() const -{ - if (responseHeaders.isEmpty()) { - return Undefined(); - } - - int endOfLine = responseHeaders.find("\n"); - - if (endOfLine == -1) { - return Undefined(); - } - - return String(responseHeaders.mid(endOfLine + 1) + "\n"); -} - -Value XMLHttpRequest::getResponseHeader(const TQString& name) const -{ - if (responseHeaders.isEmpty()) { - return Undefined(); - } - - TQRegExp headerLinePattern(name + ":", false); - - int matchLength; - int headerLinePos = headerLinePattern.search(responseHeaders, 0); - matchLength = headerLinePattern.matchedLength(); - while (headerLinePos != -1) { - if (headerLinePos == 0 || responseHeaders[headerLinePos-1] == '\n') { - break; - } - - headerLinePos = headerLinePattern.search(responseHeaders, headerLinePos + 1); - matchLength = headerLinePattern.matchedLength(); - } - - - if (headerLinePos == -1) { - return Undefined(); - } - - int endOfLine = responseHeaders.find("\n", headerLinePos + matchLength); - - return String(responseHeaders.mid(headerLinePos + matchLength, endOfLine - (headerLinePos + matchLength)).stripWhiteSpace()); -} - -static Value httpStatus(const TQString& response, bool textStatus = false) -{ - if (response.isEmpty()) { - return Undefined(); - } - - int endOfLine = response.find("\n"); - TQString firstLine = (endOfLine == -1) ? response : response.left(endOfLine); - int codeStart = firstLine.find(" "); - int codeEnd = firstLine.find(" ", codeStart + 1); - - if (codeStart == -1 || codeEnd == -1) { - return Undefined(); - } - - if (textStatus) { - TQString statusText = firstLine.mid(codeEnd + 1, endOfLine - (codeEnd + 1)).stripWhiteSpace(); - return String(statusText); - } - - TQString number = firstLine.mid(codeStart + 1, codeEnd - (codeStart + 1)); - - bool ok = false; - int code = number.toInt(&ok); - if (!ok) { - return Undefined(); - } - - return Number(code); -} - -Value XMLHttpRequest::getStatus() const -{ - return httpStatus(responseHeaders); -} - -Value XMLHttpRequest::getStatusText() const -{ - return httpStatus(responseHeaders, true); -} - -void XMLHttpRequest::processSyncLoadResults(const TQByteArray &data, const KURL &finalURL, const TQString &headers) -{ - if (!urlMatchesDocumentDomain(finalURL)) { - abort(); - return; - } - - responseHeaders = headers; - changeState(Loaded); - if (aborted) { - return; - } - -#ifdef APPLE_CHANGES - const char *bytes = (const char *)data.data(); - int len = (int)data.size(); - - slotData(0, bytes, len); -#else - slotData(0, data); -#endif - - if (aborted) { - return; - } - - slotFinished(0); -} - -void XMLHttpRequest::slotFinished(TDEIO::Job *) -{ - if (decoder) { - response += decoder->flush(); - } - - // make sure to forget about the job before emitting completed, - // since changeState triggers JS code, which might e.g. call abort. - job = 0; - changeState(Completed); - - delete decoder; - decoder = 0; -} - -void XMLHttpRequest::slotRedirection(TDEIO::Job*, const KURL& url) -{ - if (!urlMatchesDocumentDomain(url)) { - abort(); - } -} - -#ifdef APPLE_CHANGES -void XMLHttpRequest::slotData( TDEIO::Job*, const char *data, int len ) -#else -void XMLHttpRequest::slotData(TDEIO::Job*, const TQByteArray &_data) -#endif -{ - if (state < Loaded ) { - responseHeaders = job->queryMetaData("HTTP-Headers"); - - // NOTE: Replace a 304 response with a 200! Both IE and Mozilla do this. - // Problem first reported through bug# 110272. - int codeStart = responseHeaders.find("304"); - if ( codeStart != -1) { - int codeEnd = responseHeaders.find("\n", codeStart+3); - if (codeEnd != -1) - responseHeaders.replace(codeStart, (codeEnd-codeStart), "200 OK"); - } - - changeState(Loaded); - } - -#ifndef APPLE_CHANGES - const char *data = (const char *)_data.data(); - int len = (int)_data.size(); -#endif - - if ( decoder == NULL ) { - int pos = responseHeaders.find("content-type:", 0, false); - - if ( pos > -1 ) { - pos += 13; - int index = responseHeaders.find('\n', pos); - TQString type = responseHeaders.mid(pos, (index-pos)); - index = type.find (';'); - if (index > -1) - encoding = TQString(type.mid( index+1 ).remove(TQRegExp("charset[ ]*=[ ]*", false))).stripWhiteSpace(); - } - - decoder = new Decoder; - if (!encoding.isNull()) - decoder->setEncoding(encoding.latin1(), Decoder::EncodingFromHTTPHeader); - else { - // Per section 2 of W3C working draft spec, fall back to "UTF-8". - decoder->setEncoding("UTF-8", Decoder::DefaultEncoding); - } - } - if (len == 0) - return; - - if (len == -1) - len = strlen(data); - - TQString decoded = decoder->decode(data, len); - - response += decoded; - - if (!aborted) { - changeState(Interactive); - } -} - -Value XMLHttpRequestProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - if (!thisObj.inherits(&XMLHttpRequest::info)) { - Object err = Error::create(exec,TypeError); - exec->setException(err); - return err; - } - - XMLHttpRequest *request = static_cast<XMLHttpRequest *>(thisObj.imp()); - switch (id) { - case XMLHttpRequest::Abort: - request->abort(); - return Undefined(); - case XMLHttpRequest::GetAllResponseHeaders: - if (args.size() != 0) { - return Undefined(); - } - - return request->getAllResponseHeaders(); - case XMLHttpRequest::GetResponseHeader: - if (args.size() != 1) { - return Undefined(); - } - - return request->getResponseHeader(args[0].toString(exec).qstring()); - case XMLHttpRequest::Open: - { - if (args.size() < 2 || args.size() > 5) { - return Undefined(); - } - - TQString method = args[0].toString(exec).qstring(); - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(Window::retrieveActive(exec)->part()); - if (!part) - return Undefined(); - KURL url = KURL(part->document().completeURL(args[1].toString(exec).qstring()).string()); - - bool async = true; - if (args.size() >= 3) { - async = args[2].toBoolean(exec); - } - - if (args.size() >= 4) { - url.setUser(args[3].toString(exec).qstring()); - } - - if (args.size() >= 5) { - url.setPass(args[4].toString(exec).qstring()); - } - - request->open(method, url, async); - - return Undefined(); - } - case XMLHttpRequest::Send: - { - if (args.size() > 1) { - return Undefined(); - } - - if (request->state != Loading) { - return Undefined(); - } - - TQString body; - if (args.size() >= 1) { - Object obj = Object::dynamicCast(args[0]); - if (obj.isValid() && obj.inherits(&DOMDocument::info)) { - DOM::Node docNode = static_cast<KJS::DOMDocument *>(obj.imp())->toNode(); - DOM::DocumentImpl *doc = static_cast<DOM::DocumentImpl *>(docNode.handle()); - - try { - body = doc->toString().string(); - // FIXME: also need to set content type, including encoding! - - } catch(DOM::DOMException& e) { - Object err = Error::create(exec, GeneralError, "Exception serializing document"); - exec->setException(err); - } - } else { - body = args[0].toString(exec).qstring(); - } - } - - request->send(body); - - return Undefined(); - } - case XMLHttpRequest::SetRequestHeader: - if (args.size() != 2) { - return Undefined(); - } - - request->setRequestHeader(args[0].toString(exec).qstring(), args[1].toString(exec).qstring()); - - return Undefined(); - - case XMLHttpRequest::OverrideMIMEType: - if (args.size() < 1) { - Object err = Error::create(exec, SyntaxError, "Not enough arguments"); - exec->setException(err); - return err; - } - - request->overrideMIMEType(args[0].toString(exec).qstring()); - return Undefined(); - } - - return Undefined(); -} - -} // end namespace - - -#include "xmlhttprequest.moc" diff --git a/khtml/ecma/xmlhttprequest.h b/khtml/ecma/xmlhttprequest.h deleted file mode 100644 index 93420453e..000000000 --- a/khtml/ecma/xmlhttprequest.h +++ /dev/null @@ -1,142 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * 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 Lesser 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser 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 - */ - -#ifndef _XMLHTTPREQUEST_H_ -#define _XMLHTTPREQUEST_H_ - -#include "ecma/kjs_binding.h" -#include "ecma/kjs_dom.h" -#include "misc/decoder.h" -#include "kio/jobclasses.h" - -namespace KJS { - - class JSEventListener; - class XMLHttpRequestQObject; - - // these exact numeric values are important because JS expects them - enum XMLHttpRequestState { - Uninitialized = 0, - Loading = 1, - Loaded = 2, - Interactive = 3, - Completed = 4 - }; - - class XMLHttpRequestConstructorImp : public ObjectImp { - public: - XMLHttpRequestConstructorImp(ExecState *exec, const DOM::Document &d); - virtual bool implementsConstruct() const; - virtual Object construct(ExecState *exec, const List &args); - private: - DOM::Document doc; - }; - - class XMLHttpRequest : public DOMObject { - public: - XMLHttpRequest(ExecState *, const DOM::Document &d); - ~XMLHttpRequest(); - virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None); - void putValueProperty(ExecState *exec, int token, const Value& value, int /*attr*/); - virtual bool toBoolean(ExecState *) const { return true; } - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Onload, Onreadystatechange, ReadyState, ResponseText, ResponseXML, Status, StatusText, Abort, - GetAllResponseHeaders, GetResponseHeader, Open, Send, SetRequestHeader, - OverrideMIMEType }; - - private: - friend class XMLHttpRequestProtoFunc; - friend class XMLHttpRequestQObject; - - Value getStatusText() const; - Value getStatus() const; - bool urlMatchesDocumentDomain(const KURL&) const; - - XMLHttpRequestQObject *qObject; - -#ifdef APPLE_CHANGES - void slotData( TDEIO::Job* job, const char *data, int size ); -#else - void slotData( TDEIO::Job* job, const TQByteArray &data ); -#endif - void slotFinished( TDEIO::Job* ); - void slotRedirection( TDEIO::Job*, const KURL& ); - - void processSyncLoadResults(const TQByteArray &data, const KURL &finalURL, const TQString &headers); - - void open(const TQString& _method, const KURL& _url, bool _async); - void send(const TQString& _body); - void abort(); - void setRequestHeader(const TQString& name, const TQString &value); - void overrideMIMEType(const TQString& override); - Value getAllResponseHeaders() const; - Value getResponseHeader(const TQString& name) const; - - void changeState(XMLHttpRequestState newState); - - TQGuardedPtr<DOM::DocumentImpl> doc; - - KURL url; - TQString method; - bool async; - TQMap<TQString,TQString> requestHeaders; - TQString m_mimeTypeOverride; - TQString contentType; - - TDEIO::TransferJob * job; - - XMLHttpRequestState state; - JSEventListener *onReadyStateChangeListener; - JSEventListener *onLoadListener; - - khtml::Decoder *decoder; - TQString encoding; - TQString responseHeaders; - - TQString response; - mutable bool createdDocument; - mutable bool typeIsXML; - mutable DOM::Document responseXML; - - bool aborted; - }; - - - class XMLHttpRequestQObject : public TQObject { - Q_OBJECT - - public: - XMLHttpRequestQObject(XMLHttpRequest *_jsObject); - - public slots: - void slotData( TDEIO::Job* job, const TQByteArray &data ); - void slotFinished( TDEIO::Job* job ); - void slotRedirection( TDEIO::Job* job, const KURL& url); - - private: - XMLHttpRequest *jsObject; - }; - -} // namespace - -#endif diff --git a/khtml/ecma/xmlserializer.cpp b/khtml/ecma/xmlserializer.cpp deleted file mode 100644 index 856f35e1f..000000000 --- a/khtml/ecma/xmlserializer.cpp +++ /dev/null @@ -1,109 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * 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 Lesser 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser 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 "xmlserializer.h" -#include "xmlserializer.lut.h" - -#include "dom/dom_exception.h" -#include "dom/dom_doc.h" -#include "xml/dom_docimpl.h" - -#include <kdebug.h> - - -////////////////////// XMLSerializer Object //////////////////////// - -/* Source for XMLSerializerProtoTable. -@begin XMLSerializerProtoTable 1 - serializeToString XMLSerializer::SerializeToString DontDelete|Function 1 -@end -*/ - -namespace KJS { - -KJS_DEFINE_PROTOTYPE(XMLSerializerProto) -IMPLEMENT_PROTOFUNC_DOM(XMLSerializerProtoFunc) -KJS_IMPLEMENT_PROTOTYPE("XMLSerializer", XMLSerializerProto, XMLSerializerProtoFunc) - -XMLSerializerConstructorImp::XMLSerializerConstructorImp(ExecState *) - : ObjectImp() -{ -} - -bool XMLSerializerConstructorImp::implementsConstruct() const -{ - return true; -} - -Object XMLSerializerConstructorImp::construct(ExecState *exec, const List &) -{ - return Object(new XMLSerializer(exec)); -} - -const ClassInfo XMLSerializer::info = { "XMLSerializer", 0, 0, 0 }; - -XMLSerializer::XMLSerializer(ExecState *exec) - : DOMObject(XMLSerializerProto::self(exec)) -{ -} - -Value XMLSerializerProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - if (!thisObj.inherits(&XMLSerializer::info)) { - Object err = Error::create(exec,TypeError); - exec->setException(err); - return err; - } - - switch (id) { - case XMLSerializer::SerializeToString: - { - if (args.size() != 1) { - return Undefined(); - } - - if (!args[0].toObject(exec).inherits(&DOMNode::info)) { - return Undefined(); - } - - DOM::NodeImpl *node = static_cast<DOM::NodeImpl *>(static_cast<KJS::DOMNode *>(args[0].toObject(exec).imp())->toNode().handle()); - - if (!node) { - return Undefined(); - } - - TQString body; - - try { - body = node->toString().string(); - } catch(DOM::DOMException& e) { - Object err = Error::create(exec, GeneralError, "Exception serializing document"); - exec->setException(err); - return err; - } - - return getString(body); - } - } - - return Undefined(); -} - -} // end namespace diff --git a/khtml/ecma/xmlserializer.h b/khtml/ecma/xmlserializer.h deleted file mode 100644 index 629d09afe..000000000 --- a/khtml/ecma/xmlserializer.h +++ /dev/null @@ -1,54 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * 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 Lesser 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser 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 - */ - -#ifndef _XMLSERIALIZER_H_ -#define _XMLSERIALIZER_H_ - -#include "ecma/kjs_binding.h" -#include "ecma/kjs_dom.h" -#include "misc/decoder.h" -#include "kio/jobclasses.h" - -namespace KJS { - - class JSEventListener; - - class XMLSerializerConstructorImp : public ObjectImp { - public: - XMLSerializerConstructorImp(ExecState *); - virtual bool implementsConstruct() const; - virtual Object construct(ExecState *exec, const List &args); - }; - - class XMLSerializer : public DOMObject { - public: - XMLSerializer(ExecState *); - virtual bool toBoolean(ExecState *) const { return true; } - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { SerializeToString }; - - private: - friend class XMLSerializerProtoFunc; - }; - -} // namespace - -#endif |