Index: Source/web/tests/WebFrameTest.cpp |
diff --git a/Source/web/tests/WebFrameTest.cpp b/Source/web/tests/WebFrameTest.cpp |
index 0794f7e863ab829b42401fb75e16123d1bd4272b..b6413d10d32c0a9bab95477338ef1f4187243634 100644 |
--- a/Source/web/tests/WebFrameTest.cpp |
+++ b/Source/web/tests/WebFrameTest.cpp |
@@ -49,8 +49,10 @@ |
#include "core/editing/VisiblePosition.h" |
#include "core/events/MouseEvent.h" |
#include "core/fetch/MemoryCache.h" |
+#include "core/frame/FrameHost.h" |
#include "core/frame/FrameView.h" |
#include "core/frame/LocalFrame.h" |
+#include "core/frame/PinchViewport.h" |
#include "core/frame/Settings.h" |
#include "core/html/HTMLDocument.h" |
#include "core/html/HTMLFormElement.h" |
@@ -116,11 +118,25 @@ using namespace blink; |
const int touchPointPadding = 32; |
-#define EXPECT_EQ_RECT(a, b) \ |
- EXPECT_EQ(a.x(), b.x()); \ |
- EXPECT_EQ(a.y(), b.y()); \ |
- EXPECT_EQ(a.width(), b.width()); \ |
- EXPECT_EQ(a.height(), b.height()); |
+#define EXPECT_RECT_EQ(a, b) \ |
+ do { \ |
+ EXPECT_EQ(a.x(), b.x()); \ |
+ EXPECT_EQ(a.y(), b.y()); \ |
+ EXPECT_EQ(a.width(), b.width()); \ |
+ EXPECT_EQ(a.height(), b.height()); \ |
+ } while (false) |
+ |
+#define EXPECT_POINT_EQ(expected, actual) \ |
+ do { \ |
+ EXPECT_EQ((expected).x(), (actual).x()); \ |
+ EXPECT_EQ((expected).y(), (actual).y()); \ |
+ } while (false) |
+ |
+#define EXPECT_FLOAT_POINT_EQ(expected, actual) \ |
+ do { \ |
+ EXPECT_FLOAT_EQ((expected).x(), (actual).x()); \ |
+ EXPECT_FLOAT_EQ((expected).y(), (actual).y()); \ |
+ } while (false) |
class FakeCompositingWebViewClient : public FrameTestHelpers::TestWebViewClient { |
public: |
@@ -2197,7 +2213,7 @@ TEST_F(WebFrameTest, pageScaleFactorScalesPaintClip) |
GraphicsContext context(&canvas); |
context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque); |
- EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), context.opaqueRegion().asRect()); |
+ EXPECT_RECT_EQ(IntRect(0, 0, 0, 0), context.opaqueRegion().asRect()); |
FrameView* view = webViewHelper.webViewImpl()->mainFrameImpl()->frameView(); |
IntRect paintRect(0, 0, 200, 200); |
@@ -2211,7 +2227,7 @@ TEST_F(WebFrameTest, pageScaleFactorScalesPaintClip) |
int viewportWidthMinusScrollbar = 50 - (view->verticalScrollbar()->isOverlayScrollbar() ? 0 : 15); |
int viewportHeightMinusScrollbar = 50 - (view->horizontalScrollbar()->isOverlayScrollbar() ? 0 : 15); |
IntRect clippedRect(0, 0, viewportWidthMinusScrollbar * 2, viewportHeightMinusScrollbar * 2); |
- EXPECT_EQ_RECT(clippedRect, context.opaqueRegion().asRect()); |
+ EXPECT_RECT_EQ(clippedRect, context.opaqueRegion().asRect()); |
#endif |
} |
@@ -4131,7 +4147,7 @@ TEST_F(WebFrameTest, CompositedSelectionBoundsCleared) |
class DisambiguationPopupTestWebViewClient : public FrameTestHelpers::TestWebViewClient { |
public: |
- virtual bool didTapMultipleTargets(const WebGestureEvent&, const WebVector<WebRect>& targetRects) OVERRIDE |
+ virtual bool didTapMultipleTargets(const WebSize&, const WebRect&, const WebVector<WebRect>& targetRects) OVERRIDE |
{ |
EXPECT_GE(targetRects.size(), 2u); |
m_triggered = true; |
@@ -4289,6 +4305,57 @@ TEST_F(WebFrameTest, DisambiguationPopupViewportSite) |
} |
} |
+static void enableVirtualViewport(WebSettings* settings) |
+{ |
+ settings->setPinchVirtualViewportEnabled(true); |
+ settings->setViewportEnabled(true); |
+ settings->setViewportMetaEnabled(true); |
+ settings->setShrinksViewportContentToFit(true); |
+} |
+ |
+TEST_F(WebFrameTest, DisambiguationPopupPinchViewport) |
+{ |
+ const std::string htmlFile = "disambiguation_popup_200_by_800.html"; |
+ registerMockedHttpURLLoad(htmlFile); |
+ |
+ DisambiguationPopupTestWebViewClient client; |
+ |
+ FrameTestHelpers::WebViewHelper webViewHelper; |
+ webViewHelper.initializeAndLoad(m_baseURL + htmlFile, true, 0, &client, enableVirtualViewport); |
+ |
+ WebViewImpl* webViewImpl = webViewHelper.webViewImpl(); |
+ ASSERT_TRUE(webViewImpl); |
+ LocalFrame* frame = webViewImpl->mainFrameImpl()->frame(); |
+ ASSERT_TRUE(frame); |
+ |
+ webViewHelper.webView()->resize(WebSize(200, 400)); |
+ |
+ // Scroll main frame to the bottom of the document |
+ webViewImpl->setMainFrameScrollOffset(WebPoint(0, 400)); |
+ EXPECT_POINT_EQ(IntPoint(0, 400), frame->view()->scrollPosition()); |
+ |
+ webViewImpl->setPageScaleFactor(2.0); |
+ |
+ // Scroll pinch viewport to the top of the main frame. |
+ PinchViewport& pinchViewport = frame->page()->frameHost().pinchViewport(); |
+ pinchViewport.setLocation(FloatPoint(0, 0)); |
+ EXPECT_FLOAT_POINT_EQ(FloatPoint(0, 0), pinchViewport.location()); |
+ |
+ // Tap at the top: there is nothing there. |
+ client.resetTriggered(); |
+ webViewHelper.webView()->handleInputEvent(fatTap(10, 60)); |
+ EXPECT_FALSE(client.triggered()); |
+ |
+ // Scroll pinch viewport to the bottom of the main frame. |
+ pinchViewport.setLocation(FloatPoint(0, 200)); |
+ EXPECT_FLOAT_POINT_EQ(FloatPoint(0, 200), pinchViewport.location()); |
+ |
+ // Now the tap with the same coordinates should hit two elements. |
+ client.resetTriggered(); |
+ webViewHelper.webView()->handleInputEvent(fatTap(10, 60)); |
+ EXPECT_TRUE(client.triggered()); |
+} |
+ |
TEST_F(WebFrameTest, DisambiguationPopupBlacklist) |
{ |
const unsigned viewportWidth = 500; |
@@ -5721,9 +5788,9 @@ TEST_F(WebFrameTest, FrameViewSetFrameRect) |
FrameView* frameView = webViewHelper.webViewImpl()->mainFrameImpl()->frameView(); |
frameView->setFrameRect(IntRect(0, 0, 200, 200)); |
- EXPECT_EQ_RECT(IntRect(0, 0, 200, 200), frameView->frameRect()); |
+ EXPECT_RECT_EQ(IntRect(0, 0, 200, 200), frameView->frameRect()); |
frameView->setFrameRect(IntRect(100, 100, 200, 200)); |
- EXPECT_EQ_RECT(IntRect(100, 100, 200, 200), frameView->frameRect()); |
+ EXPECT_RECT_EQ(IntRect(100, 100, 200, 200), frameView->frameRect()); |
} |
TEST_F(WebFrameTest, FullscreenLayerNonScrollable) |