Title: [96798] trunk
Revision
96798
Author
jknot...@chromium.org
Date
2011-10-06 03:10:07 -0700 (Thu, 06 Oct 2011)

Log Message

Take pageScaleFactor into account for MouseRelatedEvents.
https://bugs.webkit.org/show_bug.cgi?id=67592

Reviewed by Tony Gentilcore.

Source/WebCore:

Tests: fast/events/page-scaled-mouse-click-iframe.html
       fast/events/page-scaled-mouse-click.html

* dom/MouseRelatedEvent.cpp:
(WebCore::contentsScrollOffset):
(WebCore::MouseRelatedEvent::MouseRelatedEvent):
(WebCore::frameScaleFactor):
(WebCore::MouseRelatedEvent::computePageLocation):
(WebCore::MouseRelatedEvent::computeRelativePosition):

LayoutTests:

* fast/events/page-scaled-mouse-click-expected.txt: Added.
* fast/events/page-scaled-mouse-click-iframe-expected.txt: Added.
* fast/events/page-scaled-mouse-click-iframe.html: Added.
* fast/events/page-scaled-mouse-click.html: Added.
* fast/events/resources/page-scaled-mouse-click-iframe-inner.html: Added.
* fast/events/script-tests/page-scaled-mouse-click-iframe.js: Added.
():
(clearEventLog):
(testEvents):
(iframeLoaded):
* fast/events/script-tests/page-scaled-mouse-click.js: Added.
():
(clearEventLog):
(sendEvents):
(testEvents):

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (96797 => 96798)


--- trunk/LayoutTests/ChangeLog	2011-10-06 10:07:21 UTC (rev 96797)
+++ trunk/LayoutTests/ChangeLog	2011-10-06 10:10:07 UTC (rev 96798)
@@ -1,3 +1,26 @@
+2011-10-06  John Knottenbelt  <jknot...@chromium.org>
+
+        Take pageScaleFactor into account for MouseRelatedEvents.
+        https://bugs.webkit.org/show_bug.cgi?id=67592
+
+        Reviewed by Tony Gentilcore.
+
+        * fast/events/page-scaled-mouse-click-expected.txt: Added.
+        * fast/events/page-scaled-mouse-click-iframe-expected.txt: Added.
+        * fast/events/page-scaled-mouse-click-iframe.html: Added.
+        * fast/events/page-scaled-mouse-click.html: Added.
+        * fast/events/resources/page-scaled-mouse-click-iframe-inner.html: Added.
+        * fast/events/script-tests/page-scaled-mouse-click-iframe.js: Added.
+        ():
+        (clearEventLog):
+        (testEvents):
+        (iframeLoaded):
+        * fast/events/script-tests/page-scaled-mouse-click.js: Added.
+        ():
+        (clearEventLog):
+        (sendEvents):
+        (testEvents):
+
 2011-10-06  Sergio Villar Senin  <svil...@igalia.com>
 
         Unreviewed. Skipped a test that lacks a console message.

Added: trunk/LayoutTests/fast/events/page-scaled-mouse-click-expected.txt (0 => 96798)


--- trunk/LayoutTests/fast/events/page-scaled-mouse-click-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/events/page-scaled-mouse-click-expected.txt	2011-10-06 10:10:07 UTC (rev 96798)
@@ -0,0 +1,15 @@
+This tests that page scaling does not affect mouse event pageX and pageY coordinates.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Unscaled
+PASS eventLog is "click(10, 10)"
+
+setPageScale(0.5)
+PASS eventLog is "click(20, 20)"
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/fast/events/page-scaled-mouse-click-iframe-expected.txt (0 => 96798)


--- trunk/LayoutTests/fast/events/page-scaled-mouse-click-iframe-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/events/page-scaled-mouse-click-iframe-expected.txt	2011-10-06 10:10:07 UTC (rev 96798)
@@ -0,0 +1,22 @@
+
+This tests that page scaling and CSS transforms do not affect mouse event pageX and pageY coordinates for content embedded in an iframe.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Unscaled
+PASS eventLog is "click(10, 10)"
+
+setPageScale(0.5)
+PASS eventLog is "click(20, 20)"
+
+CSS scale(0.5, 2.0)
+PASS eventLog is "click(20, 5)"
+
+setPageScale(0.5), CSS scale(0.5, 2.0)
+PASS eventLog is "click(40, 10)"
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/fast/events/page-scaled-mouse-click-iframe.html (0 => 96798)


