| Index: Source/web/PageOverlayTest.cpp
|
| diff --git a/Source/web/PageOverlayTest.cpp b/Source/web/PageOverlayTest.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..66823310248e540be9c959951e6fc55b55a41e25
|
| --- /dev/null
|
| +++ b/Source/web/PageOverlayTest.cpp
|
| @@ -0,0 +1,236 @@
|
| +// Copyright 2015 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 "config.h"
|
| +#include "web/PageOverlay.h"
|
| +
|
| +#include "core/frame/FrameView.h"
|
| +#include "core/rendering/RenderView.h"
|
| +#include "platform/graphics/Color.h"
|
| +#include "platform/graphics/GraphicsContext.h"
|
| +#include "platform/graphics/paint/DisplayItemList.h"
|
| +#include "platform/graphics/paint/DrawingRecorder.h"
|
| +#include "public/platform/Platform.h"
|
| +#include "public/platform/WebCanvas.h"
|
| +#include "public/platform/WebThread.h"
|
| +#include "public/web/WebPageOverlay.h"
|
| +#include "public/web/WebSettings.h"
|
| +#include "third_party/skia/include/core/SkBitmap.h"
|
| +#include "third_party/skia/include/core/SkCanvas.h"
|
| +#include "third_party/skia/include/core/SkColor.h"
|
| +#include "third_party/skia/include/core/SkPaint.h"
|
| +#include "web/WebGraphicsContextImpl.h"
|
| +#include "web/WebLocalFrameImpl.h"
|
| +#include "web/WebViewImpl.h"
|
| +#include "web/tests/FrameTestHelpers.h"
|
| +#include <gmock/gmock.h>
|
| +#include <gtest/gtest.h>
|
| +
|
| +using testing::_;
|
| +using testing::AtLeast;
|
| +using testing::Property;
|
| +
|
| +namespace blink {
|
| +namespace {
|
| +
|
| +static const int viewportWidth = 800;
|
| +static const int viewportHeight = 600;
|
| +
|
| +// These unit tests cover both PageOverlay and PageOverlayList.
|
| +
|
| +void enableAcceleratedCompositing(WebSettings* settings)
|
| +{
|
| + settings->setAcceleratedCompositingEnabled(true);
|
| +}
|
| +
|
| +void disableAcceleratedCompositing(WebSettings* settings)
|
| +{
|
| + settings->setAcceleratedCompositingEnabled(false);
|
| +}
|
| +
|
| +class PageOverlayTest : public ::testing::Test {
|
| +protected:
|
| + enum CompositingMode { AcceleratedCompositing, UnacceleratedCompositing };
|
| +
|
| + void initialize(CompositingMode compositingMode)
|
| + {
|
| + m_helper.initialize(
|
| + false /* enableJavascript */, nullptr /* webFrameClient */, nullptr /* webViewClient */,
|
| + compositingMode == AcceleratedCompositing ? enableAcceleratedCompositing : disableAcceleratedCompositing);
|
| + webViewImpl()->resize(WebSize(viewportWidth, viewportHeight));
|
| + ASSERT_EQ(compositingMode == AcceleratedCompositing, webViewImpl()->isAcceleratedCompositingActive());
|
| + ASSERT_TRUE(!webViewImpl()->pageOverlays() || webViewImpl()->pageOverlays()->empty());
|
| + }
|
| +
|
| + WebViewImpl* webViewImpl() const { return m_helper.webViewImpl(); }
|
| +
|
| + template <typename OverlayType>
|
| + void runPageOverlayTestWithUnacceleratedCompositing();
|
| +
|
| + template <typename OverlayType>
|
| + void runPageOverlayTestWithAcceleratedCompositing();
|
| +
|
| +private:
|
| + FrameTestHelpers::WebViewHelper m_helper;
|
| +};
|
| +
|
| +// WebPageOverlay that uses a WebCanvas to draw a solid color.
|
| +class SimpleCanvasOverlay : public WebPageOverlay {
|
| +public:
|
| + SimpleCanvasOverlay(SkColor color) : m_color(color) { }
|
| +
|
| + void paintPageOverlay(WebGraphicsContext* context, const WebSize& size) override
|
| + {
|
| + WebFloatRect rect(0, 0, size.width, size.height);
|
| + WebCanvas* canvas = context->beginDrawing(rect);
|
| + SkPaint paint;
|
| + paint.setColor(m_color);
|
| + paint.setStyle(SkPaint::kFill_Style);
|
| + canvas->drawRectCoords(0, 0, size.width, size.height, paint);
|
| + context->endDrawing();
|
| + }
|
| +
|
| +private:
|
| + SkColor m_color;
|
| +};
|
| +
|
| +// WebPageOverlay that uses the underlying blink::GraphicsContext to paint a
|
| +// solid color.
|
| +class PrivateGraphicsContextOverlay : public WebPageOverlay {
|
| +public:
|
| + PrivateGraphicsContextOverlay(Color color) : m_color(color) { }
|
| +
|
| + void paintPageOverlay(WebGraphicsContext* context, const WebSize& size) override
|
| + {
|
| + GraphicsContext& graphicsContext = toWebGraphicsContextImpl(context)->graphicsContext();
|
| + FloatRect rect(0, 0, size.width, size.height);
|
| + DrawingRecorder drawingRecorder(&graphicsContext, toDisplayItemClient(this), DisplayItem::PageOverlay, rect);
|
| + graphicsContext.fillRect(rect, m_color);
|
| + }
|
| +
|
| +private:
|
| + Color m_color;
|
| +};
|
| +
|
| +template <bool(*getter)(), void(*setter)(bool)>
|
| +class RuntimeFeatureChange {
|
| +public:
|
| + RuntimeFeatureChange(bool newValue) : m_oldValue(getter()) { setter(newValue); }
|
| + ~RuntimeFeatureChange() { setter(m_oldValue); }
|
| +private:
|
| + bool m_oldValue;
|
| +};
|
| +using SlimmingPaintScope = RuntimeFeatureChange<&RuntimeEnabledFeatures::slimmingPaintEnabled, RuntimeEnabledFeatures::setSlimmingPaintEnabled>;
|
| +
|
| +class MockCanvas : public SkCanvas {
|
| +public:
|
| + MockCanvas(int width, int height) : SkCanvas(width, height) { }
|
| + MOCK_METHOD2(onDrawRect, void(const SkRect&, const SkPaint&));
|
| +};
|
| +
|
| +template <typename OverlayType>
|
| +void PageOverlayTest::runPageOverlayTestWithUnacceleratedCompositing()
|
| +{
|
| + initialize(UnacceleratedCompositing);
|
| +
|
| + OverlayType overlay(SK_ColorYELLOW);
|
| + webViewImpl()->addPageOverlay(&overlay, 0 /* zOrder */);
|
| + EXPECT_TRUE(webViewImpl()->pageOverlays() && !webViewImpl()->pageOverlays()->empty());
|
| + webViewImpl()->layout();
|
| +
|
| + MockCanvas canvas(viewportWidth, viewportHeight);
|
| + EXPECT_CALL(canvas, onDrawRect(_, _)).Times(AtLeast(1));
|
| + EXPECT_CALL(canvas, onDrawRect(SkRect::MakeWH(viewportWidth, viewportHeight), Property(&SkPaint::getColor, SK_ColorYELLOW)));
|
| + webViewImpl()->paint(&canvas, WebRect(0, 0, viewportWidth, viewportHeight));
|
| +}
|
| +
|
| +TEST_F(PageOverlayTest, SimpleCanvasOverlay_UnacceleratedCompositing_NoSlimmingPaint)
|
| +{
|
| + SlimmingPaintScope slimmingPaintEnabled(false);
|
| + runPageOverlayTestWithUnacceleratedCompositing<SimpleCanvasOverlay>();
|
| +}
|
| +
|
| +TEST_F(PageOverlayTest, SimpleCanvasOverlay_UnacceleratedCompositing_SlimmingPaint)
|
| +{
|
| + SlimmingPaintScope slimmingPaintEnabled(true);
|
| + runPageOverlayTestWithUnacceleratedCompositing<SimpleCanvasOverlay>();
|
| +}
|
| +
|
| +TEST_F(PageOverlayTest, PrivateGraphicsContextOverlay_UnacceleratedCompositing_NoSlimmingPaint)
|
| +{
|
| + SlimmingPaintScope slimmingPaintEnabled(false);
|
| + runPageOverlayTestWithUnacceleratedCompositing<PrivateGraphicsContextOverlay>();
|
| +}
|
| +
|
| +TEST_F(PageOverlayTest, PrivateGraphicsContextOverlay_UnacceleratedCompositing_SlimmingPaint)
|
| +{
|
| + SlimmingPaintScope slimmingPaintEnabled(true);
|
| + runPageOverlayTestWithUnacceleratedCompositing<PrivateGraphicsContextOverlay>();
|
| +}
|
| +
|
| +template <typename OverlayType>
|
| +void PageOverlayTest::runPageOverlayTestWithAcceleratedCompositing()
|
| +{
|
| + initialize(AcceleratedCompositing);
|
| + webViewImpl()->layerTreeView()->setViewportSize(WebSize(viewportWidth, viewportHeight));
|
| +
|
| + OverlayType overlay(SK_ColorYELLOW);
|
| + webViewImpl()->addPageOverlay(&overlay, 0 /* zOrder */);
|
| + EXPECT_TRUE(webViewImpl()->pageOverlays() && !webViewImpl()->pageOverlays()->empty());
|
| + webViewImpl()->layout();
|
| +
|
| + // Ideally, we would get results from the compositor that showed that this
|
| + // page overlay actually winds up getting drawn on top of the rest.
|
| + // For now, we just check that the GraphicsLayer will draw the right thing.
|
| +
|
| + MockCanvas canvas(viewportWidth, viewportHeight);
|
| + EXPECT_CALL(canvas, onDrawRect(_, _)).Times(AtLeast(0));
|
| + EXPECT_CALL(canvas, onDrawRect(SkRect::MakeWH(viewportWidth, viewportHeight), Property(&SkPaint::getColor, SK_ColorYELLOW)));
|
| +
|
| + GraphicsLayer* graphicsLayer = webViewImpl()->pageOverlays()->graphicsLayerForTesting();
|
| + if (RuntimeEnabledFeatures::slimmingPaintEnabled()) {
|
| + // If slimming paint is on, we paint the layer with a null canvas to get
|
| + // a display list, and then replay that onto the mock canvas for
|
| + // examination. This is about as close to the real path as we can easily
|
| + // get.
|
| + GraphicsContext graphicsContext(nullptr /* canvas */, graphicsLayer->displayItemList());
|
| + graphicsContext.setCertainlyOpaque(false);
|
| + graphicsLayer->paint(graphicsContext, WebRect(0, 0, viewportWidth, viewportHeight));
|
| +
|
| + GraphicsContext replayContext(&canvas, nullptr /* displayItemList */);
|
| + replayContext.setCertainlyOpaque(false);
|
| + graphicsLayer->displayItemList()->replay(&replayContext);
|
| + } else {
|
| + GraphicsContext graphicsContext(&canvas, nullptr /* displayItemList */);
|
| + graphicsContext.setCertainlyOpaque(false);
|
| + graphicsLayer->paint(graphicsContext, WebRect(0, 0, viewportWidth, viewportHeight));
|
| + }
|
| +}
|
| +
|
| +TEST_F(PageOverlayTest, SimpleCanvasOverlay_AcceleratedCompositing_NoSlimmingPaint)
|
| +{
|
| + SlimmingPaintScope slimmingPaintEnabled(false);
|
| + runPageOverlayTestWithAcceleratedCompositing<SimpleCanvasOverlay>();
|
| +}
|
| +
|
| +TEST_F(PageOverlayTest, SimpleCanvasOverlay_AcceleratedCompositing_SlimmingPaint)
|
| +{
|
| + SlimmingPaintScope slimmingPaintEnabled(true);
|
| + runPageOverlayTestWithAcceleratedCompositing<SimpleCanvasOverlay>();
|
| +}
|
| +
|
| +TEST_F(PageOverlayTest, PrivateGraphicsContextOverlay_AcceleratedCompositing_NoSlimmingPaint)
|
| +{
|
| + SlimmingPaintScope slimmingPaintEnabled(false);
|
| + runPageOverlayTestWithAcceleratedCompositing<PrivateGraphicsContextOverlay>();
|
| +}
|
| +
|
| +TEST_F(PageOverlayTest, PrivateGraphicsContextOverlay_AcceleratedCompositing_SlimmingPaint)
|
| +{
|
| + SlimmingPaintScope slimmingPaintEnabled(true);
|
| + runPageOverlayTestWithAcceleratedCompositing<PrivateGraphicsContextOverlay>();
|
| +}
|
| +
|
| +} // namespace
|
| +} // namespace blink
|
|
|