Index: content/browser/renderer_host/render_widget_host_view_mac.mm |
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm |
index ccb1ecfe7b477cbb8c26063724def0a10130e70c..984c66b645157d1f5e44367010e804ef9cd2c248 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm |
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm |
@@ -553,6 +553,7 @@ RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget, |
can_compose_inline_(true), |
browser_compositor_state_(BrowserCompositorDestroyed), |
browser_compositor_placeholder_(new BrowserCompositorMacPlaceholder), |
+ page_at_minimum_scale_(true), |
is_loading_(false), |
allow_pause_for_resize_or_repaint_(true), |
is_guest_view_hack_(is_guest_view_hack), |
@@ -1470,6 +1471,10 @@ void RenderWidgetHostViewMac::OnSwapCompositorFrame( |
TRACE_EVENT0("browser", "RenderWidgetHostViewMac::OnSwapCompositorFrame"); |
last_scroll_offset_ = frame->metadata.root_scroll_offset; |
+ |
+ page_at_minimum_scale_ = frame->metadata.page_scale_factor == |
+ frame->metadata.min_page_scale_factor; |
+ |
if (frame->delegated_frame_data) { |
float scale_factor = frame->metadata.device_scale_factor; |
@@ -1750,7 +1755,7 @@ void RenderWidgetHostViewMac::OnDisplayMetricsChanged( |
canBeKeyView_ = YES; |
opaque_ = YES; |
focusedPluginIdentifier_ = -1; |
- lastUsedPinchEventTimestamp_ = 0; |
+ pinchHasReachedZoomThreshold_ = false; |
// OpenGL support: |
if ([self respondsToSelector: |
@@ -2282,7 +2287,13 @@ void RenderWidgetHostViewMac::OnDisplayMetricsChanged( |
[responderDelegate_ beginGestureWithEvent:event]; |
gestureBeginEvent_.reset( |
new WebGestureEvent(WebInputEventFactory::gestureEvent(event, self))); |
- unusedPinchAmount_ = 0; |
+ |
+ // If the page is at the minimum zoom level, require a threshold be reached |
+ // before the pinch has an effect. |
+ if (renderWidgetHostView_->page_at_minimum_scale_) { |
+ pinchHasReachedZoomThreshold_ = false; |
+ pinchUnusedAmount_ = 1; |
+ } |
} |
- (void)endGestureWithEvent:(NSEvent*)event { |
@@ -2297,7 +2308,6 @@ void RenderWidgetHostViewMac::OnDisplayMetricsChanged( |
endEvent.type = WebInputEvent::GesturePinchEnd; |
renderWidgetHostView_->render_widget_host_->ForwardGestureEvent(endEvent); |
gestureBeginPinchSent_ = NO; |
- lastUsedPinchEventTimestamp_ = [event timestamp]; |
} |
} |
@@ -2410,22 +2420,14 @@ void RenderWidgetHostViewMac::OnDisplayMetricsChanged( |
if (!gestureBeginEvent_) |
return; |
+ if (!pinchHasReachedZoomThreshold_) { |
+ pinchUnusedAmount_ *= (1 + [event magnification]); |
+ if (pinchUnusedAmount_ < 0.667 || pinchUnusedAmount_ > 1.5) |
+ pinchHasReachedZoomThreshold_ = true; |
+ } |
+ |
// Send a GesturePinchBegin event if none has been sent yet. |
if (!gestureBeginPinchSent_) { |
- // If less than 1 second has passed since an intentional pinch zoom |
- // was done, don't threshold zooms, because subsequent zooms are likely |
- // intentional. |
- const NSTimeInterval kSecondsUntilZoomThresholdReEnabled = 1; |
- if ([event timestamp] - lastUsedPinchEventTimestamp_ > |
- kSecondsUntilZoomThresholdReEnabled) { |
- // Require that a 40% zoom be hit before actually zooming the page, |
- // to avoid accidental zooms. |
- // http://crbug.com/478981 |
- unusedPinchAmount_ += [event magnification]; |
- if (unusedPinchAmount_ > -0.4 && unusedPinchAmount_ < 0.4) |
- return; |
- } |
- |
WebGestureEvent beginEvent(*gestureBeginEvent_); |
beginEvent.type = WebInputEvent::GesturePinchBegin; |
renderWidgetHostView_->render_widget_host_->ForwardGestureEvent(beginEvent); |
@@ -2433,8 +2435,9 @@ void RenderWidgetHostViewMac::OnDisplayMetricsChanged( |
} |
// Send a GesturePinchUpdate event. |
- const WebGestureEvent& updateEvent = |
+ WebGestureEvent updateEvent = |
WebInputEventFactory::gestureEvent(event, self); |
+ updateEvent.data.pinchUpdate.zoomDisabled = !pinchHasReachedZoomThreshold_; |
renderWidgetHostView_->render_widget_host_->ForwardGestureEvent(updateEvent); |
} |