--- trunk/LayoutTests/fast/events/page-scaled-mouse-click-iframe.html	                        (rev 0)
+++ trunk/LayoutTests/fast/events/page-scaled-mouse-click-iframe.html	2011-10-06 10:10:07 UTC (rev 96798)
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html style="background-color: red; ">
+<head>
+<link rel="stylesheet" href=""
+<script src=""
+</head>
+<body style="margin: 0px;">
+<p id="description"></p>
+<div id="console"></div>
+<script src=""
+<script src=""
+</body>
+</html>

Added: trunk/LayoutTests/fast/events/page-scaled-mouse-click.html (0 => 96798)


--- trunk/LayoutTests/fast/events/page-scaled-mouse-click.html	                        (rev 0)
+++ trunk/LayoutTests/fast/events/page-scaled-mouse-click.html	2011-10-06 10:10:07 UTC (rev 96798)
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link rel="stylesheet" href=""
+<script src=""
+</head>
+<body style="margin:0px">
+<p id="description"></p>
+<div id="console"></div>
+<script src=""
+<script src=""
+</body>
+</html>

Added: trunk/LayoutTests/fast/events/resources/page-scaled-mouse-click-iframe-inner.html (0 => 96798)


--- trunk/LayoutTests/fast/events/resources/page-scaled-mouse-click-iframe-inner.html	                        (rev 0)
+++ trunk/LayoutTests/fast/events/resources/page-scaled-mouse-click-iframe-inner.html	2011-10-06 10:10:07 UTC (rev 96798)
@@ -0,0 +1,2 @@
+<body _onload_="parent.iframeLoaded()" style="margin: 0px;">
+</body>

Added: trunk/LayoutTests/fast/events/script-tests/page-scaled-mouse-click-iframe.js (0 => 96798)


--- trunk/LayoutTests/fast/events/script-tests/page-scaled-mouse-click-iframe.js	                        (rev 0)
+++ trunk/LayoutTests/fast/events/script-tests/page-scaled-mouse-click-iframe.js	2011-10-06 10:10:07 UTC (rev 96798)
@@ -0,0 +1,83 @@
+description("This tests that page scaling and CSS transforms do not affect mouse event pageX and pageY coordinates for " +
+            "content embedded in an iframe.");
+
+var html = document.documentElement;
+
+var iframe = document.createElement("iframe");
+iframe.style.border = "none";
+iframe.style.width = "200px";
+iframe.style.height = "200px";
+iframe.style.background = ""
+
+var div = document.createElement("div");
+div.style.width = "100px";
+div.style.height = "100px";
+div.style.backgroundColor = "blue";
+
+var eventLog = "";
+
+function appendEventLog(event) {
+    var msg = event.type + "(" + event.pageX + ", " + event.pageY + ")";
+
+    if (window.eventSender) {
+        eventLog += msg;
+    } else {
+        debug(msg);
+    }
+}
+
+function clearEventLog() {
+    eventLog = "";
+}
+
+function sendEvents(button) {
+    if (!window.eventSender) {
+        debug("This test requires the EventSender API (provided by, for example, DumpRenderTree or WebKitTestRunner). Click on the blue rect with the left mouse button to log the mouse coordinates.")
+        return;
+    }
+    eventSender.mouseDown(button);
+    eventSender.mouseUp(button);
+}
+
+function testEvents(button, description, expectedString) {
+    sendEvents(button);
+    debug(description);
+    shouldBeEqualToString("eventLog", expectedString);
+    clearEventLog();
+    debug("");
+}
+
+function iframeLoaded() {
+  // Add the div to the iframe.
+  div.addEventListener("click", appendEventLog, false);
+  iframe.contentWindow.document.body.insertBefore(div, iframe.contentWindow.document.body.firstChild);
+
+  if (window.eventSender) {
+    eventSender.mouseMoveTo(10, 10);
+    // We are clicking in the same position on screen. As we scale or transform the page,
+    // we expect the pageX and pageY event coordinates to change because different
+    // parts of the document are under the mouse.
+
+    testEvents(0, "Unscaled", "click(10, 10)");
+
+    eventSender.scalePageBy(0.5, 0, 0);
+    testEvents(0, "setPageScale(0.5)", "click(20, 20)");
+
+    eventSender.scalePageBy(1.0, 0, 0);
+    html.style["-webkit-transform"] = "scale(0.5, 2.0)";
+    html.style["-webkit-transform-origin"] = "0 0";
+    testEvents(0, "CSS scale(0.5, 2.0)", "click(20, 5)");
+
+    eventSender.scalePageBy(0.5, 0, 0);
+    testEvents(0, "setPageScale(0.5), CSS scale(0.5, 2.0)", "click(40, 10)");
+  }
+
+  finishJSTest();
+}
+
+// Add the iframe to the document.
+iframe.src = ""
+document.body.insertBefore(iframe, document.body.firstChild);
+
+window.jsTestIsAsync = true;
+window.successfullyParsed = true;

