Index: Source/WebKit/chromium/src/WebViewImpl.cpp |
=================================================================== |
--- Source/WebKit/chromium/src/WebViewImpl.cpp (revision 143774) |
+++ Source/WebKit/chromium/src/WebViewImpl.cpp (working copy) |
@@ -697,6 +697,42 @@ |
bool eventSwallowed = false; |
bool eventCancelled = false; // for disambiguation |
+ // Special handling for slow-path fling gestures, which have no PlatformGestureEvent equivalent. |
+ switch (event.type) { |
+ case WebInputEvent::GestureFlingStart: { |
+ if (mainFrameImpl()->frame()->eventHandler()->isScrollbarHandlingGestures()) { |
+ m_client->didHandleGestureEvent(event, eventCancelled); |
+ return eventSwallowed; |
+ } |
+ m_client->cancelScheduledContentIntents(); |
+ m_positionOnFlingStart = WebPoint(event.x / pageScaleFactor(), event.y / pageScaleFactor()); |
+ m_globalPositionOnFlingStart = WebPoint(event.globalX, event.globalY); |
+ m_flingModifier = event.modifiers; |
+ m_flingSourceDevice = event.sourceDevice; |
+ OwnPtr<WebGestureCurve> flingCurve = adoptPtr(Platform::current()->createFlingAnimationCurve(event.sourceDevice, WebFloatPoint(event.data.flingStart.velocityX, event.data.flingStart.velocityY), WebSize())); |
+ m_gestureAnimation = WebActiveGestureAnimation::createAtAnimationStart(flingCurve.release(), this); |
+ scheduleAnimation(); |
+ eventSwallowed = true; |
+ |
+ m_client->didHandleGestureEvent(event, eventCancelled); |
+ return eventSwallowed; |
+ } |
+ case WebInputEvent::GestureFlingCancel: |
+ if (m_gestureAnimation) { |
+ m_gestureAnimation.clear(); |
+ if (m_layerTreeView) |
+ m_layerTreeView->didStopFlinging(); |
+ eventSwallowed = true; |
+ } |
+ |
+ m_client->didHandleGestureEvent(event, eventCancelled); |
+ return eventSwallowed; |
+ default: |
+ break; |
+ } |
+ |
+ PlatformGestureEventBuilder platformEvent(mainFrameImpl()->frameView(), event); |
+ |
// Handle link highlighting outside the main switch to avoid getting lost in the |
// complicated set of cases handled below. |
switch (event.type) { |
@@ -704,7 +740,7 @@ |
// Queue a highlight animation, then hand off to regular handler. |
#if OS(LINUX) |
if (settingsImpl()->gestureTapHighlightEnabled()) |
- enableTouchHighlight(event); |
+ enableTapHighlight(platformEvent); |
#endif |
break; |
case WebInputEvent::GestureTapCancel: |
@@ -718,31 +754,9 @@ |
} |
switch (event.type) { |
- case WebInputEvent::GestureFlingStart: { |
- if (mainFrameImpl()->frame()->eventHandler()->isScrollbarHandlingGestures()) |
- break; |
- m_client->cancelScheduledContentIntents(); |
- m_positionOnFlingStart = WebPoint(event.x, event.y); |
- m_globalPositionOnFlingStart = WebPoint(event.globalX, event.globalY); |
- m_flingModifier = event.modifiers; |
- m_flingSourceDevice = event.sourceDevice; |
- OwnPtr<WebGestureCurve> flingCurve = adoptPtr(Platform::current()->createFlingAnimationCurve(event.sourceDevice, WebFloatPoint(event.data.flingStart.velocityX, event.data.flingStart.velocityY), WebSize())); |
- m_gestureAnimation = WebActiveGestureAnimation::createAtAnimationStart(flingCurve.release(), this); |
- scheduleAnimation(); |
- eventSwallowed = true; |
- break; |
- } |
- case WebInputEvent::GestureFlingCancel: |
- if (m_gestureAnimation) { |
- m_gestureAnimation.clear(); |
- if (m_layerTreeView) |
- m_layerTreeView->didStopFlinging(); |
- eventSwallowed = true; |
- } |
- break; |
case WebInputEvent::GestureTap: { |
m_client->cancelScheduledContentIntents(); |
- if (detectContentOnTouch(WebPoint(event.x, event.y))) { |
+ if (detectContentOnTouch(platformEvent.position())) { |
eventSwallowed = true; |
break; |
} |
@@ -757,7 +771,7 @@ |
if (event.data.tap.width > 0 && !shouldDisableDesktopWorkarounds()) { |
// FIXME: didTapMultipleTargets should just take a rect instead of |
// an event. |
- WebGestureEvent scaledEvent; |
+ WebGestureEvent scaledEvent = event; |
scaledEvent.x = event.x / pageScaleFactor(); |
scaledEvent.y = event.y / pageScaleFactor(); |
scaledEvent.data.tap.width = event.data.tap.width / pageScaleFactor(); |
@@ -774,7 +788,6 @@ |
} |
} |
- PlatformGestureEventBuilder platformEvent(mainFrameImpl()->frameView(), event); |
eventSwallowed = mainFrameImpl()->frame()->eventHandler()->handleGestureEvent(platformEvent); |
if (m_selectPopup && m_selectPopup == selectPopup) { |
@@ -796,7 +809,6 @@ |
m_client->cancelScheduledContentIntents(); |
m_page->contextMenuController()->clearContextMenu(); |
m_contextMenuAllowed = true; |
- PlatformGestureEventBuilder platformEvent(mainFrameImpl()->frameView(), event); |
eventSwallowed = mainFrameImpl()->frame()->eventHandler()->handleGestureEvent(platformEvent); |
m_contextMenuAllowed = false; |
@@ -804,14 +816,13 @@ |
} |
case WebInputEvent::GestureTapDown: { |
m_client->cancelScheduledContentIntents(); |
- PlatformGestureEventBuilder platformEvent(mainFrameImpl()->frameView(), event); |
eventSwallowed = mainFrameImpl()->frame()->eventHandler()->handleGestureEvent(platformEvent); |
break; |
} |
case WebInputEvent::GestureDoubleTap: |
if (m_webSettings->doubleTapToZoomEnabled() && m_minimumPageScaleFactor != m_maximumPageScaleFactor) { |
m_client->cancelScheduledContentIntents(); |
- animateZoomAroundPoint(WebPoint(event.x, event.y), DoubleTap); |
+ animateZoomAroundPoint(platformEvent.position(), DoubleTap); |
eventSwallowed = true; |
break; |
} |
@@ -824,7 +835,6 @@ |
case WebInputEvent::GestureTapCancel: |
case WebInputEvent::GesturePinchEnd: |
case WebInputEvent::GesturePinchUpdate: { |
- PlatformGestureEventBuilder platformEvent(mainFrameImpl()->frameView(), event); |
eventSwallowed = mainFrameImpl()->frame()->eventHandler()->handleGestureEvent(platformEvent); |
break; |
} |
@@ -1271,17 +1281,16 @@ |
|| (cursor == CURSOR_AUTO && frame->eventHandler()->useHandCursor(node, node->isLink(), shiftKey)); |
} |
-Node* WebViewImpl::bestTouchLinkNode(const WebGestureEvent& touchEvent) |
+Node* WebViewImpl::bestTapNode(const PlatformGestureEvent& tapEvent) |
{ |
if (!m_page || !m_page->mainFrame()) |
return 0; |
Node* bestTouchNode = 0; |
- IntSize touchEventSearchRegionSize(touchEvent.data.tapDown.width / 2, touchEvent.data.tapDown.height / 2); |
- IntPoint touchEventLocation(touchEvent.x, touchEvent.y); |
+ IntPoint touchEventLocation(tapEvent.position()); |
#if ENABLE(TOUCH_ADJUSTMENT) |
- m_page->mainFrame()->eventHandler()->adjustGesturePosition(PlatformGestureEventBuilder(mainFrameImpl()->frameView(), touchEvent), touchEventLocation); |
+ m_page->mainFrame()->eventHandler()->adjustGesturePosition(tapEvent, touchEventLocation); |
#endif |
IntPoint hitTestPoint = m_page->mainFrame()->view()->windowToContents(touchEventLocation); |
@@ -1291,23 +1300,22 @@ |
// Make sure our highlight candidate uses a hand cursor as a heuristic to |
// choose appropriate targets. |
- bool shiftKey = touchEvent.modifiers & WebGestureEvent::ShiftKey; |
- while (bestTouchNode && !invokesHandCursor(bestTouchNode, shiftKey, m_page->mainFrame())) |
+ while (bestTouchNode && !invokesHandCursor(bestTouchNode, false, m_page->mainFrame())) |
bestTouchNode = bestTouchNode->parentNode(); |
// We should pick the largest enclosing node with hand cursor set. |
- while (bestTouchNode && bestTouchNode->parentNode() && invokesHandCursor(bestTouchNode->parentNode(), shiftKey, m_page->mainFrame())) |
+ while (bestTouchNode && bestTouchNode->parentNode() && invokesHandCursor(bestTouchNode->parentNode(), false, m_page->mainFrame())) |
bestTouchNode = bestTouchNode->parentNode(); |
return bestTouchNode; |
} |
-void WebViewImpl::enableTouchHighlight(const WebGestureEvent& touchEvent) |
+void WebViewImpl::enableTapHighlight(const PlatformGestureEvent& tapEvent) |
{ |
// Always clear any existing highlight when this is invoked, even if we don't get a new target to highlight. |
m_linkHighlight.clear(); |
- Node* touchNode = bestTouchLinkNode(touchEvent); |
+ Node* touchNode = bestTapNode(tapEvent); |
if (!touchNode || !touchNode->renderer() || !touchNode->renderer()->enclosingLayer()) |
return; |