#include "core/page/scrolling/ScrollingCoordinator.h"
-#include <gtest/gtest.h>
-#include "FrameTestHelpers.h"
-#include "URLTestHelpers.h"
-#include "WebFrameClient.h"
-#include "WebFrameImpl.h"
-#include "WebSettings.h"
-#include "WebViewClient.h"
-#include "WebViewImpl.h"
-#include "core/platform/graphics/GraphicsLayer.h"
-#include "core/rendering/CompositedLayerMapping.h"
-#include "core/rendering/RenderLayerCompositor.h"
+#include "core/page/Page.h"
+#include "core/rendering/RenderPart.h"
#include "core/rendering/RenderView.h"
+#include "core/rendering/compositing/CompositedLayerMapping.h"
+#include "core/rendering/compositing/RenderLayerCompositor.h"
+#include "core/testing/URLTestHelpers.h"
+#include "platform/graphics/GraphicsLayer.h"
#include "public/platform/Platform.h"
#include "public/platform/WebLayer.h"
#include "public/platform/WebLayerPositionConstraint.h"
#include "public/platform/WebLayerTreeView.h"
#include "public/platform/WebUnitTestSupport.h"
+#include "public/web/WebSettings.h"
+#include "public/web/WebViewClient.h"
+#include "web/WebLocalFrameImpl.h"
+#include "web/WebViewImpl.h"
+#include "web/tests/FrameTestHelpers.h"
+#include <gtest/gtest.h>
-using namespace WebCore;
-using namespace WebKit;
+using namespace blink;
namespace {
-class FakeWebViewClient : public WebViewClient {
-public:
- virtual void initializeLayerTreeView()
- {
- m_layerTreeView = adoptPtr(Platform::current()->unitTestSupport()->createLayerTreeViewForTesting(WebUnitTestSupport::TestViewTypeUnitTest));
- ASSERT(m_layerTreeView);
- }
-
- virtual WebLayerTreeView* layerTreeView()
- {
- return m_layerTreeView.get();
- }
-
-private:
- OwnPtr<WebLayerTreeView> m_layerTreeView;
-};
-
-class MockWebFrameClient : public WebFrameClient {
-};
-
class ScrollingCoordinatorChromiumTest : public testing::Test {
public:
ScrollingCoordinatorChromiumTest()
: m_baseURL("http://www.test.com/")
{
- // We cannot reuse FrameTestHelpers::createWebViewAndLoad here because the compositing
- // settings need to be set before the page is loaded.
- m_mainFrame = WebFrame::create(&m_mockWebFrameClient);
- m_webViewImpl = toWebViewImpl(WebView::create(&m_mockWebViewClient));
- m_webViewImpl->settings()->setJavaScriptEnabled(true);
- m_webViewImpl->settings()->setForceCompositingMode(true);
- m_webViewImpl->settings()->setAcceleratedCompositingEnabled(true);
- m_webViewImpl->settings()->setAcceleratedCompositingForFixedPositionEnabled(true);
- m_webViewImpl->settings()->setAcceleratedCompositingForOverflowScrollEnabled(true);
- m_webViewImpl->settings()->setAcceleratedCompositingForScrollableFramesEnabled(true);
- m_webViewImpl->settings()->setCompositedScrollingForFramesEnabled(true);
- m_webViewImpl->settings()->setFixedPositionCreatesStackingContext(true);
- m_webViewImpl->setMainFrame(m_mainFrame);
- m_webViewImpl->resize(IntSize(320, 240));
+ m_helper.initialize(true, 0, &m_mockWebViewClient, &configureSettings);
+ webViewImpl()->resize(IntSize(320, 240));
}
virtual ~ScrollingCoordinatorChromiumTest()
{
Platform::current()->unitTestSupport()->unregisterAllMockedURLs();
- m_webViewImpl->close();
- m_mainFrame->close();
}
void navigateTo(const std::string& url)
{
- FrameTestHelpers::loadFrame(m_webViewImpl->mainFrame(), url);
- Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests();
+ FrameTestHelpers::loadFrame(webViewImpl()->mainFrame(), url);
}
void forceFullCompositingUpdate()
{
- RenderLayerCompositor* compositor = m_webViewImpl->mainFrameImpl()->frame()->contentRenderer()->compositor();
- compositor->updateCompositingLayers(CompositingUpdateFinishAllDeferredWork);
+ webViewImpl()->layout();
}
void registerMockedHttpURLLoad(const std::string& fileName)
WebLayer* getRootScrollLayer()
{
- RenderLayerCompositor* compositor = m_webViewImpl->mainFrameImpl()->frame()->contentRenderer()->compositor();
+ RenderLayerCompositor* compositor = frame()->contentRenderer()->compositor();
ASSERT(compositor);
ASSERT(compositor->scrollLayer());
return webScrollLayer;
}
+ WebViewImpl* webViewImpl() const { return m_helper.webViewImpl(); }
+ LocalFrame* frame() const { return m_helper.webViewImpl()->mainFrameImpl()->frame(); }
+
protected:
std::string m_baseURL;
- MockWebFrameClient m_mockWebFrameClient;
- FakeWebViewClient m_mockWebViewClient;
- WebViewImpl* m_webViewImpl;
- WebFrame* m_mainFrame;
+ FrameTestHelpers::TestWebViewClient m_mockWebViewClient;
+
+private:
+ static void configureSettings(WebSettings* settings)
+ {
+ settings->setJavaScriptEnabled(true);
+ settings->setAcceleratedCompositingEnabled(true);
+ settings->setPreferCompositingToLCDTextEnabled(true);
+ }
+
+ FrameTestHelpers::WebViewHelper m_helper;
+};
+
+class GraphicsLayerForScrollTesting : public GraphicsLayer {
+public:
+ virtual WebLayer* contentsLayer() const { return GraphicsLayer::contentsLayer(); }
};
TEST_F(ScrollingCoordinatorChromiumTest, fastScrollingByDefault)
forceFullCompositingUpdate();
// Make sure the scrolling coordinator is active.
- FrameView* frameView = m_webViewImpl->mainFrameImpl()->frameView();
- Page* page = m_webViewImpl->mainFrameImpl()->frame()->page();
+ FrameView* frameView = frame()->view();
+ Page* page = frame()->page();
ASSERT_TRUE(page->scrollingCoordinator());
ASSERT_TRUE(page->scrollingCoordinator()->coordinatesScrollingForFrameView(frameView));
ASSERT_FALSE(rootScrollLayer->haveWheelEventHandlers());
}
+TEST_F(ScrollingCoordinatorChromiumTest, fastScrollingCanBeDisabledWithSetting)
+{
+ navigateTo("about:blank");
+ webViewImpl()->settings()->setThreadedScrollingEnabled(false);
+ forceFullCompositingUpdate();
+
+ // Make sure the scrolling coordinator is active.
+ FrameView* frameView = frame()->view();
+ Page* page = frame()->page();
+ ASSERT_TRUE(page->scrollingCoordinator());
+ ASSERT_TRUE(page->scrollingCoordinator()->coordinatesScrollingForFrameView(frameView));
+
+ // Main scrolling should be enabled with the setting override.
+ WebLayer* rootScrollLayer = getRootScrollLayer();
+ ASSERT_TRUE(rootScrollLayer->scrollable());
+ ASSERT_TRUE(rootScrollLayer->shouldScrollOnMainThread());
+}
+
static WebLayer* webLayerFromElement(Element* element)
{
if (!element)
RenderLayer* layer = toRenderBoxModelObject(renderer)->layer();
if (!layer)
return 0;
- CompositedLayerMapping* compositedLayerMapping = layer->compositedLayerMapping();
- if (!compositedLayerMapping)
+ if (!layer->hasCompositedLayerMapping())
return 0;
+ CompositedLayerMapping* compositedLayerMapping = layer->compositedLayerMapping();
GraphicsLayer* graphicsLayer = compositedLayerMapping->mainGraphicsLayer();
if (!graphicsLayer)
return 0;
WebLayer* rootScrollLayer = getRootScrollLayer();
ASSERT_FALSE(rootScrollLayer->shouldScrollOnMainThread());
- Document* document = m_webViewImpl->mainFrameImpl()->frame()->document();
+ Document* document = frame()->document();
{
Element* element = document->getElementById("div-tl");
ASSERT_TRUE(element);
}
}
-TEST_F(ScrollingCoordinatorChromiumTest, nonFastScrollableRegion)
+TEST_F(ScrollingCoordinatorChromiumTest, wheelEventHandler)
{
- registerMockedHttpURLLoad("non-fast-scrollable.html");
- navigateTo(m_baseURL + "non-fast-scrollable.html");
+ registerMockedHttpURLLoad("wheel-event-handler.html");
+ navigateTo(m_baseURL + "wheel-event-handler.html");
forceFullCompositingUpdate();
WebLayer* rootScrollLayer = getRootScrollLayer();
- WebVector<WebRect> nonFastScrollableRegion = rootScrollLayer->nonFastScrollableRegion();
-
- ASSERT_EQ(1u, nonFastScrollableRegion.size());
- ASSERT_EQ(WebRect(8, 8, 10, 10), nonFastScrollableRegion[0]);
+ ASSERT_TRUE(rootScrollLayer->haveWheelEventHandlers());
}
-TEST_F(ScrollingCoordinatorChromiumTest, wheelEventHandler)
+TEST_F(ScrollingCoordinatorChromiumTest, scrollEventHandler)
{
- registerMockedHttpURLLoad("wheel-event-handler.html");
- navigateTo(m_baseURL + "wheel-event-handler.html");
+ registerMockedHttpURLLoad("scroll-event-handler.html");
+ navigateTo(m_baseURL + "scroll-event-handler.html");
forceFullCompositingUpdate();
WebLayer* rootScrollLayer = getRootScrollLayer();
- ASSERT_TRUE(rootScrollLayer->haveWheelEventHandlers());
+ ASSERT_TRUE(rootScrollLayer->haveScrollEventHandlers());
+}
+
+TEST_F(ScrollingCoordinatorChromiumTest, updateEventHandlersDuringTeardown)
+{
+ registerMockedHttpURLLoad("scroll-event-handler-window.html");
+ navigateTo(m_baseURL + "scroll-event-handler-window.html");
+ forceFullCompositingUpdate();
+
+ // Simulate detaching the document from its DOM window. This should not
+ // cause a crash when the WebViewImpl is closed by the test runner.
+ frame()->document()->prepareForDestruction();
}
TEST_F(ScrollingCoordinatorChromiumTest, clippedBodyTest)
// Verify the properties of the accelerated scrolling element starting from the RenderObject
// all the way to the WebLayer.
- Element* scrollableElement = m_webViewImpl->mainFrameImpl()->frame()->document()->getElementById("scrollable");
+ Element* scrollableElement = frame()->document()->getElementById("scrollable");
ASSERT(scrollableElement);
RenderObject* renderer = scrollableElement->renderer();
// Verify the properties of the accelerated scrolling element starting from the RenderObject
// all the way to the WebLayer.
- Element* overflowElement = m_webViewImpl->mainFrameImpl()->frame()->document()->getElementById("unscrollable-y");
+ Element* overflowElement = frame()->document()->getElementById("unscrollable-y");
ASSERT(overflowElement);
RenderObject* renderer = overflowElement->renderer();
ASSERT_TRUE(webScrollLayer->userScrollableHorizontal());
ASSERT_FALSE(webScrollLayer->userScrollableVertical());
- overflowElement = m_webViewImpl->mainFrameImpl()->frame()->document()->getElementById("unscrollable-x");
+ overflowElement = frame()->document()->getElementById("unscrollable-x");
ASSERT(overflowElement);
renderer = overflowElement->renderer();
// Verify the properties of the accelerated scrolling element starting from the RenderObject
// all the way to the WebLayer.
- Element* scrollableFrame = m_webViewImpl->mainFrameImpl()->frame()->document()->getElementById("scrollable");
+ Element* scrollableFrame = frame()->document()->getElementById("scrollable");
ASSERT_TRUE(scrollableFrame);
RenderObject* renderer = scrollableFrame->renderer();
ASSERT_TRUE(renderer);
- ASSERT_TRUE(renderer->isWidget());
+ ASSERT_TRUE(renderer->isRenderPart());
- RenderWidget* renderWidget = toRenderWidget(renderer);
- ASSERT_TRUE(renderWidget);
- ASSERT_TRUE(renderWidget->widget());
- ASSERT_TRUE(renderWidget->widget()->isFrameView());
+ RenderPart* renderPart = toRenderPart(renderer);
+ ASSERT_TRUE(renderPart);
+ ASSERT_TRUE(renderPart->widget());
+ ASSERT_TRUE(renderPart->widget()->isFrameView());
- FrameView* innerFrameView = toFrameView(renderWidget->widget());
+ FrameView* innerFrameView = toFrameView(renderPart->widget());
RenderView* innerRenderView = innerFrameView->renderView();
ASSERT_TRUE(innerRenderView);
// Verify the properties of the accelerated scrolling element starting from the RenderObject
// all the way to the WebLayer.
- Element* scrollableFrame = m_webViewImpl->mainFrameImpl()->frame()->document()->getElementById("scrollable");
+ Element* scrollableFrame = frame()->document()->getElementById("scrollable");
ASSERT_TRUE(scrollableFrame);
RenderObject* renderer = scrollableFrame->renderer();
ASSERT_TRUE(renderer);
- ASSERT_TRUE(renderer->isWidget());
+ ASSERT_TRUE(renderer->isRenderPart());
- RenderWidget* renderWidget = toRenderWidget(renderer);
- ASSERT_TRUE(renderWidget);
- ASSERT_TRUE(renderWidget->widget());
- ASSERT_TRUE(renderWidget->widget()->isFrameView());
+ RenderPart* renderPart = toRenderPart(renderer);
+ ASSERT_TRUE(renderPart);
+ ASSERT_TRUE(renderPart->widget());
+ ASSERT_TRUE(renderPart->widget()->isFrameView());
- FrameView* innerFrameView = toFrameView(renderWidget->widget());
+ FrameView* innerFrameView = toFrameView(renderPart->widget());
RenderView* innerRenderView = innerFrameView->renderView();
ASSERT_TRUE(innerRenderView);
ASSERT_TRUE(webScrollLayer->scrollable());
int expectedScrollPosition = 958 + (innerFrameView->verticalScrollbar()->isOverlayScrollbar() ? 0 : 15);
- ASSERT_EQ(expectedScrollPosition, webScrollLayer->scrollPosition().x);
- ASSERT_EQ(expectedScrollPosition, webScrollLayer->maxScrollPosition().width);
+ ASSERT_EQ(expectedScrollPosition, webScrollLayer->scrollPositionDouble().x);
}
TEST_F(ScrollingCoordinatorChromiumTest, setupScrollbarLayerShouldNotCrash)
// an empty document by javascript.
}
+#if OS(MACOSX)
+TEST_F(ScrollingCoordinatorChromiumTest, DISABLED_setupScrollbarLayerShouldSetScrollLayerOpaque)
+#else
+TEST_F(ScrollingCoordinatorChromiumTest, setupScrollbarLayerShouldSetScrollLayerOpaque)
+#endif
+{
+ registerMockedHttpURLLoad("wide_document.html");
+ navigateTo(m_baseURL + "wide_document.html");
+ forceFullCompositingUpdate();
+
+ FrameView* frameView = frame()->view();
+ ASSERT_TRUE(frameView);
+
+ GraphicsLayerForScrollTesting* scrollbarGraphicsLayer = static_cast<GraphicsLayerForScrollTesting*>(frameView->layerForHorizontalScrollbar());
+ ASSERT_TRUE(scrollbarGraphicsLayer);
+
+ WebLayer* platformLayer = scrollbarGraphicsLayer->platformLayer();
+ ASSERT_TRUE(platformLayer);
+
+ WebLayer* contentsLayer = scrollbarGraphicsLayer->contentsLayer();
+ ASSERT_TRUE(contentsLayer);
+
+ // After scrollableAreaScrollbarLayerDidChange,
+ // if the main frame's scrollbarLayer is opaque,
+ // contentsLayer should be opaque too.
+ ASSERT_EQ(platformLayer->opaque(), contentsLayer->opaque());
+}
+
} // namespace