Index: content/browser/web_contents/web_contents_impl.cc |
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc |
index 88f58a782fd7544ae316343b06dc0b6dd50546c2..1ea9beb206bf623936fd6391462b9c5cfa4d22fa 100644 |
--- a/content/browser/web_contents/web_contents_impl.cc |
+++ b/content/browser/web_contents/web_contents_impl.cc |
@@ -6,6 +6,7 @@ |
#include <stddef.h> |
+#include <cmath> |
#include <utility> |
#include "base/command_line.h" |
@@ -396,6 +397,7 @@ WebContentsImpl::WebContentsImpl(BrowserContext* browser_context) |
closed_by_user_gesture_(false), |
minimum_zoom_percent_(static_cast<int>(kMinimumZoomFactor * 100)), |
maximum_zoom_percent_(static_cast<int>(kMaximumZoomFactor * 100)), |
+ zoom_scroll_remainder_(0), |
render_view_message_source_(NULL), |
render_frame_message_source_(NULL), |
fullscreen_widget_routing_id_(MSG_ROUTING_NONE), |
@@ -1587,7 +1589,14 @@ bool WebContentsImpl::HandleWheelEvent( |
if (delegate_ && event.wheelTicksY && |
(event.modifiers & blink::WebInputEvent::ControlKey) && |
!event.canScroll) { |
- delegate_->ContentsZoomChange(event.wheelTicksY > 0); |
+ // Count only integer cumulative scrolls as zoom events; this handles |
+ // smooth scroll and regular scroll device behavior. |
+ zoom_scroll_remainder_ += event.wheelTicksY; |
+ int whole_zoom_scroll_remainder_ = std::lround(zoom_scroll_remainder_); |
+ zoom_scroll_remainder_ -= whole_zoom_scroll_remainder_; |
+ if (whole_zoom_scroll_remainder_ != 0) { |
+ delegate_->ContentsZoomChange(whole_zoom_scroll_remainder_ > 0); |
+ } |
return true; |
} |
#endif |