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