15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/Canvas2DLayerBridge.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "SkDeferredCanvas.h"
303c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "SkSurface.h"
31a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/ImageBuffer.h"
325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/Platform.h"
337be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org#include "public/platform/WebExternalBitmap.h"
345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebThread.h"
35591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "third_party/skia/include/core/SkDevice.h"
36a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "web/tests/MockWebGraphicsContext3D.h"
37e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/RefPtr.h"
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <gmock/gmock.h>
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <gtest/gtest.h>
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WebCore;
4351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)using namespace blink;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using testing::InSequence;
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using testing::Return;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using testing::Test;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace {
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class MockCanvasContext : public MockWebGraphicsContext3D {
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MOCK_METHOD0(flush, void(void));
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MOCK_METHOD0(createTexture, unsigned(void));
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MOCK_METHOD1(deleteTexture, void(unsigned));
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class Canvas2DLayerBridgePtr {
58fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochpublic:
59a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    Canvas2DLayerBridgePtr(PassRefPtr<Canvas2DLayerBridge> layerBridge)
60a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        : m_layerBridge(layerBridge) { }
61a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
62a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ~Canvas2DLayerBridgePtr()
63fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    {
64a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_layerBridge->beginDestruction();
65fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    }
66a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
67a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    Canvas2DLayerBridge* operator->() { return m_layerBridge.get(); }
68a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    Canvas2DLayerBridge* get() { return m_layerBridge.get(); }
69a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
70a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)private:
71a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    RefPtr<Canvas2DLayerBridge> m_layerBridge;
72fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch};
73fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
747be71c394259339472222de8297b4281c5c04bc7boliu@chromium.orgclass NullWebExternalBitmap : public WebExternalBitmap {
757be71c394259339472222de8297b4281c5c04bc7boliu@chromium.orgpublic:
767be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org    virtual WebSize size()
777be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org    {
787be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org        return WebSize();
797be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org    }
807be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org
817be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org    virtual void setSize(WebSize)
827be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org    {
837be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org    }
847be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org
857be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org    virtual uint8* pixels()
867be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org    {
877be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org        return 0;
887be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org    }
897be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org};
907be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Canvas2DLayerBridgeTest : public Test {
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
95e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    void fullLifecycleTest()
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        RefPtr<GraphicsContext3D> mainContext = GraphicsContext3D::createGraphicsContextFromWebContext(adoptPtr(new MockCanvasContext));
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        MockCanvasContext& mainMock = *static_cast<MockCanvasContext*>(mainContext->webContext());
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
101a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        OwnPtr<SkDeferredCanvas> canvas = adoptPtr(SkDeferredCanvas::Create(SkSurface::NewRasterPMColor(300, 150)));
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        ::testing::Mock::VerifyAndClearExpectations(&mainMock);
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        {
106a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainContext.release(), canvas.release(), 0, NonOpaque)));
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
108a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            ::testing::Mock::VerifyAndClearExpectations(&mainMock);
10953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
110a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            EXPECT_CALL(mainMock, flush());
111a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            unsigned textureId = bridge->getBackingTexture();
112a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            EXPECT_EQ(textureId, 0u);
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
114a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            ::testing::Mock::VerifyAndClearExpectations(&mainMock);
115a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        } // bridge goes out of scope here
11653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
11753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        ::testing::Mock::VerifyAndClearExpectations(&mainMock);
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1197be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org
1207be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org    void prepareMailboxWithBitmapTest()
1217be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org    {
1227be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org        MockCanvasContext mainMock;
1237be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org        OwnPtr<SkDeferredCanvas> canvas = adoptPtr(SkDeferredCanvas::Create(SkSurface::NewRasterPMColor(300, 150)));
1247be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org        OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr(new MockWebGraphicsContext3DProvider(&mainMock));
1257be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org        Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainMockProvider.release(), canvas.release(), 0, NonOpaque)));
1267be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org        bridge->m_lastImageId = 1;
1277be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org
1287be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org        NullWebExternalBitmap bitmap;
1297be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org        bridge->prepareMailbox(0, &bitmap);
1307be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org        EXPECT_EQ(0u, bridge->m_lastImageId);
1317be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org    }
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace {
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)TEST_F(Canvas2DLayerBridgeTest, testFullLifecycleSingleThreaded)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
138e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    fullLifecycleTest();
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1417be71c394259339472222de8297b4281c5c04bc7boliu@chromium.orgTEST_F(Canvas2DLayerBridgeTest, prepareMailboxWithBitmapTest)
1427be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org{
1437be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org    prepareMailboxWithBitmapTest();
1447be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org}
1457be71c394259339472222de8297b4281c5c04bc7boliu@chromium.org
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace
147