TEST_F(ProgrammaticScrollTest, RestoreScrollPositionAndViewStateWithScale) { registerMockedHttpURLLoad("long_scroll.html"); FrameTestHelpers::WebViewHelper webViewHelper; WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "long_scroll.html", true, 0, 0); webView->resize(WebSize(1000, 1000)); webView->updateAllLifecyclePhases(); WebViewImpl* webViewImpl = toWebViewImpl(webView); FrameLoader& loader = webViewImpl->mainFrameImpl()->frame()->loader(); loader.setLoadType(FrameLoadTypeBackForward); webViewImpl->setPageScaleFactor(3.0f); webViewImpl->mainFrame()->setScrollOffset(WebSize(0, 500)); loader.documentLoader()->initialScrollState().wasScrolledByUser = false; loader.currentItem()->setPageScaleFactor(2); loader.currentItem()->setScrollPoint(WebPoint(0, 200)); // Flip back the wasScrolledByUser flag which was set to true by setPageScaleFactor // because otherwise FrameLoader::restoreScrollPositionAndViewState does nothing. loader.documentLoader()->initialScrollState().wasScrolledByUser = false; loader.restoreScrollPositionAndViewState(); // Expect that both scroll and scale were restored. EXPECT_EQ(2.0f, webViewImpl->pageScaleFactor()); EXPECT_EQ(200, webViewImpl->mainFrameImpl()->scrollOffset().height); }
TEST_F(ProgrammaticScrollTest, RestoreScrollPositionAndViewStateWithoutScale) { registerMockedHttpURLLoad("long_scroll.html"); FrameTestHelpers::WebViewHelper webViewHelper; WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "long_scroll.html", true, 0, 0); webView->resize(WebSize(1000, 1000)); webView->updateAllLifecyclePhases(); WebViewImpl* webViewImpl = toWebViewImpl(webView); FrameLoader& loader = webViewImpl->mainFrameImpl()->frame()->loader(); loader.setLoadType(FrameLoadTypeBackForward); webViewImpl->setPageScaleFactor(3.0f); webViewImpl->mainFrame()->setScrollOffset(WebSize(0, 500)); loader.documentLoader()->initialScrollState().wasScrolledByUser = false; loader.currentItem()->setPageScaleFactor(0); loader.currentItem()->setScrollPoint(WebPoint(0, 400)); // FrameLoader::restoreScrollPositionAndViewState flows differently if scale is zero. loader.restoreScrollPositionAndViewState(); // Expect that only the scroll position was restored. EXPECT_EQ(3.0f, webViewImpl->pageScaleFactor()); EXPECT_EQ(400, webViewImpl->mainFrameImpl()->scrollOffset().height); }
TEST_F(WebPluginContainerTest, ClippedRectsForIframedElement) { URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("plugin_container.html")); URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("plugin_containing_page.html")); TestPluginWebFrameClient pluginWebFrameClient; // Must outlive webViewHelper. FrameTestHelpers::WebViewHelper webViewHelper; WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "plugin_containing_page.html", true, &pluginWebFrameClient); ASSERT(webView); webView->settings()->setPluginsEnabled(true); webView->resize(WebSize(300, 300)); webView->updateAllLifecyclePhases(); runPendingTasks(); WebElement pluginElement = webView->mainFrame()->firstChild()->document().getElementById("translated-plugin"); RefPtrWillBeRawPtr<WebPluginContainerImpl> pluginContainerImpl = toWebPluginContainerImpl(pluginElement.pluginContainer()); ASSERT(pluginContainerImpl.get()); pluginContainerImpl->setFrameRect(IntRect(0, 0, 300, 300)); IntRect windowRect, clipRect, unobscuredRect; Vector<IntRect> cutOutRects; calculateGeometry(pluginContainerImpl.get(), windowRect, clipRect, unobscuredRect, cutOutRects); EXPECT_RECT_EQ(IntRect(10, 210, 300, 300), windowRect); EXPECT_RECT_EQ(IntRect(0, 0, 240, 90), clipRect); EXPECT_RECT_EQ(IntRect(0, 0, 240, 160), unobscuredRect); // Cause the plugin's frame to be detached. webViewHelper.reset(); }
// Verifies |Ctrl-C| and |Ctrl-Insert| keyboard events, results in copying to // the clipboard. TEST_F(WebPluginContainerTest, CopyInsertKeyboardEventsTest) { URLTestHelpers::registerMockedURLFromBaseURL( WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("plugin_container.html")); TestPluginWebFrameClient pluginWebFrameClient; // Must outlive webViewHelper. FrameTestHelpers::WebViewHelper webViewHelper; WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "plugin_container.html", true, &pluginWebFrameClient); ASSERT(webView); webView->settings()->setPluginsEnabled(true); webView->resize(WebSize(300, 300)); webView->updateAllLifecyclePhases(); runPendingTasks(); WebElement pluginContainerOneElement = webView->mainFrame()->document().getElementById(WebString::fromUTF8("translated-plugin")); PlatformEvent::Modifiers modifierKey = static_cast<PlatformEvent::Modifiers>(PlatformEvent::CtrlKey | PlatformEvent::NumLockOn | PlatformEvent::IsLeft); #if OS(MACOSX) modifierKey = static_cast<PlatformEvent::Modifiers>(PlatformEvent::MetaKey | PlatformEvent::NumLockOn | PlatformEvent::IsLeft); #endif PlatformKeyboardEvent platformKeyboardEventC(PlatformEvent::RawKeyDown, "", "", "67", "", "", 67, 0, false, modifierKey, 0.0); RefPtrWillBeRawPtr<KeyboardEvent> keyEventC = KeyboardEvent::create(platformKeyboardEventC, 0); toWebPluginContainerImpl(pluginContainerOneElement.pluginContainer())->handleEvent(keyEventC.get()); EXPECT_EQ(WebString("x"), Platform::current()->clipboard()->readPlainText(WebClipboard::Buffer())); // Clearing |Clipboard::Buffer()|. Platform::current()->clipboard()->writePlainText(WebString("")); EXPECT_EQ(WebString(""), Platform::current()->clipboard()->readPlainText(WebClipboard::Buffer())); PlatformKeyboardEvent platformKeyboardEventInsert(PlatformEvent::RawKeyDown, "", "", "45", "", "", 45, 0, false, modifierKey, 0.0); RefPtrWillBeRawPtr<KeyboardEvent> keyEventInsert = KeyboardEvent::create(platformKeyboardEventInsert, 0); toWebPluginContainerImpl(pluginContainerOneElement.pluginContainer())->handleEvent(keyEventInsert.get()); EXPECT_EQ(WebString("x"), Platform::current()->clipboard()->readPlainText(WebClipboard::Buffer())); }
TEST_F(WebPluginContainerTest, LocalToWindowPointTest) { URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("plugin_container.html")); TestPluginWebFrameClient pluginWebFrameClient; // Must outlive webViewHelper. FrameTestHelpers::WebViewHelper webViewHelper; WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "plugin_container.html", true, &pluginWebFrameClient); ASSERT(webView); webView->settings()->setPluginsEnabled(true); webView->resize(WebSize(300, 300)); webView->updateAllLifecyclePhases(); runPendingTasks(); WebPluginContainer* pluginContainerOne = getWebPluginContainer(webView, WebString::fromUTF8("translated-plugin")); ASSERT(pluginContainerOne); WebPoint point1 = pluginContainerOne->localToRootFramePoint(WebPoint(0, 0)); ASSERT_EQ(10, point1.x); ASSERT_EQ(10, point1.y); WebPoint point2 = pluginContainerOne->localToRootFramePoint(WebPoint(90, 90)); ASSERT_EQ(100, point2.x); ASSERT_EQ(100, point2.y); WebPluginContainer* pluginContainerTwo = getWebPluginContainer(webView, WebString::fromUTF8("rotated-plugin")); ASSERT(pluginContainerTwo); WebPoint point3 = pluginContainerTwo->localToRootFramePoint(WebPoint(10, 0)); ASSERT_EQ(0, point3.x); ASSERT_EQ(10, point3.y); WebPoint point4 = pluginContainerTwo->localToRootFramePoint(WebPoint(10, 10)); ASSERT_EQ(-10, point4.x); ASSERT_EQ(10, point4.y); }
TEST_F(WebPluginContainerTest, TopmostAfterDetachTest) { static WebRect topmostRect(10, 10, 40, 40); // Plugin that checks isRectTopmost in destroy(). class TopmostPlugin : public FakeWebPlugin { public: TopmostPlugin(WebFrame* frame, const WebPluginParams& params) : FakeWebPlugin(frame, params) {} bool isRectTopmost() { return container()->isRectTopmost(topmostRect); } void destroy() override { // In destroy, isRectTopmost is no longer valid. EXPECT_FALSE(container()->isRectTopmost(topmostRect)); FakeWebPlugin::destroy(); } }; class TopmostPluginWebFrameClient : public FrameTestHelpers::TestWebFrameClient { WebPlugin* createPlugin(WebLocalFrame* frame, const WebPluginParams& params) override { return new TopmostPlugin(frame, params); } }; URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("plugin_container.html")); TopmostPluginWebFrameClient pluginWebFrameClient; // Must outlive webViewHelper. FrameTestHelpers::WebViewHelper webViewHelper; WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "plugin_container.html", true, &pluginWebFrameClient); ASSERT(webView); webView->settings()->setPluginsEnabled(true); webView->resize(WebSize(300, 300)); webView->updateAllLifecyclePhases(); runPendingTasks(); RefPtrWillBeRawPtr<WebPluginContainerImpl> pluginContainerImpl = toWebPluginContainerImpl(getWebPluginContainer(webView, WebString::fromUTF8("translated-plugin"))); pluginContainerImpl->setFrameRect(IntRect(0, 0, 300, 300)); EXPECT_TRUE(pluginContainerImpl->isRectTopmost(topmostRect)); TopmostPlugin* testPlugin = static_cast<TopmostPlugin*>(pluginContainerImpl->plugin()); EXPECT_TRUE(testPlugin->isRectTopmost()); // Cause the plugin's frame to be detached. webViewHelper.reset(); EXPECT_FALSE(pluginContainerImpl->isRectTopmost(topmostRect)); }
TEST_F(WebPluginContainerTest, PluginDocumentPluginIsFocused) { URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("test.pdf"), WebString::fromUTF8("application/pdf")); TestPluginWebFrameClient pluginWebFrameClient; // Must outlive webViewHelper. FrameTestHelpers::WebViewHelper webViewHelper; WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "test.pdf", true, &pluginWebFrameClient); ASSERT(webView); webView->updateAllLifecyclePhases(); WebDocument document = webView->mainFrame()->document(); EXPECT_TRUE(document.isPluginDocument()); WebPluginContainer* pluginContainer = getWebPluginContainer(webView, "plugin"); EXPECT_EQ(document.focusedElement(), pluginContainer->element()); }
// Verifies executing the command 'Copy' results in copying to the clipboard. TEST_F(WebPluginContainerTest, Copy) { URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("plugin_container.html")); TestPluginWebFrameClient pluginWebFrameClient; // Must outlive webViewHelper. FrameTestHelpers::WebViewHelper webViewHelper; WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "plugin_container.html", true, &pluginWebFrameClient); ASSERT(webView); webView->settings()->setPluginsEnabled(true); webView->resize(WebSize(300, 300)); webView->updateAllLifecyclePhases(); runPendingTasks(); WebElement pluginContainerOneElement = webView->mainFrame()->document().getElementById(WebString::fromUTF8("translated-plugin")); EXPECT_TRUE(webView->mainFrame()->executeCommand("Copy", pluginContainerOneElement)); EXPECT_EQ(WebString("x"), Platform::current()->clipboard()->readPlainText(WebClipboard::Buffer())); }
TEST_F(WebPluginContainerTest, GestureLongPressReachesPlugin) { URLTestHelpers::registerMockedURLFromBaseURL( WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("plugin_container.html")); EventTestPluginWebFrameClient pluginWebFrameClient; // Must outlive webViewHelper. FrameTestHelpers::WebViewHelper webViewHelper; WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "plugin_container.html", true, &pluginWebFrameClient); ASSERT(webView); webView->settings()->setPluginsEnabled(true); webView->resize(WebSize(300, 300)); webView->updateAllLifecyclePhases(); runPendingTasks(); WebElement pluginContainerOneElement = webView->mainFrame()->document().getElementById(WebString::fromUTF8("translated-plugin")); WebPlugin* plugin = static_cast<WebPluginContainerImpl*>(pluginContainerOneElement.pluginContainer())->plugin(); EventTestPlugin* testPlugin = static_cast<EventTestPlugin*>(plugin); WebGestureEvent event; event.type = WebInputEvent::GestureLongPress; event.sourceDevice = WebGestureDeviceTouchscreen; // First, send an event that doesn't hit the plugin to verify that the // plugin doesn't receive it. event.x = 0; event.y = 0; webView->handleInputEvent(event); runPendingTasks(); EXPECT_EQ(WebInputEvent::Undefined, testPlugin->getLastInputEventType()); // Next, send an event that does hit the plugin, and verify it does receive it. WebRect rect = pluginContainerOneElement.boundsInViewportSpace(); event.x = rect.x + rect.width / 2; event.y = rect.y + rect.height / 2; webView->handleInputEvent(event); runPendingTasks(); EXPECT_EQ(WebInputEvent::GestureLongPress, testPlugin->getLastInputEventType()); }
TEST_F(WebPluginContainerTest, PrintAllPages) { URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("test.pdf"), WebString::fromUTF8("application/pdf")); TestPluginWebFrameClient pluginWebFrameClient; // Must outlive webViewHelper. FrameTestHelpers::WebViewHelper webViewHelper; WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "test.pdf", true, &pluginWebFrameClient); ASSERT(webView); webView->updateAllLifecyclePhases(); runPendingTasks(); WebFrame* frame = webView->mainFrame(); WebPrintParams printParams; printParams.printContentArea.width = 500; printParams.printContentArea.height = 500; frame->printBegin(printParams); SkPictureRecorder recorder; frame->printPagesWithBoundaries(recorder.beginRecording(IntRect()), WebSize()); frame->printEnd(); ASSERT(pluginWebFrameClient.printedAtLeastOnePage()); }
// Verify that isRectTopmost returns false when the document is detached. TEST_F(WebPluginContainerTest, IsRectTopmostTest) { URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("plugin_container.html")); TestPluginWebFrameClient pluginWebFrameClient; // Must outlive webViewHelper. FrameTestHelpers::WebViewHelper webViewHelper; WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "plugin_container.html", true, &pluginWebFrameClient); ASSERT(webView); webView->settings()->setPluginsEnabled(true); webView->resize(WebSize(300, 300)); webView->updateAllLifecyclePhases(); runPendingTasks(); RefPtrWillBeRawPtr<WebPluginContainerImpl> pluginContainerImpl = toWebPluginContainerImpl(getWebPluginContainer(webView, WebString::fromUTF8("translated-plugin"))); pluginContainerImpl->setFrameRect(IntRect(0, 0, 300, 300)); WebRect rect = pluginContainerImpl->element().boundsInViewportSpace(); EXPECT_TRUE(pluginContainerImpl->isRectTopmost(rect)); // Cause the plugin's frame to be detached. webViewHelper.reset(); EXPECT_FALSE(pluginContainerImpl->isRectTopmost(rect)); }