Title: [129029] trunk/Source/WebKit/chromium
Revision
129029
Author
commit-qu...@webkit.org
Date
2012-09-19 12:07:39 -0700 (Wed, 19 Sep 2012)

Log Message

[chromium] Add a method didHandleGestureEvent to WebViewClient, called from WebViewImpl::handleGestureEvent.
https://bugs.webkit.org/show_bug.cgi?id=96112

Patch by Oli Lan <oli...@chromium.org> on 2012-09-19
Reviewed by Adam Barth.

Adds a new method didHandleGestureEvent to WebViewClient, called from WebViewImpl::handleGestureEvent.

This will be used by the Android port to implement platform-specific gesture behaviour.

This is tested by the new test WebViewTest.ClientTapHandlers.

* public/WebViewClient.h:
(WebViewClient):
(WebKit::WebViewClient::didHandleGestureEvent):
* src/WebViewImpl.cpp:
(WebKit::WebViewImpl::handleGestureEvent):
* tests/WebViewTest.cpp:

Modified Paths

Diff

Modified: trunk/Source/WebKit/chromium/ChangeLog (129028 => 129029)


--- trunk/Source/WebKit/chromium/ChangeLog	2012-09-19 19:03:06 UTC (rev 129028)
+++ trunk/Source/WebKit/chromium/ChangeLog	2012-09-19 19:07:39 UTC (rev 129029)
@@ -1,3 +1,23 @@
+2012-09-19  Oli Lan  <oli...@chromium.org>
+
+        [chromium] Add a method didHandleGestureEvent to WebViewClient, called from WebViewImpl::handleGestureEvent.
+        https://bugs.webkit.org/show_bug.cgi?id=96112
+
+        Reviewed by Adam Barth.
+
+        Adds a new method didHandleGestureEvent to WebViewClient, called from WebViewImpl::handleGestureEvent.
+
+        This will be used by the Android port to implement platform-specific gesture behaviour.
+
+        This is tested by the new test WebViewTest.ClientTapHandlers.
+
+        * public/WebViewClient.h:
+        (WebViewClient):
+        (WebKit::WebViewClient::didHandleGestureEvent):
+        * src/WebViewImpl.cpp:
+        (WebKit::WebViewImpl::handleGestureEvent):
+        * tests/WebViewTest.cpp:
+
 2012-09-19  Robert Flack  <fla...@chromium.org>
 
         [chromium] Support high DPI scroll bar on top level web frame.

Modified: trunk/Source/WebKit/chromium/public/WebViewClient.h (129028 => 129029)


--- trunk/Source/WebKit/chromium/public/WebViewClient.h	2012-09-19 19:03:06 UTC (rev 129028)
+++ trunk/Source/WebKit/chromium/public/WebViewClient.h	2012-09-19 19:07:39 UTC (rev 129029)
@@ -142,6 +142,9 @@
     // Called to retrieve the provider of desktop notifications.
     virtual WebNotificationPresenter* notificationPresenter() { return 0; }
 
+    // Called when a gesture event is handled.
+    virtual void didHandleGestureEvent(const WebGestureEvent& event, bool eventSwallowed) { }
+
     // Called to request an icon for the specified filenames.
     // The icon is shown in a file upload control.
     virtual bool queryIconForFiles(const WebVector<WebString>& filenames, WebIconLoadingCompletion*) { return false; }

Modified: trunk/Source/WebKit/chromium/src/WebViewImpl.cpp (129028 => 129029)


