| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 | 24 |
| 25 #include "platform/graphics/Canvas2DLayerBridge.h" | 25 #include "platform/graphics/Canvas2DLayerBridge.h" |
| 26 | 26 |
| 27 #include "SkSurface.h" | 27 #include "SkSurface.h" |
| 28 #include "gpu/command_buffer/client/gles2_interface.h" | 28 #include "gpu/command_buffer/client/gles2_interface.h" |
| 29 #include "platform/Task.h" | 29 #include "platform/Task.h" |
| 30 #include "platform/ThreadSafeFunctional.h" | 30 #include "platform/ThreadSafeFunctional.h" |
| 31 #include "platform/WaitableEvent.h" | 31 #include "platform/WaitableEvent.h" |
| 32 #include "platform/graphics/ImageBuffer.h" | 32 #include "platform/graphics/ImageBuffer.h" |
| 33 #include "platform/graphics/UnacceleratedImageBufferSurface.h" | 33 #include "platform/graphics/UnacceleratedImageBufferSurface.h" |
| 34 #include "platform/graphics/test/MockGLES2Interface.h" | 34 #include "platform/graphics/test/FakeGLES2Interface.h" |
| 35 #include "platform/graphics/test/MockWebGraphicsContext3D.h" | |
| 36 #include "public/platform/Platform.h" | 35 #include "public/platform/Platform.h" |
| 37 #include "public/platform/WebExternalBitmap.h" | 36 #include "public/platform/WebExternalBitmap.h" |
| 38 #include "public/platform/WebGraphicsContext3DProvider.h" | 37 #include "public/platform/WebGraphicsContext3DProvider.h" |
| 39 #include "public/platform/WebScheduler.h" | 38 #include "public/platform/WebScheduler.h" |
| 40 #include "public/platform/WebTaskRunner.h" | 39 #include "public/platform/WebTaskRunner.h" |
| 41 #include "public/platform/WebThread.h" | 40 #include "public/platform/WebThread.h" |
| 42 #include "public/platform/WebTraceLocation.h" | 41 #include "public/platform/WebTraceLocation.h" |
| 43 #include "public/platform/callback/WebClosure.h" | 42 #include "public/platform/callback/WebClosure.h" |
| 44 #include "skia/ext/texture_handle.h" | 43 #include "skia/ext/texture_handle.h" |
| 45 #include "testing/gmock/include/gmock/gmock.h" | 44 #include "testing/gmock/include/gmock/gmock.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 56 using testing::AtLeast; | 55 using testing::AtLeast; |
| 57 using testing::InSequence; | 56 using testing::InSequence; |
| 58 using testing::Return; | 57 using testing::Return; |
| 59 using testing::Test; | 58 using testing::Test; |
| 60 using testing::_; | 59 using testing::_; |
| 61 | 60 |
| 62 namespace blink { | 61 namespace blink { |
| 63 | 62 |
| 64 namespace { | 63 namespace { |
| 65 | 64 |
| 66 class MockCanvasContext : public MockWebGraphicsContext3D { | 65 class FakeWebGraphicsContext3DProvider : public WebGraphicsContext3DProvider { |
| 67 public: | 66 public: |
| 68 MOCK_METHOD0(flush, void(void)); | 67 FakeWebGraphicsContext3DProvider(gpu::gles2::GLES2Interface* gl) |
| 69 MOCK_METHOD0(createTexture, unsigned(void)); | 68 : m_gl(gl) |
| 70 MOCK_METHOD1(deleteTexture, void(unsigned)); | |
| 71 }; | |
| 72 | |
| 73 class MockWebGraphicsContext3DProvider : public WebGraphicsContext3DProvider { | |
| 74 public: | |
| 75 MockWebGraphicsContext3DProvider(WebGraphicsContext3D* context3d, gpu::gles2
::GLES2Interface* gl) | |
| 76 : m_context3d(context3d) | |
| 77 , m_gl(gl) | |
| 78 { | 69 { |
| 79 RefPtr<const GrGLInterface> glInterface = adoptRef(GrGLCreateNullInterfa
ce()); | 70 RefPtr<const GrGLInterface> glInterface = adoptRef(GrGLCreateNullInterfa
ce()); |
| 80 m_grContext = adoptRef(GrContext::Create(kOpenGL_GrBackend, reinterpret_
cast<GrBackendContext>(glInterface.get()))); | 71 m_grContext = adoptRef(GrContext::Create(kOpenGL_GrBackend, reinterpret_
cast<GrBackendContext>(glInterface.get()))); |
| 81 } | 72 } |
| 82 | 73 |
| 83 WebGraphicsContext3D* context3d() override | 74 WebGraphicsContext3D* context3d() override |
| 84 { | 75 { |
| 85 return m_context3d; | 76 return nullptr; |
| 86 } | 77 } |
| 87 | 78 |
| 88 GrContext* grContext() override | 79 GrContext* grContext() override |
| 89 { | 80 { |
| 90 return m_grContext.get(); | 81 return m_grContext.get(); |
| 91 } | 82 } |
| 92 | 83 |
| 93 gpu::gles2::GLES2Interface* contextGL() override | 84 gpu::gles2::GLES2Interface* contextGL() override |
| 94 { | 85 { |
| 95 return m_gl; | 86 return m_gl; |
| 96 } | 87 } |
| 97 | 88 |
| 98 void setLostContextCallback(WebClosure) override {} | 89 void setLostContextCallback(WebClosure) override {} |
| 99 | 90 |
| 100 private: | 91 private: |
| 101 WebGraphicsContext3D* m_context3d; | |
| 102 gpu::gles2::GLES2Interface* m_gl; | 92 gpu::gles2::GLES2Interface* m_gl; |
| 103 RefPtr<GrContext> m_grContext; | 93 RefPtr<GrContext> m_grContext; |
| 104 }; | 94 }; |
| 105 | 95 |
| 106 class Canvas2DLayerBridgePtr { | 96 class Canvas2DLayerBridgePtr { |
| 107 public: | 97 public: |
| 108 Canvas2DLayerBridgePtr() { } | 98 Canvas2DLayerBridgePtr() { } |
| 109 Canvas2DLayerBridgePtr(PassRefPtr<Canvas2DLayerBridge> layerBridge) | 99 Canvas2DLayerBridgePtr(PassRefPtr<Canvas2DLayerBridge> layerBridge) |
| 110 : m_layerBridge(layerBridge) { } | 100 : m_layerBridge(layerBridge) { } |
| 111 | 101 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 uint8_t* pixels() override | 139 uint8_t* pixels() override |
| 150 { | 140 { |
| 151 return nullptr; | 141 return nullptr; |
| 152 } | 142 } |
| 153 }; | 143 }; |
| 154 | 144 |
| 155 } // anonymous namespace | 145 } // anonymous namespace |
| 156 | 146 |
| 157 class Canvas2DLayerBridgeTest : public Test { | 147 class Canvas2DLayerBridgeTest : public Test { |
| 158 public: | 148 public: |
| 159 PassRefPtr<Canvas2DLayerBridge> makeBridge(PassOwnPtr<MockWebGraphicsContext
3DProvider> provider, const IntSize& size, Canvas2DLayerBridge::AccelerationMode
accelerationMode) | 149 PassRefPtr<Canvas2DLayerBridge> makeBridge(PassOwnPtr<FakeWebGraphicsContext
3DProvider> provider, const IntSize& size, Canvas2DLayerBridge::AccelerationMode
accelerationMode) |
| 160 { | 150 { |
| 161 return adoptRef(new Canvas2DLayerBridge(provider, size, 0, NonOpaque, ac
celerationMode)); | 151 return adoptRef(new Canvas2DLayerBridge(provider, size, 0, NonOpaque, ac
celerationMode)); |
| 162 } | 152 } |
| 163 | 153 |
| 164 protected: | 154 protected: |
| 165 void fullLifecycleTest() | 155 void fullLifecycleTest() |
| 166 { | 156 { |
| 167 MockCanvasContext mainMock; | 157 FakeGLES2Interface gl; |
| 168 MockGLES2Interface mockGL; | 158 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(new
FakeWebGraphicsContext3DProvider(&gl)); |
| 169 OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr(new
MockWebGraphicsContext3DProvider(&mainMock, &mockGL)); | |
| 170 | 159 |
| 171 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | 160 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(contextPr
ovider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::DisableA
cceleration))); |
| 172 | 161 |
| 173 { | 162 const GrGLTextureInfo* textureInfo = skia::GrBackendObjectToGrGLTextureI
nfo(bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnknown)->getText
ureHandle(true)); |
| 174 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainM
ockProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Dis
ableAcceleration))); | 163 EXPECT_EQ(textureInfo, nullptr); |
| 175 | 164 bridge.clear(); |
| 176 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 177 | |
| 178 const GrGLTextureInfo* textureInfo = skia::GrBackendObjectToGrGLText
ureInfo(bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnknown)->get
TextureHandle(true)); | |
| 179 EXPECT_EQ(textureInfo, nullptr); | |
| 180 | |
| 181 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 182 } // bridge goes out of scope here | |
| 183 | |
| 184 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 185 } | 165 } |
| 186 | 166 |
| 187 void fallbackToSoftwareIfContextLost() | 167 void fallbackToSoftwareIfContextLost() |
| 188 { | 168 { |
| 189 MockCanvasContext mainMock; | 169 FakeGLES2Interface gl; |
| 190 MockGLES2Interface mockGL; | 170 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(new
FakeWebGraphicsContext3DProvider(&gl)); |
| 191 OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr(new
MockWebGraphicsContext3DProvider(&mainMock, &mockGL)); | |
| 192 | 171 |
| 193 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | 172 gl.setIsContextLost(true); |
| 194 | 173 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(contextPr
ovider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::EnableAc
celeration))); |
| 195 { | 174 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 196 mockGL.setIsContextLost(true); | 175 EXPECT_FALSE(bridge->isAccelerated()); |
| 197 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainM
ockProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Ena
bleAcceleration))); | |
| 198 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 199 EXPECT_TRUE(bridge->checkSurfaceValid()); | |
| 200 EXPECT_FALSE(bridge->isAccelerated()); | |
| 201 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 202 } | |
| 203 | |
| 204 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 205 } | 176 } |
| 206 | 177 |
| 207 void fallbackToSoftwareOnFailedTextureAlloc() | 178 void fallbackToSoftwareOnFailedTextureAlloc() |
| 208 { | 179 { |
| 209 MockCanvasContext mainMock; | |
| 210 | |
| 211 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 212 | |
| 213 { | 180 { |
| 214 // No fallback case | 181 // No fallback case. |
| 215 MockGLES2Interface mockGL; | 182 FakeGLES2Interface gl; |
| 216 OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr
(new MockWebGraphicsContext3DProvider(&mainMock, &mockGL)); | 183 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
new FakeWebGraphicsContext3DProvider(&gl)); |
| 217 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainM
ockProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Ena
bleAcceleration))); | 184 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(conte
xtProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Enab
leAcceleration))); |
| 218 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 219 EXPECT_TRUE(bridge->checkSurfaceValid()); | 185 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 220 EXPECT_TRUE(bridge->isAccelerated()); | 186 EXPECT_TRUE(bridge->isAccelerated()); |
| 221 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 222 RefPtr<SkImage> snapshot = bridge->newImageSnapshot(PreferAccelerati
on, SnapshotReasonUnknown); | 187 RefPtr<SkImage> snapshot = bridge->newImageSnapshot(PreferAccelerati
on, SnapshotReasonUnknown); |
| 223 EXPECT_TRUE(bridge->isAccelerated()); | 188 EXPECT_TRUE(bridge->isAccelerated()); |
| 224 EXPECT_TRUE(snapshot->isTextureBacked()); | 189 EXPECT_TRUE(snapshot->isTextureBacked()); |
| 225 } | 190 } |
| 226 | 191 |
| 227 { | 192 { |
| 228 // Fallback case | 193 // Fallback case. |
| 229 MockGLES2Interface mockGL; | 194 FakeGLES2Interface gl; |
| 230 OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr
(new MockWebGraphicsContext3DProvider(&mainMock, &mockGL)); | 195 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
new FakeWebGraphicsContext3DProvider(&gl)); |
| 231 GrContext* gr = mainMockProvider->grContext(); | 196 GrContext* gr = contextProvider->grContext(); |
| 232 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainM
ockProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Ena
bleAcceleration))); | 197 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(conte
xtProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Enab
leAcceleration))); |
| 233 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 234 EXPECT_TRUE(bridge->checkSurfaceValid()); | 198 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 235 EXPECT_TRUE(bridge->isAccelerated()); // We don't yet know that allo
cation will fail | 199 EXPECT_TRUE(bridge->isAccelerated()); // We don't yet know that allo
cation will fail |
| 236 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | 200 // This will cause SkSurface_Gpu creation to fail without |
| 237 gr->abandonContext(); // This will cause SkSurface_Gpu creation to f
ail without Canvas2DLayerBridge otherwise detecting that anything was disabled. | 201 // Canvas2DLayerBridge otherwise detecting that anything was disable
d. |
| 202 gr->abandonContext(); |
| 238 RefPtr<SkImage> snapshot = bridge->newImageSnapshot(PreferAccelerati
on, SnapshotReasonUnknown); | 203 RefPtr<SkImage> snapshot = bridge->newImageSnapshot(PreferAccelerati
on, SnapshotReasonUnknown); |
| 239 EXPECT_FALSE(bridge->isAccelerated()); | 204 EXPECT_FALSE(bridge->isAccelerated()); |
| 240 EXPECT_FALSE(snapshot->isTextureBacked()); | 205 EXPECT_FALSE(snapshot->isTextureBacked()); |
| 241 } | 206 } |
| 242 | |
| 243 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 244 } | 207 } |
| 245 | 208 |
| 246 void noDrawOnContextLostTest() | 209 void noDrawOnContextLostTest() |
| 247 { | 210 { |
| 248 MockCanvasContext mainMock; | 211 FakeGLES2Interface gl; |
| 249 MockGLES2Interface mockGL; | 212 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(new
FakeWebGraphicsContext3DProvider(&gl)); |
| 250 OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr(new
MockWebGraphicsContext3DProvider(&mainMock, &mockGL)); | |
| 251 | 213 |
| 252 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | 214 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(contextPr
ovider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::ForceAcc
elerationForTesting))); |
| 253 | 215 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 254 { | 216 SkPaint paint; |
| 255 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainM
ockProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::For
ceAccelerationForTesting))); | 217 uint32_t genID = bridge->getOrCreateSurface()->generationID(); |
| 256 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | 218 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
| 257 EXPECT_TRUE(bridge->checkSurfaceValid()); | 219 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); |
| 258 SkPaint paint; | 220 gl.setIsContextLost(true); |
| 259 uint32_t genID = bridge->getOrCreateSurface()->generationID(); | 221 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); |
| 260 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); | 222 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
| 261 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); | 223 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); |
| 262 mockGL.setIsContextLost(true); | 224 // This results in the internal surface being torn down in response to t
he context loss. |
| 263 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); | 225 EXPECT_FALSE(bridge->checkSurfaceValid()); |
| 264 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); | 226 EXPECT_EQ(nullptr, bridge->getOrCreateSurface()); |
| 265 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); | 227 // The following passes by not crashing |
| 266 EXPECT_FALSE(bridge->checkSurfaceValid()); // This results in the in
ternal surface being torn down in response to the context loss | 228 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
| 267 EXPECT_EQ(nullptr, bridge->getOrCreateSurface()); | 229 bridge->flush(); |
| 268 // The following passes by not crashing | |
| 269 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); | |
| 270 bridge->flush(); | |
| 271 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 272 } | |
| 273 | |
| 274 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 275 } | 230 } |
| 276 | 231 |
| 277 void prepareMailboxWithBitmapTest() | 232 void prepareMailboxWithBitmapTest() |
| 278 { | 233 { |
| 279 MockCanvasContext mainMock; | 234 FakeGLES2Interface gl; |
| 280 MockGLES2Interface mockGL; | 235 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(new
FakeWebGraphicsContext3DProvider(&gl)); |
| 281 OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr(new
MockWebGraphicsContext3DProvider(&mainMock, &mockGL)); | 236 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(contextPr
ovider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::ForceAcc
elerationForTesting))); |
| 282 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainMockP
rovider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::ForceAc
celerationForTesting))); | |
| 283 bridge->m_lastImageId = 1; | 237 bridge->m_lastImageId = 1; |
| 284 | 238 |
| 285 NullWebExternalBitmap bitmap; | 239 NullWebExternalBitmap bitmap; |
| 286 bridge->prepareMailbox(0, &bitmap); | 240 bridge->prepareMailbox(0, &bitmap); |
| 287 EXPECT_EQ(0u, bridge->m_lastImageId); | 241 EXPECT_EQ(0u, bridge->m_lastImageId); |
| 288 } | 242 } |
| 289 | 243 |
| 290 void prepareMailboxAndLoseResourceTest() | 244 void prepareMailboxAndLoseResourceTest() |
| 291 { | 245 { |
| 292 MockCanvasContext mainMock; | |
| 293 MockGLES2Interface mockGL; | |
| 294 bool lostResource = true; | 246 bool lostResource = true; |
| 295 | 247 |
| 296 // Prepare a mailbox, then report the resource as lost. | 248 // Prepare a mailbox, then report the resource as lost. |
| 297 // This test passes by not crashing and not triggering assertions. | 249 // This test passes by not crashing and not triggering assertions. |
| 298 { | 250 { |
| 251 FakeGLES2Interface gl; |
| 252 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
new FakeWebGraphicsContext3DProvider(&gl)); |
| 253 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(conte
xtProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Forc
eAccelerationForTesting))); |
| 299 WebExternalTextureMailbox mailbox; | 254 WebExternalTextureMailbox mailbox; |
| 300 OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr
(new MockWebGraphicsContext3DProvider(&mainMock, &mockGL)); | |
| 301 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainM
ockProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::For
ceAccelerationForTesting))); | |
| 302 bridge->prepareMailbox(&mailbox, 0); | 255 bridge->prepareMailbox(&mailbox, 0); |
| 303 bridge->mailboxReleased(mailbox, lostResource); | 256 bridge->mailboxReleased(mailbox, lostResource); |
| 304 } | 257 } |
| 305 | 258 |
| 306 // Retry with mailbox released while bridge destruction is in progress | 259 // Retry with mailbox released while bridge destruction is in progress. |
| 307 { | 260 { |
| 308 OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr
(new MockWebGraphicsContext3DProvider(&mainMock, &mockGL)); | 261 FakeGLES2Interface gl; |
| 262 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
new FakeWebGraphicsContext3DProvider(&gl)); |
| 309 WebExternalTextureMailbox mailbox; | 263 WebExternalTextureMailbox mailbox; |
| 310 Canvas2DLayerBridge* rawBridge; | 264 Canvas2DLayerBridge* rawBridge; |
| 311 { | 265 { |
| 312 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(m
ainMockProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge:
:ForceAccelerationForTesting))); | 266 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(c
ontextProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::
ForceAccelerationForTesting))); |
| 313 bridge->prepareMailbox(&mailbox, 0); | 267 bridge->prepareMailbox(&mailbox, 0); |
| 314 rawBridge = bridge.get(); | 268 rawBridge = bridge.get(); |
| 315 } // bridge goes out of scope, but object is kept alive by self refe
rences | 269 } // bridge goes out of scope, but object is kept alive by self refe
rences. |
| 316 // before fixing crbug.com/411864, the following line you cause a me
mory use after free | 270 // Before fixing crbug.com/411864, the following line you cause a me
mory use after free |
| 317 // that sometimes causes a crash in normal builds and crashes consis
tently with ASAN. | 271 // that sometimes causes a crash in normal builds and crashes consis
tently with ASAN. |
| 318 rawBridge->mailboxReleased(mailbox, lostResource); // This should se
lf-destruct the bridge. | 272 rawBridge->mailboxReleased(mailbox, lostResource); // This should se
lf-destruct the bridge. |
| 319 } | 273 } |
| 320 } | 274 } |
| 321 | 275 |
| 322 void accelerationHintTest() | 276 void accelerationHintTest() |
| 323 { | 277 { |
| 324 MockCanvasContext mainMock; | |
| 325 MockGLES2Interface mockGL; | |
| 326 { | 278 { |
| 327 | 279 FakeGLES2Interface gl; |
| 328 OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr
(new MockWebGraphicsContext3DProvider(&mainMock, &mockGL)); | 280 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
new FakeWebGraphicsContext3DProvider(&gl)); |
| 329 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | 281 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(conte
xtProvider.release(), IntSize(300, 300), 0, NonOpaque, Canvas2DLayerBridge::Enab
leAcceleration))); |
| 330 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainM
ockProvider.release(), IntSize(300, 300), 0, NonOpaque, Canvas2DLayerBridge::Ena
bleAcceleration))); | |
| 331 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 332 SkPaint paint; | 282 SkPaint paint; |
| 333 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); | 283 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
| 334 RefPtr<SkImage> image = bridge->newImageSnapshot(PreferAcceleration,
SnapshotReasonUnknown); | 284 RefPtr<SkImage> image = bridge->newImageSnapshot(PreferAcceleration,
SnapshotReasonUnknown); |
| 335 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 336 EXPECT_TRUE(bridge->checkSurfaceValid()); | 285 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 337 EXPECT_TRUE(bridge->isAccelerated()); | 286 EXPECT_TRUE(bridge->isAccelerated()); |
| 338 } | 287 } |
| 339 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 340 | 288 |
| 341 { | 289 { |
| 342 OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr
(new MockWebGraphicsContext3DProvider(&mainMock, &mockGL)); | 290 FakeGLES2Interface gl; |
| 343 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | 291 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
new FakeWebGraphicsContext3DProvider(&gl)); |
| 344 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainM
ockProvider.release(), IntSize(300, 300), 0, NonOpaque, Canvas2DLayerBridge::Ena
bleAcceleration))); | 292 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(conte
xtProvider.release(), IntSize(300, 300), 0, NonOpaque, Canvas2DLayerBridge::Enab
leAcceleration))); |
| 345 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 346 SkPaint paint; | 293 SkPaint paint; |
| 347 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); | 294 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
| 348 RefPtr<SkImage> image = bridge->newImageSnapshot(PreferNoAcceleratio
n, SnapshotReasonUnknown); | 295 RefPtr<SkImage> image = bridge->newImageSnapshot(PreferNoAcceleratio
n, SnapshotReasonUnknown); |
| 349 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 350 EXPECT_TRUE(bridge->checkSurfaceValid()); | 296 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 351 EXPECT_FALSE(bridge->isAccelerated()); | 297 EXPECT_FALSE(bridge->isAccelerated()); |
| 352 } | 298 } |
| 353 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 354 } | 299 } |
| 355 }; | 300 }; |
| 356 | 301 |
| 357 TEST_F(Canvas2DLayerBridgeTest, FullLifecycleSingleThreaded) | 302 TEST_F(Canvas2DLayerBridgeTest, FullLifecycleSingleThreaded) |
| 358 { | 303 { |
| 359 fullLifecycleTest(); | 304 fullLifecycleTest(); |
| 360 } | 305 } |
| 361 | 306 |
| 362 TEST_F(Canvas2DLayerBridgeTest, NoDrawOnContextLost) | 307 TEST_F(Canvas2DLayerBridgeTest, NoDrawOnContextLost) |
| 363 { | 308 { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 389 fallbackToSoftwareOnFailedTextureAlloc(); | 334 fallbackToSoftwareOnFailedTextureAlloc(); |
| 390 } | 335 } |
| 391 | 336 |
| 392 class MockLogger : public Canvas2DLayerBridge::Logger { | 337 class MockLogger : public Canvas2DLayerBridge::Logger { |
| 393 public: | 338 public: |
| 394 MOCK_METHOD1(reportHibernationEvent, void(Canvas2DLayerBridge::HibernationEv
ent)); | 339 MOCK_METHOD1(reportHibernationEvent, void(Canvas2DLayerBridge::HibernationEv
ent)); |
| 395 MOCK_METHOD0(didStartHibernating, void()); | 340 MOCK_METHOD0(didStartHibernating, void()); |
| 396 virtual ~MockLogger() { } | 341 virtual ~MockLogger() { } |
| 397 }; | 342 }; |
| 398 | 343 |
| 399 void runCreateBridgeTask(Canvas2DLayerBridgePtr* bridgePtr, MockCanvasContext* m
ockCanvasContext, gpu::gles2::GLES2Interface* gl, Canvas2DLayerBridgeTest* testH
ost, WaitableEvent* doneEvent) | 344 void runCreateBridgeTask(Canvas2DLayerBridgePtr* bridgePtr, gpu::gles2::GLES2Int
erface* gl, Canvas2DLayerBridgeTest* testHost, WaitableEvent* doneEvent) |
| 400 { | 345 { |
| 401 OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr(new Moc
kWebGraphicsContext3DProvider(mockCanvasContext, gl)); | 346 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(new Fake
WebGraphicsContext3DProvider(gl)); |
| 402 *bridgePtr = testHost->makeBridge(mainMockProvider.release(), IntSize(300, 3
00), Canvas2DLayerBridge::EnableAcceleration); | 347 *bridgePtr = testHost->makeBridge(contextProvider.release(), IntSize(300, 30
0), Canvas2DLayerBridge::EnableAcceleration); |
| 403 // draw+flush to trigger the creation of a GPU surface | 348 // draw+flush to trigger the creation of a GPU surface |
| 404 (*bridgePtr)->didDraw(FloatRect(0, 0, 1, 1)); | 349 (*bridgePtr)->didDraw(FloatRect(0, 0, 1, 1)); |
| 405 (*bridgePtr)->finalizeFrame(FloatRect(0, 0, 1, 1)); | 350 (*bridgePtr)->finalizeFrame(FloatRect(0, 0, 1, 1)); |
| 406 (*bridgePtr)->flush(); | 351 (*bridgePtr)->flush(); |
| 407 doneEvent->signal(); | 352 doneEvent->signal(); |
| 408 } | 353 } |
| 409 | 354 |
| 410 void postAndWaitCreateBridgeTask(const WebTraceLocation& location, WebThread* te
stThread, Canvas2DLayerBridgePtr* bridgePtr, MockCanvasContext* mockCanvasContex
t, gpu::gles2::GLES2Interface* gl, Canvas2DLayerBridgeTest* testHost) | 355 void postAndWaitCreateBridgeTask(const WebTraceLocation& location, WebThread* te
stThread, Canvas2DLayerBridgePtr* bridgePtr, gpu::gles2::GLES2Interface* gl, Can
vas2DLayerBridgeTest* testHost) |
| 411 { | 356 { |
| 412 OwnPtr<WaitableEvent> bridgeCreatedEvent = adoptPtr(new WaitableEvent()); | 357 OwnPtr<WaitableEvent> bridgeCreatedEvent = adoptPtr(new WaitableEvent()); |
| 413 testThread->getWebTaskRunner()->postTask( | 358 testThread->getWebTaskRunner()->postTask( |
| 414 location, | 359 location, |
| 415 threadSafeBind(&runCreateBridgeTask, | 360 threadSafeBind(&runCreateBridgeTask, |
| 416 AllowCrossThreadAccess(bridgePtr), | 361 AllowCrossThreadAccess(bridgePtr), |
| 417 AllowCrossThreadAccess(mockCanvasContext), | |
| 418 AllowCrossThreadAccess(gl), | 362 AllowCrossThreadAccess(gl), |
| 419 AllowCrossThreadAccess(testHost), | 363 AllowCrossThreadAccess(testHost), |
| 420 AllowCrossThreadAccess(bridgeCreatedEvent.get()))); | 364 AllowCrossThreadAccess(bridgeCreatedEvent.get()))); |
| 421 bridgeCreatedEvent->wait(); | 365 bridgeCreatedEvent->wait(); |
| 422 } | 366 } |
| 423 | 367 |
| 424 void runDestroyBridgeTask(Canvas2DLayerBridgePtr* bridgePtr, WaitableEvent* done
Event) | 368 void runDestroyBridgeTask(Canvas2DLayerBridgePtr* bridgePtr, WaitableEvent* done
Event) |
| 425 { | 369 { |
| 426 bridgePtr->clear(); | 370 bridgePtr->clear(); |
| 427 if (doneEvent) | 371 if (doneEvent) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 | 425 |
| 482 virtual ~MockImageBuffer() { } | 426 virtual ~MockImageBuffer() { } |
| 483 }; | 427 }; |
| 484 | 428 |
| 485 #if CANVAS2D_HIBERNATION_ENABLED | 429 #if CANVAS2D_HIBERNATION_ENABLED |
| 486 TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycle) | 430 TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycle) |
| 487 #else | 431 #else |
| 488 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationLifeCycle) | 432 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationLifeCycle) |
| 489 #endif | 433 #endif |
| 490 { | 434 { |
| 491 MockCanvasContext mainMock; | 435 FakeGLES2Interface gl; |
| 492 MockGLES2Interface mockGL; | |
| 493 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 436 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 494 | 437 |
| 495 // The Canvas2DLayerBridge has to be created on the thread that will use it | 438 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 496 // to avoid WeakPtr thread check issues. | 439 // to avoid WeakPtr thread check issues. |
| 497 Canvas2DLayerBridgePtr bridge; | 440 Canvas2DLayerBridgePtr bridge; |
| 498 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &mai
nMock, &mockGL, this); | 441 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
| 499 | 442 |
| 500 // Register an alternate Logger for tracking hibernation events | 443 // Register an alternate Logger for tracking hibernation events |
| 501 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 444 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); |
| 502 MockLogger* mockLoggerPtr = mockLogger.get(); | 445 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 503 bridge->setLoggerForTesting(mockLogger.release()); | 446 bridge->setLoggerForTesting(mockLogger.release()); |
| 504 | 447 |
| 505 // Test entering hibernation | 448 // Test entering hibernation |
| 506 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); | 449 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); |
| 507 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 450 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
| 508 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 451 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
| 509 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); | 452 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); |
| 510 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 453 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 511 hibernationStartedEvent->wait(); | 454 hibernationStartedEvent->wait(); |
| 512 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 455 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 513 EXPECT_FALSE(bridge->isAccelerated()); | 456 EXPECT_FALSE(bridge->isAccelerated()); |
| 514 EXPECT_TRUE(bridge->isHibernating()); | 457 EXPECT_TRUE(bridge->isHibernating()); |
| 515 EXPECT_TRUE(bridge->checkSurfaceValid()); | 458 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 516 | 459 |
| 517 // Test exiting hibernation | 460 // Test exiting hibernation |
| 518 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationEndedNormally)); | 461 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationEndedNormally)); |
| 519 postAndWaitSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(),
false); | 462 postAndWaitSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(),
false); |
| 520 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 463 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 521 EXPECT_TRUE(bridge->isAccelerated()); | 464 EXPECT_TRUE(bridge->isAccelerated()); |
| 522 EXPECT_FALSE(bridge->isHibernating()); | 465 EXPECT_FALSE(bridge->isHibernating()); |
| 523 EXPECT_TRUE(bridge->checkSurfaceValid()); | 466 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 524 | 467 |
| 525 // Tear down the bridge on the thread so that 'bridge' can go out of scope | 468 // Tear down the bridge on the thread so that 'bridge' can go out of scope |
| 526 // without crashing due to thread checks | 469 // without crashing due to thread checks |
| 527 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 470 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 528 | |
| 529 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 530 } | 471 } |
| 531 | 472 |
| 532 #if CANVAS2D_HIBERNATION_ENABLED | 473 #if CANVAS2D_HIBERNATION_ENABLED |
| 533 TEST_F(Canvas2DLayerBridgeTest, HibernationReEntry) | 474 TEST_F(Canvas2DLayerBridgeTest, HibernationReEntry) |
| 534 #else | 475 #else |
| 535 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationReEntry) | 476 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationReEntry) |
| 536 #endif | 477 #endif |
| 537 { | 478 { |
| 538 MockCanvasContext mainMock; | 479 FakeGLES2Interface gl; |
| 539 MockGLES2Interface mockGL; | |
| 540 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 480 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 541 | 481 |
| 542 // The Canvas2DLayerBridge has to be created on the thread that will use it | 482 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 543 // to avoid WeakPtr thread check issues. | 483 // to avoid WeakPtr thread check issues. |
| 544 Canvas2DLayerBridgePtr bridge; | 484 Canvas2DLayerBridgePtr bridge; |
| 545 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &mai
nMock, &mockGL, this); | 485 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
| 546 | 486 |
| 547 // Register an alternate Logger for tracking hibernation events | 487 // Register an alternate Logger for tracking hibernation events |
| 548 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 488 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); |
| 549 MockLogger* mockLoggerPtr = mockLogger.get(); | 489 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 550 bridge->setLoggerForTesting(mockLogger.release()); | 490 bridge->setLoggerForTesting(mockLogger.release()); |
| 551 | 491 |
| 552 // Test entering hibernation | 492 // Test entering hibernation |
| 553 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); | 493 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); |
| 554 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 494 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
| 555 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 495 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 570 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationEndedNormally)); | 510 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationEndedNormally)); |
| 571 postAndWaitSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(),
false); | 511 postAndWaitSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(),
false); |
| 572 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 512 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 573 EXPECT_TRUE(bridge->isAccelerated()); | 513 EXPECT_TRUE(bridge->isAccelerated()); |
| 574 EXPECT_FALSE(bridge->isHibernating()); | 514 EXPECT_FALSE(bridge->isHibernating()); |
| 575 EXPECT_TRUE(bridge->checkSurfaceValid()); | 515 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 576 | 516 |
| 577 // Tear down the bridge on the thread so that 'bridge' can go out of scope | 517 // Tear down the bridge on the thread so that 'bridge' can go out of scope |
| 578 // without crashing due to thread checks | 518 // without crashing due to thread checks |
| 579 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 519 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 580 | |
| 581 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 582 | |
| 583 } | 520 } |
| 584 | 521 |
| 585 #if CANVAS2D_HIBERNATION_ENABLED | 522 #if CANVAS2D_HIBERNATION_ENABLED |
| 586 TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycleWithDeferredRenderingDisable
d) | 523 TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycleWithDeferredRenderingDisable
d) |
| 587 #else | 524 #else |
| 588 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationLifeCycleWithDeferredRenderi
ngDisabled) | 525 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationLifeCycleWithDeferredRenderi
ngDisabled) |
| 589 #endif | 526 #endif |
| 590 { | 527 { |
| 591 MockCanvasContext mainMock; | 528 FakeGLES2Interface gl; |
| 592 MockGLES2Interface mockGL; | |
| 593 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 529 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 594 | 530 |
| 595 // The Canvas2DLayerBridge has to be created on the thread that will use it | 531 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 596 // to avoid WeakPtr thread check issues. | 532 // to avoid WeakPtr thread check issues. |
| 597 Canvas2DLayerBridgePtr bridge; | 533 Canvas2DLayerBridgePtr bridge; |
| 598 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &mai
nMock, &mockGL, this); | 534 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
| 599 bridge->disableDeferral(DisableDeferralReasonUnknown); | 535 bridge->disableDeferral(DisableDeferralReasonUnknown); |
| 600 MockImageBuffer mockImageBuffer; | 536 MockImageBuffer mockImageBuffer; |
| 601 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); | 537 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); |
| 602 bridge->setImageBuffer(&mockImageBuffer); | 538 bridge->setImageBuffer(&mockImageBuffer); |
| 603 | 539 |
| 604 // Register an alternate Logger for tracking hibernation events | 540 // Register an alternate Logger for tracking hibernation events |
| 605 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 541 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); |
| 606 MockLogger* mockLoggerPtr = mockLogger.get(); | 542 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 607 bridge->setLoggerForTesting(mockLogger.release()); | 543 bridge->setLoggerForTesting(mockLogger.release()); |
| 608 | 544 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 625 postAndWaitSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(),
false); | 561 postAndWaitSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(),
false); |
| 626 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 562 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 627 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); | 563 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); |
| 628 EXPECT_TRUE(bridge->isAccelerated()); | 564 EXPECT_TRUE(bridge->isAccelerated()); |
| 629 EXPECT_FALSE(bridge->isHibernating()); | 565 EXPECT_FALSE(bridge->isHibernating()); |
| 630 EXPECT_TRUE(bridge->checkSurfaceValid()); | 566 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 631 | 567 |
| 632 // Tear down the bridge on the thread so that 'bridge' can go out of scope | 568 // Tear down the bridge on the thread so that 'bridge' can go out of scope |
| 633 // without crashing due to thread checks | 569 // without crashing due to thread checks |
| 634 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 570 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 635 | |
| 636 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 637 } | 571 } |
| 638 | 572 |
| 639 void runRenderingTask(Canvas2DLayerBridge* bridge, WaitableEvent* doneEvent) | 573 void runRenderingTask(Canvas2DLayerBridge* bridge, WaitableEvent* doneEvent) |
| 640 { | 574 { |
| 641 bridge->didDraw(FloatRect(0, 0, 1, 1)); | 575 bridge->didDraw(FloatRect(0, 0, 1, 1)); |
| 642 bridge->finalizeFrame(FloatRect(0, 0, 1, 1)); | 576 bridge->finalizeFrame(FloatRect(0, 0, 1, 1)); |
| 643 bridge->flush(); | 577 bridge->flush(); |
| 644 doneEvent->signal(); | 578 doneEvent->signal(); |
| 645 } | 579 } |
| 646 | 580 |
| 647 void postAndWaitRenderingTask(const WebTraceLocation& location, WebThread* testT
hread, Canvas2DLayerBridge* bridge) | 581 void postAndWaitRenderingTask(const WebTraceLocation& location, WebThread* testT
hread, Canvas2DLayerBridge* bridge) |
| 648 { | 582 { |
| 649 OwnPtr<WaitableEvent> doneEvent = adoptPtr(new WaitableEvent()); | 583 OwnPtr<WaitableEvent> doneEvent = adoptPtr(new WaitableEvent()); |
| 650 testThread->getWebTaskRunner()->postTask( | 584 testThread->getWebTaskRunner()->postTask( |
| 651 location, | 585 location, |
| 652 threadSafeBind(&runRenderingTask, | 586 threadSafeBind(&runRenderingTask, |
| 653 AllowCrossThreadAccess(bridge), | 587 AllowCrossThreadAccess(bridge), |
| 654 AllowCrossThreadAccess(doneEvent.get()))); | 588 AllowCrossThreadAccess(doneEvent.get()))); |
| 655 doneEvent->wait(); | 589 doneEvent->wait(); |
| 656 } | 590 } |
| 657 | 591 |
| 658 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU | 592 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU |
| 659 TEST_F(Canvas2DLayerBridgeTest, BackgroundRenderingWhileHibernating) | 593 TEST_F(Canvas2DLayerBridgeTest, BackgroundRenderingWhileHibernating) |
| 660 #else | 594 #else |
| 661 TEST_F(Canvas2DLayerBridgeTest, DISABLED_BackgroundRenderingWhileHibernating) | 595 TEST_F(Canvas2DLayerBridgeTest, DISABLED_BackgroundRenderingWhileHibernating) |
| 662 #endif | 596 #endif |
| 663 { | 597 { |
| 664 MockCanvasContext mainMock; | 598 FakeGLES2Interface gl; |
| 665 MockGLES2Interface mockGL; | |
| 666 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 599 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 667 | 600 |
| 668 // The Canvas2DLayerBridge has to be created on the thread that will use it | 601 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 669 // to avoid WeakPtr thread check issues. | 602 // to avoid WeakPtr thread check issues. |
| 670 Canvas2DLayerBridgePtr bridge; | 603 Canvas2DLayerBridgePtr bridge; |
| 671 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &mai
nMock, &mockGL, this); | 604 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
| 672 | 605 |
| 673 // Register an alternate Logger for tracking hibernation events | 606 // Register an alternate Logger for tracking hibernation events |
| 674 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 607 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); |
| 675 MockLogger* mockLoggerPtr = mockLogger.get(); | 608 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 676 bridge->setLoggerForTesting(mockLogger.release()); | 609 bridge->setLoggerForTesting(mockLogger.release()); |
| 677 | 610 |
| 678 // Test entering hibernation | 611 // Test entering hibernation |
| 679 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); | 612 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); |
| 680 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 613 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
| 681 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 614 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 698 // Unhide | 631 // Unhide |
| 699 postAndWaitSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(),
false); | 632 postAndWaitSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(),
false); |
| 700 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 633 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 701 EXPECT_TRUE(bridge->isAccelerated()); // Becoming visible causes switch back
to GPU | 634 EXPECT_TRUE(bridge->isAccelerated()); // Becoming visible causes switch back
to GPU |
| 702 EXPECT_FALSE(bridge->isHibernating()); | 635 EXPECT_FALSE(bridge->isHibernating()); |
| 703 EXPECT_TRUE(bridge->checkSurfaceValid()); | 636 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 704 | 637 |
| 705 // Tear down the bridge on the thread so that 'bridge' can go out of scope | 638 // Tear down the bridge on the thread so that 'bridge' can go out of scope |
| 706 // without crashing due to thread checks | 639 // without crashing due to thread checks |
| 707 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 640 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 708 | |
| 709 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 710 } | 641 } |
| 711 | 642 |
| 712 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU | 643 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU |
| 713 TEST_F(Canvas2DLayerBridgeTest, BackgroundRenderingWhileHibernatingWithDeferredR
enderingDisabled) | 644 TEST_F(Canvas2DLayerBridgeTest, BackgroundRenderingWhileHibernatingWithDeferredR
enderingDisabled) |
| 714 #else | 645 #else |
| 715 TEST_F(Canvas2DLayerBridgeTest, DISABLED_BackgroundRenderingWhileHibernatingWith
DeferredRenderingDisabled) | 646 TEST_F(Canvas2DLayerBridgeTest, DISABLED_BackgroundRenderingWhileHibernatingWith
DeferredRenderingDisabled) |
| 716 #endif | 647 #endif |
| 717 { | 648 { |
| 718 MockCanvasContext mainMock; | 649 FakeGLES2Interface gl; |
| 719 MockGLES2Interface mockGL; | |
| 720 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 650 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 721 | 651 |
| 722 // The Canvas2DLayerBridge has to be created on the thread that will use it | 652 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 723 // to avoid WeakPtr thread check issues. | 653 // to avoid WeakPtr thread check issues. |
| 724 Canvas2DLayerBridgePtr bridge; | 654 Canvas2DLayerBridgePtr bridge; |
| 725 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &mai
nMock, &mockGL, this); | 655 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
| 726 MockImageBuffer mockImageBuffer; | 656 MockImageBuffer mockImageBuffer; |
| 727 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); | 657 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); |
| 728 bridge->setImageBuffer(&mockImageBuffer); | 658 bridge->setImageBuffer(&mockImageBuffer); |
| 729 bridge->disableDeferral(DisableDeferralReasonUnknown); | 659 bridge->disableDeferral(DisableDeferralReasonUnknown); |
| 730 | 660 |
| 731 // Register an alternate Logger for tracking hibernation events | 661 // Register an alternate Logger for tracking hibernation events |
| 732 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 662 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); |
| 733 MockLogger* mockLoggerPtr = mockLogger.get(); | 663 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 734 bridge->setLoggerForTesting(mockLogger.release()); | 664 bridge->setLoggerForTesting(mockLogger.release()); |
| 735 | 665 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 770 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); | 700 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); |
| 771 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 701 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 772 } | 702 } |
| 773 | 703 |
| 774 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU | 704 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU |
| 775 TEST_F(Canvas2DLayerBridgeTest, DisableDeferredRenderingWhileHibernating) | 705 TEST_F(Canvas2DLayerBridgeTest, DisableDeferredRenderingWhileHibernating) |
| 776 #else | 706 #else |
| 777 TEST_F(Canvas2DLayerBridgeTest, DISABLED_DisableDeferredRenderingWhileHibernatin
g) | 707 TEST_F(Canvas2DLayerBridgeTest, DISABLED_DisableDeferredRenderingWhileHibernatin
g) |
| 778 #endif | 708 #endif |
| 779 { | 709 { |
| 780 MockCanvasContext mainMock; | 710 FakeGLES2Interface gl; |
| 781 MockGLES2Interface mockGL; | |
| 782 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 711 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 783 | 712 |
| 784 // The Canvas2DLayerBridge has to be created on the thread that will use it | 713 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 785 // to avoid WeakPtr thread check issues. | 714 // to avoid WeakPtr thread check issues. |
| 786 Canvas2DLayerBridgePtr bridge; | 715 Canvas2DLayerBridgePtr bridge; |
| 787 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &mai
nMock, &mockGL, this); | 716 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
| 788 MockImageBuffer mockImageBuffer; | 717 MockImageBuffer mockImageBuffer; |
| 789 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); | 718 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); |
| 790 bridge->setImageBuffer(&mockImageBuffer); | 719 bridge->setImageBuffer(&mockImageBuffer); |
| 791 | 720 |
| 792 // Register an alternate Logger for tracking hibernation events | 721 // Register an alternate Logger for tracking hibernation events |
| 793 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 722 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); |
| 794 MockLogger* mockLoggerPtr = mockLogger.get(); | 723 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 795 bridge->setLoggerForTesting(mockLogger.release()); | 724 bridge->setLoggerForTesting(mockLogger.release()); |
| 796 | 725 |
| 797 // Test entering hibernation | 726 // Test entering hibernation |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 831 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); | 760 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); |
| 832 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 761 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 833 } | 762 } |
| 834 | 763 |
| 835 #if CANVAS2D_HIBERNATION_ENABLED | 764 #if CANVAS2D_HIBERNATION_ENABLED |
| 836 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernating) | 765 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernating) |
| 837 #else | 766 #else |
| 838 TEST_F(Canvas2DLayerBridgeTest, DISABLED_TeardownWhileHibernating) | 767 TEST_F(Canvas2DLayerBridgeTest, DISABLED_TeardownWhileHibernating) |
| 839 #endif | 768 #endif |
| 840 { | 769 { |
| 841 MockCanvasContext mainMock; | 770 FakeGLES2Interface gl; |
| 842 MockGLES2Interface mockGL; | |
| 843 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 771 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 844 | 772 |
| 845 // The Canvas2DLayerBridge has to be created on the thread that will use it | 773 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 846 // to avoid WeakPtr thread check issues. | 774 // to avoid WeakPtr thread check issues. |
| 847 Canvas2DLayerBridgePtr bridge; | 775 Canvas2DLayerBridgePtr bridge; |
| 848 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &mai
nMock, &mockGL, this); | 776 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
| 849 | 777 |
| 850 // Register an alternate Logger for tracking hibernation events | 778 // Register an alternate Logger for tracking hibernation events |
| 851 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 779 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); |
| 852 MockLogger* mockLoggerPtr = mockLogger.get(); | 780 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 853 bridge->setLoggerForTesting(mockLogger.release()); | 781 bridge->setLoggerForTesting(mockLogger.release()); |
| 854 | 782 |
| 855 // Test entering hibernation | 783 // Test entering hibernation |
| 856 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); | 784 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); |
| 857 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 785 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
| 858 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 786 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
| 859 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); | 787 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); |
| 860 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 788 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 861 hibernationStartedEvent->wait(); | 789 hibernationStartedEvent->wait(); |
| 862 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 790 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 863 EXPECT_FALSE(bridge->isAccelerated()); | 791 EXPECT_FALSE(bridge->isAccelerated()); |
| 864 EXPECT_TRUE(bridge->isHibernating()); | 792 EXPECT_TRUE(bridge->isHibernating()); |
| 865 EXPECT_TRUE(bridge->checkSurfaceValid()); | 793 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 866 | 794 |
| 867 // Tear down the bridge while hibernating | 795 // Tear down the bridge while hibernating |
| 868 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationEndedWithTeardown)); | 796 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationEndedWithTeardown)); |
| 869 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 797 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 870 | |
| 871 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 872 } | 798 } |
| 873 | 799 |
| 874 class IdleFenceTask : public WebThread::IdleTask { | 800 class IdleFenceTask : public WebThread::IdleTask { |
| 875 public: | 801 public: |
| 876 IdleFenceTask(WaitableEvent* doneEvent) | 802 IdleFenceTask(WaitableEvent* doneEvent) |
| 877 : m_doneEvent(doneEvent) | 803 : m_doneEvent(doneEvent) |
| 878 { } | 804 { } |
| 879 | 805 |
| 880 virtual ~IdleFenceTask() { } | 806 virtual ~IdleFenceTask() { } |
| 881 | 807 |
| 882 void run(double /*deadline*/) override | 808 void run(double /*deadline*/) override |
| 883 { | 809 { |
| 884 m_doneEvent->signal(); | 810 m_doneEvent->signal(); |
| 885 } | 811 } |
| 886 | 812 |
| 887 private: | 813 private: |
| 888 WaitableEvent* m_doneEvent; | 814 WaitableEvent* m_doneEvent; |
| 889 }; | 815 }; |
| 890 | 816 |
| 891 #if CANVAS2D_HIBERNATION_ENABLED | 817 #if CANVAS2D_HIBERNATION_ENABLED |
| 892 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernationIsPending) | 818 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernationIsPending) |
| 893 #else | 819 #else |
| 894 TEST_F(Canvas2DLayerBridgeTest, DISABLED_TeardownWhileHibernationIsPending) | 820 TEST_F(Canvas2DLayerBridgeTest, DISABLED_TeardownWhileHibernationIsPending) |
| 895 #endif | 821 #endif |
| 896 { | 822 { |
| 897 MockCanvasContext mainMock; | 823 FakeGLES2Interface gl; |
| 898 MockGLES2Interface mockGL; | |
| 899 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 824 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 900 | 825 |
| 901 // The Canvas2DLayerBridge has to be created on the thread that will use it | 826 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 902 // to avoid WeakPtr thread check issues. | 827 // to avoid WeakPtr thread check issues. |
| 903 Canvas2DLayerBridgePtr bridge; | 828 Canvas2DLayerBridgePtr bridge; |
| 904 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &mai
nMock, &mockGL, this); | 829 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
| 905 | 830 |
| 906 // Register an alternate Logger for tracking hibernation events | 831 // Register an alternate Logger for tracking hibernation events |
| 907 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 832 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); |
| 908 MockLogger* mockLoggerPtr = mockLogger.get(); | 833 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 909 bridge->setLoggerForTesting(mockLogger.release()); | 834 bridge->setLoggerForTesting(mockLogger.release()); |
| 910 | 835 |
| 911 // Test entering hibernation | 836 // Test entering hibernation |
| 912 OwnPtr<WaitableEvent> hibernationScheduledEvent = adoptPtr(new WaitableEvent
()); | 837 OwnPtr<WaitableEvent> hibernationScheduledEvent = adoptPtr(new WaitableEvent
()); |
| 913 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 838 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
| 914 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true, h
ibernationScheduledEvent.get()); | 839 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true, h
ibernationScheduledEvent.get()); |
| 915 postDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 840 postDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 916 // In production, we would expect a | 841 // In production, we would expect a |
| 917 // HibernationAbortedDueToDestructionWhileHibernatePending event to be | 842 // HibernationAbortedDueToDestructionWhileHibernatePending event to be |
| 918 // fired, but that signal is lost in the unit test due to no longer having | 843 // fired, but that signal is lost in the unit test due to no longer having |
| 919 // a bridge to hold the mockLogger. | 844 // a bridge to hold the mockLogger. |
| 920 hibernationScheduledEvent->wait(); | 845 hibernationScheduledEvent->wait(); |
| 921 // Once we know the hibernation task is scheduled, we can schedule a fence. | 846 // Once we know the hibernation task is scheduled, we can schedule a fence. |
| 922 // Assuming Idle tasks are guaranteed to run in the order they were | 847 // Assuming Idle tasks are guaranteed to run in the order they were |
| 923 // submitted, this fence will guarantee the attempt to hibernate runs to | 848 // submitted, this fence will guarantee the attempt to hibernate runs to |
| 924 // completion before the thread is destroyed. | 849 // completion before the thread is destroyed. |
| 925 // This test passes by not crashing, which proves that the WeakPtr logic | 850 // This test passes by not crashing, which proves that the WeakPtr logic |
| 926 // is sound. | 851 // is sound. |
| 927 OwnPtr<WaitableEvent> fenceEvent = adoptPtr(new WaitableEvent()); | 852 OwnPtr<WaitableEvent> fenceEvent = adoptPtr(new WaitableEvent()); |
| 928 testThread->scheduler()->postIdleTask(BLINK_FROM_HERE, new IdleFenceTask(fen
ceEvent.get())); | 853 testThread->scheduler()->postIdleTask(BLINK_FROM_HERE, new IdleFenceTask(fen
ceEvent.get())); |
| 929 fenceEvent->wait(); | 854 fenceEvent->wait(); |
| 930 | |
| 931 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 932 } | 855 } |
| 933 | 856 |
| 934 #if CANVAS2D_HIBERNATION_ENABLED | 857 #if CANVAS2D_HIBERNATION_ENABLED |
| 935 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToPendingTeardown) | 858 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToPendingTeardown) |
| 936 #else | 859 #else |
| 937 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToPendingTeardown) | 860 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToPendingTeardown) |
| 938 #endif | 861 #endif |
| 939 { | 862 { |
| 940 MockCanvasContext mainMock; | 863 FakeGLES2Interface gl; |
| 941 MockGLES2Interface mockGL; | |
| 942 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 864 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 943 | 865 |
| 944 // The Canvas2DLayerBridge has to be created on the thread that will use it | 866 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 945 // to avoid WeakPtr thread check issues. | 867 // to avoid WeakPtr thread check issues. |
| 946 Canvas2DLayerBridgePtr bridge; | 868 Canvas2DLayerBridgePtr bridge; |
| 947 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &mai
nMock, &mockGL, this); | 869 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
| 948 | 870 |
| 949 // Register an alternate Logger for tracking hibernation events | 871 // Register an alternate Logger for tracking hibernation events |
| 950 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 872 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); |
| 951 MockLogger* mockLoggerPtr = mockLogger.get(); | 873 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 952 bridge->setLoggerForTesting(mockLogger.release()); | 874 bridge->setLoggerForTesting(mockLogger.release()); |
| 953 | 875 |
| 954 // Test entering hibernation | 876 // Test entering hibernation |
| 955 OwnPtr<WaitableEvent> hibernationAbortedEvent = adoptPtr(new WaitableEvent()
); | 877 OwnPtr<WaitableEvent> hibernationAbortedEvent = adoptPtr(new WaitableEvent()
); |
| 956 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 878 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
| 957 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationAbortedDueToPendingDestruction)) | 879 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationAbortedDueToPendingDestruction)) |
| 958 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Wai
tableEvent::signal)); | 880 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Wai
tableEvent::signal)); |
| 959 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 881 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 960 testThread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&Ca
nvas2DLayerBridge::beginDestruction, AllowCrossThreadAccess(bridge.get()))); | 882 testThread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&Ca
nvas2DLayerBridge::beginDestruction, AllowCrossThreadAccess(bridge.get()))); |
| 961 hibernationAbortedEvent->wait(); | 883 hibernationAbortedEvent->wait(); |
| 962 | 884 |
| 963 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 885 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 964 | 886 |
| 965 // Tear down bridge on thread | 887 // Tear down bridge on thread |
| 966 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 888 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 967 | |
| 968 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 969 } | 889 } |
| 970 | 890 |
| 971 #if CANVAS2D_HIBERNATION_ENABLED | 891 #if CANVAS2D_HIBERNATION_ENABLED |
| 972 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToVisibilityChange) | 892 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToVisibilityChange) |
| 973 #else | 893 #else |
| 974 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToVisibilityChange
) | 894 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToVisibilityChange
) |
| 975 #endif | 895 #endif |
| 976 { | 896 { |
| 977 MockCanvasContext mainMock; | 897 FakeGLES2Interface gl; |
| 978 MockGLES2Interface mockGL; | |
| 979 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 898 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 980 | 899 |
| 981 // The Canvas2DLayerBridge has to be created on the thread that will use it | 900 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 982 // to avoid WeakPtr thread check issues. | 901 // to avoid WeakPtr thread check issues. |
| 983 Canvas2DLayerBridgePtr bridge; | 902 Canvas2DLayerBridgePtr bridge; |
| 984 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &mai
nMock, &mockGL, this); | 903 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
| 985 | 904 |
| 986 // Register an alternate Logger for tracking hibernation events | 905 // Register an alternate Logger for tracking hibernation events |
| 987 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 906 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); |
| 988 MockLogger* mockLoggerPtr = mockLogger.get(); | 907 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 989 bridge->setLoggerForTesting(mockLogger.release()); | 908 bridge->setLoggerForTesting(mockLogger.release()); |
| 990 | 909 |
| 991 // Test entering hibernation | 910 // Test entering hibernation |
| 992 OwnPtr<WaitableEvent> hibernationAbortedEvent = adoptPtr(new WaitableEvent()
); | 911 OwnPtr<WaitableEvent> hibernationAbortedEvent = adoptPtr(new WaitableEvent()
); |
| 993 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 912 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
| 994 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationAbortedDueToVisibilityChange)) | 913 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationAbortedDueToVisibilityChange)) |
| 995 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Wai
tableEvent::signal)); | 914 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Wai
tableEvent::signal)); |
| 996 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 915 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 997 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), false); | 916 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), false); |
| 998 hibernationAbortedEvent->wait(); | 917 hibernationAbortedEvent->wait(); |
| 999 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 918 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 1000 EXPECT_TRUE(bridge->isAccelerated()); | 919 EXPECT_TRUE(bridge->isAccelerated()); |
| 1001 EXPECT_FALSE(bridge->isHibernating()); | 920 EXPECT_FALSE(bridge->isHibernating()); |
| 1002 EXPECT_TRUE(bridge->checkSurfaceValid()); | 921 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 1003 | 922 |
| 1004 // Tear down the bridge on the thread so that 'bridge' can go out of scope | 923 // Tear down the bridge on the thread so that 'bridge' can go out of scope |
| 1005 // without crashing due to thread checks | 924 // without crashing due to thread checks |
| 1006 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 925 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 1007 | |
| 1008 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 1009 } | 926 } |
| 1010 | 927 |
| 1011 #if CANVAS2D_HIBERNATION_ENABLED | 928 #if CANVAS2D_HIBERNATION_ENABLED |
| 1012 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToLostContext) | 929 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToLostContext) |
| 1013 #else | 930 #else |
| 1014 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToLostContext) | 931 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToLostContext) |
| 1015 #endif | 932 #endif |
| 1016 { | 933 { |
| 1017 MockCanvasContext mainMock; | 934 FakeGLES2Interface gl; |
| 1018 MockGLES2Interface mockGL; | |
| 1019 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 935 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 1020 | 936 |
| 1021 // The Canvas2DLayerBridge has to be created on the thread that will use it | 937 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 1022 // to avoid WeakPtr thread check issues. | 938 // to avoid WeakPtr thread check issues. |
| 1023 Canvas2DLayerBridgePtr bridge; | 939 Canvas2DLayerBridgePtr bridge; |
| 1024 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &mai
nMock, &mockGL, this); | 940 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
| 1025 | 941 |
| 1026 // Register an alternate Logger for tracking hibernation events | 942 // Register an alternate Logger for tracking hibernation events |
| 1027 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 943 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); |
| 1028 MockLogger* mockLoggerPtr = mockLogger.get(); | 944 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 1029 bridge->setLoggerForTesting(mockLogger.release()); | 945 bridge->setLoggerForTesting(mockLogger.release()); |
| 1030 | 946 |
| 1031 mockGL.setIsContextLost(true); | 947 gl.setIsContextLost(true); |
| 1032 // Test entering hibernation | 948 // Test entering hibernation |
| 1033 OwnPtr<WaitableEvent> hibernationAbortedEvent = adoptPtr(new WaitableEvent()
); | 949 OwnPtr<WaitableEvent> hibernationAbortedEvent = adoptPtr(new WaitableEvent()
); |
| 1034 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 950 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
| 1035 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationAbortedDueGpuContextLoss)) | 951 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationAbortedDueGpuContextLoss)) |
| 1036 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Wai
tableEvent::signal)); | 952 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Wai
tableEvent::signal)); |
| 1037 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 953 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 1038 hibernationAbortedEvent->wait(); | 954 hibernationAbortedEvent->wait(); |
| 1039 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 955 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 1040 EXPECT_FALSE(bridge->isHibernating()); | 956 EXPECT_FALSE(bridge->isHibernating()); |
| 1041 | 957 |
| 1042 // Tear down the bridge on the thread so that 'bridge' can go out of scope | 958 // Tear down the bridge on the thread so that 'bridge' can go out of scope |
| 1043 // without crashing due to thread checks | 959 // without crashing due to thread checks |
| 1044 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 960 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 1045 | |
| 1046 ::testing::Mock::VerifyAndClearExpectations(&mainMock); | |
| 1047 } | 961 } |
| 1048 | 962 |
| 1049 #if CANVAS2D_HIBERNATION_ENABLED | 963 #if CANVAS2D_HIBERNATION_ENABLED |
| 1050 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileHibernating) | 964 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileHibernating) |
| 1051 #else | 965 #else |
| 1052 TEST_F(Canvas2DLayerBridgeTest, DISABLED_PrepareMailboxWhileHibernating) | 966 TEST_F(Canvas2DLayerBridgeTest, DISABLED_PrepareMailboxWhileHibernating) |
| 1053 #endif | 967 #endif |
| 1054 { | 968 { |
| 1055 MockCanvasContext mainMock; | 969 FakeGLES2Interface gl; |
| 1056 MockGLES2Interface mockGL; | |
| 1057 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 970 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 1058 | 971 |
| 1059 // The Canvas2DLayerBridge has to be created on the thread that will use it | 972 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 1060 // to avoid WeakPtr thread check issues. | 973 // to avoid WeakPtr thread check issues. |
| 1061 Canvas2DLayerBridgePtr bridge; | 974 Canvas2DLayerBridgePtr bridge; |
| 1062 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &mai
nMock, &mockGL, this); | 975 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
| 1063 | 976 |
| 1064 // Register an alternate Logger for tracking hibernation events | 977 // Register an alternate Logger for tracking hibernation events |
| 1065 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 978 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); |
| 1066 MockLogger* mockLoggerPtr = mockLogger.get(); | 979 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 1067 bridge->setLoggerForTesting(mockLogger.release()); | 980 bridge->setLoggerForTesting(mockLogger.release()); |
| 1068 | 981 |
| 1069 // Test entering hibernation | 982 // Test entering hibernation |
| 1070 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); | 983 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); |
| 1071 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 984 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
| 1072 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 985 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1085 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationEndedWithTeardown)); | 998 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationEndedWithTeardown)); |
| 1086 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 999 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 1087 } | 1000 } |
| 1088 | 1001 |
| 1089 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU | 1002 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU |
| 1090 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileBackgroundRendering) | 1003 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileBackgroundRendering) |
| 1091 #else | 1004 #else |
| 1092 TEST_F(Canvas2DLayerBridgeTest, DISABLED_PrepareMailboxWhileBackgroundRendering) | 1005 TEST_F(Canvas2DLayerBridgeTest, DISABLED_PrepareMailboxWhileBackgroundRendering) |
| 1093 #endif | 1006 #endif |
| 1094 { | 1007 { |
| 1095 MockCanvasContext mainMock; | 1008 FakeGLES2Interface gl; |
| 1096 MockGLES2Interface mockGL; | |
| 1097 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 1009 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 1098 | 1010 |
| 1099 // The Canvas2DLayerBridge has to be created on the thread that will use it | 1011 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 1100 // to avoid WeakPtr thread check issues. | 1012 // to avoid WeakPtr thread check issues. |
| 1101 Canvas2DLayerBridgePtr bridge; | 1013 Canvas2DLayerBridgePtr bridge; |
| 1102 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &mai
nMock, &mockGL, this); | 1014 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
| 1103 | 1015 |
| 1104 // Register an alternate Logger for tracking hibernation events | 1016 // Register an alternate Logger for tracking hibernation events |
| 1105 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 1017 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); |
| 1106 MockLogger* mockLoggerPtr = mockLogger.get(); | 1018 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 1107 bridge->setLoggerForTesting(mockLogger.release()); | 1019 bridge->setLoggerForTesting(mockLogger.release()); |
| 1108 | 1020 |
| 1109 // Test entering hibernation | 1021 // Test entering hibernation |
| 1110 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); | 1022 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); |
| 1111 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 1023 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
| 1112 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 1024 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1127 WebExternalTextureMailbox mailbox; | 1039 WebExternalTextureMailbox mailbox; |
| 1128 EXPECT_FALSE(bridge->prepareMailbox(&mailbox, 0)); | 1040 EXPECT_FALSE(bridge->prepareMailbox(&mailbox, 0)); |
| 1129 EXPECT_TRUE(bridge->checkSurfaceValid()); | 1041 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 1130 | 1042 |
| 1131 // Tear down the bridge on the thread so that 'bridge' can go out of scope | 1043 // Tear down the bridge on the thread so that 'bridge' can go out of scope |
| 1132 // without crashing due to thread checks | 1044 // without crashing due to thread checks |
| 1133 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 1045 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 1134 } | 1046 } |
| 1135 | 1047 |
| 1136 } // namespace blink | 1048 } // namespace blink |
| OLD | NEW |