[chromium] Scroll deltas should be floats https://bugs.webkit.org/show_bug.cgi?id=111465 Reviewed by James Robinson. This converts the remaining scroll delta fields to floats so that we no longer lose precision due to DIP conversion. The natural type for deltas is WebFloatSize, which was missing, so I also created that type based on the existing WebSize header. Source/Platform: * Platform.gypi: * chromium/public/WebFloatSize.h: Added. (WebKit): (WebFloatSize): (WebKit::WebFloatSize::isEmpty): (WebKit::WebFloatSize::WebFloatSize): (WebKit::WebFloatSize::operator=): (WebKit::WebFloatSize::operator WebCore::FloatSize): (WebKit::WebFloatSize::operator gfx::SizeF): (WebKit::WebFloatSize::operator gfx::Vector2dF): (WebKit::operator==): (WebKit::operator!=): * chromium/public/WebGestureCurveTarget.h: (WebKit::WebGestureCurveTarget::scrollBy): (WebGestureCurveTarget): * chromium/public/WebInputHandlerClient.h: (WebKit::WebInputHandlerClient::scrollByIfPossible): (WebInputHandlerClient): Source/WebKit/chromium: * src/WebCompositorInputHandlerImpl.cpp: (WebKit::WebCompositorInputHandlerImpl::handleInputEventInternal): (WebKit::WebCompositorInputHandlerImpl::touchpadFlingScroll): (WebKit::WebCompositorInputHandlerImpl::scrollBy): * src/WebCompositorInputHandlerImpl.h: (WebCompositorInputHandlerImpl): * src/WebViewImpl.cpp: (WebKit::WebViewImpl::scrollBy): * src/WebViewImpl.h: (WebViewImpl): * tests/WebCompositorInputHandlerImplTest.cpp: (MockWebInputHandlerClient): (WebKit::TEST_F): git-svn-id: https://svn.webkit.org/repository/webkit/trunk/Source/Platform/chromium/public@144856 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebFloatSize.h b/WebFloatSize.h new file mode 100644 index 0000000..5de9495 --- /dev/null +++ b/WebFloatSize.h
@@ -0,0 +1,133 @@ +/* + * Copyright (C) 2013 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef WebFloatSize_h +#define WebFloatSize_h + +#include "WebCommon.h" + +#if WEBKIT_IMPLEMENTATION +#include "FloatSize.h" +#else +#include <cmath> +#include <ui/gfx/size_f.h> +#include <ui/gfx/vector2d_f.h> +#endif + +namespace WebKit { + +struct WebFloatSize { + float width; + float height; + + bool isEmpty() const { return width <= 0 || height <= 0; } + + WebFloatSize() + : width(0) + , height(0) + { + } + + WebFloatSize(float width, float height) + : width(width) + , height(height) + { + } + +#if WEBKIT_IMPLEMENTATION + WebFloatSize(const WebCore::FloatSize& s) + : width(s.width()) + , height(s.height()) + { + } + + WebFloatSize& operator=(const WebCore::FloatSize& s) + { + width = s.width(); + height = s.height(); + return *this; + } + + operator WebCore::FloatSize() const + { + return WebCore::FloatSize(width, height); + } +#else + WebFloatSize(const gfx::SizeF& s) + : width(s.width()) + , height(s.height()) + { + } + + WebFloatSize(const gfx::Vector2dF& v) + : width(v.x()) + , height(v.y()) + { + } + + WebFloatSize& operator=(const gfx::SizeF& s) + { + width = s.width(); + height = s.height(); + return *this; + } + + WebFloatSize& operator=(const gfx::Vector2dF& v) + { + width = v.x(); + height = v.y(); + return *this; + } + + operator gfx::SizeF() const + { + return gfx::SizeF(std::max(0.f, width), std::max(0.f, height)); + } + + operator gfx::Vector2dF() const + { + return gfx::Vector2dF(width, height); + } +#endif +}; + +inline bool operator==(const WebFloatSize& a, const WebFloatSize& b) +{ + return a.width == b.width && a.height == b.height; +} + +inline bool operator!=(const WebFloatSize& a, const WebFloatSize& b) +{ + return !(a == b); +} + +} // namespace WebKit + +#endif
diff --git a/WebGestureCurveTarget.h b/WebGestureCurveTarget.h index a44bfbf..cfc2a82 100644 --- a/WebGestureCurveTarget.h +++ b/WebGestureCurveTarget.h
@@ -25,13 +25,17 @@ #ifndef WebGestureCurveTarget_h #define WebGestureCurveTarget_h -namespace WebKit { +#include "WebFloatSize.h" +#include "WebPoint.h" -struct WebPoint; +namespace WebKit { class WebGestureCurveTarget { public: - virtual void scrollBy(const WebPoint&) = 0; + virtual void scrollBy(const WebFloatSize& delta) { scrollBy(WebPoint(delta.width, delta.height)); } + + // TODO(aelias): Delete this after WebKit roll. + virtual void scrollBy(const WebPoint& delta) { scrollBy(WebFloatSize(delta.x, delta.y)); } protected: virtual ~WebGestureCurveTarget() { }
diff --git a/WebInputHandlerClient.h b/WebInputHandlerClient.h index baecfbd..026ba0a 100644 --- a/WebInputHandlerClient.h +++ b/WebInputHandlerClient.h
@@ -25,6 +25,7 @@ #define WebInputHandlerClient_h #include "WebCommon.h" +#include "WebFloatSize.h" #include "WebPoint.h" #include "WebSize.h" @@ -55,7 +56,10 @@ // ancestor layer that can be scrolled will be moved instead. If there is no // such layer to be moved, this returns false. Returns true otherwise. // Should only be called if scrollBegin() returned ScrollStarted. - virtual bool scrollByIfPossible(WebPoint, WebSize) = 0; + virtual bool scrollByIfPossible(WebPoint origin, WebFloatSize delta) { return scrollByIfPossible(origin, WebSize(delta.width, delta.height)); } + + // TODO(aelias): Delete this after WebKit roll. + virtual bool scrollByIfPossible(WebPoint origin, WebSize delta) { return scrollByIfPossible(origin, WebFloatSize(delta.width, delta.height)); } // Stop scrolling the selected layer. Should only be called if scrollBegin() // returned ScrollStarted.