#include "WebTextCheckingResult.h"
#include "WebViewClient.h"
#include "WebViewImpl.h"
-#include "core/dom/Clipboard.h"
+#include "core/clipboard/Clipboard.h"
#include "core/dom/DocumentMarkerController.h"
-#include "core/events/MouseEvent.h"
#include "core/dom/Range.h"
#include "core/editing/Editor.h"
#include "core/editing/FrameSelection.h"
#include "core/editing/SpellChecker.h"
#include "core/editing/VisiblePosition.h"
+#include "core/events/MouseEvent.h"
#include "core/html/HTMLFormElement.h"
#include "core/loader/FrameLoadRequest.h"
#include "core/page/EventHandler.h"
#include "core/frame/Frame.h"
#include "core/frame/FrameView.h"
-#include "core/page/Settings.h"
-#include "core/platform/ScrollbarTheme.h"
+#include "core/frame/Settings.h"
#include "core/rendering/HitTestResult.h"
#include "core/rendering/RenderLayerCompositor.h"
#include "core/rendering/RenderView.h"
#include "core/rendering/TextAutosizer.h"
#include "platform/geometry/FloatRect.h"
#include "platform/network/ResourceError.h"
+#include "platform/scroll/ScrollbarTheme.h"
#include "v8.h"
#include "public/platform/Platform.h"
#include "public/platform/WebFloatRect.h"
#include "wtf/Forward.h"
#include <map>
-using namespace WebKit;
+using namespace blink;
using WebCore::Document;
using WebCore::DocumentMarker;
using WebCore::Element;
using WebCore::FloatRect;
using WebCore::HitTestRequest;
using WebCore::Range;
-using WebKit::URLTestHelpers::toKURL;
-using WebKit::FrameTestHelpers::runPendingTasks;
+using blink::URLTestHelpers::toKURL;
+using blink::FrameTestHelpers::runPendingTasks;
namespace {
EXPECT_EQ(a.width(), b.width()); \
EXPECT_EQ(a.height(), b.height());
-class FakeWebFrameClient : public WebFrameClient {
- // To make the destructor public.
-};
-
class FakeCompositingWebViewClient : public WebViewClient {
public:
virtual ~FakeCompositingWebViewClient()
return m_layerTreeView.get();
}
- FakeWebFrameClient m_fakeWebFrameClient;
-
private:
OwnPtr<WebLayerTreeView> m_layerTreeView;
};
void executeScript(const WebString& code)
{
m_frame->executeScript(WebScriptSource(code));
+ m_frame->view()->layout();
runPendingTasks();
}
WebFrame* m_frame;
};
-// crbug.com/310440
-TEST_F(WebFrameCSSCallbackTest, DISABLED_AuthorStyleSheet)
+TEST_F(WebFrameCSSCallbackTest, AuthorStyleSheet)
{
loadHTML(
"<style>"
std::vector<WebString> selectors;
selectors.push_back(WebString::fromUTF8("div.initial_on"));
m_frame->document().watchCSSSelectors(WebVector<WebString>(selectors));
+ m_frame->view()->layout();
runPendingTasks();
EXPECT_EQ(1, updateCount());
EXPECT_THAT(matchedSelectors(), testing::ElementsAre("div.initial_on"));
// Check that adding a watched selector calls back for already-present nodes.
selectors.push_back(WebString::fromUTF8("div.initial_off"));
doc().watchCSSSelectors(WebVector<WebString>(selectors));
+ m_frame->view()->layout();
runPendingTasks();
EXPECT_EQ(2, updateCount());
EXPECT_THAT(matchedSelectors(), testing::ElementsAre("div.initial_off", "div.initial_on"));
// Check that we can turn off callbacks for certain selectors.
doc().watchCSSSelectors(WebVector<WebString>());
+ m_frame->view()->layout();
runPendingTasks();
EXPECT_EQ(3, updateCount());
EXPECT_THAT(matchedSelectors(), testing::ElementsAre());
EXPECT_THAT(matchedSelectors(), testing::ElementsAre());
}
-TEST_F(WebFrameCSSCallbackTest, DISABLED_CatchesAttributeChange)
+TEST_F(WebFrameCSSCallbackTest, CatchesAttributeChange)
{
loadHTML("<span></span>");
EXPECT_THAT(matchedSelectors(), testing::ElementsAre("span[attr=\"value\"]"));
}
-TEST_F(WebFrameCSSCallbackTest, DISABLED_DisplayNone)
+TEST_F(WebFrameCSSCallbackTest, DisplayNone)
{
loadHTML("<div style='display:none'><span></span></div>");
EXPECT_THAT(matchedSelectors(), testing::ElementsAre());
}
-// Flaky on Win7 and Mac dbg: crbug.com/314554
-#if (OS(MACOSX) || OS(WIN)) && !defined(NDEBUG)
-TEST_F(WebFrameCSSCallbackTest, FLAKY_Reparenting)
-#else
TEST_F(WebFrameCSSCallbackTest, Reparenting)
-#endif
{
loadHTML(
"<div id='d1'><span></span></div>"
std::vector<WebString> selectors;
selectors.push_back(WebString::fromUTF8("span"));
doc().watchCSSSelectors(WebVector<WebString>(selectors));
+ m_frame->view()->layout();
runPendingTasks();
EXPECT_EQ(1, updateCount());
EXPECT_THAT(matchedSelectors(), testing::ElementsAre("span"));
}
-// Flaky: crbug.com/310440
-TEST_F(WebFrameCSSCallbackTest, DISABLED_MultiSelector)
+TEST_F(WebFrameCSSCallbackTest, MultiSelector)
{
loadHTML("<span></span>");
selectors.push_back(WebString::fromUTF8("span"));
selectors.push_back(WebString::fromUTF8("span,p"));
doc().watchCSSSelectors(WebVector<WebString>(selectors));
-
+ m_frame->view()->layout();
runPendingTasks();
+
EXPECT_EQ(1, updateCount());
EXPECT_THAT(matchedSelectors(), testing::ElementsAre("span", "span, p"));
}
-// Flaky on MacOS https://code.google.com/p/chromium/issues/detail?id=310361
-#if OS(MACOSX)
-TEST_F(WebFrameCSSCallbackTest, DISABLED_InvalidSelector)
-#else
TEST_F(WebFrameCSSCallbackTest, InvalidSelector)
-#endif
{
loadHTML("<p><span></span></p>");
selectors.push_back(WebString::fromUTF8("[")); // Invalid.
selectors.push_back(WebString::fromUTF8("p span")); // Not compound.
doc().watchCSSSelectors(WebVector<WebString>(selectors));
-
+ m_frame->view()->layout();
runPendingTasks();
+
EXPECT_EQ(1, updateCount());
EXPECT_THAT(matchedSelectors(), testing::ElementsAre("span"))
<< "An invalid selector shouldn't prevent other selectors from matching.";
EXPECT_EQ(std::string::npos, content.find("Message 2."));
}
+TEST_F(WebFrameTest, PostMessageThenDetach)
+{
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad("about:blank");
+
+ RefPtr<WebCore::Frame> frame = webViewHelper.webViewImpl()->page()->mainFrame();
+ WebCore::NonThrowableExceptionState exceptionState;
+ frame->domWindow()->postMessage(WebCore::SerializedScriptValue::create("message"), 0, "*", frame->domWindow(), exceptionState);
+ webViewHelper.reset();
+ EXPECT_FALSE(exceptionState.hadException());
+
+ // Success is not crashing.
+ runPendingTasks();
+}
+
class FixedLayoutTestWebViewClient : public WebViewClient {
public:
virtual WebScreenInfo screenInfo() OVERRIDE { return m_screenInfo; }
WebScreenInfo m_screenInfo;
};
+// Viewport settings need to be set before the page gets loaded
+static void enableViewportSettings(WebSettings* settings)
+{
+ settings->setViewportMetaEnabled(true);
+ settings->setViewportEnabled(true);
+ settings->setMainFrameResizesAreOrientationChanges(true);
+}
+
TEST_F(WebFrameTest, FrameViewNeedsLayoutOnFixedLayoutResize)
{
UseMockScrollbarSettings mockScrollbarSettings;
// Make sure we initialize to minimum scale, even if the window size
// only becomes available after the load begins.
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webView()->layout();
// Make sure we initialize to minimum scale, even if the window size
// only becomes available after the load begins.
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client, enableViewportSettings);
WebCore::Document* document = webViewHelper.webViewImpl()->page()->mainFrame()->document();
document->settings()->setTextAutosizingEnabled(true);
int fixedLayoutHeight = viewportHeight / 2;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html");
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, 0, enableViewportSettings);
webViewHelper.webView()->setFixedLayoutSize(WebSize(fixedLayoutWidth, fixedLayoutHeight));
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webView()->layout();
int fixedLayoutHeight = viewportHeight / 2;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html");
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, 0, enableViewportSettings);
webViewHelper.webView()->setFixedLayoutSize(WebSize(fixedLayoutWidth, fixedLayoutHeight));
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webView()->layout();
int fixedLayoutHeight = viewportHeight * 2;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html");
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, 0, enableViewportSettings);
webViewHelper.webView()->setFixedLayoutSize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webView()->layout();
client.m_screenInfo.deviceScaleFactor = 1;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "200-by-300.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "200-by-300.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->resize(WebSize(windowWidth, windowHeight));
webViewHelper.webView()->setFixedLayoutSize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webView()->layout();
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "no_viewport_tag.html", true, 0, &client);
+ webViewHelper.initializeAndLoad(m_baseURL + "no_viewport_tag.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setSupportDeprecatedTargetDensityDPI(true);
webViewHelper.webView()->settings()->setUseWideViewport(true);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webView()->setFixedLayoutSize(WebSize(viewportWidth, viewportHeight));
EXPECT_EQ(980, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->contentsSize().width());
}
+TEST_F(WebFrameTest, ZeroHeightPositiveWidthNotIgnored)
+{
+ UseMockScrollbarSettings mockScrollbarSettings;
+
+ FixedLayoutTestWebViewClient client;
+ client.m_screenInfo.deviceScaleFactor = 1;
+ int viewportWidth = 1280;
+ int viewportHeight = 0;
+
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initialize(true, 0, &client, enableViewportSettings);
+ webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
+
+ EXPECT_EQ(viewportWidth, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().width());
+ EXPECT_EQ(viewportHeight, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().height());
+}
+
TEST_F(WebFrameTest, DeviceScaleFactorUsesDefaultWithoutViewportTag)
{
UseMockScrollbarSettings mockScrollbarSettings;
client.m_screenInfo.deviceScaleFactor = 2;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "no_viewport_tag.html", true, 0, &client);
+ webViewHelper.initializeAndLoad(m_baseURL + "no_viewport_tag.html", true, 0, &client, enableViewportSettings);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webView()->layout();
// Make sure we initialize to minimum scale, even if the window size
// only becomes available after the load begins.
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
int defaultFixedLayoutWidth = 980;
// Make sure we initialize to minimum scale, even if the window size
// only becomes available after the load begins.
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "wide_document.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "wide_document.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
int wideDocumentWidth = 1500;
EXPECT_EQ(userPinchPageScaleFactor, webViewHelper.webView()->pageScaleFactor());
}
+TEST_F(WebFrameTest, DelayedViewportInitialScale)
+{
+ UseMockScrollbarSettings mockScrollbarSettings;
+ registerMockedHttpURLLoad("viewport-auto-initial-scale.html");
+
+ FixedLayoutTestWebViewClient client;
+ client.m_screenInfo.deviceScaleFactor = 1;
+ int viewportWidth = 640;
+ int viewportHeight = 480;
+
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-auto-initial-scale.html", true, 0, &client, enableViewportSettings);
+ webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
+
+ EXPECT_EQ(0.25f, webViewHelper.webView()->pageScaleFactor());
+
+ WebCore::Document* document = webViewHelper.webViewImpl()->page()->mainFrame()->document();
+ WebCore::ViewportDescription description = document->viewportDescription();
+ description.zoom = 2;
+ document->setViewportDescription(description);
+ webViewHelper.webView()->layout();
+ EXPECT_EQ(2, webViewHelper.webView()->pageScaleFactor());
+}
+
TEST_F(WebFrameTest, setLoadWithOverviewModeToFalse)
{
UseMockScrollbarSettings mockScrollbarSettings;
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "viewport-auto-initial-scale.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-auto-initial-scale.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
webViewHelper.webView()->settings()->setLoadWithOverviewMode(false);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "large-div.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "large-div.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setLoadWithOverviewMode(false);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
webViewHelper.webView()->settings()->setUseWideViewport(false);
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "viewport-auto-initial-scale.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-auto-initial-scale.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
webViewHelper.webView()->settings()->setUseWideViewport(false);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "viewport-wide-2x-initial-scale.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-wide-2x-initial-scale.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
webViewHelper.webView()->settings()->setUseWideViewport(false);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "no_viewport_tag.html", true, 0, &client);
+ webViewHelper.initializeAndLoad(m_baseURL + "no_viewport_tag.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
webViewHelper.webView()->settings()->setUseWideViewport(true);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
EXPECT_EQ(980, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->contentsSize().width());
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "viewport-height-1000.html", true, 0, &client);
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-height-1000.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
webViewHelper.webView()->settings()->setUseWideViewport(false);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
EXPECT_EQ(viewportWidth, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->contentsSize().width());
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "viewport-2x-initial-scale.html", true, 0, &client);
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-2x-initial-scale.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
webViewHelper.webView()->settings()->setUseWideViewport(true);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
EXPECT_EQ(980, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->contentsSize().width());
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "viewport-wide-2x-initial-scale.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-wide-2x-initial-scale.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setLoadWithOverviewMode(false);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
float enforcedPageScaleFactor = 2.0f;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client);
+ webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
webViewHelper.webView()->settings()->setLoadWithOverviewMode(false);
webViewHelper.webView()->setInitialPageScaleOverride(enforcedPageScaleFactor);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
webViewHelper.webView()->layout();
EXPECT_EQ(enforcedPageScaleFactor, webViewHelper.webView()->pageScaleFactor());
client.m_screenInfo.deviceScaleFactor = 1;
int viewportWidth = 640;
int viewportHeight = 480;
- float enforcedPageScalePactor = 0.5f;
+ float enforcedPageScaleFactor = 0.5f;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "viewport-auto-initial-scale.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-auto-initial-scale.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setLoadWithOverviewMode(false);
- webViewHelper.webView()->setInitialPageScaleOverride(enforcedPageScalePactor);
+ webViewHelper.webView()->setInitialPageScaleOverride(enforcedPageScaleFactor);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
- EXPECT_EQ(enforcedPageScalePactor, webViewHelper.webView()->pageScaleFactor());
+ EXPECT_EQ(enforcedPageScaleFactor, webViewHelper.webView()->pageScaleFactor());
}
TEST_F(WebFrameTest, PermanentInitialPageScaleFactorOverridesPageViewportInitialScale)
client.m_screenInfo.deviceScaleFactor = 1;
int viewportWidth = 640;
int viewportHeight = 480;
- float enforcedPageScalePactor = 0.5f;
+ float enforcedPageScaleFactor = 0.5f;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "viewport-wide-2x-initial-scale.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
- webViewHelper.webView()->setInitialPageScaleOverride(enforcedPageScalePactor);
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-wide-2x-initial-scale.html", true, 0, &client, enableViewportSettings);
+ webViewHelper.webView()->setInitialPageScaleOverride(enforcedPageScaleFactor);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
- EXPECT_EQ(enforcedPageScalePactor, webViewHelper.webView()->pageScaleFactor());
+ EXPECT_EQ(enforcedPageScaleFactor, webViewHelper.webView()->pageScaleFactor());
+}
+
+TEST_F(WebFrameTest, SmallPermanentInitialPageScaleFactorIsClobbered)
+{
+ UseMockScrollbarSettings mockScrollbarSettings;
+ const char* pages[] = {
+ // These pages trigger the clobbering condition. There must be a matching item in "pageScaleFactors" array.
+ "viewport-device-0.5x-initial-scale.html",
+ "viewport-initial-scale-1.html",
+ // These ones do not.
+ "viewport-auto-initial-scale.html",
+ "viewport-target-densitydpi-device-and-fixed-width.html"
+ };
+ float pageScaleFactors[] = { 0.5f, 1.0f };
+ for (size_t i = 0; i < ARRAY_SIZE(pages); ++i)
+ registerMockedHttpURLLoad(pages[i]);
+
+ FixedLayoutTestWebViewClient client;
+ client.m_screenInfo.deviceScaleFactor = 1;
+ int viewportWidth = 400;
+ int viewportHeight = 300;
+ float enforcedPageScaleFactor = 0.75f;
+
+ for (size_t i = 0; i < ARRAY_SIZE(pages); ++i) {
+ for (int quirkEnabled = 0; quirkEnabled <= 1; ++quirkEnabled) {
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad(m_baseURL + pages[i], true, 0, &client, enableViewportSettings);
+ webViewHelper.webView()->settings()->setClobberUserAgentInitialScaleQuirk(quirkEnabled);
+ webViewHelper.webView()->setInitialPageScaleOverride(enforcedPageScaleFactor);
+ webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
+
+ float expectedPageScaleFactor = quirkEnabled && i < ARRAY_SIZE(pageScaleFactors) ? pageScaleFactors[i] : enforcedPageScaleFactor;
+ EXPECT_EQ(expectedPageScaleFactor, webViewHelper.webView()->pageScaleFactor());
+ }
+ }
+}
+
+TEST_F(WebFrameTest, PermanentInitialPageScaleFactorAffectsLayoutWidth)
+{
+ UseMockScrollbarSettings mockScrollbarSettings;
+
+ FixedLayoutTestWebViewClient client;
+ client.m_screenInfo.deviceScaleFactor = 1;
+ int viewportWidth = 640;
+ int viewportHeight = 480;
+ float enforcedPageScaleFactor = 0.5;
+
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad("about:blank", true, 0, &client, enableViewportSettings);
+ webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
+ webViewHelper.webView()->settings()->setUseWideViewport(false);
+ webViewHelper.webView()->settings()->setLoadWithOverviewMode(false);
+ webViewHelper.webView()->setInitialPageScaleOverride(enforcedPageScaleFactor);
+ webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
+
+ EXPECT_EQ(viewportWidth / enforcedPageScaleFactor, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->contentsSize().width());
+ EXPECT_EQ(enforcedPageScaleFactor, webViewHelper.webView()->pageScaleFactor());
}
TEST_F(WebFrameTest, WideViewportInitialScaleDoesNotExpandFixedLayoutWidth)
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "viewport-device-0.5x-initial-scale.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-device-0.5x-initial-scale.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
webViewHelper.webView()->settings()->setUseWideViewport(true);
webViewHelper.webView()->settings()->setViewportMetaLayoutSizeQuirk(true);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
EXPECT_EQ(viewportWidth, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().width());
+ EXPECT_EQ(1, webViewHelper.webView()->pageScaleFactor());
+
+ webViewHelper.webView()->setFixedLayoutSize(WebSize(2000, 1500));
+ webViewHelper.webView()->layout();
+ EXPECT_EQ(2000, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().width());
+ EXPECT_EQ(0.5f, webViewHelper.webView()->pageScaleFactor());
}
TEST_F(WebFrameTest, WideViewportAndWideContentWithInitialScale)
int viewportHeight = 800;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad("about:blank", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad("about:blank", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
webViewHelper.webView()->settings()->setUseWideViewport(true);
webViewHelper.webView()->settings()->setViewportMetaLayoutSizeQuirk(true);
EXPECT_EQ(minimumPageScaleFactor, webViewHelper.webView()->minimumPageScaleFactor());
}
+TEST_F(WebFrameTest, WideViewportQuirkClobbersHeight)
+{
+ UseMockScrollbarSettings mockScrollbarSettings;
+ registerMockedHttpURLLoad("viewport-height-1000.html");
+
+ FixedLayoutTestWebViewClient client;
+ client.m_screenInfo.deviceScaleFactor = 1;
+ int viewportWidth = 600;
+ int viewportHeight = 800;
+
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad("about:blank", true, 0, &client, enableViewportSettings);
+ webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
+ webViewHelper.webView()->settings()->setUseWideViewport(false);
+ webViewHelper.webView()->settings()->setViewportMetaLayoutSizeQuirk(true);
+ webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
+
+ FrameTestHelpers::loadFrame(webViewHelper.webView()->mainFrame(), m_baseURL + "viewport-height-1000.html");
+ Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests();
+ webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
+
+ EXPECT_EQ(800, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().height());
+ EXPECT_EQ(1, webViewHelper.webView()->pageScaleFactor());
+}
+
+TEST_F(WebFrameTest, LayoutSize320Quirk)
+{
+ UseMockScrollbarSettings mockScrollbarSettings;
+ registerMockedHttpURLLoad("viewport/viewport-30.html");
+
+ FixedLayoutTestWebViewClient client;
+ client.m_screenInfo.deviceScaleFactor = 1;
+ int viewportWidth = 600;
+ int viewportHeight = 800;
+
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad("about:blank", true, 0, &client, enableViewportSettings);
+ webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
+ webViewHelper.webView()->settings()->setUseWideViewport(true);
+ webViewHelper.webView()->settings()->setViewportMetaLayoutSizeQuirk(true);
+ webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
+
+ FrameTestHelpers::loadFrame(webViewHelper.webView()->mainFrame(), m_baseURL + "viewport/viewport-30.html");
+ Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests();
+ webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
+
+ EXPECT_EQ(600, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().width());
+ EXPECT_EQ(800, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().height());
+ EXPECT_EQ(1, webViewHelper.webView()->pageScaleFactor());
+
+ // The magic number to snap to device-width is 320, so test that 321 is
+ // respected.
+ WebCore::Document* document = webViewHelper.webViewImpl()->page()->mainFrame()->document();
+ WebCore::ViewportDescription description = document->viewportDescription();
+ description.minWidth = WebCore::Length(321, WebCore::Fixed);
+ description.maxWidth = WebCore::Length(321, WebCore::Fixed);
+ document->setViewportDescription(description);
+ webViewHelper.webView()->layout();
+ EXPECT_EQ(321, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().width());
+
+ description.minWidth = WebCore::Length(320, WebCore::Fixed);
+ description.maxWidth = WebCore::Length(320, WebCore::Fixed);
+ document->setViewportDescription(description);
+ webViewHelper.webView()->layout();
+ EXPECT_EQ(600, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().width());
+}
+
TEST_F(WebFrameTest, ZeroValuesQuirk)
{
UseMockScrollbarSettings mockScrollbarSettings;
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initialize(true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initialize(true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setViewportMetaZeroValuesQuirk(true);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
+ webViewHelper.webView()->settings()->setViewportMetaLayoutSizeQuirk(true);
FrameTestHelpers::loadFrame(webViewHelper.webView()->mainFrame(), m_baseURL + "viewport-zero-values.html");
Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests();
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
float expectedPageScaleFactor = 0.5f;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initialize(true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initialize(true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setViewportMetaZeroValuesQuirk(true);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
FrameTestHelpers::loadFrame(webViewHelper.webView()->mainFrame(), m_baseURL + "viewport-nonzero-values.html");
EXPECT_EQ(expectedPageScaleFactor, webViewHelper.webView()->pageScaleFactor());
}
-TEST_F(WebFrameTest, ScaleFactorShouldNotOscillate)
-{
- UseMockScrollbarSettings mockScrollbarSettings;
- registerMockedHttpURLLoad("scale_oscillate.html");
-
- FixedLayoutTestWebViewClient client;
- client.m_screenInfo.deviceScaleFactor = static_cast<float>(1.325);
- int viewportWidth = 800;
- int viewportHeight = 1057;
-
- FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "scale_oscillate.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
- webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
- webViewHelper.webView()->layout();
-}
-
TEST_F(WebFrameTest, setPageScaleFactorDoesNotLayout)
{
UseMockScrollbarSettings mockScrollbarSettings;
int viewportHeight = 48;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webView()->layout();
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webView()->layout();
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webView()->layout();
webViewHelper.webView()->setPageScaleFactor(3, WebPoint());
- webViewHelper.webViewImpl()->page()->mainFrame()->loader().history()->saveDocumentAndScrollState();
+ webViewHelper.webViewImpl()->page()->mainFrame()->loader().saveDocumentAndScrollState();
webViewHelper.webView()->setPageScaleFactor(1, WebPoint());
- webViewHelper.webViewImpl()->page()->mainFrame()->loader().history()->restoreScrollPositionAndViewState();
+ webViewHelper.webViewImpl()->page()->mainFrame()->loader().setLoadType(WebCore::FrameLoadTypeBackForward);
+ webViewHelper.webViewImpl()->page()->mainFrame()->loader().restoreScrollPositionAndViewState();
EXPECT_EQ(3, webViewHelper.webView()->pageScaleFactor());
}
int viewportHeight = 48;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "large-div.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "large-div.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webView()->layout();
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webView()->layout();
client.m_screenInfo.deviceScaleFactor = deviceScaleFactor;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "viewport-target-densitydpi-high.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-target-densitydpi-high.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
webViewHelper.webView()->settings()->setSupportDeprecatedTargetDensityDPI(true);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
client.m_screenInfo.deviceScaleFactor = deviceScaleFactors[i];
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "viewport-target-densitydpi-device.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-target-densitydpi-device.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
webViewHelper.webView()->settings()->setSupportDeprecatedTargetDensityDPI(true);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
client.m_screenInfo.deviceScaleFactor = deviceScaleFactors[i];
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "viewport-target-densitydpi-device-and-fixed-width.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-target-densitydpi-device-and-fixed-width.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
webViewHelper.webView()->settings()->setSupportDeprecatedTargetDensityDPI(true);
webViewHelper.webView()->settings()->setUseWideViewport(true);
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "viewport-initial-scale-less-than-1.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-initial-scale-less-than-1.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setSupportDeprecatedTargetDensityDPI(true);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
webViewHelper.webView()->settings()->setUseWideViewport(false);
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "viewport-initial-scale-less-than-1-device-width.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-initial-scale-less-than-1-device-width.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->settings()->setSupportDeprecatedTargetDensityDPI(true);
webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
webViewHelper.webView()->settings()->setUseWideViewport(false);
EXPECT_NEAR(1.0f / client.m_screenInfo.deviceScaleFactor, webViewHelper.webView()->pageScaleFactor(), 0.01f);
}
+TEST_F(WebFrameTest, NoWideViewportAndNoViewportWithInitialPageScaleOverride)
+{
+ UseMockScrollbarSettings mockScrollbarSettings;
+ registerMockedHttpURLLoad("large-div.html");
+
+ FixedLayoutTestWebViewClient client;
+ int viewportWidth = 640;
+ int viewportHeight = 480;
+ float enforcedPageScaleFactor = 5.0f;
+
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad(m_baseURL + "large-div.html", true, 0, &client, enableViewportSettings);
+ webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
+ webViewHelper.webView()->settings()->setUseWideViewport(false);
+ webViewHelper.webView()->setInitialPageScaleOverride(enforcedPageScaleFactor);
+ webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
+ webViewHelper.webView()->layout();
+
+ EXPECT_NEAR(viewportWidth / enforcedPageScaleFactor, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().width(), 1.0f);
+ EXPECT_NEAR(viewportHeight / enforcedPageScaleFactor, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().height(), 1.0f);
+ EXPECT_NEAR(enforcedPageScaleFactor, webViewHelper.webView()->pageScaleFactor(), 0.01f);
+}
+
+TEST_F(WebFrameTest, NoUserScalableQuirkIgnoresViewportScale)
+{
+ UseMockScrollbarSettings mockScrollbarSettings;
+ registerMockedHttpURLLoad("viewport-initial-scale-and-user-scalable-no.html");
+
+ FixedLayoutTestWebViewClient client;
+ int viewportWidth = 640;
+ int viewportHeight = 480;
+
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-initial-scale-and-user-scalable-no.html", true, 0, &client, enableViewportSettings);
+ webViewHelper.webView()->settings()->setViewportMetaNonUserScalableQuirk(true);
+ webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
+ webViewHelper.webView()->layout();
+
+ EXPECT_NEAR(viewportWidth, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().width(), 1.0f);
+ EXPECT_NEAR(viewportHeight, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().height(), 1.0f);
+ EXPECT_NEAR(1.0f, webViewHelper.webView()->pageScaleFactor(), 0.01f);
+}
+
+TEST_F(WebFrameTest, NoUserScalableQuirkIgnoresViewportScaleForNonWideViewport)
+{
+ UseMockScrollbarSettings mockScrollbarSettings;
+ registerMockedHttpURLLoad("viewport-initial-scale-and-user-scalable-no.html");
+
+ FixedLayoutTestWebViewClient client;
+ client.m_screenInfo.deviceScaleFactor = 1.33f;
+ int viewportWidth = 640;
+ int viewportHeight = 480;
+
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-initial-scale-and-user-scalable-no.html", true, 0, &client, enableViewportSettings);
+ webViewHelper.webView()->settings()->setSupportDeprecatedTargetDensityDPI(true);
+ webViewHelper.webView()->settings()->setViewportMetaNonUserScalableQuirk(true);
+ webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
+ webViewHelper.webView()->settings()->setUseWideViewport(false);
+ webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
+ webViewHelper.webView()->layout();
+
+ EXPECT_NEAR(viewportWidth * client.m_screenInfo.deviceScaleFactor, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().width(), 1.0f);
+ EXPECT_NEAR(viewportHeight * client.m_screenInfo.deviceScaleFactor, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().height(), 1.0f);
+ EXPECT_NEAR(1.0f / client.m_screenInfo.deviceScaleFactor, webViewHelper.webView()->pageScaleFactor(), 0.01f);
+}
+
+TEST_F(WebFrameTest, NoUserScalableQuirkIgnoresViewportScaleForWideViewport)
+{
+ UseMockScrollbarSettings mockScrollbarSettings;
+ registerMockedHttpURLLoad("viewport-2x-initial-scale-non-user-scalable.html");
+
+ FixedLayoutTestWebViewClient client;
+ int viewportWidth = 640;
+ int viewportHeight = 480;
+
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad(m_baseURL + "viewport-2x-initial-scale-non-user-scalable.html", true, 0, &client, enableViewportSettings);
+ webViewHelper.webView()->settings()->setViewportMetaNonUserScalableQuirk(true);
+ webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
+ webViewHelper.webView()->settings()->setUseWideViewport(true);
+ webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
+
+ EXPECT_NEAR(viewportWidth, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().width(), 1.0f);
+ EXPECT_NEAR(viewportHeight, webViewHelper.webViewImpl()->mainFrameImpl()->frameView()->layoutSize().height(), 1.0f);
+ EXPECT_NEAR(1.0f, webViewHelper.webView()->pageScaleFactor(), 0.01f);
+}
+
+TEST_F(WebFrameTest, DesktopPageCanBeZoomedInWhenWideViewportIsTurnedOff)
+{
+ UseMockScrollbarSettings mockScrollbarSettings;
+ registerMockedHttpURLLoad("no_viewport_tag.html");
+
+ FixedLayoutTestWebViewClient client;
+ int viewportWidth = 640;
+ int viewportHeight = 480;
+
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad(m_baseURL + "no_viewport_tag.html", true, 0, &client, enableViewportSettings);
+ webViewHelper.webView()->settings()->setWideViewportQuirkEnabled(true);
+ webViewHelper.webView()->settings()->setUseWideViewport(false);
+ webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
+
+ EXPECT_NEAR(1.0f, webViewHelper.webView()->pageScaleFactor(), 0.01f);
+ EXPECT_NEAR(1.0f, webViewHelper.webView()->minimumPageScaleFactor(), 0.01f);
+ EXPECT_NEAR(5.0f, webViewHelper.webView()->maximumPageScaleFactor(), 0.01f);
+}
+
class WebFrameResizeTest : public WebFrameTest {
protected:
const float aspectRatio = static_cast<float>(viewportSize.width) / viewportSize.height;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + url, true);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + url, true, 0, 0, enableViewportSettings);
// Origin scrollOffsets preserved under resize.
{
FrameTestHelpers::WebViewHelper webViewHelper;
webViewHelper.initializeAndLoad(m_baseURL + "large-div.html", true, 0, &client);
+ // FIXME: This test breaks if the viewport is enabled before loading the page due to the paint
+ // calls below not working on composited layers. For some reason, enabling the viewport here
+ // doesn't cause compositing
webViewHelper.webView()->settings()->setViewportEnabled(true);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webView()->layout();
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webView()->layout();
int viewportHeight = 480;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "no_scale_for_you.html", true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "no_scale_for_you.html", true, 0, &client, enableViewportSettings);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
EXPECT_EQ(2.0f, webViewHelper.webView()->minimumPageScaleFactor());
OwnPtr<FakeCompositingWebViewClient> fakeCompositingWebViewClient = adoptPtr(new FakeCompositingWebViewClient());
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initialize(true, &fakeCompositingWebViewClient->m_fakeWebFrameClient, fakeCompositingWebViewClient.get(), &configueCompositingWebView);
+ webViewHelper.initialize(true, 0, fakeCompositingWebViewClient.get(), &configueCompositingWebView);
webViewHelper.webView()->resize(WebSize(viewWidth, viewHeight));
FrameTestHelpers::loadFrame(webViewHelper.webView()->mainFrame(), m_baseURL + "large-div.html");
EXPECT_FALSE(view->renderView()->compositor()->layerForVerticalScrollbar());
}
-void setScaleAndScrollAndLayout(WebKit::WebView* webView, WebPoint scroll, float scale)
+void setScaleAndScrollAndLayout(blink::WebView* webView, WebPoint scroll, float scale)
{
webView->setPageScaleFactor(scale, WebPoint(scroll.x, scroll.y));
webView->layout();
int viewportWidth = 640 / deviceScaleFactor;
int viewportHeight = 1280 / deviceScaleFactor;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "very_tall_div.html");
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + "very_tall_div.html", true, 0, 0, enableViewportSettings);
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webView()->setPageScaleFactorLimits(1.0f, 4);
webViewHelper.webView()->setDeviceScaleFactor(deviceScaleFactor);
int viewportWidth = 320;
int viewportHeight = 480;
float doubleTapZoomAlreadyLegibleRatio = 1.2f;
- float textAutosizingFontScaleFactor = 1.13f;
+ float accessibilityFontScaleFactor = 1.13f;
FrameTestHelpers::WebViewHelper webViewHelper;
webViewHelper.initializeAndLoad(m_baseURL + "get_scale_bounds_check_for_auto_zoom_test.html");
webViewHelper.webView()->resize(WebSize(viewportWidth, viewportHeight));
webViewHelper.webViewImpl()->enableFakePageScaleAnimationForTesting(true);
webViewHelper.webViewImpl()->page()->settings().setTextAutosizingEnabled(true);
- webViewHelper.webViewImpl()->page()->settings().setTextAutosizingFontScaleFactor(textAutosizingFontScaleFactor);
+ webViewHelper.webViewImpl()->page()->settings().setAccessibilityFontScaleFactor(accessibilityFontScaleFactor);
WebRect div(200, 100, 200, 150);
WebPoint doubleTapPoint(div.x + 50, div.y + 50);
float scale;
// Test double tap scale bounds.
- // minimumPageScale < doubleTapZoomAlreadyLegibleScale < 1 < textAutosizingFontScaleFactor
- float legibleScale = textAutosizingFontScaleFactor;
+ // minimumPageScale < doubleTapZoomAlreadyLegibleScale < 1 < accessibilityFontScaleFactor
+ float legibleScale = accessibilityFontScaleFactor;
setScaleAndScrollAndLayout(webViewHelper.webViewImpl(), WebPoint(0, 0), (webViewHelper.webViewImpl()->minimumPageScaleFactor()) * (1 + doubleTapZoomAlreadyLegibleRatio) / 2);
float doubleTapZoomAlreadyLegibleScale = webViewHelper.webViewImpl()->minimumPageScaleFactor() * doubleTapZoomAlreadyLegibleRatio;
webViewHelper.webView()->setPageScaleFactorLimits(0.5f, 4);
// Zoom in to reset double_tap_zoom_in_effect flag.
webViewHelper.webViewImpl()->applyScrollAndScale(WebSize(), 1.1f);
- // 1 < textAutosizingFontScaleFactor < minimumPageScale < doubleTapZoomAlreadyLegibleScale
+ // 1 < accessibilityFontScaleFactor < minimumPageScale < doubleTapZoomAlreadyLegibleScale
webViewHelper.webView()->setPageScaleFactorLimits(1.0f, 4);
webViewHelper.webView()->layout();
doubleTapZoomAlreadyLegibleScale = webViewHelper.webViewImpl()->minimumPageScaleFactor() * doubleTapZoomAlreadyLegibleRatio;
// Zoom in to reset double_tap_zoom_in_effect flag.
webViewHelper.webViewImpl()->applyScrollAndScale(WebSize(), 1.1f);
- // minimumPageScale < 1 < textAutosizingFontScaleFactor < doubleTapZoomAlreadyLegibleScale
+ // minimumPageScale < 1 < accessibilityFontScaleFactor < doubleTapZoomAlreadyLegibleScale
webViewHelper.webView()->setPageScaleFactorLimits(0.95f, 4);
webViewHelper.webView()->layout();
doubleTapZoomAlreadyLegibleScale = webViewHelper.webViewImpl()->minimumPageScaleFactor() * doubleTapZoomAlreadyLegibleRatio;
// Zoom in to reset double_tap_zoom_in_effect flag.
webViewHelper.webViewImpl()->applyScrollAndScale(WebSize(), 1.1f);
- // minimumPageScale < 1 < doubleTapZoomAlreadyLegibleScale < textAutosizingFontScaleFactor
+ // minimumPageScale < 1 < doubleTapZoomAlreadyLegibleScale < accessibilityFontScaleFactor
webViewHelper.webView()->setPageScaleFactorLimits(0.9f, 4);
webViewHelper.webView()->layout();
doubleTapZoomAlreadyLegibleScale = webViewHelper.webViewImpl()->minimumPageScaleFactor() * doubleTapZoomAlreadyLegibleRatio;
ASSERT_EQ(previousScale, webViewHelper.webViewImpl()->pageScaleFactor());
}
-class TestReloadWhileProvisionalFrameClient : public WebFrameClient {
-};
-
TEST_F(WebFrameTest, ReloadWhileProvisional)
{
// Test that reloading while the previous load is still pending does not cause the initial
// request to get lost.
registerMockedHttpURLLoad("fixed_layout.html");
- TestReloadWhileProvisionalFrameClient webFrameClient;
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initialize(false, &webFrameClient);
+ webViewHelper.initialize();
FrameTestHelpers::loadFrame(webViewHelper.webView()->mainFrame(), m_baseURL + "fixed_layout.html");
// start reload before first request is delivered.
webViewHelper.webView()->mainFrame()->reload(true);
+
Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests();
- ASSERT_EQ(WebURL(toKURL(m_baseURL + "fixed_layout.html")),
- webViewHelper.webView()->mainFrame()->dataSource()->request().url());
+
+ WebDataSource* dataSource = webViewHelper.webView()->mainFrame()->dataSource();
+ ASSERT_TRUE(dataSource);
+ EXPECT_EQ(toKURL(m_baseURL + "fixed_layout.html"), toKURL(dataSource->request().url().spec()));
}
TEST_F(WebFrameTest, AppendRedirects)
// Implementation of WebFrameClient that tracks the v8 contexts that are created
// and destroyed for verification.
-class ContextLifetimeTestWebFrameClient : public WebFrameClient {
+class ContextLifetimeTestWebFrameClient : public FrameTestHelpers::TestWebFrameClient {
public:
struct Notification {
public:
~Notification()
{
- context.Dispose();
+ context.Reset();
}
bool Equals(Notification* other)
Platform::current()->unitTestSupport()->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;
- FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + "iframes_test.html", false, &webFrameClient);
-
- EXPECT_EQ(webFrameClient.m_frameCount, 3);
- EXPECT_EQ(webFrameClient.m_parent, webViewHelper.webView()->mainFrame());
-}
-
-class FindUpdateWebFrameClient : public WebFrameClient {
+class FindUpdateWebFrameClient : public FrameTestHelpers::TestWebFrameClient {
public:
FindUpdateWebFrameClient()
: m_findResultsAreReady(false)
};
// This fails on Mac https://bugs.webkit.org/show_bug.cgi?id=108574
-#if OS(MACOSX)
+// Also failing on Android: http://crbug.com/341314
+#if OS(MACOSX) || OS(ANDROID)
TEST_F(WebFrameTest, DISABLED_FindInPageMatchRects)
#else
TEST_F(WebFrameTest, FindInPageMatchRects)
WebFindOptions options;
WebString searchText = WebString::fromUTF8(kFindString);
WebFrameImpl* mainFrame = toWebFrameImpl(webViewHelper.webView()->mainFrame());
- WebFrameImpl* secondFrame = toWebFrameImpl(mainFrame->traverseNext(false));
+ RefPtr<WebFrameImpl> secondFrame = toWebFrameImpl(mainFrame->traverseNext(false));
RefPtr<WebCore::Frame> holdSecondFrame = secondFrame->frame();
// Detach the frame before finding.
WebPoint moveTo(topLeft(initialStartRect));
moveTo.y += 40;
- frame->moveCaretSelectionTowardsWindowPoint(moveTo);
+ frame->moveCaretSelection(moveTo);
webViewHelper.webView()->selectionBounds(startRect, endRect);
EXPECT_EQ(startRect, initialStartRect);
EXPECT_EQ(endRect, initialEndRect);
moveTo.y -= 80;
- frame->moveCaretSelectionTowardsWindowPoint(moveTo);
+ frame->moveCaretSelection(moveTo);
webViewHelper.webView()->selectionBounds(startRect, endRect);
EXPECT_EQ(startRect, initialStartRect);
EXPECT_EQ(endRect, initialEndRect);
// Make sure we initialize to minimum scale, even if the window size
// only becomes available after the load begins.
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + htmlFile, true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + htmlFile, true, 0, &client, enableViewportSettings);
webViewHelper.webView()->resize(WebSize(1000, 1000));
webViewHelper.webView()->layout();
// Make sure we initialize to minimum scale, even if the window size
// only becomes available after the load begins.
FrameTestHelpers::WebViewHelper webViewHelper;
- webViewHelper.initializeAndLoad(m_baseURL + htmlFile, true, 0, &client);
- webViewHelper.webView()->settings()->setViewportEnabled(true);
+ webViewHelper.initializeAndLoad(m_baseURL + htmlFile, true, 0, &client, enableViewportSettings);
webViewHelper.webView()->resize(WebSize(1000, 1000));
webViewHelper.webView()->layout();
WebFrame* frame = webViewHelper.webView()->mainFrame();
// This test passes if this doesn't crash.
- frame->moveCaretSelectionTowardsWindowPoint(WebPoint(0, 0));
+ frame->moveCaretSelection(WebPoint(0, 0));
}
class SpellCheckClient : public WebSpellCheckClient {
public:
explicit SpellCheckClient(uint32_t hash = 0) : m_numberOfTimesChecked(0), m_hash(hash) { }
virtual ~SpellCheckClient() { }
- virtual void requestCheckingOfText(const WebKit::WebString&, const WebKit::WebVector<uint32_t>&, const WebKit::WebVector<unsigned>&, WebKit::WebTextCheckingCompletion* completion) OVERRIDE
+ virtual void requestCheckingOfText(const blink::WebString&, const blink::WebVector<uint32_t>&, const blink::WebVector<unsigned>&, blink::WebTextCheckingCompletion* completion) OVERRIDE
{
++m_numberOfTimesChecked;
Vector<WebTextCheckingResult> results;
virtual ~StubbornSpellCheckClient() { }
virtual void requestCheckingOfText(
- const WebKit::WebString&,
- const WebKit::WebVector<uint32_t>&,
- const WebKit::WebVector<unsigned>&,
- WebKit::WebTextCheckingCompletion* completion) OVERRIDE
+ const blink::WebString&,
+ const blink::WebVector<uint32_t>&,
+ const blink::WebVector<unsigned>&,
+ blink::WebTextCheckingCompletion* completion) OVERRIDE
{
m_completion = completion;
}
m_completion = 0;
}
- WebKit::WebTextCheckingCompletion* m_completion;
+ blink::WebTextCheckingCompletion* m_completion;
};
TEST_F(WebFrameTest, SlowSpellcheckMarkerPosition)
EXPECT_TRUE(webFrameClient.m_didAccessInitialDocument);
}
+// Fails on the WebKit XP (deps) bot. http://crbug.com/312192
+#if OS(WIN)
+TEST_F(WebFrameTest, DISABLED_DidWriteToInitialDocumentBeforeModalDialog)
+#else
+TEST_F(WebFrameTest, DidWriteToInitialDocumentBeforeModalDialog)
+#endif
+{
+ TestAccessInitialDocumentWebFrameClient webFrameClient;
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initialize(true, &webFrameClient);
+ runPendingTasks();
+ EXPECT_FALSE(webFrameClient.m_didAccessInitialDocument);
+
+ // Create another window that will try to access it.
+ FrameTestHelpers::WebViewHelper newWebViewHelper;
+ WebView* newView = newWebViewHelper.initialize(true);
+ newView->mainFrame()->setOpener(webViewHelper.webView()->mainFrame());
+ runPendingTasks();
+ EXPECT_FALSE(webFrameClient.m_didAccessInitialDocument);
+
+ // Access the initial document with document.write, which moves us past the
+ // initial empty document state of the state machine. We normally set a
+ // timer to notify the client.
+ newView->mainFrame()->executeScript(
+ WebScriptSource("window.opener.document.write('Modified');"));
+ EXPECT_FALSE(webFrameClient.m_didAccessInitialDocument);
+
+ // Make sure that a modal dialog forces us to notify right away.
+ newView->mainFrame()->executeScript(
+ WebScriptSource("window.opener.confirm('Modal');"));
+ EXPECT_TRUE(webFrameClient.m_didAccessInitialDocument);
+
+ // Ensure that we don't notify again later.
+ runPendingTasks();
+ EXPECT_TRUE(webFrameClient.m_didAccessInitialDocument);
+}
+
class TestMainFrameUserOrProgrammaticScrollFrameClient : public WebFrameClient {
public:
TestMainFrameUserOrProgrammaticScrollFrameClient() { reset(); }
RefPtr<WebCore::Event> event = WebCore::MouseEvent::create(WebCore::EventTypeNames::click, false, false,
document->domWindow(), 0, 0, 0, 0, 0, 0, 0, false, false, false, false, 1, 0, 0);
- WebCore::FrameLoadRequest frameRequest(document->securityOrigin(), WebCore::ResourceRequest(destination));
+ WebCore::FrameLoadRequest frameRequest(document, WebCore::ResourceRequest(destination));
frameRequest.setTriggeringEvent(event);
webViewHelper.webViewImpl()->page()->mainFrame()->loader().load(frameRequest);
}
EXPECT_EQ(WebURLRequest::ReloadIgnoringCacheData, frame->dataSource()->request().cachePolicy());
}
+TEST_F(WebFrameTest, BackDuringChildFrameReload)
+{
+ registerMockedHttpURLLoad("page_with_blank_iframe.html");
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad(m_baseURL + "page_with_blank_iframe.html", true);
+ WebFrame* mainFrame = webViewHelper.webView()->mainFrame();
+ WebFrame* childFrame = mainFrame->firstChild();
+ ASSERT_TRUE(childFrame);
+
+ // Start a history navigation, then have a different frame commit a navigation.
+ // In this case, reload an about:blank frame, which will commit synchronously.
+ // After the history navigation completes, both the appropriate document url and
+ // the current history item should reflect the history navigation.
+ registerMockedHttpURLLoad("white-1x1.png");
+ WebHistoryItem item;
+ item.initialize();
+ WebURL historyURL(toKURL(m_baseURL + "white-1x1.png"));
+ item.setURLString(historyURL.string());
+ mainFrame->loadHistoryItem(item);
+
+ childFrame->reload();
+ Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests();
+ EXPECT_EQ(item.urlString(), mainFrame->document().url().string());
+ EXPECT_EQ(item.urlString(), mainFrame->currentHistoryItem().urlString());
+}
+
TEST_F(WebFrameTest, ReloadPost)
{
registerMockedHttpURLLoad("reload_post.html");
EXPECT_EQ(WebNavigationTypeFormResubmitted, frame->dataSource()->navigationType());
}
+TEST_F(WebFrameTest, LoadHistoryItemReload)
+{
+ registerMockedHttpURLLoad("fragment_middle_click.html");
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad(m_baseURL + "fragment_middle_click.html", true);
+ WebFrame* frame = webViewHelper.webView()->mainFrame();
+ WebHistoryItem firstItem = frame->currentHistoryItem();
+ EXPECT_FALSE(firstItem.isNull());
+
+ registerMockedHttpURLLoad("white-1x1.png");
+ FrameTestHelpers::loadFrame(frame, m_baseURL + "white-1x1.png");
+ Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests();
+ EXPECT_FALSE(frame->previousHistoryItem().isNull());
+ EXPECT_EQ(firstItem.urlString(), frame->previousHistoryItem().urlString());
+
+ // Cache policy overrides should take.
+ frame->loadHistoryItem(frame->previousHistoryItem(), WebURLRequest::ReloadIgnoringCacheData);
+ Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests();
+ EXPECT_EQ(firstItem.urlString(), frame->currentHistoryItem().urlString());
+ EXPECT_EQ(WebURLRequest::ReloadIgnoringCacheData, frame->dataSource()->request().cachePolicy());
+}
+
class TestCachePolicyWebFrameClient : public WebFrameClient {
public:
int willSendRequestCallCount() const { return m_willSendRequestCallCount; }
int childFrameCreationCount() const { return m_childFrameCreationCount; }
- virtual WebFrame* createChildFrame(WebFrame*, const WebString&)
+ virtual WebFrame* createChildFrame(WebFrame* parent, const WebString&)
{
m_childFrameCreationCount++;
- return WebFrame::create(m_client);
+ WebFrame* frame = WebFrame::create(m_client);
+ parent->appendChild(frame);
+ return frame;
}
- virtual void willSendRequest(WebFrame* frame, unsigned, WebURLRequest& request, const WebURLResponse&)
+ virtual void frameDetached(WebFrame* frame) OVERRIDE
+ {
+ if (frame->parent())
+ frame->parent()->removeChild(frame);
+ frame->close();
+ }
+
+ virtual void willSendRequest(WebFrame* frame, unsigned, WebURLRequest& request, const WebURLResponse&) OVERRIDE
{
m_policy = request.cachePolicy();
m_willSendRequestCallCount++;
webViewHelper.initializeAndLoad(m_baseURL + "iframe_reload.html", true, &mainClient);
WebFrameImpl* mainFrame = webViewHelper.webViewImpl()->mainFrameImpl();
- WebFrameImpl* childFrame = toWebFrameImpl(mainFrame->firstChild());
+ RefPtr<WebFrameImpl> childFrame = toWebFrameImpl(mainFrame->firstChild());
ASSERT_EQ(childFrame->client(), &childClient);
EXPECT_EQ(mainClient.childFrameCreationCount(), 1);
EXPECT_EQ(childClient.willSendRequestCallCount(), 1);
Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests();
// A new WebFrame should have been created, but the child WebFrameClient should be reused.
- ASSERT_FALSE(childFrame == toWebFrameImpl(mainFrame->firstChild()));
+ ASSERT_NE(childFrame, toWebFrameImpl(mainFrame->firstChild()));
ASSERT_EQ(toWebFrameImpl(mainFrame->firstChild())->client(), &childClient);
EXPECT_EQ(mainClient.childFrameCreationCount(), 2);
EXPECT_EQ(childClient.cachePolicy(), WebURLRequest::ReloadIgnoringCacheData);
}
+TEST_F(WebFrameTest, ExportHistoryItemFromChildFrame)
+{
+ registerMockedHttpURLLoad("iframe_reload.html");
+ registerMockedHttpURLLoad("visible_iframe.html");
+ TestCachePolicyWebFrameClient mainClient;
+ TestCachePolicyWebFrameClient childClient;
+ mainClient.setChildWebFrameClient(&childClient);
+
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad(m_baseURL + "iframe_reload.html", true, &mainClient);
+
+ WebFrame* childFrame = webViewHelper.webViewImpl()->mainFrameImpl()->firstChild();
+ WebHistoryItem item = childFrame->currentHistoryItem();
+ EXPECT_EQ(item.urlString().utf8(), m_baseURL + "iframe_reload.html");
+}
+
class TestSameDocumentWebFrameClient : public WebFrameClient {
public:
TestSameDocumentWebFrameClient()
TestStartStopCallbackWebViewClient()
: m_startLoadingCount(0)
, m_stopLoadingCount(0)
+ , m_differentDocumentStartCount(0)
{
}
- virtual void didStartLoading()
+ virtual void didStartLoading(bool toDifferentDocument) OVERRIDE
{
m_startLoadingCount++;
+ if (toDifferentDocument)
+ m_differentDocumentStartCount++;
}
- virtual void didStopLoading()
+ virtual void didStopLoading() OVERRIDE
{
m_stopLoadingCount++;
}
int startLoadingCount() const { return m_startLoadingCount; }
int stopLoadingCount() const { return m_stopLoadingCount; }
+ int differentDocumentStartCount() const { return m_differentDocumentStartCount; }
private:
int m_startLoadingCount;
int m_stopLoadingCount;
+ int m_differentDocumentStartCount;
};
TEST_F(WebFrameTest, PushStateStartsAndStops)
EXPECT_EQ(client.startLoadingCount(), 2);
EXPECT_EQ(client.stopLoadingCount(), 2);
+ EXPECT_EQ(client.differentDocumentStartCount(), 1);
}
class TestHistoryWebFrameClient : public WebFrameClient {
EXPECT_FALSE(client.replacesCurrentHistoryItem());
}
+// This tests the restore case where the first load in a page is
+// via loadHistoryItem(). If multiple pages are in the same process
+// and are restoring around the same time, they may not restore in
+// the order they were created and may end up with different names
+// than they were given when they were saved. If the initial item
+// has a child with url "about:blank", we should still navigate the
+// main frame to the parent, rather than incorrectly matching the
+// blank child to the main frame.
+TEST_F(WebFrameTest, firstNavigationIsHistoryWithBlankChild)
+{
+ registerMockedHttpURLLoad("history.html");
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ WebViewImpl* webView = webViewHelper.initialize();
+ ASSERT_TRUE(webView->mainFrame()->currentHistoryItem().isNull());
+
+ WebHistoryItem item;
+ item.initialize();
+ WebURL destinationURL(toKURL(m_baseURL + "history.html"));
+ item.setURLString(destinationURL.string());
+ item.setTarget(WebString::fromUTF8("expectedButMissingMainFrameName"));
+
+ WebHistoryItem childItem;
+ childItem.initialize();
+ childItem.setURLString("about:blank");
+ item.appendToChildren(childItem);
+
+ webView->mainFrame()->loadHistoryItem(item);
+ Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests();
+ EXPECT_EQ(destinationURL, webView->mainFrame()->document().url());
+}
+
+// Test verifies that layout will change a layer's scrollable attibutes
+TEST_F(WebFrameTest, overflowHiddenRewrite)
+{
+ registerMockedHttpURLLoad("non-scrollable.html");
+ TestMainFrameUserOrProgrammaticScrollFrameClient client;
+ OwnPtr<FakeCompositingWebViewClient> fakeCompositingWebViewClient = adoptPtr(new FakeCompositingWebViewClient());
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initialize(true, 0, fakeCompositingWebViewClient.get(), &configueCompositingWebView);
+
+ webViewHelper.webView()->resize(WebSize(100, 100));
+ FrameTestHelpers::loadFrame(webViewHelper.webView()->mainFrame(), m_baseURL + "non-scrollable.html");
+ Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests();
+ webViewHelper.webView()->layout();
+
+ WebCore::RenderLayerCompositor* compositor = webViewHelper.webViewImpl()->compositor();
+ ASSERT_TRUE(compositor->scrollLayer());
+
+ // Verify that the WebLayer is not scrollable initially.
+ WebCore::GraphicsLayer* scrollLayer = compositor->scrollLayer();
+ WebLayer* webScrollLayer = scrollLayer->platformLayer();
+ ASSERT_FALSE(webScrollLayer->userScrollableHorizontal());
+ ASSERT_FALSE(webScrollLayer->userScrollableVertical());
+
+ // Call javascript to make the layer scrollable, and verify it.
+ WebFrameImpl* frame = (WebFrameImpl*)webViewHelper.webView()->mainFrame();
+ frame->executeScript(WebScriptSource("allowScroll();"));
+ webViewHelper.webView()->layout();
+ ASSERT_TRUE(webScrollLayer->userScrollableHorizontal());
+ ASSERT_TRUE(webScrollLayer->userScrollableVertical());
+}
+
+// Test that currentHistoryItem reflects the current page, not the provisional load.
+TEST_F(WebFrameTest, CurrentHistoryItem)
+{
+ registerMockedHttpURLLoad("fixed_layout.html");
+ std::string url = m_baseURL + "fixed_layout.html";
+
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initialize();
+ WebFrame* frame = webViewHelper.webView()->mainFrame();
+ FrameTestHelpers::loadFrame(frame, url);
+
+ // Before commit, there is no history item.
+ EXPECT_TRUE(frame->currentHistoryItem().isNull());
+
+ Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests();
+
+ // After commit, there is.
+ WebHistoryItem item = frame->currentHistoryItem();
+ ASSERT_FALSE(item.isNull());
+ EXPECT_EQ(url, item.urlString().utf8());
+}
+
+class FailCreateChildFrame : public WebFrameClient {
+public:
+ FailCreateChildFrame() : m_callCount(0) { }
+
+ WebFrame* createChildFrame(WebFrame* parent, const WebString& frameName)
+ {
+ ++m_callCount;
+ return 0;
+ }
+
+ int callCount() const { return m_callCount; }
+
+private:
+ int m_callCount;
+};
+
+// Test that we don't crash if WebFrameClient::createChildFrame() fails.
+TEST_F(WebFrameTest, CreateChildFrameFailure)
+{
+ registerMockedHttpURLLoad("create_child_frame_fail.html");
+ FailCreateChildFrame client;
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad(m_baseURL + "create_child_frame_fail.html", true, &client);
+
+ EXPECT_EQ(1, client.callCount());
+}
+
+TEST_F(WebFrameTest, fixedPositionInFixedViewport)
+{
+ UseMockScrollbarSettings mockScrollbarSettings;
+ registerMockedHttpURLLoad("fixed-position-in-fixed-viewport.html");
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad(m_baseURL + "fixed-position-in-fixed-viewport.html", true, 0, 0, enableViewportSettings);
+
+ WebView* webView = webViewHelper.webView();
+ webView->resize(WebSize(100, 100));
+ webView->layout();
+
+ Document* document = toWebFrameImpl(webView->mainFrame())->frame()->document();
+ Element* bottomFixed = document->getElementById("bottom-fixed");
+ Element* topBottomFixed = document->getElementById("top-bottom-fixed");
+ Element* rightFixed = document->getElementById("right-fixed");
+ Element* leftRightFixed = document->getElementById("left-right-fixed");
+
+ webView->resize(WebSize(100, 200));
+ webView->layout();
+ EXPECT_EQ(200, bottomFixed->offsetTop() + bottomFixed->offsetHeight());
+ EXPECT_EQ(200, topBottomFixed->offsetHeight());
+
+ webView->settings()->setMainFrameResizesAreOrientationChanges(false);
+ webView->resize(WebSize(200, 200));
+ webView->layout();
+ EXPECT_EQ(200, rightFixed->offsetLeft() + rightFixed->offsetWidth());
+ EXPECT_EQ(200, leftRightFixed->offsetWidth());
+
+ webView->settings()->setMainFrameResizesAreOrientationChanges(true);
+ // Will scale the page by 1.5.
+ webView->resize(WebSize(300, 330));
+ webView->layout();
+ EXPECT_EQ(220, bottomFixed->offsetTop() + bottomFixed->offsetHeight());
+ EXPECT_EQ(220, topBottomFixed->offsetHeight());
+ EXPECT_EQ(200, rightFixed->offsetLeft() + rightFixed->offsetWidth());
+ EXPECT_EQ(200, leftRightFixed->offsetWidth());
+}
+
+TEST_F(WebFrameTest, FrameViewSetFrameRect)
+{
+ FrameTestHelpers::WebViewHelper webViewHelper;
+ webViewHelper.initializeAndLoad("about:blank");
+
+ WebCore::FrameView* frameView = webViewHelper.webViewImpl()->mainFrameImpl()->frameView();
+ frameView->setFrameRect(WebCore::IntRect(0, 0, 200, 200));
+ EXPECT_EQ_RECT(WebCore::IntRect(0, 0, 200, 200), frameView->frameRect());
+ frameView->setFrameRect(WebCore::IntRect(100, 100, 200, 200));
+ EXPECT_EQ_RECT(WebCore::IntRect(100, 100, 200, 200), frameView->frameRect());
+}
+
} // namespace