| Index: third_party/WebKit/Source/web/tests/TouchActionTest.cpp
|
| diff --git a/third_party/WebKit/Source/web/tests/TouchActionTest.cpp b/third_party/WebKit/Source/web/tests/TouchActionTest.cpp
|
| index 0719ecfc8e63b13f4943daef33e5a39016211ef9..82992c1011eda68cb328a34d59b05ed93821b4a4 100644
|
| --- a/third_party/WebKit/Source/web/tests/TouchActionTest.cpp
|
| +++ b/third_party/WebKit/Source/web/tests/TouchActionTest.cpp
|
| @@ -38,6 +38,7 @@
|
| #include "core/dom/shadow/ShadowRoot.h"
|
| #include "core/frame/FrameView.h"
|
| #include "core/frame/LocalFrame.h"
|
| +#include "core/html/HTMLIFrameElement.h"
|
| #include "core/input/EventHandler.h"
|
| #include "core/layout/HitTestResult.h"
|
| #include "core/layout/LayoutTreeAsText.h"
|
| @@ -54,6 +55,7 @@
|
| #include "public/web/WebViewClient.h"
|
| #include "public/web/WebWidgetClient.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| +#include "web/WebFrameImplBase.h"
|
| #include "web/WebViewImpl.h"
|
| #include "web/tests/FrameTestHelpers.h"
|
|
|
| @@ -118,6 +120,7 @@ public:
|
| protected:
|
| void runTouchActionTest(std::string file);
|
| void runShadowDOMTest(std::string file);
|
| + void runIFrameTest(std::string file);
|
| void sendTouchEvent(WebView*, WebInputEvent::Type, IntPoint clientPoint);
|
| WebView* setupTest(std::string file, TouchActionTrackingWebViewClient&);
|
| void runTestOnTree(ContainerNode* root, WebView*, TouchActionTrackingWebViewClient&);
|
| @@ -173,6 +176,23 @@ void TouchActionTest::runShadowDOMTest(std::string file)
|
| m_webViewHelper.reset(); // Explicitly reset to break dependency on locally scoped client.
|
| }
|
|
|
| +void TouchActionTest::runIFrameTest(std::string file)
|
| +{
|
| + TouchActionTrackingWebViewClient client;
|
| +
|
| + WebView* webView = setupTest(file, client);
|
| + WebFrame* curFrame = webView->mainFrame()->firstChild();
|
| + ASSERT_TRUE(curFrame);
|
| +
|
| + for (; curFrame; curFrame = curFrame->nextSibling()) {
|
| + // Oilpan: see runTouchActionTest() comment why these are persistent references.
|
| + RefPtrWillBePersistent<Document> contentDoc = static_cast<PassRefPtrWillBeRawPtr<Document>>(curFrame->document());
|
| + runTestOnTree(contentDoc.get(), webView, client);
|
| + }
|
| +
|
| + m_webViewHelper.reset(); // Explicitly reset to break dependency on locally scoped client.
|
| +}
|
| +
|
| WebView* TouchActionTest::setupTest(std::string file, TouchActionTrackingWebViewClient& client)
|
| {
|
| URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL), WebString::fromUTF8(file));
|
| @@ -224,33 +244,35 @@ void TouchActionTest::runTestOnTree(ContainerNode* root, WebView* webView, Touch
|
| FloatRect clientFloatRect = FloatRect(r->left(), r->top(), r->width(), r->height());
|
| IntRect clientRect = enclosedIntRect(clientFloatRect);
|
| for (int locIdx = 0; locIdx < 3; locIdx++) {
|
| - IntPoint clientPoint;
|
| + IntPoint framePoint;
|
| std::stringstream contextStream;
|
| contextStream << failureContext << " (";
|
| switch (locIdx) {
|
| case 0:
|
| - clientPoint = clientRect.center();
|
| + framePoint = clientRect.center();
|
| contextStream << "center";
|
| break;
|
| case 1:
|
| - clientPoint = clientRect.location();
|
| + framePoint = clientRect.location();
|
| contextStream << "top-left";
|
| break;
|
| case 2:
|
| - clientPoint = clientRect.maxXMaxYCorner();
|
| - clientPoint.move(-1, -1);
|
| + framePoint = clientRect.maxXMaxYCorner();
|
| + framePoint.move(-1, -1);
|
| contextStream << "bottom-right";
|
| break;
|
| default:
|
| FAIL() << "Invalid location index.";
|
| }
|
| - contextStream << "=" << clientPoint.x() << "," << clientPoint.y() << ").";
|
| +
|
| + IntPoint windowPoint = root->document().frame()->view()->convertToRootFrame(framePoint);
|
| + contextStream << "=" << windowPoint.x() << "," << windowPoint.y() << ").";
|
| std::string failureContextPos = contextStream.str();
|
|
|
| - LocalFrame* frame = root->document().frame();
|
| - FrameView* frameView = frame->view();
|
| - IntRect visibleRect = frameView->windowClipRect();
|
| - ASSERT_TRUE(visibleRect.contains(clientPoint)) << failureContextPos
|
| + LocalFrame* mainFrame = static_cast<LocalFrame*>(webView->mainFrame()->toImplBase()->frame());
|
| + FrameView* mainFrameView = mainFrame->view();
|
| + IntRect visibleRect = mainFrameView->windowClipRect();
|
| + ASSERT_TRUE(visibleRect.contains(windowPoint)) << failureContextPos
|
| << " Test point not contained in visible area: " << visibleRect.x() << "," << visibleRect.y()
|
| << "-" << visibleRect.maxX() << "," << visibleRect.maxY();
|
|
|
| @@ -258,14 +280,14 @@ void TouchActionTest::runTestOnTree(ContainerNode* root, WebView* webView, Touch
|
| // we intended. This is the easiest way for a test to be broken, but has nothing really
|
| // to do with touch action.
|
| // Note that we can't use WebView's hit test API because it doesn't look into shadow DOM.
|
| - IntPoint docPoint(frameView->rootFrameToContents(clientPoint));
|
| - HitTestResult result = frame->eventHandler().hitTestResultAtPoint(docPoint, HitTestRequest::ReadOnly | HitTestRequest::Active);
|
| + IntPoint docPoint(mainFrameView->frameToContents(windowPoint));
|
| + HitTestResult result = mainFrame->eventHandler().hitTestResultAtPoint(docPoint, HitTestRequest::ReadOnly | HitTestRequest::Active);
|
| ASSERT_EQ(element, result.innerElement()) << "Unexpected hit test result " << failureContextPos
|
| << " Got element: \"" << result.innerElement()->outerHTML().stripWhiteSpace().left(80).ascii().data() << "\""
|
| << std::endl << "Document render tree:" << std::endl << externalRepresentation(root->document().frame()).utf8().data();
|
|
|
| // Now send the touch event and check any touch action result.
|
| - sendTouchEvent(webView, WebInputEvent::TouchStart, clientPoint);
|
| + sendTouchEvent(webView, WebInputEvent::TouchStart, windowPoint);
|
|
|
| AtomicString expectedAction = element->getAttribute("expected-action");
|
| if (expectedAction == "auto") {
|
| @@ -283,9 +305,9 @@ void TouchActionTest::runTestOnTree(ContainerNode* root, WebView* webView, Touch
|
| } else if (expectedAction == "pan-y") {
|
| EXPECT_EQ(WebTouchActionPanY, client.lastTouchAction()) << failureContextPos;
|
| } else if (expectedAction == "pan-x-y") {
|
| - EXPECT_EQ((WebTouchActionPanX | WebTouchActionPanY), client.lastTouchAction()) << failureContextPos;
|
| + EXPECT_EQ((WebTouchActionPan), client.lastTouchAction()) << failureContextPos;
|
| } else if (expectedAction == "manipulation") {
|
| - EXPECT_EQ((WebTouchActionPanX | WebTouchActionPanY | WebTouchActionPinchZoom), client.lastTouchAction()) << failureContextPos;
|
| + EXPECT_EQ((WebTouchActionManipulation), client.lastTouchAction()) << failureContextPos;
|
| } else {
|
| FAIL() << "Unrecognized expected-action \"" << expectedAction.ascii().data()
|
| << "\" " << failureContextPos;
|
| @@ -295,7 +317,7 @@ void TouchActionTest::runTestOnTree(ContainerNode* root, WebView* webView, Touch
|
|
|
| // Reset webview touch state.
|
| client.reset();
|
| - sendTouchEvent(webView, WebInputEvent::TouchCancel, clientPoint);
|
| + sendTouchEvent(webView, WebInputEvent::TouchCancel, windowPoint);
|
| EXPECT_EQ(0, client.touchActionSetCount());
|
| }
|
| }
|
| @@ -335,6 +357,11 @@ TEST_F(TouchActionTest, Overflow)
|
| runTouchActionTest("touch-action-overflow.html");
|
| }
|
|
|
| +TEST_F(TouchActionTest, IFrame)
|
| +{
|
| + runIFrameTest("touch-action-iframe.html");
|
| +}
|
| +
|
| TEST_F(TouchActionTest, ShadowDOM)
|
| {
|
| runShadowDOMTest("touch-action-shadow-dom.html");
|
|
|