|
View:
New views
1 Messages
—
Rating Filter:
Alert me
|
|
|
KDE/kdelibs/khtmlSVN commit 1042046 by orlovich:
Fix receiver on XHR. This was done by introducing the EventTarget handler, which was rather invasive... Hence, trunk only for now BUG:211136 BUG:205438 M +6 -2 dom/dom2_events.cpp M +1 -1 dom/dom2_events.h M +11 -0 ecma/kjs_dom.cpp M +1 -0 ecma/kjs_dom.h M +11 -8 ecma/kjs_events.cpp M +5 -0 ecma/xmlhttprequest.cpp M +5 -1 ecma/xmlhttprequest.h M +1 -1 xml/dom2_eventsimpl.cpp M +6 -6 xml/dom2_eventsimpl.h M +1 -1 xml/dom_nodeimpl.cpp M +18 -8 xml/dom_nodeimpl.h --- trunk/KDE/kdelibs/khtml/dom/dom2_events.cpp #1042045:1042046 @@ -91,7 +91,9 @@ if (!impl) throw DOMException(DOMException::INVALID_STATE_ERR); - return impl->target(); + if (impl->target()->eventTargetType() == EventTargetImpl::DOM_NODE) + return static_cast<DOM::NodeImpl*>(impl->target()); + return 0; } Node Event::currentTarget() const @@ -99,7 +101,9 @@ if (!impl) throw DOMException(DOMException::INVALID_STATE_ERR); - return impl->currentTarget(); + if (impl->currentTarget()->eventTargetType() == EventTargetImpl::DOM_NODE) + return static_cast<DOM::NodeImpl*>(impl->currentTarget()); + return 0; } unsigned short Event::eventPhase() const --- trunk/KDE/kdelibs/khtml/dom/dom2_events.h #1042045:1042046 @@ -252,8 +252,8 @@ EventImpl *handle() const; bool isNull() const; + Event(EventImpl *i); protected: - Event(EventImpl *i); EventImpl *impl; }; --- trunk/KDE/kdelibs/khtml/ecma/kjs_dom.cpp #1042045:1042046 @@ -48,6 +48,7 @@ #include "kjs_events.h" #include "kjs_views.h" #include "kjs_window.h" +#include "xmlhttprequest.h" #include <kjs/PropertyNameArray.h> #include <dom/dom_exception.h> #include <dom/html_document.h> @@ -1745,6 +1746,16 @@ CREATE_WRAPPER_FUNCTION(Audio) CREATE_WRAPPER_FUNCTION(Video) +JSValue* KJS::getEventTarget(ExecState* exec, DOM::EventTargetImpl* t) +{ + if (!t) + return jsNull(); + if (t->eventTargetType() == EventTargetImpl::DOM_NODE) + return getDOMNode(exec, static_cast<DOM::NodeImpl*>(t)); + else + return static_cast<XMLHttpRequest*>(t); //static +} + JSValue* KJS::getDOMNode(ExecState *exec, DOM::NodeImpl* n) { DOMObject *ret = 0; --- trunk/KDE/kdelibs/khtml/ecma/kjs_dom.h #1042045:1042046 @@ -281,6 +281,7 @@ }; bool checkNodeSecurity(ExecState *exec, const DOM::NodeImpl* n); + JSValue* getEventTarget(ExecState* exec, DOM::EventTargetImpl* t); JSValue* getDOMNode(ExecState *exec, DOM::NodeImpl* n); JSValue* getDOMNamedNodeMap(ExecState *exec, DOM::NamedNodeMapImpl* m); JSValue* getDOMNodeList(ExecState *exec, DOM::NodeListImpl* l); --- trunk/KDE/kdelibs/khtml/ecma/kjs_events.cpp #1042045:1042046 @@ -86,7 +86,7 @@ // Check whether handler is a function or an object with handleEvent method if (listener == compareListenerImp) { // Set "this" to the event's current target - thisObj = getDOMNode(exec,evt.currentTarget().handle())->getObject(); + thisObj = getEventTarget(exec,evt.handle()->currentTarget())->getObject(); } else { thisObj = compareListenerImp; } @@ -290,9 +290,9 @@ return jsString(event.type()); case Target: case SrcElement: /*MSIE extension - "the object that fired the event"*/ - return getDOMNode(exec,event.target()); + return getEventTarget(exec,event.target()); case CurrentTarget: - return getDOMNode(exec,event.currentTarget()); + return getEventTarget(exec,event.currentTarget()); case EventPhase: return jsNumber((unsigned int)event.eventPhase()); case Bubbles: @@ -612,7 +612,10 @@ case OffsetX: case OffsetY: // MSIE extension { - DOM::Node node = event.target(); + if (event.target()->eventTargetType() != EventTargetImpl::DOM_NODE) + return jsUndefined(); + + DOM::Node node = static_cast<NodeImpl*>(event.target()); khtml::RenderObject *rend = 0; if (node.handle()) { node.handle()->document()->updateRendering(); @@ -658,16 +661,16 @@ case ToElement: // MSIE extension - "the object toward which the user is moving the mouse pointer" if (event.id() == DOM::EventImpl::MOUSEOUT_EVENT) - return getDOMNode(exec,event.relatedTarget()); - return getDOMNode(exec,event.target()); + return getEventTarget(exec,event.relatedTarget()); + return getEventTarget(exec,event.target()); case FromElement: // MSIE extension - "object from which activation // or the mouse pointer is exiting during the event" (huh?) if (event.id() == DOM::EventImpl::MOUSEOUT_EVENT) - return getDOMNode(exec,event.target()); + return getEventTarget(exec,event.target()); /* fall through */ case RelatedTarget: - return getDOMNode(exec,event.relatedTarget()); + return getEventTarget(exec,event.relatedTarget()); default: kDebug(6070) << "WARNING: Unhandled token in DOMMouseEvent::getValueProperty : " << token; return 0; --- trunk/KDE/kdelibs/khtml/ecma/xmlhttprequest.cpp #1042045:1042046 @@ -321,6 +321,7 @@ createdDocument(false), aborted(false) { + ref(); // we're a GC point, so refcount pin. setPrototype(XMLHttpRequestProto::self(exec)); } @@ -345,12 +346,16 @@ if (onReadyStateChangeListener != 0 && doc->view() && doc->view()->part()) { DOM::Event ev = doc->view()->part()->document().createEvent("HTMLEvents"); ev.initEvent("readystatechange", true, true); + ev.handle()->setTarget(this); + ev.handle()->setCurrentTarget(this); onReadyStateChangeListener->handleEvent(ev); } if (m_state == XHRS_Loaded && onLoadListener != 0 && doc->view() && doc->view()->part()) { DOM::Event ev = doc->view()->part()->document().createEvent("HTMLEvents"); ev.initEvent("load", true, true); + ev.handle()->setTarget(this); + ev.handle()->setCurrentTarget(this); onLoadListener->handleEvent(ev); } } --- trunk/KDE/kdelibs/khtml/ecma/xmlhttprequest.h #1042045:1042046 @@ -28,6 +28,8 @@ #include <QtCore/QPointer> #include <QtCore/QHash> +#include "xml/dom_nodeimpl.h" + namespace KJS { class JSEventListener; @@ -77,11 +79,13 @@ SharedPtr<DOM::DocumentImpl> doc; }; - class XMLHttpRequest : public DOMObject { + class XMLHttpRequest : public DOMObject, public DOM::EventTargetImpl { public: XMLHttpRequest(ExecState *, DOM::DocumentImpl* d); ~XMLHttpRequest(); + virtual Type eventTargetType() const { return XML_HTTP_REQUEST; } + bool getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot); JSValue *getValueProperty(ExecState *exec, int token) const; virtual void put(ExecState *exec, const Identifier &propertyName, JSValue *value, int attr = None); --- trunk/KDE/kdelibs/khtml/xml/dom2_eventsimpl.cpp #1042045:1042046 @@ -75,7 +75,7 @@ m_target->deref(); } -void EventImpl::setTarget(NodeImpl *_target) +void EventImpl::setTarget(EventTargetImpl *_target) { if (m_target) m_target->deref(); --- trunk/KDE/kdelibs/khtml/xml/dom2_eventsimpl.h #1042045:1042046 @@ -98,10 +98,10 @@ DOMString type() const { return m_eventName.toString(); } EventName name() const { return m_eventName; } - NodeImpl *target() const { return m_target; } - void setTarget(NodeImpl *_target); - NodeImpl *currentTarget() const { return m_currentTarget; } - void setCurrentTarget(NodeImpl *_currentTarget) { m_currentTarget = _currentTarget; } + EventTargetImpl *target() const { return m_target; } + void setTarget(EventTargetImpl *_target); + EventTargetImpl *currentTarget() const { return m_currentTarget; } + void setCurrentTarget(EventTargetImpl *_currentTarget) { m_currentTarget = _currentTarget; } unsigned short eventPhase() const { return m_eventPhase; } void setEventPhase(unsigned short _eventPhase) { m_eventPhase = _eventPhase; } bool bubbles() const { return m_canBubble; } @@ -145,8 +145,8 @@ bool m_defaultPrevented : 1; bool m_defaultHandled : 1; unsigned short m_eventPhase : 2; - NodeImpl *m_currentTarget; // ref > 0 maintained externally - NodeImpl *m_target; + EventTargetImpl *m_currentTarget; // ref > 0 maintained externally + EventTargetImpl *m_target; QDateTime m_createTime; DOMString m_message; }; --- trunk/KDE/kdelibs/khtml/xml/dom_nodeimpl.cpp #1042045:1042046 @@ -342,7 +342,7 @@ bool NodeImpl::isContentEditable() const { - return m_parent ? m_parent->isContentEditable() : false; + return parentNode() ? parentNode()->isContentEditable() : false; } QRect NodeImpl::getRect() const --- trunk/KDE/kdelibs/khtml/xml/dom_nodeimpl.h #1042045:1042046 @@ -81,8 +81,19 @@ bool isHTMLEventListener(EventListener* listener); }; -class NodeImpl : public khtml::TreeShared<NodeImpl> +class EventTargetImpl : public khtml::TreeShared<EventTargetImpl> { +public: + enum Type { + DOM_NODE, + XML_HTTP_REQUEST + }; + + virtual Type eventTargetType() const = 0; +}; + +class NodeImpl : public EventTargetImpl +{ friend class DocumentImpl; public: NodeImpl(DocumentImpl *doc); @@ -91,12 +102,17 @@ //stuff for WebCore DOM & SVG virtual bool hasTagName(const QualifiedName& /*name*/) const { return false; } + // EventTarget + virtual Type eventTargetType() const { return DOM_NODE; } + // covariant override + NodeImpl* parent() const { return parentNode(); } + // DOM methods & attributes for Node virtual DOMString nodeName() const; virtual DOMString nodeValue() const; virtual void setNodeValue( const DOMString &_nodeValue, int &exceptioncode ); virtual unsigned short nodeType() const; - NodeImpl *parentNode() const { return m_parent; } + NodeImpl *parentNode() const { return static_cast<NodeImpl*>(m_parent); } NodeImpl *previousSibling() const { return m_previous; } NodeImpl *nextSibling() const { return m_next; } virtual NodeListImpl *childNodes(); @@ -209,12 +225,6 @@ // qualified element name. virtual Id id() const { return 0; } - enum IdType { - AttributeId, - ElementId, - NamespaceId - }; - enum MouseEventType { MousePress, MouseRelease, _______________________________________________ Khtml-cvs mailing list Khtml-cvs@... https://mail.kde.org/mailman/listinfo/khtml-cvs |
| Free embeddable forum powered by Nabble | Forum Help |