summaryrefslogtreecommitdiffstats
path: root/khtml/ecma/kjs_events.h
diff options
context:
space:
mode:
Diffstat (limited to 'khtml/ecma/kjs_events.h')
-rw-r--r--khtml/ecma/kjs_events.h250
1 files changed, 250 insertions, 0 deletions
diff --git a/khtml/ecma/kjs_events.h b/khtml/ecma/kjs_events.h
new file mode 100644
index 000000000..9fedfe594
--- /dev/null
+++ b/khtml/ecma/kjs_events.h
@@ -0,0 +1,250 @@
+// -*- 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 QString &_code, const QString &_name, const Object &_win, DOM::NodeImpl* node);
+ ~JSLazyEventListener();
+ virtual void handleEvent(DOM::Event &evt);
+ Object listenerObj() const;
+ private:
+ void parseCode() const;
+
+ mutable QString code;
+ mutable QString 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