Added: trunk/LayoutTests/fast/events/script-tests/page-scaled-mouse-click.js (0 => 96798)


--- trunk/LayoutTests/fast/events/script-tests/page-scaled-mouse-click.js	                        (rev 0)
+++ trunk/LayoutTests/fast/events/script-tests/page-scaled-mouse-click.js	2011-10-06 10:10:07 UTC (rev 96798)
@@ -0,0 +1,57 @@
+description("This tests that page scaling does not affect mouse event pageX and pageY coordinates.");
+
+var html = document.documentElement;
+
+var div = document.createElement("div");
+div.style.width = "100px";
+div.style.height = "100px";
+div.style.backgroundColor = "blue";
+
+var eventLog = "";
+
+function appendEventLog() {
+    var msg = event.type + "(" + event.pageX + ", " + event.pageY + ")";
+
+    if (window.eventSender) {
+        eventLog += msg;
+    } else {
+        debug(msg);
+    }
+}
+
+function clearEventLog() {
+    eventLog = "";
+}
+
+div.addEventListener("click", appendEventLog, false);
+document.body.insertBefore(div, document.body.firstChild);
+
+function sendEvents(button) {
+    if (!window.eventSender) {
+        debug("This test requires DumpRenderTree.  Click on the blue rect with the left mouse button to log the mouse coordinates.")
+        return;
+    }
+    eventSender.mouseDown(button);
+    eventSender.mouseUp(button);
+}
+
+function testEvents(button, description, expectedString) {
+    sendEvents(button);
+    debug(description);
+    shouldBeEqualToString("eventLog", expectedString);
+    debug("");
+    clearEventLog();
+}
+
+if (window.eventSender) {
+    eventSender.mouseMoveTo(10, 10);
+    // We are clicking in the same position on screen. As we scale or transform the page,
+    // we expect the pageX and pageY event coordinates to change because different
+    // parts of the document are under the mouse.
+    testEvents(0, "Unscaled", "click(10, 10)");
+
+    eventSender.scalePageBy(0.5, 0, 0);
+    testEvents(0, "setPageScale(0.5)", "click(20, 20)");
+}
+
+var successfullyParsed = true;

Modified: trunk/Source/WebCore/ChangeLog (96797 => 96798)


--- trunk/Source/WebCore/ChangeLog	2011-10-06 10:07:21 UTC (rev 96797)
+++ trunk/Source/WebCore/ChangeLog	2011-10-06 10:10:07 UTC (rev 96798)
@@ -1,3 +1,20 @@
+2011-10-06  John Knottenbelt  <jknot...@chromium.org>
+
+        Take pageScaleFactor into account for MouseRelatedEvents.
+        https://bugs.webkit.org/show_bug.cgi?id=67592
+
+        Reviewed by Tony Gentilcore.
+
+        Tests: fast/events/page-scaled-mouse-click-iframe.html
+               fast/events/page-scaled-mouse-click.html
+
+        * dom/MouseRelatedEvent.cpp:
+        (WebCore::contentsScrollOffset):
+        (WebCore::MouseRelatedEvent::MouseRelatedEvent):
+        (WebCore::frameScaleFactor):
+        (WebCore::MouseRelatedEvent::computePageLocation):
+        (WebCore::MouseRelatedEvent::computeRelativePosition):
+
 2011-10-03  Hans Wennborg  <h...@chromium.org>
 
         IndexedDB: Remove SQLite-LevelDB migration code