--- trunk/Source/WebKit/chromium/src/WebViewImpl.cpp	2012-09-19 19:03:06 UTC (rev 129028)
+++ trunk/Source/WebKit/chromium/src/WebViewImpl.cpp	2012-09-19 19:07:39 UTC (rev 129029)
@@ -682,6 +682,7 @@
 #if ENABLE(GESTURE_EVENTS)
 bool WebViewImpl::handleGestureEvent(const WebGestureEvent& event)
 {
+    bool eventSwallowed = false;
     switch (event.type) {
     case WebInputEvent::GestureFlingStart: {
         m_client->cancelScheduledContentIntents();
@@ -692,18 +693,21 @@
         OwnPtr<PlatformGestureCurve> flingCurve = PlatformGestureCurveFactory::get()->createCurve(event.data.flingStart.sourceDevice, FloatPoint(event.data.flingStart.velocityX, event.data.flingStart.velocityY));
         m_gestureAnimation = ActivePlatformGestureAnimation::create(flingCurve.release(), this);
         scheduleAnimation();
-        return true;
+        eventSwallowed = true;
+        break;
     }
     case WebInputEvent::GestureFlingCancel:
         if (m_gestureAnimation) {
             m_gestureAnimation.clear();
-            return true;
+            eventSwallowed = true;
         }
-        return false;
+        break;
     case WebInputEvent::GestureTap: {
         m_client->cancelScheduledContentIntents();
-        if (detectContentOnTouch(WebPoint(event.x, event.y), event.type))
-            return true;
+        if (detectContentOnTouch(WebPoint(event.x, event.y), event.type)) {
+            eventSwallowed = true;
+            break;
+        }
 
         RefPtr<WebCore::PopupContainer> selectPopup;
         selectPopup = m_selectPopup;
@@ -716,12 +720,14 @@
             findGoodTouchTargets(boundingBox, mainFrameImpl()->frame(), pageScaleFactor(), goodTargets);
             // FIXME: replace touch adjustment code when numberOfGoodTargets == 1?
             // Single candidate case is currently handled by: https://bugs.webkit.org/show_bug.cgi?id=85101
-            if (goodTargets.size() >= 2 && m_client && m_client->didTapMultipleTargets(event, goodTargets))
-                return true;
+            if (goodTargets.size() >= 2 && m_client && m_client->didTapMultipleTargets(event, goodTargets)) {
+                eventSwallowed = true;
+                break;
+            }
         }
 
         PlatformGestureEventBuilder platformEvent(mainFrameImpl()->frameView(), event);
-        bool gestureHandled = mainFrameImpl()->frame()->eventHandler()->handleGestureEvent(platformEvent);
+        eventSwallowed = mainFrameImpl()->frame()->eventHandler()->handleGestureEvent(platformEvent);
 
         if (m_selectPopup && m_selectPopup == selectPopup) {
             // That tap triggered a select popup which is the same as the one that
@@ -731,23 +737,26 @@
             hideSelectPopup();
         }
 
-        return gestureHandled;
+        break;
     }
     case WebInputEvent::GestureTwoFingerTap:
     case WebInputEvent::GestureLongPress: {
         if (!mainFrameImpl() || !mainFrameImpl()->frameView())
-            return false;
+            break;
 
         m_client->cancelScheduledContentIntents();
-        if (detectContentOnTouch(WebPoint(event.x, event.y), event.type))
-            return true;
+        if (detectContentOnTouch(WebPoint(event.x, event.y), event.type)) {
+            eventSwallowed = true;
+            break;
+        }
 
         m_page->contextMenuController()->clearContextMenu();
         m_contextMenuAllowed = true;
         PlatformGestureEventBuilder platformEvent(mainFrameImpl()->frameView(), event);
-        bool handled = mainFrameImpl()->frame()->eventHandler()->sendContextMenuEventForGesture(platformEvent);
+        eventSwallowed = mainFrameImpl()->frame()->eventHandler()->sendContextMenuEventForGesture(platformEvent);
         m_contextMenuAllowed = false;
-        return handled;
+
+        break;
     }
     case WebInputEvent::GestureTapDown: {
         m_client->cancelScheduledContentIntents();
@@ -757,7 +766,8 @@
             enableTouchHighlight(IntPoint(event.x, event.y));
 #endif
         PlatformGestureEventBuilder platformEvent(mainFrameImpl()->frameView(), event);
-        return mainFrameImpl()->frame()->eventHandler()->handleGestureEvent(platformEvent);
+        eventSwallowed = mainFrameImpl()->frame()->eventHandler()->handleGestureEvent(platformEvent);
+        break;
     }
     case WebInputEvent::GestureDoubleTap:
     case WebInputEvent::GestureScrollBegin:
@@ -769,12 +779,14 @@
     case WebInputEvent::GesturePinchEnd:
     case WebInputEvent::GesturePinchUpdate: {
         PlatformGestureEventBuilder platformEvent(mainFrameImpl()->frameView(), event);
-        return mainFrameImpl()->frame()->eventHandler()->handleGestureEvent(platformEvent);
+        eventSwallowed = mainFrameImpl()->frame()->eventHandler()->handleGestureEvent(platformEvent);
+        break;
     }
     default:
         ASSERT_NOT_REACHED();
     }
-    return false;
+    m_client->didHandleGestureEvent(event, eventSwallowed);
+    return eventSwallowed;
 }
 
 void WebViewImpl::transferActiveWheelFlingAnimation(const WebActiveWheelFlingParameters& parameters)

Modified: trunk/Source/WebKit/chromium/tests/WebViewTest.cpp (129028 => 129029)


--- trunk/Source/WebKit/chromium/tests/WebViewTest.cpp	2012-09-19 19:03:06 UTC (rev 129028)
+++ trunk/Source/WebKit/chromium/tests/WebViewTest.cpp	2012-09-19 19:07:39 UTC (rev 129029)
@@ -120,6 +120,40 @@
     bool m_focused;
 };
 
+class TapHandlingWebViewClient : public WebViewClient {
+public:
+    // WebViewClient methods
+    virtual void didHandleGestureEvent(const WebGestureEvent& event, bool handled)
+    {
+        if (event.type == WebInputEvent::GestureTap) {
+            m_tapX = event.x;
+            m_tapY = event.y;
+        } else if (event.type == WebInputEvent::GestureLongPress) {
+            m_longpressX = event.x;
+            m_longpressY = event.y;
+        }
+    }
+
+    // Local methods
+    void reset()
+    {
+        m_tapX = -1;
+        m_tapY = -1;
+        m_longpressX = -1;
+        m_longpressY = -1;
+    }
+    int tapX() { return m_tapX; }
+    int tapY() { return m_tapY; }
+    int longpressX() { return m_longpressX; }
+    int longpressY() { return m_longpressY; }
+
+private:
+    int m_tapX;
+    int m_tapY;
+    int m_longpressX;
+    int m_longpressY;
+};
+
 class WebViewTest : public testing::Test {
 public:
     WebViewTest()
@@ -589,4 +623,28 @@
     webView->close();
 }
 
+TEST_F(WebViewTest, ClientTapHandling)
+{
+    TapHandlingWebViewClient client;
+    client.reset();
+    WebView* webView = FrameTestHelpers::createWebViewAndLoad("about:blank", true, 0, &client);
+    WebGestureEvent event;
+    event.type = WebInputEvent::GestureTap;
+    event.x = 3;
+    event.y = 8;
+    webView->handleInputEvent(event);
+    webkit_support::RunAllPendingMessages();
+    EXPECT_EQ(3, client.tapX());
+    EXPECT_EQ(8, client.tapY());
+    client.reset();
+    event.type = WebInputEvent::GestureLongPress;
+    event.x = 25;
+    event.y = 7;
+    webView->handleInputEvent(event);
+    webkit_support::RunAllPendingMessages();
+    EXPECT_EQ(25, client.longpressX());
+    EXPECT_EQ(7, client.longpressY());
+    webView->close();
 }
+
+}
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to