blob: fa3b275ff7ad16b2f24bb6ec0676b04ba0f1582b [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/paint/HTMLCanvasPainter.h"
#include "core/frame/FrameView.h"
#include "core/frame/Settings.h"
#include "core/html/HTMLCanvasElement.h"
#include "core/html/canvas/CanvasContextCreationAttributes.h"
#include "core/html/canvas/CanvasRenderingContext.h"
#include "core/loader/EmptyClients.h"
#include "core/paint/StubChromeClientForSPv2.h"
#include "core/testing/DummyPageHolder.h"
#include "platform/graphics/Canvas2DImageBufferSurface.h"
#include "platform/graphics/Canvas2DLayerBridge.h"
#include "platform/graphics/test/FakeGLES2Interface.h"
#include "platform/graphics/test/FakeWebGraphicsContext3DProvider.h"
#include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h"
#include "public/platform/WebLayer.h"
#include "public/platform/WebSize.h"
#include "testing/gtest/include/gtest/gtest.h"
// Integration tests of canvas painting code (in SPv2 mode).
namespace blink {
class HTMLCanvasPainterTestForSPv2 : public ::testing::Test,
public testing::WithParamInterface<bool>,
private ScopedSlimmingPaintV2ForTest,
private ScopedRootLayerScrollingForTest {
public:
HTMLCanvasPainterTestForSPv2()
: ScopedSlimmingPaintV2ForTest(true),
ScopedRootLayerScrollingForTest(GetParam()) {}
protected:
void SetUp() override {
m_chromeClient = new StubChromeClientForSPv2();
Page::PageClients clients;
fillWithEmptyClients(clients);
clients.chromeClient = m_chromeClient.get();
m_pageHolder = DummyPageHolder::create(
IntSize(800, 600), &clients, nullptr, [](Settings& settings) {
settings.setAcceleratedCompositingEnabled(true);
// LayoutHTMLCanvas doesn't exist if script is disabled.
settings.setScriptEnabled(true);
});
document().view()->setParentVisible(true);
document().view()->setSelfVisible(true);
}
Document& document() { return m_pageHolder->document(); }
bool hasLayerAttached(const WebLayer& layer) {
return m_chromeClient->hasLayer(layer);
}
PassRefPtr<Canvas2DLayerBridge> makeCanvas2DLayerBridge(const IntSize& size) {
return adoptRef(new Canvas2DLayerBridge(
WTF::wrapUnique(new FakeWebGraphicsContext3DProvider(&m_gl)), size, 0,
NonOpaque, Canvas2DLayerBridge::ForceAccelerationForTesting,
gfx::ColorSpace::CreateSRGB(), false, kN32_SkColorType));
}
private:
Persistent<StubChromeClientForSPv2> m_chromeClient;
FakeGLES2Interface m_gl;
std::unique_ptr<DummyPageHolder> m_pageHolder;
};
INSTANTIATE_TEST_CASE_P(All, HTMLCanvasPainterTestForSPv2, ::testing::Bool());
TEST_P(HTMLCanvasPainterTestForSPv2, Canvas2DLayerAppearsInLayerTree) {
// Insert a <canvas> and force it into accelerated mode.
document().body()->setInnerHTML("<canvas width=300 height=200>");
HTMLCanvasElement* element =
toHTMLCanvasElement(document().body()->firstChild());
CanvasContextCreationAttributes attributes;
attributes.setAlpha(true);
CanvasRenderingContext* context =
element->getCanvasRenderingContext("2d", attributes);
RefPtr<Canvas2DLayerBridge> bridge =
makeCanvas2DLayerBridge(IntSize(300, 200));
element->createImageBufferUsingSurfaceForTesting(WTF::wrapUnique(
new Canvas2DImageBufferSurface(bridge, IntSize(300, 200))));
ASSERT_EQ(context, element->renderingContext());
ASSERT_TRUE(context->isComposited());
ASSERT_TRUE(element->isAccelerated());
// Force the page to paint.
document().view()->updateAllLifecyclePhases();
// Fetch the layer associated with the <canvas>, and check that it was
// correctly configured in the layer tree.
const WebLayer* layer = context->platformLayer();
ASSERT_TRUE(layer);
EXPECT_TRUE(hasLayerAttached(*layer));
EXPECT_EQ(WebSize(300, 200), layer->bounds());
}
} // namespace blink