Index: content/browser/web_contents/web_contents_impl_unittest.cc |
diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc |
index 0c8f70cb4942f2ddb6476a97f874e3e6003905b0..a6a66bbdf77c2a0634a30c6975e56ff88ea398e4 100644 |
--- a/content/browser/web_contents/web_contents_impl_unittest.cc |
+++ b/content/browser/web_contents/web_contents_impl_unittest.cc |
@@ -2430,4 +2430,54 @@ TEST_F(WebContentsImplTest, HandleWheelEvent) { |
contents()->SetDelegate(NULL); |
} |
+// Tests that trackpad GesturePinchUpdate events get turned into browser zoom. |
+TEST_F(WebContentsImplTest, HandleGestureEvent) { |
+ using blink::WebGestureEvent; |
+ using blink::WebInputEvent; |
+ |
+ scoped_ptr<ContentsZoomChangedDelegate> delegate( |
+ new ContentsZoomChangedDelegate()); |
+ contents()->SetDelegate(delegate.get()); |
+ |
+ const float kZoomStepValue = 0.6f; |
+ blink::WebGestureEvent event = SyntheticWebGestureEventBuilder::Build( |
+ WebInputEvent::GesturePinchUpdate, WebGestureEvent::Touchpad); |
+ |
+ // A pinch less than the step value doesn't change the zoom level. |
+ event.data.pinchUpdate.scale = kZoomStepValue * 0.8f; |
+ EXPECT_TRUE(contents()->HandleGestureEvent(event)); |
+ EXPECT_EQ(0, delegate->GetAndResetContentsZoomChangedCallCount()); |
+ |
+ // But repeating the event so the combined scale is greater does. |
+ EXPECT_TRUE(contents()->HandleGestureEvent(event)); |
+ EXPECT_EQ(1, delegate->GetAndResetContentsZoomChangedCallCount()); |
+ EXPECT_TRUE(delegate->last_zoom_in()); |
+ |
+ // Pinching back out one step goes back to 100%. |
+ event.data.pinchUpdate.scale = -kZoomStepValue; |
+ EXPECT_TRUE(contents()->HandleGestureEvent(event)); |
+ EXPECT_EQ(1, delegate->GetAndResetContentsZoomChangedCallCount()); |
+ EXPECT_FALSE(delegate->last_zoom_in()); |
+ |
+ // Pinching out again doesn't zoom (step is twice as large around 100%). |
+ EXPECT_TRUE(contents()->HandleGestureEvent(event)); |
+ EXPECT_EQ(0, delegate->GetAndResetContentsZoomChangedCallCount()); |
+ |
+ // And again now it zooms once per step. |
+ EXPECT_TRUE(contents()->HandleGestureEvent(event)); |
+ EXPECT_EQ(1, delegate->GetAndResetContentsZoomChangedCallCount()); |
+ EXPECT_FALSE(delegate->last_zoom_in()); |
+ |
+ // No other type of gesture event is handled by WebContentsImpl (for example |
+ // a touchscreen pinch gesture). |
+ event = SyntheticWebGestureEventBuilder::Build( |
+ WebInputEvent::GesturePinchUpdate, WebGestureEvent::Touchscreen); |
+ event.data.pinchUpdate.scale = kZoomStepValue * 3; |
+ EXPECT_FALSE(contents()->HandleGestureEvent(event)); |
+ EXPECT_EQ(0, delegate->GetAndResetContentsZoomChangedCallCount()); |
+ |
+ // Ensure pointers to the delegate aren't kept beyond it's lifetime. |
+ contents()->SetDelegate(NULL); |
+} |
+ |
} // namespace content |