[webkit-changes] cvs commit: WebCore/khtml/xml dom2_eventsimpl.cpp dom2_eventsimpl.h

Darin darin at opensource.apple.com
Wed Dec 21 20:06:47 PST 2005


darin       05/12/21 20:06:46

  Modified:    .        ChangeLog
               khtml/ecma kjs_events.cpp
               khtml/xml dom2_eventsimpl.cpp dom2_eventsimpl.h
  Log:
          Reviewed by Geoff.
  
          - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=6177
            move event code from JavaScript binding into DOM implementation
  
          * khtml/ecma/kjs_events.cpp:
          (KJS::DOMMouseEvent::getValueProperty): Change everything to just call through instead of doing
          the work here.
          (KJS::DOMWheelEvent::getValueProperty): Ditto.
  
          * khtml/xml/dom2_eventsimpl.h:
          (DOM::MouseRelatedEventImpl::offsetX):
          (DOM::MouseRelatedEventImpl::offsetY):
          * khtml/xml/dom2_eventsimpl.cpp:
          (DOM::MouseRelatedEventImpl::MouseRelatedEventImpl): Initialize new m_pageX, m_pageY, m_layerX,
          m_layerY, m_offsetX, and m_offsetY.
          (DOM::MouseRelatedEventImpl::computePositions): Renamed from computeLayerPos since it handles
          page position andoffset position too now.
          (DOM::MouseRelatedEventImpl::pageX): Added. Not in header since it's virtual.
          (DOM::MouseRelatedEventImpl::pageY): Ditto.
          (DOM::MouseRelatedEventImpl::x): Added, with FIXME since it should change eventually.
          (DOM::MouseRelatedEventImpl::y): Ditto.
          (DOM::MouseEventImpl::initMouseEvent): Call computePositions instead of computeLayerPos.
          (DOM::MouseEventImpl::toElement): Added.
          (DOM::MouseEventImpl::fromElement): Added.
  
  Revision  Changes    Path
  1.22      +28 -0     WebCore/ChangeLog
  
  Index: ChangeLog
  ===================================================================
  RCS file: /cvs/root/WebCore/ChangeLog,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- ChangeLog	22 Dec 2005 01:40:50 -0000	1.21
  +++ ChangeLog	22 Dec 2005 04:06:44 -0000	1.22
  @@ -1,3 +1,31 @@
  +2005-12-21  Darin Adler  <darin at apple.com>
  +
  +        Reviewed by Geoff.
  +
  +        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=6177
  +          move event code from JavaScript binding into DOM implementation
  +
  +        * khtml/ecma/kjs_events.cpp:
  +        (KJS::DOMMouseEvent::getValueProperty): Change everything to just call through instead of doing
  +        the work here.
  +        (KJS::DOMWheelEvent::getValueProperty): Ditto.
  +
  +        * khtml/xml/dom2_eventsimpl.h:
  +        (DOM::MouseRelatedEventImpl::offsetX):
  +        (DOM::MouseRelatedEventImpl::offsetY):
  +        * khtml/xml/dom2_eventsimpl.cpp:
  +        (DOM::MouseRelatedEventImpl::MouseRelatedEventImpl): Initialize new m_pageX, m_pageY, m_layerX,
  +        m_layerY, m_offsetX, and m_offsetY.
  +        (DOM::MouseRelatedEventImpl::computePositions): Renamed from computeLayerPos since it handles
  +        page position andoffset position too now.
  +        (DOM::MouseRelatedEventImpl::pageX): Added. Not in header since it's virtual.
  +        (DOM::MouseRelatedEventImpl::pageY): Ditto.
  +        (DOM::MouseRelatedEventImpl::x): Added, with FIXME since it should change eventually.
  +        (DOM::MouseRelatedEventImpl::y): Ditto.
  +        (DOM::MouseEventImpl::initMouseEvent): Call computePositions instead of computeLayerPos.
  +        (DOM::MouseEventImpl::toElement): Added.
  +        (DOM::MouseEventImpl::fromElement): Added.
  +
   2005-12-21  Timothy Hatcher  <timothy at apple.com>
   
           * WebCore.xcodeproj/project.pbxproj:
  
  
  
  1.79      +16 -38    WebCore/khtml/ecma/kjs_events.cpp
  
  Index: kjs_events.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/ecma/kjs_events.cpp,v
  retrieving revision 1.78
  retrieving revision 1.79
  diff -u -r1.78 -r1.79
  --- kjs_events.cpp	16 Dec 2005 08:08:12 -0000	1.78
  +++ kjs_events.cpp	22 Dec 2005 04:06:45 -0000	1.79
  @@ -675,29 +675,6 @@
     return getStaticValueSlot<DOMMouseEvent, DOMUIEvent>(exec, &DOMMouseEventTable, this, propertyName, slot);
   }
   
  -static QPoint offsetFromTarget(const MouseRelatedEventImpl *e)
  -{
  -    int x = e->clientX();
  -    int y = e->clientY();
  -
  -    NodeImpl *n = e->target();
  -    if (n) {
  -        DocumentImpl *doc = n->getDocument();
  -        if (doc) {
  -            doc->updateRendering();
  -            RenderObject *r = n->renderer();
  -            if (r) {
  -                int rx, ry;
  -                if (r->absolutePosition(rx, ry)) {
  -                    x -= rx;
  -                    y -= ry;
  -                }
  -            }
  -        }
  -    }
  -    return QPoint(x, y);
  -}
  -
   JSValue *DOMMouseEvent::getValueProperty(ExecState *exec, int token) const
   {
     MouseEventImpl &event = *static_cast<MouseEventImpl *>(impl());
  @@ -707,15 +684,13 @@
     case ScreenY:
       return jsNumber(event.screenY());
     case ClientX:
  -  case X:
       return jsNumber(event.clientX());
     case ClientY:
  -  case Y:
       return jsNumber(event.clientY());
  -  case OffsetX: // MSIE extension
  -    return jsNumber(offsetFromTarget(&event).x());
  -  case OffsetY: // MSIE extension
  -    return jsNumber(offsetFromTarget(&event).y());
  +  case OffsetX:
  +    return jsNumber(event.offsetX());
  +  case OffsetY:
  +    return jsNumber(event.offsetY());
     case CtrlKey:
       return jsBoolean(event.ctrlKey());
     case ShiftKey:
  @@ -725,16 +700,17 @@
     case MetaKey:
       return jsBoolean(event.metaKey());
     case Button:
  -    // WinIE uses 1,4,2 for left/middle/right but not for click (just for mousedown/up, maybe others), but we will match the standard DOM.
       return jsNumber(event.button());
     case ToElement:
  -    // MSIE extension - "the object toward which the user is moving the mouse pointer"
  -    return getDOMNode(exec, event.type() == mouseoutEvent ? event.relatedTarget() : event.target());
  +    return getDOMNode(exec, event.toElement());
     case FromElement:
  -    // MSIE extension - "object from which activation or the mouse pointer is exiting during the event" (huh?)
  -    return getDOMNode(exec, event.type() == mouseoutEvent ? event.target() : event.relatedTarget());
  +    return getDOMNode(exec, event.fromElement());
     case RelatedTarget:
       return getDOMNode(exec, event.relatedTarget());
  +  case X:
  +    return jsNumber(event.x());
  +  case Y:
  +    return jsNumber(event.y());
     default:
       kdWarning() << "Unhandled token in DOMMouseEvent::getValueProperty : " << token << endl;
       return NULL;
  @@ -987,19 +963,17 @@
           case AltKey:
               return jsBoolean(e->altKey());
           case ClientX:
  -        case X:
               return jsNumber(e->clientX());
           case ClientY:
  -        case Y:
               return jsNumber(e->clientY());
           case CtrlKey:
               return jsNumber(e->ctrlKey());
           case MetaKey:
               return jsNumber(e->metaKey());
           case OffsetX:
  -            return jsNumber(offsetFromTarget(e).x());
  +            return jsNumber(e->offsetX());
           case OffsetY:
  -            return jsNumber(offsetFromTarget(e).y());
  +            return jsNumber(e->offsetY());
           case ScreenX:
               return jsNumber(e->screenX());
           case ScreenY:
  @@ -1008,6 +982,10 @@
               return jsBoolean(e->shiftKey());
           case WheelDelta:
               return jsNumber(e->wheelDelta());
  +        case X:
  +            return jsNumber(e->x());
  +        case Y:
  +            return jsNumber(e->y());
       }
       return jsUndefined();
   }
  
  
  
  1.42      +87 -38    WebCore/khtml/xml/dom2_eventsimpl.cpp
  
  Index: dom2_eventsimpl.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/xml/dom2_eventsimpl.cpp,v
  retrieving revision 1.41
  retrieving revision 1.42
  diff -u -r1.41 -r1.42
  --- dom2_eventsimpl.cpp	19 Nov 2005 01:26:46 -0000	1.41
  +++ dom2_eventsimpl.cpp	22 Dec 2005 04:06:45 -0000	1.42
  @@ -3,7 +3,7 @@
    *
    * (C) 2001 Peter Kelly (pmk at post.com)
    * (C) 2001 Tobias Anton (anton at stud.fbi.fh-darmstadt.de)
  - * Copyright (C) 2003 Apple Computer, Inc.
  + * Copyright (C) 2003, 2005 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
  @@ -25,20 +25,20 @@
   #include "xml/dom2_eventsimpl.h"
   
   #include "dom/dom2_events.h"
  -#include "xml/dom_docimpl.h"
  -#include "xml/dom2_viewsimpl.h"
  -#include "xml/EventNames.h"
  +#include "khtmlview.h"
   #include "rendering/render_layer.h"
  +#include "xml/EventNames.h"
  +#include "xml/dom2_viewsimpl.h"
  +#include "xml/dom_docimpl.h"
   
  -using khtml::RenderObject;
  -using khtml::RenderLayer;
  +using namespace khtml;
   
   namespace DOM {
   
   using namespace EventNames;
   
   #if __APPLE__
  -inline DOMTimeStamp currentTimeStamp()
  +static inline DOMTimeStamp currentTimeStamp()
   {
       // Since this shows up on profiles, do this an even faster way on Mac OS X.
       return static_cast<DOMTimeStamp>((CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970) * 1000);
  @@ -209,7 +209,8 @@
   // -----------------------------------------------------------------------------
   
   MouseRelatedEventImpl::MouseRelatedEventImpl()
  -    : m_screenX(0), m_screenY(0), m_clientX(0), m_clientY(0), m_layerX(0), m_layerY(0)
  +    : m_screenX(0), m_screenY(0), m_clientX(0), m_clientY(0)
  +    , m_pageX(0), m_pageY(0), m_layerX(0), m_layerY(0), m_offsetX(0), m_offsetY(0)
   {
   }
   
  @@ -228,56 +229,91 @@
   			       bool metaKeyArg)
       : UIEventWithKeyStateImpl(eventType, canBubbleArg, cancelableArg, viewArg, detailArg,
           ctrlKeyArg, altKeyArg, shiftKeyArg, metaKeyArg)
  +    , m_screenX(screenXArg), m_screenY(screenYArg)
  +    , m_clientX(clientXArg), m_clientY(clientYArg)
   {
  -    m_screenX = screenXArg;
  -    m_screenY = screenYArg;
  -    m_clientX = clientXArg;
  -    m_clientY = clientYArg;
  -    computeLayerPos();
  +    computePositions();
   }
   
  -void MouseRelatedEventImpl::computeLayerPos()
  +void MouseRelatedEventImpl::computePositions()
   {
  -    m_layerX = m_clientX;
  -    m_layerY = m_clientY;
  +    m_pageX = m_clientX;
  +    m_pageY = m_clientY;
  +
  +    m_layerX = m_pageX;
  +    m_layerY = m_pageY;
  +
  +    m_offsetX = m_pageX;
  +    m_offsetY = m_pageY;
   
  -    AbstractViewImpl *av = view();
  +    AbstractViewImpl* av = view();
       if (!av)
           return;
  -    DocumentImpl *doc = av->document();
  +    DocumentImpl* doc = av->document();
       if (!doc)
  -	return;
  -    RenderObject *docRenderer = doc->renderer();
  -    if (!docRenderer)
  +        return;
  +    KHTMLView* kv = doc->view();
  +    if (!kv)
           return;
   
  -    khtml::RenderObject::NodeInfo renderInfo(true, false);
  -    docRenderer->layer()->hitTest(renderInfo, m_clientX, m_clientY);
  -
  -    NodeImpl *node = renderInfo.innerNonSharedNode();
  -    while (node && !node->renderer()) {
  -	node = node->parent();
  -    }
  +    doc->updateRendering();
   
  -    if (!node) {
  -	return;
  -    }
  +    // Compute page position.
  +    kv->viewportToContents(m_clientX, m_clientY, m_pageX, m_pageY);
   
  -    node->renderer()->enclosingLayer()->updateLayerPosition();
  -    
  -    for (RenderLayer *layer = node->renderer()->enclosingLayer(); layer; layer = layer->parent()) {
  -	m_layerX -= layer->xPos();
  -	m_layerY -= layer->yPos();
  +    // Compute offset position.
  +    m_offsetX = m_pageX;
  +    m_offsetY = m_pageY;
  +    if (NodeImpl *n = target())
  +        if (RenderObject *r = n->renderer()) {
  +            int rx, ry;
  +            if (r->absolutePosition(rx, ry)) {
  +                m_offsetX -= rx;
  +                m_offsetY -= ry;
  +            }
  +        }
  +
  +    // Compute layer position.
  +    m_layerX = m_pageX;
  +    m_layerY = m_pageY;
  +    if (RenderObject* docRenderer = doc->renderer()) {
  +        // FIXME: Should we use the target node instead of hit testing?
  +        RenderObject::NodeInfo hitTestResult(true, false);
  +        docRenderer->layer()->hitTest(hitTestResult, m_pageX, m_pageY);
  +        NodeImpl *n = hitTestResult.innerNonSharedNode();
  +        while (n && !n->renderer())
  +            n = n->parent();
  +        if (n) {
  +            n->renderer()->enclosingLayer()->updateLayerPosition();    
  +            for (RenderLayer *layer = n->renderer()->enclosingLayer(); layer; layer = layer->parent()) {
  +                m_layerX -= layer->xPos();
  +                m_layerY -= layer->yPos();
  +            }
  +        }
       }
   }
   
   int MouseRelatedEventImpl::pageX() const
   {
  -    return m_clientX;
  +    return m_pageX;
   }
   
   int MouseRelatedEventImpl::pageY() const
   {
  +    return m_pageY;
  +}
  +
  +int MouseRelatedEventImpl::x() const
  +{
  +    // FIXME: This is not correct.
  +    // See Microsoft documentation and <http://www.quirksmode.org/dom/w3c_events.html>.
  +    return m_clientX;
  +}
  +
  +int MouseRelatedEventImpl::y() const
  +{
  +    // FIXME: This is not correct.
  +    // See Microsoft documentation and <http://www.quirksmode.org/dom/w3c_events.html>.
       return m_clientY;
   }
   
  @@ -348,7 +384,8 @@
       m_metaKey = metaKeyArg;
       m_button = buttonArg;
       m_relatedTarget = relatedTargetArg;
  -    computeLayerPos();
  +
  +    computePositions();
   }
   
   bool MouseEventImpl::isMouseEvent() const
  @@ -372,6 +409,18 @@
       return m_button + 1;
   }
   
  +NodeImpl* MouseEventImpl::toElement() const
  +{
  +    // MSIE extension - "the object toward which the user is moving the mouse pointer"
  +    return type() == mouseoutEvent ? relatedTarget() : target();
  +}
  +
  +NodeImpl* MouseEventImpl::fromElement() const
  +{
  +    // MSIE extension - "object from which activation or the mouse pointer is exiting during the event" (huh?)
  +    return type() == mouseoutEvent ? target() : relatedTarget();
  +}
  +
   //---------------------------------------------------------------------------------------------
   
   KeyboardEventImpl::KeyboardEventImpl()
  
  
  
  1.36      +12 -1     WebCore/khtml/xml/dom2_eventsimpl.h
  
  Index: dom2_eventsimpl.h
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/xml/dom2_eventsimpl.h,v
  retrieving revision 1.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- dom2_eventsimpl.h	1 Dec 2005 10:32:25 -0000	1.35
  +++ dom2_eventsimpl.h	22 Dec 2005 04:06:46 -0000	1.36
  @@ -180,17 +180,25 @@
       int clientY() const { return m_clientY; }
       int layerX() const { return m_layerX; }
       int layerY() const { return m_layerY; }
  +    int offsetX() const { return m_offsetX; }
  +    int offsetY() const { return m_offsetY; }
       virtual int pageX() const;
       virtual int pageY() const;
  +    int x() const;
  +    int y() const;
   protected: // expose these so MouseEventImpl::initMouseEvent can set them
       int m_screenX;
       int m_screenY;
       int m_clientX;
       int m_clientY;
  -    void computeLayerPos();
  +    void computePositions();
   private:
  +    int m_pageX;
  +    int m_pageY;
       int m_layerX;
       int m_layerY;
  +    int m_offsetX;
  +    int m_offsetY;
   };
   
   // Introduced in DOM Level 2
  @@ -214,9 +222,12 @@
   		   NodeImpl *relatedTargetArg,
                      ClipboardImpl *clipboardArg=0);
       virtual ~MouseEventImpl();
  +    // WinIE uses 1,4,2 for left/middle/right but not for click (just for mousedown/up, maybe others), but we will match the standard DOM.
       unsigned short button() const { return m_button; }
       NodeImpl *relatedTarget() const { return m_relatedTarget.get(); }
       ClipboardImpl *clipboard() const { return m_clipboard.get(); }
  +    NodeImpl *toElement() const;
  +    NodeImpl *fromElement() const;
       void initMouseEvent(const AtomicString &typeArg,
   			bool canBubbleArg,
   			bool cancelableArg,
  
  
  



More information about the webkit-changes mailing list