Modified: trunk/Source/WebCore/dom/MouseRelatedEvent.cpp (96797 => 96798)


--- trunk/Source/WebCore/dom/MouseRelatedEvent.cpp	2011-10-06 10:07:21 UTC (rev 96797)
+++ trunk/Source/WebCore/dom/MouseRelatedEvent.cpp	2011-10-06 10:10:07 UTC (rev 96798)
@@ -48,8 +48,8 @@
     FrameView* frameView = frame->view();
     if (!frameView)
         return LayoutSize();
-    return LayoutSize(frameView->scrollX() / frame->pageZoomFactor(),
-        frameView->scrollY() / frame->pageZoomFactor());
+    float scaleFactor = frame->pageZoomFactor() * frame->frameScaleFactor();
+    return LayoutSize(frameView->scrollX() / scaleFactor, frameView->scrollY() / scaleFactor);
 }
 
 MouseRelatedEvent::MouseRelatedEvent(const AtomicString& eventType, bool canBubble, bool cancelable, PassRefPtr<AbstractView> abstractView,
@@ -67,15 +67,15 @@
         if (FrameView* frameView = frame->view()) {
             scrollPosition = frameView->scrollPosition();
             adjustedPageLocation = frameView->windowToContents(windowLocation);
-            float pageZoom = frame->pageZoomFactor();
-            if (pageZoom != 1.0f) {
+            float scaleFactor = frame->pageZoomFactor() * frame->frameScaleFactor();
+            if (scaleFactor != 1.0f) {
                 // Adjust our pageX and pageY to account for the page zoom.
-                adjustedPageLocation.scale(1 / pageZoom, 1 / pageZoom);
+                adjustedPageLocation.scale(1 / scaleFactor, 1 / scaleFactor);
 
                 // FIXME: Change this to use float math and proper rounding (or
                 // better yet, use LayoutPoint::scale).
-                scrollPosition.setX(scrollPosition.x() / pageZoom);
-                scrollPosition.setY(scrollPosition.y() / pageZoom);
+                scrollPosition.setX(scrollPosition.x() / scaleFactor);
+                scrollPosition.setY(scrollPosition.y() / scaleFactor);
             }
         }
     }
@@ -122,10 +122,21 @@
     return frame->pageZoomFactor();
 }
 
+static float frameScaleFactor(const UIEvent* event)
+{
+    DOMWindow* window = event->view();
+    if (!window)
+        return 1;
+    Frame* frame = window->frame();
+    if (!frame)
+        return 1;
+    return frame->frameScaleFactor();
+}
+
 void MouseRelatedEvent::computePageLocation()
 {
-    float zoomFactor = pageZoomFactor(this);
-    setAbsoluteLocation(roundedLayoutPoint(FloatPoint(pageX() * zoomFactor, pageY() * zoomFactor)));
+    float scaleFactor = pageZoomFactor(this) * frameScaleFactor(this);
+    setAbsoluteLocation(roundedLayoutPoint(FloatPoint(pageX() * scaleFactor, pageY() * scaleFactor)));
 }
 
 void MouseRelatedEvent::receivedTarget()
@@ -151,7 +162,7 @@
         if (RenderObject* r = targetNode->renderer()) {
             FloatPoint localPos = r->absoluteToLocal(absoluteLocation(), false, true);
             m_offsetLocation = roundedLayoutPoint(localPos);
-            float scaleFactor = 1 / pageZoomFactor(this);
+            float scaleFactor = 1 / (pageZoomFactor(this) * frameScaleFactor(this));
             if (scaleFactor != 1.0f)
                 m_offsetLocation.scale(scaleFactor, scaleFactor);
         }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to