Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp

Issue 1887463002: Remove all usage of WebGraphicsContext3D in blink unit tests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nowgc3d-tests: removemockwebgc3d Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698