[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