+2006-06-25 Rob Buis <buis@kde.org>
+
+ Reviewed by Darin.
+
+ Test cases for
+ <http://bugzilla.opendarwin.org/show_bug.cgi?id=8707>
+ event.clientX and event.clientY should be relative to the viewport, not the canvas
+
+ * fast/dom/window-xy-properties-expected.txt: Added.
+ * fast/dom/window-xy-properties.html: Added.
+
2006-06-25 Timothy Hatcher <timothy@apple.com>
http://bugzilla.opendarwin.org/show_bug.cgi?id=9560
--- /dev/null
+EDITING DELEGATE: shouldChangeSelectedDOMRange:(null) toDOMRange:range from 0 of DIV > BODY > HTML > #document to 0 of DIV > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 0 of DIV > BODY > HTML > #document to 0 of DIV > BODY > HTML > #document toDOMRange:range from 0 of DIV > BODY > HTML > #document to 0 of DIV > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 0 of DIV > BODY > HTML > #document to 0 of DIV > BODY > HTML > #document toDOMRange:range from 0 of DIV > BODY > HTML > #document to 0 of DIV > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
+PASS event.clientX is 50
+PASS event.clientY is 50
+PASS event.pageX is 50
+PASS event.pageY is 50
+PASS event.layerX is 50
+PASS event.layerY is 50
+PASS event.offsetX is 42
+PASS event.offsetY is 42
+PASS event.clientX is 50
+PASS event.clientY is 50
+PASS event.pageX is 50
+PASS event.pageY is 550
+PASS event.layerX is 50
+PASS event.layerY is 550
+PASS event.offsetX is 42
+PASS event.offsetY is 542
+PASS event.clientX is 50
+PASS event.clientY is 50
+PASS event.pageX is 550
+PASS event.pageY is 50
+PASS event.layerX is 550
+PASS event.layerY is 50
+PASS event.offsetX is 542
+PASS event.offsetY is 42
+
--- /dev/null
+<head>
+<script src="../js/resources/js-test-pre.js"></script>
+<script>
+var nrmouseclicks = 0; // small hack to distinguish between clicks
+function mouseev(event) {
+ if (nrmouseclicks == 0) {
+ shouldBe("event.clientX", "50");
+ shouldBe("event.clientY", "50");
+ shouldBe("event.pageX", "50");
+ shouldBe("event.pageY", "50");
+ shouldBe("event.layerX", "50");
+ shouldBe("event.layerY", "50");
+ shouldBe("event.offsetX", "42");
+ shouldBe("event.offsetY", "42");
+ nrmouseclicks++;
+ } else if (nrmouseclicks == 1) {
+ shouldBe("event.clientX", "50");
+ shouldBe("event.clientY", "50");
+ shouldBe("event.pageX", "50");
+ shouldBe("event.pageY", "550");
+ shouldBe("event.layerX", "50");
+ shouldBe("event.layerY", "550");
+ shouldBe("event.offsetX", "42");
+ shouldBe("event.offsetY", "542");
+ nrmouseclicks++;
+ } else {
+ shouldBe("event.clientX", "50");
+ shouldBe("event.clientY", "50");
+ shouldBe("event.pageX", "550");
+ shouldBe("event.pageY", "50");
+ shouldBe("event.layerX", "550");
+ shouldBe("event.layerY", "50");
+ shouldBe("event.offsetX", "542");
+ shouldBe("event.offsetY", "42");
+ }
+}
+function test() {
+ if (window.layoutTestController) {
+ layoutTestController.dumpAsText();
+ // test a normal mouse to
+ eventSender.mouseMoveTo(50, 50);
+ eventSender.mouseDown();
+ eventSender.mouseUp();
+
+ // now scroll a bit down and verify that clientY does not change
+ window.scrollTo(0, 500);
+ eventSender.mouseDown();
+ eventSender.mouseUp();
+
+ // now scroll a bit to the right and verify that clientX does not change
+ window.scrollTo(500, 0);
+ eventSender.mouseDown();
+ eventSender.mouseUp();
+ }
+}
+</script>
+</head>
+<body onload="test()">
+<div style="background: red; width:2000px; height: 2000px" onmousedown="mouseev(event)">
+</div>
+<div id="console"></div>
+</body>
+2006-06-25 Rob Buis <buis@kde.org>
+
+ Reviewed by Darin.
+
+ Fix for http://bugzilla.opendarwin.org/show_bug.cgi?id=8707:
+ event.clientX and event.clientY should be relative to the viewport, not the canvas
+
+ Make sure clientX and clientY take into account the scroll offsets
+ of the view.
+
+ * dom/EventTargetNode.cpp:
+ (WebCore::EventTargetNode::dispatchMouseEvent):
+ * dom/MouseEvent.cpp:
+ (WebCore::MouseEvent::MouseEvent):
+ * dom/MouseEvent.h:
+ * dom/MouseRelatedEvent.cpp:
+ (WebCore::MouseRelatedEvent::MouseRelatedEvent):
+ (WebCore::MouseRelatedEvent::initCoordinates):
+ * dom/MouseRelatedEvent.h:
+ * dom/WheelEvent.cpp:
+ (WebCore::WheelEvent::WheelEvent):
+ * page/FrameView.cpp:
+ (WebCore::FrameView::dispatchDragEvent):
+
2006-06-25 Timothy Hatcher <timothy@apple.com>
Reviewed by Darin.
// Attempting to dispatch with a non-EventTarget relatedTarget causes the relatedTarget to be silently ignored.
EventTargetNode *relatedTarget = (relatedTargetArg && relatedTargetArg->isEventTargetNode()) ? static_cast<EventTargetNode*>(relatedTargetArg) : 0;
-
+
+ int pageX = clientX;
+ int pageY = clientY;
+ if (FrameView* view = document()->view()) {
+ pageX -= view->contentsX();
+ pageY -= view->contentsY();
+ }
RefPtr<Event> me = new MouseEvent(eventType, true, cancelable, document()->defaultView(),
- detail, screenX, screenY, clientX, clientY,
+ detail, screenX, screenY,
+ pageX, pageY, clientX, clientY,
ctrlKey, altKey, shiftKey, metaKey, button,
relatedTarget, 0, isSimulated);
// as a separate event in other DOM-compliant browsers like Firefox, and so we do the same.
if (eventType == clickEvent && detail == 2) {
me = new MouseEvent(dblclickEvent, true, cancelable, document()->defaultView(),
- detail, screenX, screenY, clientX, clientY,
+ detail, screenX, screenY,
+ pageX, pageY, clientX, clientY,
ctrlKey, altKey, shiftKey, metaKey, button,
relatedTarget, 0, isSimulated);
if (defaultHandled)
MouseEvent::MouseEvent(const AtomicString& eventType, bool canBubble, bool cancelable, AbstractView* view,
int detail, int screenX, int screenY, int clientX, int clientY,
- bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button,
+ int pageX, int pageY, bool ctrlKey, bool altKey,
+ bool shiftKey, bool metaKey, unsigned short button,
EventTargetNode* relatedTarget, Clipboard* clipboard, bool isSimulated)
: MouseRelatedEvent(eventType, canBubble, cancelable, view, detail, screenX, screenY,
- clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, isSimulated)
+ clientX, clientY, pageX, pageY, ctrlKey, altKey, shiftKey, metaKey, isSimulated)
, m_button(button)
, m_relatedTarget(relatedTarget)
, m_clipboard(clipboard)
MouseEvent();
MouseEvent(const AtomicString& type, bool canBubble, bool cancelable, AbstractView* view,
int detail, int screenX, int screenY, int clientX, int clientY,
- bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button,
+ int pageX, int pageY, bool ctrlKey, bool altKey,
+ bool shiftKey, bool metaKey, unsigned short button,
EventTargetNode* relatedTarget, Clipboard* clipboard = 0, bool isSimulated = false);
virtual ~MouseEvent();
MouseRelatedEvent::MouseRelatedEvent(const AtomicString& eventType, bool canBubble, bool cancelable, AbstractView* view,
int detail, int screenX, int screenY, int clientX, int clientY,
- bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool isSimulated)
+ int pageX, int pageY, bool ctrlKey, bool altKey,
+ bool shiftKey, bool metaKey, bool isSimulated)
: UIEventWithKeyState(eventType, canBubble, cancelable, view, detail, ctrlKey, altKey, shiftKey, metaKey)
, m_screenX(screenX)
, m_screenY(screenY)
, m_clientX(clientX)
, m_clientY(clientY)
+ , m_pageX(pageX)
+ , m_pageY(pageY)
, m_isSimulated(isSimulated)
{
initCoordinates();
// Set up initial values for coordinates.
// Correct values can't be computed until we have at target, so receivedTarget
// does the "real" computation.
- m_pageX = m_clientX;
- m_pageY = m_clientY;
m_layerX = m_pageX;
m_layerY = m_pageY;
m_offsetX = m_pageX;
MouseRelatedEvent();
MouseRelatedEvent(const AtomicString& type, bool canBubble, bool cancelable, AbstractView* view,
int detail, int screenX, int screenY, int clientX, int clientY,
- bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool isSimulated = false);
+ int pageX, int pageY, bool ctrlKey, bool altKey,
+ bool shiftKey, bool metaKey, bool isSimulated = false);
int screenX() const { return m_screenX; }
int screenY() const { return m_screenY; }
#include "config.h"
#include "WheelEvent.h"
+#include "Frame.h"
#include "EventNames.h"
bool ctrlKey, bool altKey, bool shiftKey, bool metaKey)
: MouseRelatedEvent(horizontal ? khtmlHorizontalmousewheelEvent : mousewheelEvent,
true, true, view, 0, screenX, screenY, clientX, clientY,
+ clientX - (view && view->frame() && view->frame()->view()) ? view->frame()->view()->contentsX() : 0,
+ clientY - (view && view->frame() && view->frame()->view()) ? view->frame()->view()->contentsY() : 0,
ctrlKey, altKey, shiftKey, metaKey)
, m_horizontal(horizontal)
, m_wheelDelta(wheelDelta)
{
IntPoint clientPos = viewportToContents(event.pos());
+ int clientX = clientPos.x();
+ int clientY = clientPos.y();
+ int pageX = clientX;
+ int pageY = clientY;
+ if (FrameView* view = m_frame->document()->view()) {
+ pageX -= view->contentsX();
+ pageY -= view->contentsY();
+ }
RefPtr<MouseEvent> me = new MouseEvent(eventType,
true, true, m_frame->document()->defaultView(),
- 0, event.globalX(), event.globalY(), clientPos.x(), clientPos.y(),
+ 0, event.globalX(), event.globalY(), pageX, pageY, clientX, clientY,
event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(),
0, 0, clipboard);