KDE/kdelibs/khtml

View: New views
1 Messages — Rating Filter:   Alert me  

KDE/kdelibs/khtml

by Bugzilla from maksim@kde.org :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

SVN 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