diff options
| author | Allan Sandfeld Jensen <allan.jensen@digia.com> | 2013-09-13 12:51:20 +0200 |
|---|---|---|
| committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-19 20:50:05 +0200 |
| commit | d441d6f39bb846989d95bcf5caf387b42414718d (patch) | |
| tree | e367e64a75991c554930278175d403c072de6bb8 /Source/WebKit/chromium/tests/WebFrameTest.cpp | |
| parent | 0060b2994c07842f4c59de64b5e3e430525c4b90 (diff) | |
| download | qtwebkit-d441d6f39bb846989d95bcf5caf387b42414718d.tar.gz | |
Import Qt5x2 branch of QtWebkit for Qt 5.2
Importing a new snapshot of webkit.
Change-Id: I2d01ad12cdc8af8cb015387641120a9d7ea5f10c
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@digia.com>
Diffstat (limited to 'Source/WebKit/chromium/tests/WebFrameTest.cpp')
| -rw-r--r-- | Source/WebKit/chromium/tests/WebFrameTest.cpp | 1648 |
1 files changed, 0 insertions, 1648 deletions
diff --git a/Source/WebKit/chromium/tests/WebFrameTest.cpp b/Source/WebKit/chromium/tests/WebFrameTest.cpp deleted file mode 100644 index 29e0f0b6c..000000000 --- a/Source/WebKit/chromium/tests/WebFrameTest.cpp +++ /dev/null @@ -1,1648 +0,0 @@ -/* - * Copyright (C) 2010 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. - */ - -#include "config.h" - -#include "WebFrame.h" - -#include "FloatRect.h" -#include "Frame.h" -#include "FrameTestHelpers.h" -#include "FrameView.h" -#include "Range.h" -#include "ResourceError.h" -#include "URLTestHelpers.h" -#include "WebDataSource.h" -#include "WebDocument.h" -#include "WebFindOptions.h" -#include "WebFormElement.h" -#include "WebFrameClient.h" -#include "WebFrameImpl.h" -#include "WebHistoryItem.h" -#include "WebRange.h" -#include "WebScriptSource.h" -#include "WebSearchableFormData.h" -#include "WebSecurityOrigin.h" -#include "WebSecurityPolicy.h" -#include "WebSettings.h" -#include "WebViewClient.h" -#include "WebViewImpl.h" -#include "platform/WebFloatRect.h" -#include "platform/WebURLResponse.h" -#include "v8.h" -#include <gtest/gtest.h> -#include <webkit/support/webkit_support.h> - -using namespace WebKit; -using WebCore::FloatRect; -using WebCore::Range; -using WebKit::URLTestHelpers::toKURL; - -namespace { - -class WebFrameTest : public testing::Test { -public: - WebFrameTest() - : m_baseURL("http://www.test.com/"), - m_chromeURL("chrome://") - { - } - - virtual void TearDown() - { - webkit_support::UnregisterAllMockedURLs(); - } - - void registerMockedHttpURLLoad(const std::string& fileName) - { - URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8(fileName.c_str())); - } - - void registerMockedChromeURLLoad(const std::string& fileName) - { - URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_chromeURL.c_str()), WebString::fromUTF8(fileName.c_str())); - } - -protected: - std::string m_baseURL; - std::string m_chromeURL; -}; - -TEST_F(WebFrameTest, ContentText) -{ - registerMockedHttpURLLoad("iframes_test.html"); - registerMockedHttpURLLoad("visible_iframe.html"); - registerMockedHttpURLLoad("invisible_iframe.html"); - registerMockedHttpURLLoad("zero_sized_iframe.html"); - - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "iframes_test.html"); - - // Now retrieve the frames text and test it only includes visible elements. - std::string content = std::string(webView->mainFrame()->contentAsText(1024).utf8().data()); - EXPECT_NE(std::string::npos, content.find(" visible paragraph")); - EXPECT_NE(std::string::npos, content.find(" visible iframe")); - EXPECT_EQ(std::string::npos, content.find(" invisible pararaph")); - EXPECT_EQ(std::string::npos, content.find(" invisible iframe")); - EXPECT_EQ(std::string::npos, content.find("iframe with zero size")); - - webView->close(); -} - -TEST_F(WebFrameTest, FrameForEnteredContext) -{ - registerMockedHttpURLLoad("iframes_test.html"); - registerMockedHttpURLLoad("visible_iframe.html"); - registerMockedHttpURLLoad("invisible_iframe.html"); - registerMockedHttpURLLoad("zero_sized_iframe.html"); - - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "iframes_test.html", true); - - v8::HandleScope scope; - EXPECT_EQ(webView->mainFrame(), - WebFrame::frameForContext( - webView->mainFrame()->mainWorldScriptContext())); - EXPECT_EQ(webView->mainFrame()->firstChild(), - WebFrame::frameForContext( - webView->mainFrame()->firstChild()->mainWorldScriptContext())); - - webView->close(); -} - -TEST_F(WebFrameTest, FormWithNullFrame) -{ - registerMockedHttpURLLoad("form.html"); - - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "form.html"); - - WebVector<WebFormElement> forms; - webView->mainFrame()->document().forms(forms); - webView->close(); - - EXPECT_EQ(forms.size(), 1U); - - // This test passes if this doesn't crash. - WebSearchableFormData searchableDataForm(forms[0]); -} - -TEST_F(WebFrameTest, ChromePageJavascript) -{ - registerMockedChromeURLLoad("history.html"); - - // Pass true to enable JavaScript. - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_chromeURL + "history.html", true); - - // Try to run JS against the chrome-style URL. - FrameTestHelpers::loadFrame(webView->mainFrame(), "javascript:document.body.appendChild(document.createTextNode('Clobbered'))"); - - // Required to see any updates in contentAsText. - webView->layout(); - - // Now retrieve the frame's text and ensure it was modified by running javascript. - std::string content = std::string(webView->mainFrame()->contentAsText(1024).utf8().data()); - EXPECT_NE(std::string::npos, content.find("Clobbered")); -} - -TEST_F(WebFrameTest, ChromePageNoJavascript) -{ - registerMockedChromeURLLoad("history.html"); - - /// Pass true to enable JavaScript. - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_chromeURL + "history.html", true); - - // Try to run JS against the chrome-style URL after prohibiting it. - WebSecurityPolicy::registerURLSchemeAsNotAllowingJavascriptURLs("chrome"); - FrameTestHelpers::loadFrame(webView->mainFrame(), "javascript:document.body.appendChild(document.createTextNode('Clobbered'))"); - - // Required to see any updates in contentAsText. - webView->layout(); - - // Now retrieve the frame's text and ensure it wasn't modified by running javascript. - std::string content = std::string(webView->mainFrame()->contentAsText(1024).utf8().data()); - EXPECT_EQ(std::string::npos, content.find("Clobbered")); -} - -TEST_F(WebFrameTest, DispatchMessageEventWithOriginCheck) -{ - registerMockedHttpURLLoad("postmessage_test.html"); - - // Pass true to enable JavaScript. - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "postmessage_test.html", true); - - // Send a message with the correct origin. - WebSecurityOrigin correctOrigin(WebSecurityOrigin::create(toKURL(m_baseURL))); - WebDOMEvent event = webView->mainFrame()->document().createEvent("MessageEvent"); - WebDOMMessageEvent message = event.to<WebDOMMessageEvent>(); - WebSerializedScriptValue data(WebSerializedScriptValue::fromString("foo")); - message.initMessageEvent("message", false, false, data, "http://origin.com", 0, ""); - webView->mainFrame()->dispatchMessageEventWithOriginCheck(correctOrigin, message); - - // Send another message with incorrect origin. - WebSecurityOrigin incorrectOrigin(WebSecurityOrigin::create(toKURL(m_chromeURL))); - webView->mainFrame()->dispatchMessageEventWithOriginCheck(incorrectOrigin, message); - - // Required to see any updates in contentAsText. - webView->layout(); - - // Verify that only the first addition is in the body of the page. - std::string content = std::string(webView->mainFrame()->contentAsText(1024).utf8().data()); - EXPECT_NE(std::string::npos, content.find("Message 1.")); - EXPECT_EQ(std::string::npos, content.find("Message 2.")); -} - -#if ENABLE(VIEWPORT) - -class FixedLayoutTestWebViewClient : public WebViewClient { - public: - virtual WebScreenInfo screenInfo() OVERRIDE { return m_screenInfo; } - - WebScreenInfo m_screenInfo; -}; - -TEST_F(WebFrameTest, DeviceScaleFactorUsesDefaultWithoutViewportTag) -{ - registerMockedHttpURLLoad("no_viewport_tag.html"); - - int viewportWidth = 640; - int viewportHeight = 480; - - FixedLayoutTestWebViewClient client; - client.m_screenInfo.deviceScaleFactor = 2; - - WebView* webView = static_cast<WebView*>(FrameTestHelpers::createWebViewAndLoad(m_baseURL + "no_viewport_tag.html", true, 0, &client)); - - webView->settings()->setViewportEnabled(true); - webView->enableFixedLayoutMode(true); - webView->resize(WebSize(viewportWidth, viewportHeight)); - webView->layout(); - - EXPECT_EQ(2, webView->deviceScaleFactor()); - - // Device scale factor should be a component of page scale factor in fixed-layout, so a scale of 1 becomes 2. - webView->setPageScaleFactorLimits(1, 2); - EXPECT_EQ(2, webView->pageScaleFactor()); - - // Force the layout to happen before leaving the test. - webView->mainFrame()->contentAsText(1024).utf8(); -} - -TEST_F(WebFrameTest, FixedLayoutInitializeAtMinimumPageScale) -{ - registerMockedHttpURLLoad("fixed_layout.html"); - - FixedLayoutTestWebViewClient client; - client.m_screenInfo.deviceScaleFactor = 1; - int viewportWidth = 640; - int viewportHeight = 480; - - // Make sure we initialize to minimum scale, even if the window size - // only becomes available after the load begins. - WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(FrameTestHelpers::createWebViewAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client)); - webViewImpl->enableFixedLayoutMode(true); - webViewImpl->settings()->setViewportEnabled(true); - webViewImpl->resize(WebSize(viewportWidth, viewportHeight)); - - int defaultFixedLayoutWidth = 980; - float minimumPageScaleFactor = viewportWidth / (float) defaultFixedLayoutWidth; - EXPECT_EQ(minimumPageScaleFactor, webViewImpl->pageScaleFactor()); - - // Assume the user has pinch zoomed to page scale factor 2. - float userPinchPageScaleFactor = 2; - webViewImpl->setPageScaleFactorPreservingScrollOffset(userPinchPageScaleFactor); - webViewImpl->mainFrameImpl()->frameView()->layout(); - - // Make sure we don't reset to initial scale if the page continues to load. - bool isNewNavigation; - webViewImpl->didCommitLoad(&isNewNavigation, false); - webViewImpl->didChangeContentsSize(); - EXPECT_EQ(userPinchPageScaleFactor, webViewImpl->pageScaleFactor()); - - // Make sure we don't reset to initial scale if the viewport size changes. - webViewImpl->resize(WebSize(viewportWidth, viewportHeight + 100)); - EXPECT_EQ(userPinchPageScaleFactor, webViewImpl->pageScaleFactor()); -} - -TEST_F(WebFrameTest, ScaleFactorShouldNotOscillate) -{ - registerMockedHttpURLLoad("scale_oscillate.html"); - - FixedLayoutTestWebViewClient client; - client.m_screenInfo.deviceScaleFactor = static_cast<float>(1.325); - int viewportWidth = 800; - int viewportHeight = 1057; - - WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(FrameTestHelpers::createWebViewAndLoad(m_baseURL + "scale_oscillate.html", true, 0, &client)); - webViewImpl->enableFixedLayoutMode(true); - webViewImpl->settings()->setViewportEnabled(true); - webViewImpl->resize(WebSize(viewportWidth, viewportHeight)); - webViewImpl->layout(); -} - -#endif - -TEST_F(WebFrameTest, CanOverrideMaximumScaleFactor) -{ - registerMockedHttpURLLoad("no_scale_for_you.html"); - - FixedLayoutTestWebViewClient client; - client.m_screenInfo.deviceScaleFactor = 1; - int viewportWidth = 640; - int viewportHeight = 480; - - WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(FrameTestHelpers::createWebViewAndLoad(m_baseURL + "no_scale_for_you.html", true, 0, &client)); - webViewImpl->enableFixedLayoutMode(true); - webViewImpl->settings()->setViewportEnabled(true); - webViewImpl->resize(WebSize(viewportWidth, viewportHeight)); - - EXPECT_EQ(1.0f, webViewImpl->maximumPageScaleFactor()); - - webViewImpl->setIgnoreViewportTagMaximumScale(true); - - EXPECT_EQ(4.0f, webViewImpl->maximumPageScaleFactor()); -} - -#if ENABLE(GESTURE_EVENTS) -void setScaleAndScrollAndLayout(WebKit::WebView* webView, WebPoint scroll, float scale) -{ - webView->setPageScaleFactor(scale, WebPoint(scroll.x, scroll.y)); - webView->layout(); -} - -TEST_F(WebFrameTest, DivAutoZoomParamsTest) -{ - registerMockedHttpURLLoad("get_scale_for_auto_zoom_into_div_test.html"); - - int viewportWidth = 640; - int viewportHeight = 480; - WebKit::WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "get_scale_for_auto_zoom_into_div_test.html"); - webView->enableFixedLayoutMode(true); - webView->setDeviceScaleFactor(2.0f); - webView->resize(WebSize(viewportWidth, viewportHeight)); - webView->setPageScaleFactorLimits(0.01f, 4); - webView->layout(); - - WebRect wideDiv(200, 100, 400, 150); - WebRect tallDiv(200, 300, 400, 800); - WebRect doubleTapPointWide((wideDiv.x + 50) * webView->pageScaleFactor(), - (wideDiv.y + 50) * webView->pageScaleFactor(), 0, 0); - WebRect doubleTapPointTall((tallDiv.x + 50) * webView->pageScaleFactor(), - (tallDiv.y + 50) * webView->pageScaleFactor(), 0, 0); - float scale; - WebPoint scroll; - bool isAnchor; - - WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(webView); - // Test double-tap zooming into wide div. - webViewImpl->computeScaleAndScrollForHitRect(doubleTapPointWide, WebViewImpl::DoubleTap, scale, scroll, isAnchor); - // The div should horizontally fill the screen (modulo margins), and - // vertically centered (modulo integer rounding). - EXPECT_NEAR(viewportWidth / (float) wideDiv.width, scale, 0.1); - EXPECT_NEAR(wideDiv.x * scale, scroll.x, 20); - int vScroll = (wideDiv.y + wideDiv.height / 2) * scale - (viewportHeight / 2); - EXPECT_NEAR(vScroll, scroll.y, 1); - EXPECT_FALSE(isAnchor); - - setScaleAndScrollAndLayout(webViewImpl, scroll, scale); - - // Test zoom out back to minimum scale. - webViewImpl->computeScaleAndScrollForHitRect(doubleTapPointWide, WebViewImpl::DoubleTap, scale, scroll, isAnchor); - EXPECT_FLOAT_EQ(webViewImpl->minimumPageScaleFactor(), scale); - EXPECT_TRUE(isAnchor); - - setScaleAndScrollAndLayout(webViewImpl, WebPoint(0, 0), scale); - - // Test double-tap zooming into tall div. - webViewImpl->computeScaleAndScrollForHitRect(doubleTapPointTall, WebViewImpl::DoubleTap, scale, scroll, isAnchor); - // The div should start at the top left of the viewport. - EXPECT_NEAR(viewportWidth / (float) tallDiv.width, scale, 0.1); - EXPECT_NEAR(tallDiv.x * scale, scroll.x, 20); - EXPECT_NEAR(tallDiv.y * scale, scroll.y, 20); - EXPECT_FALSE(isAnchor); - - // Test for Non-doubletap scaling - // Test zooming into div. - webViewImpl->computeScaleAndScrollForHitRect(WebRect(250, 250, 10, 10), WebViewImpl::FindInPage, scale, scroll, isAnchor); - EXPECT_NEAR(viewportWidth / (float) wideDiv.width, scale, 0.1); -} - -void simulateDoubleTap(WebViewImpl* webViewImpl, WebPoint& point, float& scale) -{ - WebPoint scaledPoint(static_cast<int>(point.x * webViewImpl->pageScaleFactor()), - static_cast<int>(point.y * webViewImpl->pageScaleFactor())); - webViewImpl->animateZoomAroundPoint(scaledPoint, WebViewImpl::DoubleTap); - webViewImpl->mainFrameImpl()->frameView()->layout(); - scale = webViewImpl->pageScaleFactor(); -} - -TEST_F(WebFrameTest, DivAutoZoomMultipleDivsTest) -{ - registerMockedHttpURLLoad("get_multiple_divs_for_auto_zoom_test.html"); - - int viewportWidth = 640; - int viewportHeight = 480; - float doubleTapZoomAlreadyLegibleRatio = 1.2f; - WebKit::WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "get_multiple_divs_for_auto_zoom_test.html"); - webView->enableFixedLayoutMode(true); - webView->resize(WebSize(viewportWidth, viewportHeight)); - webView->setPageScaleFactorLimits(1, 4); - webView->layout(); - webView->setDeviceScaleFactor(1.5f); - - WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(webView); - webViewImpl->shouldUseAnimateDoubleTapTimeZeroForTesting(true); - - WebRect topDiv(200, 100, 200, 150); - WebRect bottomDiv(200, 300, 200, 150); - WebPoint topPoint(topDiv.x + 50, topDiv.y + 50); - WebPoint bottomPoint(bottomDiv.x + 50, bottomDiv.y + 50); - float scale; - setScaleAndScrollAndLayout(webViewImpl, WebPoint(0, 0), (webViewImpl->minimumPageScaleFactor()) * (1 + doubleTapZoomAlreadyLegibleRatio) / 2); - - // Test double tap on two different divs - // After first zoom, we should go back to minimum page scale with a second double tap. - simulateDoubleTap(webViewImpl, topPoint, scale); - EXPECT_FLOAT_EQ(webViewImpl->deviceScaleFactor(), scale); - simulateDoubleTap(webViewImpl, bottomPoint, scale); - EXPECT_FLOAT_EQ(webViewImpl->minimumPageScaleFactor(), scale); - - // If the user pinch zooms after double tap, a second double tap should zoom back to the div. - simulateDoubleTap(webViewImpl, topPoint, scale); - EXPECT_FLOAT_EQ(webViewImpl->deviceScaleFactor(), scale); - webViewImpl->applyScrollAndScale(WebSize(), 0.6f); - simulateDoubleTap(webViewImpl, bottomPoint, scale); - EXPECT_FLOAT_EQ(webViewImpl->deviceScaleFactor(), scale); -} - -TEST_F(WebFrameTest, DivAutoZoomScaleBoundsTest) -{ - registerMockedHttpURLLoad("get_scale_bounds_check_for_auto_zoom_test.html"); - - int viewportWidth = 640; - int viewportHeight = 480; - float doubleTapZoomAlreadyLegibleRatio = 1.2f; - WebKit::WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "get_scale_bounds_check_for_auto_zoom_test.html"); - webView->enableFixedLayoutMode(true); - webView->resize(WebSize(viewportWidth, viewportHeight)); - webView->setPageScaleFactorLimits(1, 4); - webView->layout(); - webView->setDeviceScaleFactor(1.5f); - - WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(webView); - webViewImpl->shouldUseAnimateDoubleTapTimeZeroForTesting(true); - float doubleTapZoomAlreadyLegibleScale = webViewImpl->minimumPageScaleFactor() * doubleTapZoomAlreadyLegibleRatio; - - WebRect div(200, 100, 200, 150); - WebPoint doubleTapPoint(div.x + 50, div.y + 50); - float scale; - - // Test double tap scale bounds. - // minimumPageScale < doubleTapZoomAlreadyLegibleScale < deviceDpiScale - setScaleAndScrollAndLayout(webViewImpl, WebPoint(0, 0), (webViewImpl->minimumPageScaleFactor()) * (1 + doubleTapZoomAlreadyLegibleRatio) / 2); - simulateDoubleTap(webViewImpl, doubleTapPoint, scale); - EXPECT_FLOAT_EQ(webViewImpl->deviceScaleFactor(), scale); - simulateDoubleTap(webViewImpl, doubleTapPoint, scale); - EXPECT_FLOAT_EQ(webViewImpl->minimumPageScaleFactor(), scale); - simulateDoubleTap(webViewImpl, doubleTapPoint, scale); - EXPECT_FLOAT_EQ(webViewImpl->deviceScaleFactor(), scale); - - // Zoom in to reset double_tap_zoom_in_effect flag. - webViewImpl->applyScrollAndScale(WebSize(), 1.1f); - // deviceDpiScale < minimumPageScale < doubleTapZoomAlreadyLegibleScale - webViewImpl->setDeviceScaleFactor(0.5f); - setScaleAndScrollAndLayout(webViewImpl, WebPoint(0, 0), (webViewImpl->minimumPageScaleFactor()) * (1 + doubleTapZoomAlreadyLegibleRatio) / 2); - simulateDoubleTap(webViewImpl, doubleTapPoint, scale); - EXPECT_FLOAT_EQ(webViewImpl->minimumPageScaleFactor(), scale); - simulateDoubleTap(webViewImpl, doubleTapPoint, scale); - EXPECT_FLOAT_EQ(doubleTapZoomAlreadyLegibleScale, scale); - simulateDoubleTap(webViewImpl, doubleTapPoint, scale); - EXPECT_FLOAT_EQ(webViewImpl->minimumPageScaleFactor(), scale); - - // Zoom in to reset double_tap_zoom_in_effect flag. - webViewImpl->applyScrollAndScale(WebSize(), 1.1f); - // minimumPageScale < doubleTapZoomAlreadyLegibleScale < deviceDpiScale - webViewImpl->setDeviceScaleFactor(1.1f); - setScaleAndScrollAndLayout(webViewImpl, WebPoint(0, 0), (webViewImpl->minimumPageScaleFactor()) * (1 + doubleTapZoomAlreadyLegibleRatio) / 2); - simulateDoubleTap(webViewImpl, doubleTapPoint, scale); - EXPECT_FLOAT_EQ(webViewImpl->minimumPageScaleFactor(), scale); - simulateDoubleTap(webViewImpl, doubleTapPoint, scale); - EXPECT_FLOAT_EQ(doubleTapZoomAlreadyLegibleScale, scale); - simulateDoubleTap(webViewImpl, doubleTapPoint, scale); - EXPECT_FLOAT_EQ(webViewImpl->minimumPageScaleFactor(), scale); -} - -// This test depends on code that is compiled conditionally. We likely need to -// add the proper ifdef when re-enabling it. See -// https://bugs.webkit.org/show_bug.cgi?id=98558 -TEST_F(WebFrameTest, DISABLED_DivScrollIntoEditableTest) -{ - registerMockedHttpURLLoad("get_scale_for_zoom_into_editable_test.html"); - - int viewportWidth = 640; - int viewportHeight = 480; - float leftBoxRatio = 0.3f; - int caretPadding = 10; - int minReadableCaretHeight = 18; - WebKit::WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "get_scale_for_zoom_into_editable_test.html"); - webView->enableFixedLayoutMode(true); - webView->resize(WebSize(viewportWidth, viewportHeight)); - webView->setPageScaleFactorLimits(1, 10); - webView->layout(); - webView->setDeviceScaleFactor(1.5f); - webView->settings()->setAutoZoomFocusedNodeToLegibleScale(true); - - WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(webView); - webViewImpl->shouldUseAnimateDoubleTapTimeZeroForTesting(true); - - WebRect editBoxWithText(200, 200, 250, 20); - WebRect editBoxWithNoText(200, 250, 250, 20); - - // Test scrolling the focused node - // The edit box is shorter and narrower than the viewport when legible. - setScaleAndScrollAndLayout(webView, WebPoint(0, 0), 1); - WebRect rect, caret; - webViewImpl->selectionBounds(caret, rect); - webView->scrollFocusedNodeIntoRect(rect); - // The edit box should be left aligned with a margin for possible label. - int hScroll = editBoxWithText.x * webView->pageScaleFactor() - leftBoxRatio * viewportWidth; - EXPECT_EQ(hScroll, webView->mainFrame()->scrollOffset().width); - int vScroll = editBoxWithText.y * webView->pageScaleFactor() - (viewportHeight - editBoxWithText.height * webView->pageScaleFactor()) / 2; - EXPECT_EQ(vScroll, webView->mainFrame()->scrollOffset().height); - EXPECT_FLOAT_EQ(webView->deviceScaleFactor() * minReadableCaretHeight / caret.height, webView->pageScaleFactor()); - - // The edit box is wider than the viewport when legible. - webView->setDeviceScaleFactor(4); - setScaleAndScrollAndLayout(webView, WebPoint(0, 0), 1); - webViewImpl->selectionBounds(caret, rect); - webView->scrollFocusedNodeIntoRect(rect); - // The caret should be right aligned since the caret would be offscreen when the edit box is left aligned. - hScroll = (caret.x + caret.width) * webView->pageScaleFactor() + caretPadding - viewportWidth; - EXPECT_EQ(hScroll, webView->mainFrame()->scrollOffset().width); - EXPECT_FLOAT_EQ(webView->deviceScaleFactor() * minReadableCaretHeight / caret.height, webView->pageScaleFactor()); - - setScaleAndScrollAndLayout(webView, WebPoint(0, 0), 1); - // Move focus to edit box with text. - webView->advanceFocus(false); - webViewImpl->selectionBounds(caret, rect); - webView->scrollFocusedNodeIntoRect(rect); - // The edit box should be left aligned. - hScroll = editBoxWithNoText.x * webView->pageScaleFactor(); - EXPECT_EQ(hScroll, webView->mainFrame()->scrollOffset().width); - vScroll = editBoxWithNoText.y * webView->pageScaleFactor() - (viewportHeight - editBoxWithNoText.height * webView->pageScaleFactor()) / 2; - EXPECT_EQ(vScroll, webView->mainFrame()->scrollOffset().height); - EXPECT_FLOAT_EQ(webView->deviceScaleFactor() * minReadableCaretHeight / caret.height, webView->pageScaleFactor()); - - // Move focus back to the first edit box. - webView->advanceFocus(true); - webViewImpl->selectionBounds(caret, rect); - // The position should have stayed the same since this box was already on screen with the right scale. - EXPECT_EQ(vScroll, webView->mainFrame()->scrollOffset().height); - EXPECT_EQ(hScroll, webView->mainFrame()->scrollOffset().width); -} -#endif - -class TestReloadDoesntRedirectWebFrameClient : public WebFrameClient { -public: - virtual WebNavigationPolicy decidePolicyForNavigation( - WebFrame*, const WebURLRequest&, WebNavigationType, - const WebNode& originatingNode, - WebNavigationPolicy defaultPolicy, bool isRedirect) - { - EXPECT_FALSE(isRedirect); - return WebNavigationPolicyCurrentTab; - } - - virtual WebURLError cancelledError(WebFrame*, const WebURLRequest& request) - { - // Return a dummy error so the DocumentLoader doesn't assert when - // the reload cancels it. - WebURLError webURLError; - webURLError.domain = ""; - webURLError.reason = 1; - webURLError.isCancellation = true; - webURLError.unreachableURL = WebURL(); - return webURLError; - } -}; - -TEST_F(WebFrameTest, ReloadDoesntSetRedirect) -{ - // Test for case in http://crbug.com/73104. Reloading a frame very quickly - // would sometimes call decidePolicyForNavigation with isRedirect=true - registerMockedHttpURLLoad("form.html"); - - TestReloadDoesntRedirectWebFrameClient webFrameClient; - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "form.html", false, &webFrameClient); - - webView->mainFrame()->reload(true); - // start reload before request is delivered. - webView->mainFrame()->reload(true); - webkit_support::ServeAsynchronousMockedRequests(); -} - -TEST_F(WebFrameTest, ReloadWithOverrideURLPreservesState) -{ - const std::string firstURL = "find.html"; - const std::string secondURL = "form.html"; - const std::string thirdURL = "history.html"; - const float pageScaleFactor = 1.1684f; - const int pageWidth = 640; - const int pageHeight = 480; - - registerMockedHttpURLLoad(firstURL); - registerMockedHttpURLLoad(secondURL); - registerMockedHttpURLLoad(thirdURL); - - WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(FrameTestHelpers::createWebViewAndLoad(m_baseURL + firstURL, true)); - webViewImpl->resize(WebSize(pageWidth, pageHeight)); - webViewImpl->mainFrame()->setScrollOffset(WebSize(pageWidth / 4, pageHeight / 4)); - webViewImpl->setPageScaleFactorPreservingScrollOffset(pageScaleFactor); - - WebSize previousOffset = webViewImpl->mainFrame()->scrollOffset(); - float previousScale = webViewImpl->pageScaleFactor(); - - // Reload the page using the cache. - webViewImpl->mainFrame()->reloadWithOverrideURL(toKURL(m_baseURL + secondURL), false); - webkit_support::ServeAsynchronousMockedRequests(); - ASSERT_EQ(previousOffset, webViewImpl->mainFrame()->scrollOffset()); - ASSERT_EQ(previousScale, webViewImpl->pageScaleFactor()); - - // Reload the page while ignoring the cache. - webViewImpl->mainFrame()->reloadWithOverrideURL(toKURL(m_baseURL + thirdURL), true); - webkit_support::ServeAsynchronousMockedRequests(); - ASSERT_EQ(previousOffset, webViewImpl->mainFrame()->scrollOffset()); - ASSERT_EQ(previousScale, webViewImpl->pageScaleFactor()); -} - -TEST_F(WebFrameTest, IframeRedirect) -{ - registerMockedHttpURLLoad("iframe_redirect.html"); - registerMockedHttpURLLoad("visible_iframe.html"); - - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "iframe_redirect.html", true); - webkit_support::RunAllPendingMessages(); // Queue the iframe. - webkit_support::ServeAsynchronousMockedRequests(); // Load the iframe. - - WebFrame* iframe = webView->findFrameByName(WebString::fromUTF8("ifr")); - ASSERT_TRUE(iframe); - WebDataSource* iframeDataSource = iframe->dataSource(); - ASSERT_TRUE(iframeDataSource); - WebVector<WebURL> redirects; - iframeDataSource->redirectChain(redirects); - ASSERT_EQ(2U, redirects.size()); - EXPECT_EQ(toKURL("about:blank"), toKURL(redirects[0].spec().data())); - EXPECT_EQ(toKURL("http://www.test.com/visible_iframe.html"), toKURL(redirects[1].spec().data())); - - webView->close(); -} - -TEST_F(WebFrameTest, ClearFocusedNodeTest) -{ - registerMockedHttpURLLoad("iframe_clear_focused_node_test.html"); - registerMockedHttpURLLoad("autofocus_input_field_iframe.html"); - - WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(FrameTestHelpers::createWebViewAndLoad(m_baseURL + "iframe_clear_focused_node_test.html", true)); - - // Clear the focused node. - webViewImpl->clearFocusedNode(); - - // Now retrieve the FocusedNode and test it should be null. - EXPECT_EQ(0, webViewImpl->focusedWebCoreNode()); - - webViewImpl->close(); -} - -// Implementation of WebFrameClient that tracks the v8 contexts that are created -// and destroyed for verification. -class ContextLifetimeTestWebFrameClient : public WebFrameClient { -public: - struct Notification { - public: - Notification(WebFrame* frame, v8::Handle<v8::Context> context, int worldId) - : frame(frame) , - context(v8::Persistent<v8::Context>::New(context)), - worldId(worldId) - { - } - - ~Notification() - { - context.Dispose(); - } - - bool Equals(Notification* other) - { - return other && frame == other->frame && context == other->context && worldId == other->worldId; - } - - WebFrame* frame; - v8::Persistent<v8::Context> context; - int worldId; - }; - - ~ContextLifetimeTestWebFrameClient() - { - reset(); - } - - void reset() - { - for (size_t i = 0; i < createNotifications.size(); ++i) - delete createNotifications[i]; - - for (size_t i = 0; i < releaseNotifications.size(); ++i) - delete releaseNotifications[i]; - - createNotifications.clear(); - releaseNotifications.clear(); - } - - std::vector<Notification*> createNotifications; - std::vector<Notification*> releaseNotifications; - - private: - virtual void didCreateScriptContext(WebFrame* frame, v8::Handle<v8::Context> context, int extensionGroup, int worldId) OVERRIDE - { - createNotifications.push_back(new Notification(frame, context, worldId)); - } - - virtual void willReleaseScriptContext(WebFrame* frame, v8::Handle<v8::Context> context, int worldId) OVERRIDE - { - releaseNotifications.push_back(new Notification(frame, context, worldId)); - } -}; - -TEST_F(WebFrameTest, ContextNotificationsLoadUnload) -{ - v8::HandleScope handleScope; - - registerMockedHttpURLLoad("context_notifications_test.html"); - registerMockedHttpURLLoad("context_notifications_test_frame.html"); - - // Load a frame with an iframe, make sure we get the right create notifications. - ContextLifetimeTestWebFrameClient webFrameClient; - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "context_notifications_test.html", true, &webFrameClient); - - WebFrame* mainFrame = webView->mainFrame(); - WebFrame* childFrame = mainFrame->firstChild(); - - ASSERT_EQ(2u, webFrameClient.createNotifications.size()); - EXPECT_EQ(0u, webFrameClient.releaseNotifications.size()); - - ContextLifetimeTestWebFrameClient::Notification* firstCreateNotification = webFrameClient.createNotifications[0]; - ContextLifetimeTestWebFrameClient::Notification* secondCreateNotification = webFrameClient.createNotifications[1]; - - EXPECT_EQ(mainFrame, firstCreateNotification->frame); - EXPECT_EQ(mainFrame->mainWorldScriptContext(), firstCreateNotification->context); - EXPECT_EQ(0, firstCreateNotification->worldId); - - EXPECT_EQ(childFrame, secondCreateNotification->frame); - EXPECT_EQ(childFrame->mainWorldScriptContext(), secondCreateNotification->context); - EXPECT_EQ(0, secondCreateNotification->worldId); - - // Close the view. We should get two release notifications that are exactly the same as the create ones, in reverse order. - webView->close(); - - ASSERT_EQ(2u, webFrameClient.releaseNotifications.size()); - ContextLifetimeTestWebFrameClient::Notification* firstReleaseNotification = webFrameClient.releaseNotifications[0]; - ContextLifetimeTestWebFrameClient::Notification* secondReleaseNotification = webFrameClient.releaseNotifications[1]; - - ASSERT_TRUE(firstCreateNotification->Equals(secondReleaseNotification)); - ASSERT_TRUE(secondCreateNotification->Equals(firstReleaseNotification)); -} - -TEST_F(WebFrameTest, ContextNotificationsReload) -{ - v8::HandleScope handleScope; - - registerMockedHttpURLLoad("context_notifications_test.html"); - registerMockedHttpURLLoad("context_notifications_test_frame.html"); - - ContextLifetimeTestWebFrameClient webFrameClient; - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "context_notifications_test.html", true, &webFrameClient); - - // Refresh, we should get two release notifications and two more create notifications. - webView->mainFrame()->reload(false); - webkit_support::ServeAsynchronousMockedRequests(); - ASSERT_EQ(4u, webFrameClient.createNotifications.size()); - ASSERT_EQ(2u, webFrameClient.releaseNotifications.size()); - - // The two release notifications we got should be exactly the same as the first two create notifications. - for (size_t i = 0; i < webFrameClient.releaseNotifications.size(); ++i) { - EXPECT_TRUE(webFrameClient.releaseNotifications[i]->Equals( - webFrameClient.createNotifications[webFrameClient.createNotifications.size() - 3 - i])); - } - - // The last two create notifications should be for the current frames and context. - WebFrame* mainFrame = webView->mainFrame(); - WebFrame* childFrame = mainFrame->firstChild(); - ContextLifetimeTestWebFrameClient::Notification* firstRefreshNotification = webFrameClient.createNotifications[2]; - ContextLifetimeTestWebFrameClient::Notification* secondRefreshNotification = webFrameClient.createNotifications[3]; - - EXPECT_EQ(mainFrame, firstRefreshNotification->frame); - EXPECT_EQ(mainFrame->mainWorldScriptContext(), firstRefreshNotification->context); - EXPECT_EQ(0, firstRefreshNotification->worldId); - - EXPECT_EQ(childFrame, secondRefreshNotification->frame); - EXPECT_EQ(childFrame->mainWorldScriptContext(), secondRefreshNotification->context); - EXPECT_EQ(0, secondRefreshNotification->worldId); - - webView->close(); -} - -TEST_F(WebFrameTest, ContextNotificationsIsolatedWorlds) -{ - v8::HandleScope handleScope; - - registerMockedHttpURLLoad("context_notifications_test.html"); - registerMockedHttpURLLoad("context_notifications_test_frame.html"); - - ContextLifetimeTestWebFrameClient webFrameClient; - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "context_notifications_test.html", true, &webFrameClient); - - // Add an isolated world. - webFrameClient.reset(); - - int isolatedWorldId = 42; - WebScriptSource scriptSource("hi!"); - int numSources = 1; - int extensionGroup = 0; - webView->mainFrame()->executeScriptInIsolatedWorld(isolatedWorldId, &scriptSource, numSources, extensionGroup); - - // We should now have a new create notification. - ASSERT_EQ(1u, webFrameClient.createNotifications.size()); - ContextLifetimeTestWebFrameClient::Notification* notification = webFrameClient.createNotifications[0]; - ASSERT_EQ(isolatedWorldId, notification->worldId); - ASSERT_EQ(webView->mainFrame(), notification->frame); - - // We don't have an API to enumarate isolated worlds for a frame, but we can at least assert that the context we got is *not* the main world's context. - ASSERT_NE(webView->mainFrame()->mainWorldScriptContext(), notification->context); - - webView->close(); - - // We should have gotten three release notifications (one for each of the frames, plus one for the isolated context). - ASSERT_EQ(3u, webFrameClient.releaseNotifications.size()); - - // And one of them should be exactly the same as the create notification for the isolated context. - int matchCount = 0; - for (size_t i = 0; i < webFrameClient.releaseNotifications.size(); ++i) { - if (webFrameClient.releaseNotifications[i]->Equals(webFrameClient.createNotifications[0])) - ++matchCount; - } - EXPECT_EQ(1, matchCount); -} - -TEST_F(WebFrameTest, FindInPage) -{ - registerMockedHttpURLLoad("find.html"); - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "find.html"); - WebFrame* frame = webView->mainFrame(); - const int findIdentifier = 12345; - WebFindOptions options; - - // Find in a <div> element. - EXPECT_TRUE(frame->find(findIdentifier, WebString::fromUTF8("bar1"), options, false, 0)); - frame->stopFinding(false); - WebRange range = frame->selectionRange(); - EXPECT_EQ(5, range.startOffset()); - EXPECT_EQ(9, range.endOffset()); - EXPECT_TRUE(frame->document().focusedNode().isNull()); - - // Find in an <input> value. - EXPECT_TRUE(frame->find(findIdentifier, WebString::fromUTF8("bar2"), options, false, 0)); - // Confirm stopFinding(false) sets the selection on the found text. - frame->stopFinding(false); - range = frame->selectionRange(); - ASSERT_FALSE(range.isNull()); - EXPECT_EQ(5, range.startOffset()); - EXPECT_EQ(9, range.endOffset()); - EXPECT_EQ(WebString::fromUTF8("INPUT"), frame->document().focusedNode().nodeName()); - - // Find in a <textarea> content. - EXPECT_TRUE(frame->find(findIdentifier, WebString::fromUTF8("bar3"), options, false, 0)); - // Confirm stopFinding(false) sets the selection on the found text. - frame->stopFinding(false); - range = frame->selectionRange(); - ASSERT_FALSE(range.isNull()); - EXPECT_EQ(5, range.startOffset()); - EXPECT_EQ(9, range.endOffset()); - EXPECT_EQ(WebString::fromUTF8("TEXTAREA"), frame->document().focusedNode().nodeName()); - - // Find in a contentEditable element. - EXPECT_TRUE(frame->find(findIdentifier, WebString::fromUTF8("bar4"), options, false, 0)); - // Confirm stopFinding(false) sets the selection on the found text. - frame->stopFinding(false); - range = frame->selectionRange(); - ASSERT_FALSE(range.isNull()); - EXPECT_EQ(0, range.startOffset()); - EXPECT_EQ(4, range.endOffset()); - // "bar4" is surrounded by <span>, but the focusable node should be the parent <div>. - EXPECT_EQ(WebString::fromUTF8("DIV"), frame->document().focusedNode().nodeName()); - - webView->close(); -} - -TEST_F(WebFrameTest, GetContentAsPlainText) -{ - WebView* webView = FrameTestHelpers::createWebViewAndLoad("about:blank", true); - // We set the size because it impacts line wrapping, which changes the - // resulting text value. - webView->resize(WebSize(640, 480)); - WebFrame* frame = webView->mainFrame(); - - // Generate a simple test case. - const char simpleSource[] = "<div>Foo bar</div><div></div>baz"; - WebCore::KURL testURL = toKURL("about:blank"); - frame->loadHTMLString(simpleSource, testURL); - webkit_support::RunAllPendingMessages(); - - // Make sure it comes out OK. - const std::string expected("Foo bar\nbaz"); - WebString text = frame->contentAsText(std::numeric_limits<size_t>::max()); - EXPECT_EQ(expected, std::string(text.utf8().data())); - - // Try reading the same one with clipping of the text. - const int length = 5; - text = frame->contentAsText(length); - EXPECT_EQ(expected.substr(0, length), std::string(text.utf8().data())); - - // Now do a new test with a subframe. - const char outerFrameSource[] = "Hello<iframe></iframe> world"; - frame->loadHTMLString(outerFrameSource, testURL); - webkit_support::RunAllPendingMessages(); - - // Load something into the subframe. - WebFrame* subframe = frame->findChildByExpression(WebString::fromUTF8("/html/body/iframe")); - ASSERT_TRUE(subframe); - subframe->loadHTMLString("sub<p>text", testURL); - webkit_support::RunAllPendingMessages(); - - text = frame->contentAsText(std::numeric_limits<size_t>::max()); - EXPECT_EQ("Hello world\n\nsub\ntext", std::string(text.utf8().data())); - - // Get the frame text where the subframe separator falls on the boundary of - // what we'll take. There used to be a crash in this case. - text = frame->contentAsText(12); - EXPECT_EQ("Hello world", std::string(text.utf8().data())); - - webView->close(); -} - -TEST_F(WebFrameTest, GetFullHtmlOfPage) -{ - WebView* webView = FrameTestHelpers::createWebViewAndLoad("about:blank", true); - WebFrame* frame = webView->mainFrame(); - - // Generate a simple test case. - const char simpleSource[] = "<p>Hello</p><p>World</p>"; - WebCore::KURL testURL = toKURL("about:blank"); - frame->loadHTMLString(simpleSource, testURL); - webkit_support::RunAllPendingMessages(); - - WebString text = frame->contentAsText(std::numeric_limits<size_t>::max()); - EXPECT_EQ("Hello\n\nWorld", std::string(text.utf8().data())); - - const std::string html = std::string(frame->contentAsMarkup().utf8().data()); - - // Load again with the output html. - frame->loadHTMLString(WebData(html.c_str(), html.length()), testURL); - webkit_support::RunAllPendingMessages(); - - EXPECT_EQ(html, std::string(frame->contentAsMarkup().utf8().data())); - - text = frame->contentAsText(std::numeric_limits<size_t>::max()); - EXPECT_EQ("Hello\n\nWorld", std::string(text.utf8().data())); - - // Test selection check - EXPECT_FALSE(frame->hasSelection()); - frame->executeCommand(WebString::fromUTF8("SelectAll")); - EXPECT_TRUE(frame->hasSelection()); - frame->executeCommand(WebString::fromUTF8("Unselect")); - EXPECT_FALSE(frame->hasSelection()); - WebString selectionHtml = frame->selectionAsMarkup(); - EXPECT_TRUE(selectionHtml.isEmpty()); -} - -class TestExecuteScriptDuringDidCreateScriptContext : public WebFrameClient { -public: - virtual void didCreateScriptContext(WebFrame* frame, v8::Handle<v8::Context> context, int extensionGroup, int worldId) OVERRIDE - { - frame->executeScript(WebScriptSource("window.history = 'replaced';")); - } -}; - -TEST_F(WebFrameTest, ExecuteScriptDuringDidCreateScriptContext) -{ - registerMockedHttpURLLoad("hello_world.html"); - - TestExecuteScriptDuringDidCreateScriptContext webFrameClient; - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "hello_world.html", true, &webFrameClient); - - webView->mainFrame()->reload(); - webkit_support::ServeAsynchronousMockedRequests(); -} - -class TestDidCreateFrameWebFrameClient : public WebFrameClient { -public: - TestDidCreateFrameWebFrameClient() : m_frameCount(0), m_parent(0) - { - } - - virtual void didCreateFrame(WebFrame* parent, WebFrame* child) - { - m_frameCount++; - if (!m_parent) - m_parent = parent; - } - - int m_frameCount; - WebFrame* m_parent; -}; - -TEST_F(WebFrameTest, DidCreateFrame) -{ - registerMockedHttpURLLoad("iframes_test.html"); - registerMockedHttpURLLoad("visible_iframe.html"); - registerMockedHttpURLLoad("invisible_iframe.html"); - registerMockedHttpURLLoad("zero_sized_iframe.html"); - - TestDidCreateFrameWebFrameClient webFrameClient; - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "iframes_test.html", false, &webFrameClient); - - EXPECT_EQ(webFrameClient.m_frameCount, 3); - EXPECT_EQ(webFrameClient.m_parent, webView->mainFrame()); -} - -class FindUpdateWebFrameClient : public WebFrameClient { -public: - FindUpdateWebFrameClient() - : m_findResultsAreReady(false) - , m_count(-1) - { - } - - virtual void reportFindInPageMatchCount(int, int count, bool finalUpdate) OVERRIDE - { - m_count = count; - if (finalUpdate) - m_findResultsAreReady = true; - } - - bool findResultsAreReady() const { return m_findResultsAreReady; } - int count() const { return m_count; } - -private: - bool m_findResultsAreReady; - int m_count; -}; - -TEST_F(WebFrameTest, FindInPageMatchRects) -{ - registerMockedHttpURLLoad("find_in_page.html"); - registerMockedHttpURLLoad("find_in_page_frame.html"); - - FindUpdateWebFrameClient client; - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "find_in_page.html", true, &client); - webView->resize(WebSize(640, 480)); - webView->layout(); - webkit_support::RunAllPendingMessages(); - - static const char* kFindString = "result"; - static const int kFindIdentifier = 12345; - static const int kNumResults = 16; - - WebFindOptions options; - WebString searchText = WebString::fromUTF8(kFindString); - WebFrameImpl* mainFrame = static_cast<WebFrameImpl*>(webView->mainFrame()); - EXPECT_TRUE(mainFrame->find(kFindIdentifier, searchText, options, false, 0)); - - mainFrame->resetMatchCount(); - - for (WebFrame* frame = mainFrame; frame; frame = frame->traverseNext(false)) - frame->scopeStringMatches(kFindIdentifier, searchText, options, true); - - webkit_support::RunAllPendingMessages(); - EXPECT_TRUE(client.findResultsAreReady()); - - WebVector<WebFloatRect> webMatchRects; - mainFrame->findMatchRects(webMatchRects); - ASSERT_EQ(webMatchRects.size(), static_cast<size_t>(kNumResults)); - int rectsVersion = mainFrame->findMatchMarkersVersion(); - - for (int resultIndex = 0; resultIndex < kNumResults; ++resultIndex) { - FloatRect resultRect = static_cast<FloatRect>(webMatchRects[resultIndex]); - - // Select the match by the center of its rect. - EXPECT_EQ(mainFrame->selectNearestFindMatch(resultRect.center(), 0), resultIndex + 1); - - // Check that the find result ordering matches with our expectations. - Range* result = mainFrame->activeMatchFrame()->activeMatch(); - ASSERT_TRUE(result); - result->setEnd(result->endContainer(), result->endOffset() + 3); - EXPECT_EQ(result->text(), String::format("%s %02d", kFindString, resultIndex)); - - // Verify that the expected match rect also matches the currently active match. - // Compare the enclosing rects to prevent precision issues caused by CSS transforms. - FloatRect activeMatch = mainFrame->activeFindMatchRect(); - EXPECT_EQ(enclosingIntRect(activeMatch), enclosingIntRect(resultRect)); - - // The rects version should not have changed. - EXPECT_EQ(mainFrame->findMatchMarkersVersion(), rectsVersion); - } - - // All results after the first two ones should be below between them in find-in-page coordinates. - // This is because results 2 to 9 are inside an iframe located between results 0 and 1. This applies to the fixed div too. - EXPECT_TRUE(webMatchRects[0].y < webMatchRects[1].y); - for (int resultIndex = 2; resultIndex < kNumResults; ++resultIndex) { - EXPECT_TRUE(webMatchRects[0].y < webMatchRects[resultIndex].y); - EXPECT_TRUE(webMatchRects[1].y > webMatchRects[resultIndex].y); - } - - // Result 3 should be below both 2 and 4. This is caused by the CSS transform in the containing div. - // If the transform doesn't work then 3 will be between 2 and 4. - EXPECT_TRUE(webMatchRects[3].y > webMatchRects[2].y); - EXPECT_TRUE(webMatchRects[3].y > webMatchRects[4].y); - - // Results 6, 7, 8 and 9 should be one below the other in that same order. - // If overflow:scroll is not properly handled then result 8 would be below result 9 or - // result 7 above result 6 depending on the scroll. - EXPECT_TRUE(webMatchRects[6].y < webMatchRects[7].y); - EXPECT_TRUE(webMatchRects[7].y < webMatchRects[8].y); - EXPECT_TRUE(webMatchRects[8].y < webMatchRects[9].y); - - // Results 11, 12, 13 and 14 should be between results 10 and 15, as they are inside the table. - EXPECT_TRUE(webMatchRects[11].y > webMatchRects[10].y); - EXPECT_TRUE(webMatchRects[12].y > webMatchRects[10].y); - EXPECT_TRUE(webMatchRects[13].y > webMatchRects[10].y); - EXPECT_TRUE(webMatchRects[14].y > webMatchRects[10].y); - EXPECT_TRUE(webMatchRects[11].y < webMatchRects[15].y); - EXPECT_TRUE(webMatchRects[12].y < webMatchRects[15].y); - EXPECT_TRUE(webMatchRects[13].y < webMatchRects[15].y); - EXPECT_TRUE(webMatchRects[14].y < webMatchRects[15].y); - - // Result 11 should be above 12, 13 and 14 as it's in the table header. - EXPECT_TRUE(webMatchRects[11].y < webMatchRects[12].y); - EXPECT_TRUE(webMatchRects[11].y < webMatchRects[13].y); - EXPECT_TRUE(webMatchRects[11].y < webMatchRects[14].y); - - // Result 11 should also be right to 12, 13 and 14 because of the colspan. - EXPECT_TRUE(webMatchRects[11].x > webMatchRects[12].x); - EXPECT_TRUE(webMatchRects[11].x > webMatchRects[13].x); - EXPECT_TRUE(webMatchRects[11].x > webMatchRects[14].x); - - // Result 12 should be left to results 11, 13 and 14 in the table layout. - EXPECT_TRUE(webMatchRects[12].x < webMatchRects[11].x); - EXPECT_TRUE(webMatchRects[12].x < webMatchRects[13].x); - EXPECT_TRUE(webMatchRects[12].x < webMatchRects[14].x); - - // Results 13, 12 and 14 should be one above the other in that order because of the rowspan - // and vertical-align: middle by default. - EXPECT_TRUE(webMatchRects[13].y < webMatchRects[12].y); - EXPECT_TRUE(webMatchRects[12].y < webMatchRects[14].y); - - // Resizing should update the rects version. - webView->resize(WebSize(800, 600)); - webkit_support::RunAllPendingMessages(); - EXPECT_TRUE(mainFrame->findMatchMarkersVersion() != rectsVersion); - - webView->close(); -} - -TEST_F(WebFrameTest, FindInPageSkipsHiddenFrames) -{ - registerMockedHttpURLLoad("find_in_hidden_frame.html"); - - FindUpdateWebFrameClient client; - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "find_in_hidden_frame.html", true, &client); - webView->resize(WebSize(640, 480)); - webView->layout(); - webkit_support::RunAllPendingMessages(); - - static const char* kFindString = "hello"; - static const int kFindIdentifier = 12345; - static const int kNumResults = 1; - - WebFindOptions options; - WebString searchText = WebString::fromUTF8(kFindString); - WebFrameImpl* mainFrame = static_cast<WebFrameImpl*>(webView->mainFrame()); - EXPECT_TRUE(mainFrame->find(kFindIdentifier, searchText, options, false, 0)); - - mainFrame->resetMatchCount(); - - for (WebFrame* frame = mainFrame; frame; frame = frame->traverseNext(false)) - frame->scopeStringMatches(kFindIdentifier, searchText, options, true); - - webkit_support::RunAllPendingMessages(); - EXPECT_TRUE(client.findResultsAreReady()); - EXPECT_EQ(kNumResults, client.count()); - - webView->close(); -} - -TEST_F(WebFrameTest, FindOnDetachedFrame) -{ - registerMockedHttpURLLoad("find_in_page.html"); - registerMockedHttpURLLoad("find_in_page_frame.html"); - - FindUpdateWebFrameClient client; - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "find_in_page.html", true, &client); - webView->resize(WebSize(640, 480)); - webView->layout(); - webkit_support::RunAllPendingMessages(); - - static const char* kFindString = "result"; - static const int kFindIdentifier = 12345; - - WebFindOptions options; - WebString searchText = WebString::fromUTF8(kFindString); - WebFrameImpl* mainFrame = static_cast<WebFrameImpl*>(webView->mainFrame()); - WebFrameImpl* secondFrame = static_cast<WebFrameImpl*>(mainFrame->traverseNext(false)); - RefPtr<WebCore::Frame> holdSecondFrame = secondFrame->frame(); - - // Detach the frame before finding. - EXPECT_TRUE(mainFrame->document().getElementById("frame").remove()); - - EXPECT_TRUE(mainFrame->find(kFindIdentifier, searchText, options, false, 0)); - EXPECT_FALSE(secondFrame->find(kFindIdentifier, searchText, options, false, 0)); - - webkit_support::RunAllPendingMessages(); - EXPECT_FALSE(client.findResultsAreReady()); - - mainFrame->resetMatchCount(); - - for (WebFrame* frame = mainFrame; frame; frame = frame->traverseNext(false)) - frame->scopeStringMatches(kFindIdentifier, searchText, options, true); - - webkit_support::RunAllPendingMessages(); - EXPECT_TRUE(client.findResultsAreReady()); - - holdSecondFrame.release(); - webView->close(); -} - -TEST_F(WebFrameTest, FindDetachFrameBeforeScopeStrings) -{ - registerMockedHttpURLLoad("find_in_page.html"); - registerMockedHttpURLLoad("find_in_page_frame.html"); - - FindUpdateWebFrameClient client; - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "find_in_page.html", true, &client); - webView->resize(WebSize(640, 480)); - webView->layout(); - webkit_support::RunAllPendingMessages(); - - static const char* kFindString = "result"; - static const int kFindIdentifier = 12345; - - WebFindOptions options; - WebString searchText = WebString::fromUTF8(kFindString); - WebFrameImpl* mainFrame = static_cast<WebFrameImpl*>(webView->mainFrame()); - WebFrameImpl* secondFrame = static_cast<WebFrameImpl*>(mainFrame->traverseNext(false)); - RefPtr<WebCore::Frame> holdSecondFrame = secondFrame->frame(); - - for (WebFrame* frame = mainFrame; frame; frame = frame->traverseNext(false)) - EXPECT_TRUE(frame->find(kFindIdentifier, searchText, options, false, 0)); - - webkit_support::RunAllPendingMessages(); - EXPECT_FALSE(client.findResultsAreReady()); - - // Detach the frame between finding and scoping. - EXPECT_TRUE(mainFrame->document().getElementById("frame").remove()); - - mainFrame->resetMatchCount(); - - for (WebFrame* frame = mainFrame; frame; frame = frame->traverseNext(false)) - frame->scopeStringMatches(kFindIdentifier, searchText, options, true); - - webkit_support::RunAllPendingMessages(); - EXPECT_TRUE(client.findResultsAreReady()); - - holdSecondFrame.release(); - webView->close(); -} - -TEST_F(WebFrameTest, FindDetachFrameWhileScopingStrings) -{ - registerMockedHttpURLLoad("find_in_page.html"); - registerMockedHttpURLLoad("find_in_page_frame.html"); - - FindUpdateWebFrameClient client; - WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "find_in_page.html", true, &client); - webView->resize(WebSize(640, 480)); - webView->layout(); - webkit_support::RunAllPendingMessages(); - - static const char* kFindString = "result"; - static const int kFindIdentifier = 12345; - - WebFindOptions options; - WebString searchText = WebString::fromUTF8(kFindString); - WebFrameImpl* mainFrame = static_cast<WebFrameImpl*>(webView->mainFrame()); - WebFrameImpl* secondFrame = static_cast<WebFrameImpl*>(mainFrame->traverseNext(false)); - RefPtr<WebCore::Frame> holdSecondFrame = secondFrame->frame(); - - for (WebFrame* frame = mainFrame; frame; frame = frame->traverseNext(false)) - EXPECT_TRUE(frame->find(kFindIdentifier, searchText, options, false, 0)); - - webkit_support::RunAllPendingMessages(); - EXPECT_FALSE(client.findResultsAreReady()); - - mainFrame->resetMatchCount(); - - for (WebFrame* frame = mainFrame; frame; frame = frame->traverseNext(false)) - frame->scopeStringMatches(kFindIdentifier, searchText, options, true); - - // The first scopeStringMatches will have reset the state. Detach before it actually scopes. - EXPECT_TRUE(mainFrame->document().getElementById("frame").remove()); - - webkit_support::RunAllPendingMessages(); - EXPECT_TRUE(client.findResultsAreReady()); - - holdSecondFrame.release(); - webView->close(); -} - -static WebView* createWebViewForTextSelection(const std::string& url) -{ - WebView* webView = FrameTestHelpers::createWebViewAndLoad(url, true); - webView->settings()->setDefaultFontSize(12); - webView->enableFixedLayoutMode(false); - webView->resize(WebSize(640, 480)); - return webView; -} - -static WebPoint topLeft(const WebRect& rect) -{ - return WebPoint(rect.x, rect.y); -} - -static WebPoint bottomRightMinusOne(const WebRect& rect) -{ - // FIXME: If we don't subtract 1 from the x- and y-coordinates of the - // selection bounds, selectRange() will select the *next* element. That's - // strictly correct, as hit-testing checks the pixel to the lower-right of - // the input coordinate, but it's a wart on the API. - return WebPoint(rect.x + rect.width - 1, rect.y + rect.height - 1); -} - -static WebRect elementBounds(WebFrame* frame, const WebString& id) -{ - return frame->document().getElementById(id).boundsInViewportSpace(); -} - -static std::string selectionAsString(WebFrame* frame) -{ - return std::string(frame->selectionAsText().utf8().data()); -} - -TEST_F(WebFrameTest, SelectRange) -{ - WebView* webView; - WebFrame* frame; - WebRect startWebRect; - WebRect endWebRect; - - registerMockedHttpURLLoad("select_range_basic.html"); - registerMockedHttpURLLoad("select_range_scroll.html"); - registerMockedHttpURLLoad("select_range_iframe.html"); - registerMockedHttpURLLoad("select_range_editable.html"); - - webView = createWebViewForTextSelection(m_baseURL + "select_range_basic.html"); - frame = webView->mainFrame(); - EXPECT_EQ("Some test text for testing.", selectionAsString(frame)); - webView->selectionBounds(startWebRect, endWebRect); - frame->executeCommand(WebString::fromUTF8("Unselect")); - EXPECT_EQ("", selectionAsString(frame)); - frame->selectRange(topLeft(startWebRect), bottomRightMinusOne(endWebRect)); - EXPECT_EQ("Some test text for testing.", selectionAsString(frame)); - webView->close(); - - webView = createWebViewForTextSelection(m_baseURL + "select_range_scroll.html"); - frame = webView->mainFrame(); - EXPECT_EQ("Some offscreen test text for testing.", selectionAsString(frame)); - webView->selectionBounds(startWebRect, endWebRect); - frame->executeCommand(WebString::fromUTF8("Unselect")); - EXPECT_EQ("", selectionAsString(frame)); - frame->selectRange(topLeft(startWebRect), bottomRightMinusOne(endWebRect)); - EXPECT_EQ("Some offscreen test text for testing.", selectionAsString(frame)); - webView->close(); - - webView = createWebViewForTextSelection(m_baseURL + "select_range_iframe.html"); - frame = webView->mainFrame(); - WebFrame* subframe = frame->findChildByExpression(WebString::fromUTF8("/html/body/iframe")); - EXPECT_EQ("Some test text for testing.", selectionAsString(subframe)); - webView->selectionBounds(startWebRect, endWebRect); - subframe->executeCommand(WebString::fromUTF8("Unselect")); - EXPECT_EQ("", selectionAsString(subframe)); - subframe->selectRange(topLeft(startWebRect), bottomRightMinusOne(endWebRect)); - EXPECT_EQ("Some test text for testing.", selectionAsString(subframe)); - webView->close(); - - // Select the middle of an editable element, then try to extend the selection to the top of the document. - // The selection range should be clipped to the bounds of the editable element. - webView = createWebViewForTextSelection(m_baseURL + "select_range_editable.html"); - frame = webView->mainFrame(); - EXPECT_EQ("This text is initially selected.", selectionAsString(frame)); - webView->selectionBounds(startWebRect, endWebRect); - frame->selectRange(bottomRightMinusOne(endWebRect), WebPoint(0, 0)); - EXPECT_EQ("16-char header. This text is initially selected.", selectionAsString(frame)); - webView->close(); - - // As above, but extending the selection to the bottom of the document. - webView = createWebViewForTextSelection(m_baseURL + "select_range_editable.html"); - frame = webView->mainFrame(); - EXPECT_EQ("This text is initially selected.", selectionAsString(frame)); - webView->selectionBounds(startWebRect, endWebRect); - frame->selectRange(topLeft(startWebRect), WebPoint(640, 480)); - EXPECT_EQ("This text is initially selected. 16-char footer.", selectionAsString(frame)); - webView->close(); -} - -TEST_F(WebFrameTest, SelectRangeCanMoveSelectionStart) -{ - registerMockedHttpURLLoad("text_selection.html"); - WebView* webView = createWebViewForTextSelection(m_baseURL + "text_selection.html"); - WebFrame* frame = webView->mainFrame(); - - // Select second span. We can move the start to include the first span. - frame->executeScript(WebScriptSource("selectElement('header_2');")); - EXPECT_EQ("Header 2.", selectionAsString(frame)); - frame->selectRange(bottomRightMinusOne(elementBounds(frame, "header_2")), topLeft(elementBounds(frame, "header_1"))); - EXPECT_EQ("Header 1. Header 2.", selectionAsString(frame)); - - // We can move the start and end together. - frame->executeScript(WebScriptSource("selectElement('header_1');")); - EXPECT_EQ("Header 1.", selectionAsString(frame)); - frame->selectRange(bottomRightMinusOne(elementBounds(frame, "header_1")), bottomRightMinusOne(elementBounds(frame, "header_1"))); - EXPECT_EQ("", selectionAsString(frame)); - // Selection is a caret, not empty. - EXPECT_FALSE(frame->selectionRange().isNull()); - - // We can move the start across the end. - frame->executeScript(WebScriptSource("selectElement('header_1');")); - EXPECT_EQ("Header 1.", selectionAsString(frame)); - frame->selectRange(bottomRightMinusOne(elementBounds(frame, "header_1")), bottomRightMinusOne(elementBounds(frame, "header_2"))); - EXPECT_EQ(" Header 2.", selectionAsString(frame)); - - // Can't extend the selection part-way into an editable element. - frame->executeScript(WebScriptSource("selectElement('footer_2');")); - EXPECT_EQ("Footer 2.", selectionAsString(frame)); - frame->selectRange(bottomRightMinusOne(elementBounds(frame, "footer_2")), topLeft(elementBounds(frame, "editable_2"))); - EXPECT_EQ(" [ Footer 1. Footer 2.", selectionAsString(frame)); - - // Can extend the selection completely across editable elements. - frame->executeScript(WebScriptSource("selectElement('footer_2');")); - EXPECT_EQ("Footer 2.", selectionAsString(frame)); - frame->selectRange(bottomRightMinusOne(elementBounds(frame, "footer_2")), topLeft(elementBounds(frame, "header_2"))); - EXPECT_EQ("Header 2. ] [ Editable 1. Editable 2. ] [ Footer 1. Footer 2.", selectionAsString(frame)); - - // If the selection is editable text, we can't extend it into non-editable text. - frame->executeScript(WebScriptSource("selectElement('editable_2');")); - EXPECT_EQ("Editable 2.", selectionAsString(frame)); - frame->selectRange(bottomRightMinusOne(elementBounds(frame, "editable_2")), topLeft(elementBounds(frame, "header_2"))); - EXPECT_EQ("[ Editable 1. Editable 2.", selectionAsString(frame)); - - webView->close(); -} - -TEST_F(WebFrameTest, SelectRangeCanMoveSelectionEnd) -{ - registerMockedHttpURLLoad("text_selection.html"); - WebView* webView = createWebViewForTextSelection(m_baseURL + "text_selection.html"); - WebFrame* frame = webView->mainFrame(); - - // Select first span. We can move the end to include the second span. - frame->executeScript(WebScriptSource("selectElement('header_1');")); - EXPECT_EQ("Header 1.", selectionAsString(frame)); - frame->selectRange(topLeft(elementBounds(frame, "header_1")), bottomRightMinusOne(elementBounds(frame, "header_2"))); - EXPECT_EQ("Header 1. Header 2.", selectionAsString(frame)); - - // We can move the start and end together. - frame->executeScript(WebScriptSource("selectElement('header_2');")); - EXPECT_EQ("Header 2.", selectionAsString(frame)); - frame->selectRange(topLeft(elementBounds(frame, "header_2")), topLeft(elementBounds(frame, "header_2"))); - EXPECT_EQ("", selectionAsString(frame)); - // Selection is a caret, not empty. - EXPECT_FALSE(frame->selectionRange().isNull()); - - // We can move the end across the start. - frame->executeScript(WebScriptSource("selectElement('header_2');")); - EXPECT_EQ("Header 2.", selectionAsString(frame)); - frame->selectRange(topLeft(elementBounds(frame, "header_2")), topLeft(elementBounds(frame, "header_1"))); - EXPECT_EQ("Header 1. ", selectionAsString(frame)); - - // Can't extend the selection part-way into an editable element. - frame->executeScript(WebScriptSource("selectElement('header_1');")); - EXPECT_EQ("Header 1.", selectionAsString(frame)); - frame->selectRange(topLeft(elementBounds(frame, "header_1")), bottomRightMinusOne(elementBounds(frame, "editable_1"))); - EXPECT_EQ("Header 1. Header 2. ] ", selectionAsString(frame)); - - // Can extend the selection completely across editable elements. - frame->executeScript(WebScriptSource("selectElement('header_1');")); - EXPECT_EQ("Header 1.", selectionAsString(frame)); - frame->selectRange(topLeft(elementBounds(frame, "header_1")), bottomRightMinusOne(elementBounds(frame, "footer_1"))); - EXPECT_EQ("Header 1. Header 2. ] [ Editable 1. Editable 2. ] [ Footer 1.", selectionAsString(frame)); - - // If the selection is editable text, we can't extend it into non-editable text. - frame->executeScript(WebScriptSource("selectElement('editable_1');")); - EXPECT_EQ("Editable 1.", selectionAsString(frame)); - frame->selectRange(topLeft(elementBounds(frame, "editable_1")), bottomRightMinusOne(elementBounds(frame, "footer_1"))); - EXPECT_EQ("Editable 1. Editable 2. ]", selectionAsString(frame)); - - webView->close(); -} - -class DisambiguationPopupTestWebViewClient : public WebViewClient { -public: - virtual bool didTapMultipleTargets(const WebGestureEvent&, const WebVector<WebRect>& targetRects) OVERRIDE - { - EXPECT_GE(targetRects.size(), 2u); - m_triggered = true; - return true; - } - - bool triggered() const { return m_triggered; } - void resetTriggered() { m_triggered = false; } - bool m_triggered; -}; - -static WebGestureEvent fatTap(int x, int y) -{ - WebGestureEvent event; - event.type = WebInputEvent::GestureTap; - event.x = x; - event.y = y; - event.data.tap.width = 50; - event.data.tap.height = 50; - return event; -} - -TEST_F(WebFrameTest, DisambiguationPopupTest) -{ - registerMockedHttpURLLoad("disambiguation_popup.html"); - - DisambiguationPopupTestWebViewClient client; - - // Make sure we initialize to minimum scale, even if the window size - // only becomes available after the load begins. - WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(FrameTestHelpers::createWebViewAndLoad(m_baseURL + "disambiguation_popup.html", true, 0, &client)); - webViewImpl->resize(WebSize(1000, 1000)); - webViewImpl->layout(); - - client.resetTriggered(); - webViewImpl->handleInputEvent(fatTap(0, 0)); - EXPECT_FALSE(client.triggered()); - - client.resetTriggered(); - webViewImpl->handleInputEvent(fatTap(200, 115)); - EXPECT_FALSE(client.triggered()); - - for (int i = 0; i <= 46; i++) { - client.resetTriggered(); - webViewImpl->handleInputEvent(fatTap(120, 230 + i * 5)); - - int j = i % 10; - if (j >= 7 && j <= 9) - EXPECT_TRUE(client.triggered()); - else - EXPECT_FALSE(client.triggered()); - } - - for (int i = 0; i <= 46; i++) { - client.resetTriggered(); - webViewImpl->handleInputEvent(fatTap(10 + i * 5, 590)); - - int j = i % 10; - if (j >= 7 && j <= 9) - EXPECT_TRUE(client.triggered()); - else - EXPECT_FALSE(client.triggered()); - } - -} - -class TestSubstituteDataWebFrameClient : public WebFrameClient { -public: - TestSubstituteDataWebFrameClient() - : m_commitCalled(false) - { - } - - virtual void didFailProvisionalLoad(WebFrame* frame, const WebURLError& error) - { - frame->loadHTMLString("This should appear", toKURL("data:text/html,chromewebdata"), error.unreachableURL, true); - webkit_support::RunAllPendingMessages(); - } - - virtual void didCommitProvisionalLoad(WebFrame* frame, bool) - { - if (frame->dataSource()->response().url() != WebURL(URLTestHelpers::toKURL("about:blank"))) - m_commitCalled = true; - } - - bool commitCalled() const { return m_commitCalled; } - -private: - bool m_commitCalled; -}; - -TEST_F(WebFrameTest, ReplaceNavigationAfterHistoryNavigation) -{ - TestSubstituteDataWebFrameClient webFrameClient; - - WebView* webView = FrameTestHelpers::createWebViewAndLoad("about:blank", true, &webFrameClient); - webkit_support::RunAllPendingMessages(); - WebFrame* frame = webView->mainFrame(); - - // Load a url as a history navigation that will return an error. TestSubstituteDataWebFrameClient - // will start a SubstituteData load in response to the load failure, which should get fully committed. - // Due to https://bugs.webkit.org/show_bug.cgi?id=91685, FrameLoader::didReceiveData() wasn't getting - // called in this case, which resulted in the SubstituteData document not getting displayed. - WebURLError error; - error.reason = 1337; - error.domain = "WebFrameTest"; - std::string errorURL = "http://0.0.0.0"; - WebURLResponse response; - response.initialize(); - response.setURL(URLTestHelpers::toKURL(errorURL)); - response.setMIMEType("text/html"); - response.setHTTPStatusCode(500); - WebHistoryItem errorHistoryItem; - errorHistoryItem.initialize(); - errorHistoryItem.setURLString(WebString::fromUTF8(errorURL.c_str(), errorURL.length())); - errorHistoryItem.setOriginalURLString(WebString::fromUTF8(errorURL.c_str(), errorURL.length())); - webkit_support::RegisterMockedErrorURL(URLTestHelpers::toKURL(errorURL), response, error); - frame->loadHistoryItem(errorHistoryItem); - webkit_support::ServeAsynchronousMockedRequests(); - - WebString text = frame->contentAsText(std::numeric_limits<size_t>::max()); - EXPECT_EQ("This should appear", std::string(text.utf8().data())); - EXPECT_TRUE(webFrameClient.commitCalled()); -} - -} // namespace |
