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();
}
+
+}