diff options
Diffstat (limited to 'khtml/ecma/kjs_events.cpp')
-rw-r--r-- | khtml/ecma/kjs_events.cpp | 993 |
1 files changed, 0 insertions, 993 deletions
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 |