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 29 matching lines...) Expand all Loading... |
40 #include "public/platform/WebThread.h" | 40 #include "public/platform/WebThread.h" |
41 #include "public/platform/WebTraceLocation.h" | 41 #include "public/platform/WebTraceLocation.h" |
42 #include "public/platform/functional/WebFunction.h" | 42 #include "public/platform/functional/WebFunction.h" |
43 #include "skia/ext/texture_handle.h" | 43 #include "skia/ext/texture_handle.h" |
44 #include "testing/gmock/include/gmock/gmock.h" | 44 #include "testing/gmock/include/gmock/gmock.h" |
45 #include "testing/gtest/include/gtest/gtest.h" | 45 #include "testing/gtest/include/gtest/gtest.h" |
46 #include "third_party/skia/include/core/SkCanvas.h" | 46 #include "third_party/skia/include/core/SkCanvas.h" |
47 #include "third_party/skia/include/gpu/GrContext.h" | 47 #include "third_party/skia/include/gpu/GrContext.h" |
48 #include "third_party/skia/include/gpu/gl/GrGLInterface.h" | 48 #include "third_party/skia/include/gpu/gl/GrGLInterface.h" |
49 #include "third_party/skia/include/gpu/gl/GrGLTypes.h" | 49 #include "third_party/skia/include/gpu/gl/GrGLTypes.h" |
| 50 #include "wtf/PtrUtil.h" |
50 #include "wtf/RefPtr.h" | 51 #include "wtf/RefPtr.h" |
51 | |
52 #include <memory> | 52 #include <memory> |
53 | 53 |
54 using testing::AnyNumber; | 54 using testing::AnyNumber; |
55 using testing::AtLeast; | 55 using testing::AtLeast; |
56 using testing::InSequence; | 56 using testing::InSequence; |
57 using testing::Return; | 57 using testing::Return; |
58 using testing::Test; | 58 using testing::Test; |
59 using testing::_; | 59 using testing::_; |
60 | 60 |
61 namespace blink { | 61 namespace blink { |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 uint8_t* pixels() override | 142 uint8_t* pixels() override |
143 { | 143 { |
144 return nullptr; | 144 return nullptr; |
145 } | 145 } |
146 }; | 146 }; |
147 | 147 |
148 } // anonymous namespace | 148 } // anonymous namespace |
149 | 149 |
150 class Canvas2DLayerBridgeTest : public Test { | 150 class Canvas2DLayerBridgeTest : public Test { |
151 public: | 151 public: |
152 PassRefPtr<Canvas2DLayerBridge> makeBridge(PassOwnPtr<FakeWebGraphicsContext
3DProvider> provider, const IntSize& size, Canvas2DLayerBridge::AccelerationMode
accelerationMode) | 152 PassRefPtr<Canvas2DLayerBridge> makeBridge(std::unique_ptr<FakeWebGraphicsCo
ntext3DProvider> provider, const IntSize& size, Canvas2DLayerBridge::Acceleratio
nMode accelerationMode) |
153 { | 153 { |
154 return adoptRef(new Canvas2DLayerBridge(std::move(provider), size, 0, No
nOpaque, accelerationMode)); | 154 return adoptRef(new Canvas2DLayerBridge(std::move(provider), size, 0, No
nOpaque, accelerationMode)); |
155 } | 155 } |
156 | 156 |
157 protected: | 157 protected: |
158 void fullLifecycleTest() | 158 void fullLifecycleTest() |
159 { | 159 { |
160 FakeGLES2Interface gl; | 160 FakeGLES2Interface gl; |
161 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(new
FakeWebGraphicsContext3DProvider(&gl)); | 161 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrap
Unique(new FakeWebGraphicsContext3DProvider(&gl)); |
162 | 162 |
163 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::move
(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Disable
Acceleration))); | 163 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::move
(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Disable
Acceleration))); |
164 | 164 |
165 const GrGLTextureInfo* textureInfo = skia::GrBackendObjectToGrGLTextureI
nfo(bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnknown)->getText
ureHandle(true)); | 165 const GrGLTextureInfo* textureInfo = skia::GrBackendObjectToGrGLTextureI
nfo(bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnknown)->getText
ureHandle(true)); |
166 EXPECT_EQ(textureInfo, nullptr); | 166 EXPECT_EQ(textureInfo, nullptr); |
167 bridge.clear(); | 167 bridge.clear(); |
168 } | 168 } |
169 | 169 |
170 void fallbackToSoftwareIfContextLost() | 170 void fallbackToSoftwareIfContextLost() |
171 { | 171 { |
172 FakeGLES2Interface gl; | 172 FakeGLES2Interface gl; |
173 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(new
FakeWebGraphicsContext3DProvider(&gl)); | 173 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrap
Unique(new FakeWebGraphicsContext3DProvider(&gl)); |
174 | 174 |
175 gl.setIsContextLost(true); | 175 gl.setIsContextLost(true); |
176 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::move
(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::EnableA
cceleration))); | 176 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::move
(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::EnableA
cceleration))); |
177 EXPECT_TRUE(bridge->checkSurfaceValid()); | 177 EXPECT_TRUE(bridge->checkSurfaceValid()); |
178 EXPECT_FALSE(bridge->isAccelerated()); | 178 EXPECT_FALSE(bridge->isAccelerated()); |
179 } | 179 } |
180 | 180 |
181 void fallbackToSoftwareOnFailedTextureAlloc() | 181 void fallbackToSoftwareOnFailedTextureAlloc() |
182 { | 182 { |
183 { | 183 { |
184 // No fallback case. | 184 // No fallback case. |
185 FakeGLES2Interface gl; | 185 FakeGLES2Interface gl; |
186 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
new FakeWebGraphicsContext3DProvider(&gl)); | 186 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider =
wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
187 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::
move(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Ena
bleAcceleration))); | 187 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::
move(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Ena
bleAcceleration))); |
188 EXPECT_TRUE(bridge->checkSurfaceValid()); | 188 EXPECT_TRUE(bridge->checkSurfaceValid()); |
189 EXPECT_TRUE(bridge->isAccelerated()); | 189 EXPECT_TRUE(bridge->isAccelerated()); |
190 RefPtr<SkImage> snapshot = bridge->newImageSnapshot(PreferAccelerati
on, SnapshotReasonUnknown); | 190 RefPtr<SkImage> snapshot = bridge->newImageSnapshot(PreferAccelerati
on, SnapshotReasonUnknown); |
191 EXPECT_TRUE(bridge->isAccelerated()); | 191 EXPECT_TRUE(bridge->isAccelerated()); |
192 EXPECT_TRUE(snapshot->isTextureBacked()); | 192 EXPECT_TRUE(snapshot->isTextureBacked()); |
193 } | 193 } |
194 | 194 |
195 { | 195 { |
196 // Fallback case. | 196 // Fallback case. |
197 FakeGLES2Interface gl; | 197 FakeGLES2Interface gl; |
198 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
new FakeWebGraphicsContext3DProvider(&gl)); | 198 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider =
wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
199 GrContext* gr = contextProvider->grContext(); | 199 GrContext* gr = contextProvider->grContext(); |
200 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::
move(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Ena
bleAcceleration))); | 200 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::
move(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Ena
bleAcceleration))); |
201 EXPECT_TRUE(bridge->checkSurfaceValid()); | 201 EXPECT_TRUE(bridge->checkSurfaceValid()); |
202 EXPECT_TRUE(bridge->isAccelerated()); // We don't yet know that allo
cation will fail | 202 EXPECT_TRUE(bridge->isAccelerated()); // We don't yet know that allo
cation will fail |
203 // This will cause SkSurface_Gpu creation to fail without | 203 // This will cause SkSurface_Gpu creation to fail without |
204 // Canvas2DLayerBridge otherwise detecting that anything was disable
d. | 204 // Canvas2DLayerBridge otherwise detecting that anything was disable
d. |
205 gr->abandonContext(); | 205 gr->abandonContext(); |
206 RefPtr<SkImage> snapshot = bridge->newImageSnapshot(PreferAccelerati
on, SnapshotReasonUnknown); | 206 RefPtr<SkImage> snapshot = bridge->newImageSnapshot(PreferAccelerati
on, SnapshotReasonUnknown); |
207 EXPECT_FALSE(bridge->isAccelerated()); | 207 EXPECT_FALSE(bridge->isAccelerated()); |
208 EXPECT_FALSE(snapshot->isTextureBacked()); | 208 EXPECT_FALSE(snapshot->isTextureBacked()); |
209 } | 209 } |
210 } | 210 } |
211 | 211 |
212 void noDrawOnContextLostTest() | 212 void noDrawOnContextLostTest() |
213 { | 213 { |
214 FakeGLES2Interface gl; | 214 FakeGLES2Interface gl; |
215 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(new
FakeWebGraphicsContext3DProvider(&gl)); | 215 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrap
Unique(new FakeWebGraphicsContext3DProvider(&gl)); |
216 | 216 |
217 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::move
(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::ForceAc
celerationForTesting))); | 217 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::move
(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::ForceAc
celerationForTesting))); |
218 EXPECT_TRUE(bridge->checkSurfaceValid()); | 218 EXPECT_TRUE(bridge->checkSurfaceValid()); |
219 SkPaint paint; | 219 SkPaint paint; |
220 uint32_t genID = bridge->getOrCreateSurface()->generationID(); | 220 uint32_t genID = bridge->getOrCreateSurface()->generationID(); |
221 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); | 221 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
222 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); | 222 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); |
223 gl.setIsContextLost(true); | 223 gl.setIsContextLost(true); |
224 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); | 224 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); |
225 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); | 225 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
226 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); | 226 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); |
227 // This results in the internal surface being torn down in response to t
he context loss. | 227 // This results in the internal surface being torn down in response to t
he context loss. |
228 EXPECT_FALSE(bridge->checkSurfaceValid()); | 228 EXPECT_FALSE(bridge->checkSurfaceValid()); |
229 EXPECT_EQ(nullptr, bridge->getOrCreateSurface()); | 229 EXPECT_EQ(nullptr, bridge->getOrCreateSurface()); |
230 // The following passes by not crashing | 230 // The following passes by not crashing |
231 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); | 231 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
232 bridge->flush(); | 232 bridge->flush(); |
233 } | 233 } |
234 | 234 |
235 void prepareMailboxWithBitmapTest() | 235 void prepareMailboxWithBitmapTest() |
236 { | 236 { |
237 FakeGLES2Interface gl; | 237 FakeGLES2Interface gl; |
238 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(new
FakeWebGraphicsContext3DProvider(&gl)); | 238 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrap
Unique(new FakeWebGraphicsContext3DProvider(&gl)); |
239 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::move
(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::ForceAc
celerationForTesting))); | 239 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::move
(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::ForceAc
celerationForTesting))); |
240 bridge->m_lastImageId = 1; | 240 bridge->m_lastImageId = 1; |
241 | 241 |
242 NullWebExternalBitmap bitmap; | 242 NullWebExternalBitmap bitmap; |
243 bridge->prepareMailbox(0, &bitmap); | 243 bridge->prepareMailbox(0, &bitmap); |
244 EXPECT_EQ(0u, bridge->m_lastImageId); | 244 EXPECT_EQ(0u, bridge->m_lastImageId); |
245 } | 245 } |
246 | 246 |
247 void prepareMailboxAndLoseResourceTest() | 247 void prepareMailboxAndLoseResourceTest() |
248 { | 248 { |
249 bool lostResource = true; | 249 bool lostResource = true; |
250 | 250 |
251 // Prepare a mailbox, then report the resource as lost. | 251 // Prepare a mailbox, then report the resource as lost. |
252 // This test passes by not crashing and not triggering assertions. | 252 // This test passes by not crashing and not triggering assertions. |
253 { | 253 { |
254 FakeGLES2Interface gl; | 254 FakeGLES2Interface gl; |
255 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
new FakeWebGraphicsContext3DProvider(&gl)); | 255 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider =
wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
256 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::
move(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::For
ceAccelerationForTesting))); | 256 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::
move(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::For
ceAccelerationForTesting))); |
257 WebExternalTextureMailbox mailbox; | 257 WebExternalTextureMailbox mailbox; |
258 bridge->prepareMailbox(&mailbox, 0); | 258 bridge->prepareMailbox(&mailbox, 0); |
259 bridge->mailboxReleased(mailbox, lostResource); | 259 bridge->mailboxReleased(mailbox, lostResource); |
260 } | 260 } |
261 | 261 |
262 // Retry with mailbox released while bridge destruction is in progress. | 262 // Retry with mailbox released while bridge destruction is in progress. |
263 { | 263 { |
264 FakeGLES2Interface gl; | 264 FakeGLES2Interface gl; |
265 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
new FakeWebGraphicsContext3DProvider(&gl)); | 265 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider =
wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
266 WebExternalTextureMailbox mailbox; | 266 WebExternalTextureMailbox mailbox; |
267 Canvas2DLayerBridge* rawBridge; | 267 Canvas2DLayerBridge* rawBridge; |
268 { | 268 { |
269 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(s
td::move(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge:
:ForceAccelerationForTesting))); | 269 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(s
td::move(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge:
:ForceAccelerationForTesting))); |
270 bridge->prepareMailbox(&mailbox, 0); | 270 bridge->prepareMailbox(&mailbox, 0); |
271 rawBridge = bridge.get(); | 271 rawBridge = bridge.get(); |
272 } // bridge goes out of scope, but object is kept alive by self refe
rences. | 272 } // bridge goes out of scope, but object is kept alive by self refe
rences. |
273 // Before fixing crbug.com/411864, the following line you cause a me
mory use after free | 273 // Before fixing crbug.com/411864, the following line you cause a me
mory use after free |
274 // that sometimes causes a crash in normal builds and crashes consis
tently with ASAN. | 274 // that sometimes causes a crash in normal builds and crashes consis
tently with ASAN. |
275 rawBridge->mailboxReleased(mailbox, lostResource); // This should se
lf-destruct the bridge. | 275 rawBridge->mailboxReleased(mailbox, lostResource); // This should se
lf-destruct the bridge. |
276 } | 276 } |
277 } | 277 } |
278 | 278 |
279 void accelerationHintTest() | 279 void accelerationHintTest() |
280 { | 280 { |
281 { | 281 { |
282 FakeGLES2Interface gl; | 282 FakeGLES2Interface gl; |
283 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
new FakeWebGraphicsContext3DProvider(&gl)); | 283 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider =
wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
284 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::
move(contextProvider), IntSize(300, 300), 0, NonOpaque, Canvas2DLayerBridge::Ena
bleAcceleration))); | 284 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::
move(contextProvider), IntSize(300, 300), 0, NonOpaque, Canvas2DLayerBridge::Ena
bleAcceleration))); |
285 SkPaint paint; | 285 SkPaint paint; |
286 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); | 286 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
287 RefPtr<SkImage> image = bridge->newImageSnapshot(PreferAcceleration,
SnapshotReasonUnknown); | 287 RefPtr<SkImage> image = bridge->newImageSnapshot(PreferAcceleration,
SnapshotReasonUnknown); |
288 EXPECT_TRUE(bridge->checkSurfaceValid()); | 288 EXPECT_TRUE(bridge->checkSurfaceValid()); |
289 EXPECT_TRUE(bridge->isAccelerated()); | 289 EXPECT_TRUE(bridge->isAccelerated()); |
290 } | 290 } |
291 | 291 |
292 { | 292 { |
293 FakeGLES2Interface gl; | 293 FakeGLES2Interface gl; |
294 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
new FakeWebGraphicsContext3DProvider(&gl)); | 294 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider =
wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
295 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::
move(contextProvider), IntSize(300, 300), 0, NonOpaque, Canvas2DLayerBridge::Ena
bleAcceleration))); | 295 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::
move(contextProvider), IntSize(300, 300), 0, NonOpaque, Canvas2DLayerBridge::Ena
bleAcceleration))); |
296 SkPaint paint; | 296 SkPaint paint; |
297 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); | 297 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
298 RefPtr<SkImage> image = bridge->newImageSnapshot(PreferNoAcceleratio
n, SnapshotReasonUnknown); | 298 RefPtr<SkImage> image = bridge->newImageSnapshot(PreferNoAcceleratio
n, SnapshotReasonUnknown); |
299 EXPECT_TRUE(bridge->checkSurfaceValid()); | 299 EXPECT_TRUE(bridge->checkSurfaceValid()); |
300 EXPECT_FALSE(bridge->isAccelerated()); | 300 EXPECT_FALSE(bridge->isAccelerated()); |
301 } | 301 } |
302 } | 302 } |
303 }; | 303 }; |
304 | 304 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 | 339 |
340 class MockLogger : public Canvas2DLayerBridge::Logger { | 340 class MockLogger : public Canvas2DLayerBridge::Logger { |
341 public: | 341 public: |
342 MOCK_METHOD1(reportHibernationEvent, void(Canvas2DLayerBridge::HibernationEv
ent)); | 342 MOCK_METHOD1(reportHibernationEvent, void(Canvas2DLayerBridge::HibernationEv
ent)); |
343 MOCK_METHOD0(didStartHibernating, void()); | 343 MOCK_METHOD0(didStartHibernating, void()); |
344 virtual ~MockLogger() { } | 344 virtual ~MockLogger() { } |
345 }; | 345 }; |
346 | 346 |
347 void runCreateBridgeTask(Canvas2DLayerBridgePtr* bridgePtr, gpu::gles2::GLES2Int
erface* gl, Canvas2DLayerBridgeTest* testHost, WaitableEvent* doneEvent) | 347 void runCreateBridgeTask(Canvas2DLayerBridgePtr* bridgePtr, gpu::gles2::GLES2Int
erface* gl, Canvas2DLayerBridgeTest* testHost, WaitableEvent* doneEvent) |
348 { | 348 { |
349 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(new Fake
WebGraphicsContext3DProvider(gl)); | 349 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrapUniq
ue(new FakeWebGraphicsContext3DProvider(gl)); |
350 *bridgePtr = testHost->makeBridge(std::move(contextProvider), IntSize(300, 3
00), Canvas2DLayerBridge::EnableAcceleration); | 350 *bridgePtr = testHost->makeBridge(std::move(contextProvider), IntSize(300, 3
00), Canvas2DLayerBridge::EnableAcceleration); |
351 // draw+flush to trigger the creation of a GPU surface | 351 // draw+flush to trigger the creation of a GPU surface |
352 (*bridgePtr)->didDraw(FloatRect(0, 0, 1, 1)); | 352 (*bridgePtr)->didDraw(FloatRect(0, 0, 1, 1)); |
353 (*bridgePtr)->finalizeFrame(FloatRect(0, 0, 1, 1)); | 353 (*bridgePtr)->finalizeFrame(FloatRect(0, 0, 1, 1)); |
354 (*bridgePtr)->flush(); | 354 (*bridgePtr)->flush(); |
355 doneEvent->signal(); | 355 doneEvent->signal(); |
356 } | 356 } |
357 | 357 |
358 void postAndWaitCreateBridgeTask(const WebTraceLocation& location, WebThread* te
stThread, Canvas2DLayerBridgePtr* bridgePtr, gpu::gles2::GLES2Interface* gl, Can
vas2DLayerBridgeTest* testHost) | 358 void postAndWaitCreateBridgeTask(const WebTraceLocation& location, WebThread* te
stThread, Canvas2DLayerBridgePtr* bridgePtr, gpu::gles2::GLES2Interface* gl, Can
vas2DLayerBridgeTest* testHost) |
359 { | 359 { |
360 OwnPtr<WaitableEvent> bridgeCreatedEvent = adoptPtr(new WaitableEvent()); | 360 std::unique_ptr<WaitableEvent> bridgeCreatedEvent = wrapUnique(new WaitableE
vent()); |
361 testThread->getWebTaskRunner()->postTask( | 361 testThread->getWebTaskRunner()->postTask( |
362 location, | 362 location, |
363 threadSafeBind(&runCreateBridgeTask, | 363 threadSafeBind(&runCreateBridgeTask, |
364 AllowCrossThreadAccess(bridgePtr), | 364 AllowCrossThreadAccess(bridgePtr), |
365 AllowCrossThreadAccess(gl), | 365 AllowCrossThreadAccess(gl), |
366 AllowCrossThreadAccess(testHost), | 366 AllowCrossThreadAccess(testHost), |
367 AllowCrossThreadAccess(bridgeCreatedEvent.get()))); | 367 AllowCrossThreadAccess(bridgeCreatedEvent.get()))); |
368 bridgeCreatedEvent->wait(); | 368 bridgeCreatedEvent->wait(); |
369 } | 369 } |
370 | 370 |
371 void runDestroyBridgeTask(Canvas2DLayerBridgePtr* bridgePtr, WaitableEvent* done
Event) | 371 void runDestroyBridgeTask(Canvas2DLayerBridgePtr* bridgePtr, WaitableEvent* done
Event) |
372 { | 372 { |
373 bridgePtr->clear(); | 373 bridgePtr->clear(); |
374 if (doneEvent) | 374 if (doneEvent) |
375 doneEvent->signal(); | 375 doneEvent->signal(); |
376 } | 376 } |
377 | 377 |
378 void postDestroyBridgeTask(const WebTraceLocation& location, WebThread* testThre
ad, Canvas2DLayerBridgePtr* bridgePtr) | 378 void postDestroyBridgeTask(const WebTraceLocation& location, WebThread* testThre
ad, Canvas2DLayerBridgePtr* bridgePtr) |
379 { | 379 { |
380 testThread->getWebTaskRunner()->postTask( | 380 testThread->getWebTaskRunner()->postTask( |
381 location, | 381 location, |
382 threadSafeBind(&runDestroyBridgeTask, | 382 threadSafeBind(&runDestroyBridgeTask, |
383 AllowCrossThreadAccess(bridgePtr), | 383 AllowCrossThreadAccess(bridgePtr), |
384 nullptr)); | 384 nullptr)); |
385 } | 385 } |
386 | 386 |
387 void postAndWaitDestroyBridgeTask(const WebTraceLocation& location, WebThread* t
estThread, Canvas2DLayerBridgePtr* bridgePtr) | 387 void postAndWaitDestroyBridgeTask(const WebTraceLocation& location, WebThread* t
estThread, Canvas2DLayerBridgePtr* bridgePtr) |
388 { | 388 { |
389 OwnPtr<WaitableEvent> bridgeDestroyedEvent = adoptPtr(new WaitableEvent()); | 389 std::unique_ptr<WaitableEvent> bridgeDestroyedEvent = wrapUnique(new Waitabl
eEvent()); |
390 testThread->getWebTaskRunner()->postTask( | 390 testThread->getWebTaskRunner()->postTask( |
391 location, | 391 location, |
392 threadSafeBind(&runDestroyBridgeTask, | 392 threadSafeBind(&runDestroyBridgeTask, |
393 AllowCrossThreadAccess(bridgePtr), | 393 AllowCrossThreadAccess(bridgePtr), |
394 AllowCrossThreadAccess(bridgeDestroyedEvent.get()))); | 394 AllowCrossThreadAccess(bridgeDestroyedEvent.get()))); |
395 bridgeDestroyedEvent->wait(); | 395 bridgeDestroyedEvent->wait(); |
396 } | 396 } |
397 | 397 |
398 void runSetIsHiddenTask(Canvas2DLayerBridge* bridge, bool value, WaitableEvent*
doneEvent) | 398 void runSetIsHiddenTask(Canvas2DLayerBridge* bridge, bool value, WaitableEvent*
doneEvent) |
399 { | 399 { |
400 bridge->setIsHidden(value); | 400 bridge->setIsHidden(value); |
401 if (doneEvent) | 401 if (doneEvent) |
402 doneEvent->signal(); | 402 doneEvent->signal(); |
403 } | 403 } |
404 | 404 |
405 void postSetIsHiddenTask(const WebTraceLocation& location, WebThread* testThread
, Canvas2DLayerBridge* bridge, bool value, WaitableEvent* doneEvent = nullptr) | 405 void postSetIsHiddenTask(const WebTraceLocation& location, WebThread* testThread
, Canvas2DLayerBridge* bridge, bool value, WaitableEvent* doneEvent = nullptr) |
406 { | 406 { |
407 testThread->getWebTaskRunner()->postTask( | 407 testThread->getWebTaskRunner()->postTask( |
408 location, | 408 location, |
409 threadSafeBind(&runSetIsHiddenTask, | 409 threadSafeBind(&runSetIsHiddenTask, |
410 AllowCrossThreadAccess(bridge), | 410 AllowCrossThreadAccess(bridge), |
411 value, | 411 value, |
412 AllowCrossThreadAccess(doneEvent))); | 412 AllowCrossThreadAccess(doneEvent))); |
413 } | 413 } |
414 | 414 |
415 void postAndWaitSetIsHiddenTask(const WebTraceLocation& location, WebThread* tes
tThread, Canvas2DLayerBridge* bridge, bool value) | 415 void postAndWaitSetIsHiddenTask(const WebTraceLocation& location, WebThread* tes
tThread, Canvas2DLayerBridge* bridge, bool value) |
416 { | 416 { |
417 OwnPtr<WaitableEvent> doneEvent = adoptPtr(new WaitableEvent()); | 417 std::unique_ptr<WaitableEvent> doneEvent = wrapUnique(new WaitableEvent()); |
418 postSetIsHiddenTask(location, testThread, bridge, value, doneEvent.get()); | 418 postSetIsHiddenTask(location, testThread, bridge, value, doneEvent.get()); |
419 doneEvent->wait(); | 419 doneEvent->wait(); |
420 } | 420 } |
421 | 421 |
422 class MockImageBuffer : public ImageBuffer { | 422 class MockImageBuffer : public ImageBuffer { |
423 public: | 423 public: |
424 MockImageBuffer() | 424 MockImageBuffer() |
425 : ImageBuffer(adoptPtr(new UnacceleratedImageBufferSurface(IntSize(1, 1)
))) { } | 425 : ImageBuffer(wrapUnique(new UnacceleratedImageBufferSurface(IntSize(1,
1)))) { } |
426 | 426 |
427 MOCK_CONST_METHOD1(resetCanvas, void(SkCanvas*)); | 427 MOCK_CONST_METHOD1(resetCanvas, void(SkCanvas*)); |
428 | 428 |
429 virtual ~MockImageBuffer() { } | 429 virtual ~MockImageBuffer() { } |
430 }; | 430 }; |
431 | 431 |
432 #if CANVAS2D_HIBERNATION_ENABLED | 432 #if CANVAS2D_HIBERNATION_ENABLED |
433 TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycle) | 433 TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycle) |
434 #else | 434 #else |
435 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationLifeCycle) | 435 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationLifeCycle) |
436 #endif | 436 #endif |
437 { | 437 { |
438 FakeGLES2Interface gl; | 438 FakeGLES2Interface gl; |
439 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 439 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); |
440 | 440 |
441 // The Canvas2DLayerBridge has to be created on the thread that will use it | 441 // The Canvas2DLayerBridge has to be created on the thread that will use it |
442 // to avoid WeakPtr thread check issues. | 442 // to avoid WeakPtr thread check issues. |
443 Canvas2DLayerBridgePtr bridge; | 443 Canvas2DLayerBridgePtr bridge; |
444 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); | 444 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
445 | 445 |
446 // Register an alternate Logger for tracking hibernation events | 446 // Register an alternate Logger for tracking hibernation events |
447 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 447 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); |
448 MockLogger* mockLoggerPtr = mockLogger.get(); | 448 MockLogger* mockLoggerPtr = mockLogger.get(); |
449 bridge->setLoggerForTesting(std::move(mockLogger)); | 449 bridge->setLoggerForTesting(std::move(mockLogger)); |
450 | 450 |
451 // Test entering hibernation | 451 // Test entering hibernation |
452 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); | 452 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); |
453 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 453 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
454 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 454 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
455 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); | 455 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); |
456 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 456 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
457 hibernationStartedEvent->wait(); | 457 hibernationStartedEvent->wait(); |
458 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 458 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
459 EXPECT_FALSE(bridge->isAccelerated()); | 459 EXPECT_FALSE(bridge->isAccelerated()); |
460 EXPECT_TRUE(bridge->isHibernating()); | 460 EXPECT_TRUE(bridge->isHibernating()); |
461 EXPECT_TRUE(bridge->checkSurfaceValid()); | 461 EXPECT_TRUE(bridge->checkSurfaceValid()); |
462 | 462 |
(...skipping 10 matching lines...) Expand all Loading... |
473 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 473 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
474 } | 474 } |
475 | 475 |
476 #if CANVAS2D_HIBERNATION_ENABLED | 476 #if CANVAS2D_HIBERNATION_ENABLED |
477 TEST_F(Canvas2DLayerBridgeTest, HibernationReEntry) | 477 TEST_F(Canvas2DLayerBridgeTest, HibernationReEntry) |
478 #else | 478 #else |
479 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationReEntry) | 479 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationReEntry) |
480 #endif | 480 #endif |
481 { | 481 { |
482 FakeGLES2Interface gl; | 482 FakeGLES2Interface gl; |
483 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 483 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); |
484 | 484 |
485 // The Canvas2DLayerBridge has to be created on the thread that will use it | 485 // The Canvas2DLayerBridge has to be created on the thread that will use it |
486 // to avoid WeakPtr thread check issues. | 486 // to avoid WeakPtr thread check issues. |
487 Canvas2DLayerBridgePtr bridge; | 487 Canvas2DLayerBridgePtr bridge; |
488 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); | 488 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
489 | 489 |
490 // Register an alternate Logger for tracking hibernation events | 490 // Register an alternate Logger for tracking hibernation events |
491 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 491 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); |
492 MockLogger* mockLoggerPtr = mockLogger.get(); | 492 MockLogger* mockLoggerPtr = mockLogger.get(); |
493 bridge->setLoggerForTesting(std::move(mockLogger)); | 493 bridge->setLoggerForTesting(std::move(mockLogger)); |
494 | 494 |
495 // Test entering hibernation | 495 // Test entering hibernation |
496 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); | 496 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); |
497 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 497 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
498 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 498 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
499 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); | 499 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); |
500 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 500 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
501 // Toggle visibility before the idle tasks that enters hibernation gets a | 501 // Toggle visibility before the idle tasks that enters hibernation gets a |
502 // chance to run. | 502 // chance to run. |
503 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), false); | 503 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), false); |
504 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 504 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
505 | 505 |
506 hibernationStartedEvent->wait(); | 506 hibernationStartedEvent->wait(); |
(...skipping 15 matching lines...) Expand all Loading... |
522 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 522 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
523 } | 523 } |
524 | 524 |
525 #if CANVAS2D_HIBERNATION_ENABLED | 525 #if CANVAS2D_HIBERNATION_ENABLED |
526 TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycleWithDeferredRenderingDisable
d) | 526 TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycleWithDeferredRenderingDisable
d) |
527 #else | 527 #else |
528 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationLifeCycleWithDeferredRenderi
ngDisabled) | 528 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationLifeCycleWithDeferredRenderi
ngDisabled) |
529 #endif | 529 #endif |
530 { | 530 { |
531 FakeGLES2Interface gl; | 531 FakeGLES2Interface gl; |
532 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 532 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); |
533 | 533 |
534 // The Canvas2DLayerBridge has to be created on the thread that will use it | 534 // The Canvas2DLayerBridge has to be created on the thread that will use it |
535 // to avoid WeakPtr thread check issues. | 535 // to avoid WeakPtr thread check issues. |
536 Canvas2DLayerBridgePtr bridge; | 536 Canvas2DLayerBridgePtr bridge; |
537 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); | 537 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
538 bridge->disableDeferral(DisableDeferralReasonUnknown); | 538 bridge->disableDeferral(DisableDeferralReasonUnknown); |
539 MockImageBuffer mockImageBuffer; | 539 MockImageBuffer mockImageBuffer; |
540 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); | 540 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); |
541 bridge->setImageBuffer(&mockImageBuffer); | 541 bridge->setImageBuffer(&mockImageBuffer); |
542 | 542 |
543 // Register an alternate Logger for tracking hibernation events | 543 // Register an alternate Logger for tracking hibernation events |
544 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 544 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); |
545 MockLogger* mockLoggerPtr = mockLogger.get(); | 545 MockLogger* mockLoggerPtr = mockLogger.get(); |
546 bridge->setLoggerForTesting(std::move(mockLogger)); | 546 bridge->setLoggerForTesting(std::move(mockLogger)); |
547 | 547 |
548 // Test entering hibernation | 548 // Test entering hibernation |
549 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); | 549 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); |
550 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 550 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
551 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 551 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
552 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); | 552 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); |
553 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 553 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
554 hibernationStartedEvent->wait(); | 554 hibernationStartedEvent->wait(); |
555 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 555 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
556 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); | 556 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); |
557 EXPECT_FALSE(bridge->isAccelerated()); | 557 EXPECT_FALSE(bridge->isAccelerated()); |
558 EXPECT_TRUE(bridge->isHibernating()); | 558 EXPECT_TRUE(bridge->isHibernating()); |
559 EXPECT_TRUE(bridge->checkSurfaceValid()); | 559 EXPECT_TRUE(bridge->checkSurfaceValid()); |
(...skipping 16 matching lines...) Expand all Loading... |
576 void runRenderingTask(Canvas2DLayerBridge* bridge, WaitableEvent* doneEvent) | 576 void runRenderingTask(Canvas2DLayerBridge* bridge, WaitableEvent* doneEvent) |
577 { | 577 { |
578 bridge->didDraw(FloatRect(0, 0, 1, 1)); | 578 bridge->didDraw(FloatRect(0, 0, 1, 1)); |
579 bridge->finalizeFrame(FloatRect(0, 0, 1, 1)); | 579 bridge->finalizeFrame(FloatRect(0, 0, 1, 1)); |
580 bridge->flush(); | 580 bridge->flush(); |
581 doneEvent->signal(); | 581 doneEvent->signal(); |
582 } | 582 } |
583 | 583 |
584 void postAndWaitRenderingTask(const WebTraceLocation& location, WebThread* testT
hread, Canvas2DLayerBridge* bridge) | 584 void postAndWaitRenderingTask(const WebTraceLocation& location, WebThread* testT
hread, Canvas2DLayerBridge* bridge) |
585 { | 585 { |
586 OwnPtr<WaitableEvent> doneEvent = adoptPtr(new WaitableEvent()); | 586 std::unique_ptr<WaitableEvent> doneEvent = wrapUnique(new WaitableEvent()); |
587 testThread->getWebTaskRunner()->postTask( | 587 testThread->getWebTaskRunner()->postTask( |
588 location, | 588 location, |
589 threadSafeBind(&runRenderingTask, | 589 threadSafeBind(&runRenderingTask, |
590 AllowCrossThreadAccess(bridge), | 590 AllowCrossThreadAccess(bridge), |
591 AllowCrossThreadAccess(doneEvent.get()))); | 591 AllowCrossThreadAccess(doneEvent.get()))); |
592 doneEvent->wait(); | 592 doneEvent->wait(); |
593 } | 593 } |
594 | 594 |
595 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU | 595 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU |
596 TEST_F(Canvas2DLayerBridgeTest, BackgroundRenderingWhileHibernating) | 596 TEST_F(Canvas2DLayerBridgeTest, BackgroundRenderingWhileHibernating) |
597 #else | 597 #else |
598 TEST_F(Canvas2DLayerBridgeTest, DISABLED_BackgroundRenderingWhileHibernating) | 598 TEST_F(Canvas2DLayerBridgeTest, DISABLED_BackgroundRenderingWhileHibernating) |
599 #endif | 599 #endif |
600 { | 600 { |
601 FakeGLES2Interface gl; | 601 FakeGLES2Interface gl; |
602 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 602 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); |
603 | 603 |
604 // The Canvas2DLayerBridge has to be created on the thread that will use it | 604 // The Canvas2DLayerBridge has to be created on the thread that will use it |
605 // to avoid WeakPtr thread check issues. | 605 // to avoid WeakPtr thread check issues. |
606 Canvas2DLayerBridgePtr bridge; | 606 Canvas2DLayerBridgePtr bridge; |
607 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); | 607 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
608 | 608 |
609 // Register an alternate Logger for tracking hibernation events | 609 // Register an alternate Logger for tracking hibernation events |
610 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 610 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); |
611 MockLogger* mockLoggerPtr = mockLogger.get(); | 611 MockLogger* mockLoggerPtr = mockLogger.get(); |
612 bridge->setLoggerForTesting(std::move(mockLogger)); | 612 bridge->setLoggerForTesting(std::move(mockLogger)); |
613 | 613 |
614 // Test entering hibernation | 614 // Test entering hibernation |
615 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); | 615 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); |
616 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 616 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
617 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 617 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
618 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); | 618 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); |
619 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 619 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
620 hibernationStartedEvent->wait(); | 620 hibernationStartedEvent->wait(); |
621 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 621 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
622 EXPECT_FALSE(bridge->isAccelerated()); | 622 EXPECT_FALSE(bridge->isAccelerated()); |
623 EXPECT_TRUE(bridge->isHibernating()); | 623 EXPECT_TRUE(bridge->isHibernating()); |
624 EXPECT_TRUE(bridge->checkSurfaceValid()); | 624 EXPECT_TRUE(bridge->checkSurfaceValid()); |
625 | 625 |
(...skipping 17 matching lines...) Expand all Loading... |
643 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 643 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
644 } | 644 } |
645 | 645 |
646 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU | 646 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU |
647 TEST_F(Canvas2DLayerBridgeTest, BackgroundRenderingWhileHibernatingWithDeferredR
enderingDisabled) | 647 TEST_F(Canvas2DLayerBridgeTest, BackgroundRenderingWhileHibernatingWithDeferredR
enderingDisabled) |
648 #else | 648 #else |
649 TEST_F(Canvas2DLayerBridgeTest, DISABLED_BackgroundRenderingWhileHibernatingWith
DeferredRenderingDisabled) | 649 TEST_F(Canvas2DLayerBridgeTest, DISABLED_BackgroundRenderingWhileHibernatingWith
DeferredRenderingDisabled) |
650 #endif | 650 #endif |
651 { | 651 { |
652 FakeGLES2Interface gl; | 652 FakeGLES2Interface gl; |
653 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 653 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); |
654 | 654 |
655 // The Canvas2DLayerBridge has to be created on the thread that will use it | 655 // The Canvas2DLayerBridge has to be created on the thread that will use it |
656 // to avoid WeakPtr thread check issues. | 656 // to avoid WeakPtr thread check issues. |
657 Canvas2DLayerBridgePtr bridge; | 657 Canvas2DLayerBridgePtr bridge; |
658 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); | 658 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
659 MockImageBuffer mockImageBuffer; | 659 MockImageBuffer mockImageBuffer; |
660 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); | 660 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); |
661 bridge->setImageBuffer(&mockImageBuffer); | 661 bridge->setImageBuffer(&mockImageBuffer); |
662 bridge->disableDeferral(DisableDeferralReasonUnknown); | 662 bridge->disableDeferral(DisableDeferralReasonUnknown); |
663 | 663 |
664 // Register an alternate Logger for tracking hibernation events | 664 // Register an alternate Logger for tracking hibernation events |
665 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 665 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); |
666 MockLogger* mockLoggerPtr = mockLogger.get(); | 666 MockLogger* mockLoggerPtr = mockLogger.get(); |
667 bridge->setLoggerForTesting(std::move(mockLogger)); | 667 bridge->setLoggerForTesting(std::move(mockLogger)); |
668 | 668 |
669 // Test entering hibernation | 669 // Test entering hibernation |
670 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); | 670 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); |
671 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 671 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
672 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 672 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
673 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); | 673 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); |
674 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 674 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
675 hibernationStartedEvent->wait(); | 675 hibernationStartedEvent->wait(); |
676 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 676 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
677 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); | 677 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); |
678 EXPECT_FALSE(bridge->isAccelerated()); | 678 EXPECT_FALSE(bridge->isAccelerated()); |
679 EXPECT_TRUE(bridge->isHibernating()); | 679 EXPECT_TRUE(bridge->isHibernating()); |
680 EXPECT_TRUE(bridge->checkSurfaceValid()); | 680 EXPECT_TRUE(bridge->checkSurfaceValid()); |
(...skipping 23 matching lines...) Expand all Loading... |
704 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 704 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
705 } | 705 } |
706 | 706 |
707 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU | 707 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU |
708 TEST_F(Canvas2DLayerBridgeTest, DisableDeferredRenderingWhileHibernating) | 708 TEST_F(Canvas2DLayerBridgeTest, DisableDeferredRenderingWhileHibernating) |
709 #else | 709 #else |
710 TEST_F(Canvas2DLayerBridgeTest, DISABLED_DisableDeferredRenderingWhileHibernatin
g) | 710 TEST_F(Canvas2DLayerBridgeTest, DISABLED_DisableDeferredRenderingWhileHibernatin
g) |
711 #endif | 711 #endif |
712 { | 712 { |
713 FakeGLES2Interface gl; | 713 FakeGLES2Interface gl; |
714 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 714 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); |
715 | 715 |
716 // The Canvas2DLayerBridge has to be created on the thread that will use it | 716 // The Canvas2DLayerBridge has to be created on the thread that will use it |
717 // to avoid WeakPtr thread check issues. | 717 // to avoid WeakPtr thread check issues. |
718 Canvas2DLayerBridgePtr bridge; | 718 Canvas2DLayerBridgePtr bridge; |
719 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); | 719 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
720 MockImageBuffer mockImageBuffer; | 720 MockImageBuffer mockImageBuffer; |
721 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); | 721 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); |
722 bridge->setImageBuffer(&mockImageBuffer); | 722 bridge->setImageBuffer(&mockImageBuffer); |
723 | 723 |
724 // Register an alternate Logger for tracking hibernation events | 724 // Register an alternate Logger for tracking hibernation events |
725 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 725 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); |
726 MockLogger* mockLoggerPtr = mockLogger.get(); | 726 MockLogger* mockLoggerPtr = mockLogger.get(); |
727 bridge->setLoggerForTesting(std::move(mockLogger)); | 727 bridge->setLoggerForTesting(std::move(mockLogger)); |
728 | 728 |
729 // Test entering hibernation | 729 // Test entering hibernation |
730 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); | 730 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); |
731 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 731 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
732 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 732 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
733 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); | 733 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); |
734 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 734 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
735 hibernationStartedEvent->wait(); | 735 hibernationStartedEvent->wait(); |
736 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 736 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
737 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); | 737 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); |
738 EXPECT_FALSE(bridge->isAccelerated()); | 738 EXPECT_FALSE(bridge->isAccelerated()); |
739 EXPECT_TRUE(bridge->isHibernating()); | 739 EXPECT_TRUE(bridge->isHibernating()); |
740 EXPECT_TRUE(bridge->checkSurfaceValid()); | 740 EXPECT_TRUE(bridge->checkSurfaceValid()); |
(...skipping 23 matching lines...) Expand all Loading... |
764 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 764 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
765 } | 765 } |
766 | 766 |
767 #if CANVAS2D_HIBERNATION_ENABLED | 767 #if CANVAS2D_HIBERNATION_ENABLED |
768 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernating) | 768 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernating) |
769 #else | 769 #else |
770 TEST_F(Canvas2DLayerBridgeTest, DISABLED_TeardownWhileHibernating) | 770 TEST_F(Canvas2DLayerBridgeTest, DISABLED_TeardownWhileHibernating) |
771 #endif | 771 #endif |
772 { | 772 { |
773 FakeGLES2Interface gl; | 773 FakeGLES2Interface gl; |
774 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 774 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); |
775 | 775 |
776 // The Canvas2DLayerBridge has to be created on the thread that will use it | 776 // The Canvas2DLayerBridge has to be created on the thread that will use it |
777 // to avoid WeakPtr thread check issues. | 777 // to avoid WeakPtr thread check issues. |
778 Canvas2DLayerBridgePtr bridge; | 778 Canvas2DLayerBridgePtr bridge; |
779 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); | 779 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
780 | 780 |
781 // Register an alternate Logger for tracking hibernation events | 781 // Register an alternate Logger for tracking hibernation events |
782 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 782 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); |
783 MockLogger* mockLoggerPtr = mockLogger.get(); | 783 MockLogger* mockLoggerPtr = mockLogger.get(); |
784 bridge->setLoggerForTesting(std::move(mockLogger)); | 784 bridge->setLoggerForTesting(std::move(mockLogger)); |
785 | 785 |
786 // Test entering hibernation | 786 // Test entering hibernation |
787 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); | 787 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); |
788 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 788 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
789 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 789 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
790 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); | 790 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); |
791 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 791 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
792 hibernationStartedEvent->wait(); | 792 hibernationStartedEvent->wait(); |
793 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 793 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
794 EXPECT_FALSE(bridge->isAccelerated()); | 794 EXPECT_FALSE(bridge->isAccelerated()); |
795 EXPECT_TRUE(bridge->isHibernating()); | 795 EXPECT_TRUE(bridge->isHibernating()); |
796 EXPECT_TRUE(bridge->checkSurfaceValid()); | 796 EXPECT_TRUE(bridge->checkSurfaceValid()); |
797 | 797 |
798 // Tear down the bridge while hibernating | 798 // Tear down the bridge while hibernating |
799 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationEndedWithTeardown)); | 799 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationEndedWithTeardown)); |
800 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 800 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
801 } | 801 } |
802 | 802 |
803 #if CANVAS2D_HIBERNATION_ENABLED | 803 #if CANVAS2D_HIBERNATION_ENABLED |
804 TEST_F(Canvas2DLayerBridgeTest, SnapshotWhileHibernating) | 804 TEST_F(Canvas2DLayerBridgeTest, SnapshotWhileHibernating) |
805 #else | 805 #else |
806 TEST_F(Canvas2DLayerBridgeTest, DISABLED_SnapshotWhileHibernating) | 806 TEST_F(Canvas2DLayerBridgeTest, DISABLED_SnapshotWhileHibernating) |
807 #endif | 807 #endif |
808 { | 808 { |
809 FakeGLES2Interface gl; | 809 FakeGLES2Interface gl; |
810 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 810 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); |
811 | 811 |
812 // The Canvas2DLayerBridge has to be created on the thread that will use it | 812 // The Canvas2DLayerBridge has to be created on the thread that will use it |
813 // to avoid WeakPtr thread check issues. | 813 // to avoid WeakPtr thread check issues. |
814 Canvas2DLayerBridgePtr bridge; | 814 Canvas2DLayerBridgePtr bridge; |
815 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); | 815 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
816 | 816 |
817 // Register an alternate Logger for tracking hibernation events | 817 // Register an alternate Logger for tracking hibernation events |
818 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 818 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); |
819 MockLogger* mockLoggerPtr = mockLogger.get(); | 819 MockLogger* mockLoggerPtr = mockLogger.get(); |
820 bridge->setLoggerForTesting(std::move(mockLogger)); | 820 bridge->setLoggerForTesting(std::move(mockLogger)); |
821 | 821 |
822 // Test entering hibernation | 822 // Test entering hibernation |
823 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); | 823 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); |
824 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 824 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
825 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 825 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
826 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); | 826 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); |
827 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 827 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
828 hibernationStartedEvent->wait(); | 828 hibernationStartedEvent->wait(); |
829 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 829 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
830 EXPECT_FALSE(bridge->isAccelerated()); | 830 EXPECT_FALSE(bridge->isAccelerated()); |
831 EXPECT_TRUE(bridge->isHibernating()); | 831 EXPECT_TRUE(bridge->isHibernating()); |
832 EXPECT_TRUE(bridge->checkSurfaceValid()); | 832 EXPECT_TRUE(bridge->checkSurfaceValid()); |
833 | 833 |
834 // Take a snapshot and verify that it is not accelerated due to hibernation | 834 // Take a snapshot and verify that it is not accelerated due to hibernation |
835 RefPtr<SkImage> image = bridge->newImageSnapshot(PreferAcceleration, Snapsho
tReasonUnknown); | 835 RefPtr<SkImage> image = bridge->newImageSnapshot(PreferAcceleration, Snapsho
tReasonUnknown); |
836 EXPECT_FALSE(image->isTextureBacked()); | 836 EXPECT_FALSE(image->isTextureBacked()); |
837 image.clear(); | 837 image.clear(); |
838 | 838 |
839 // Verify that taking a snapshot did not affect the state of bridge | 839 // Verify that taking a snapshot did not affect the state of bridge |
840 EXPECT_FALSE(bridge->isAccelerated()); | 840 EXPECT_FALSE(bridge->isAccelerated()); |
841 EXPECT_TRUE(bridge->isHibernating()); | 841 EXPECT_TRUE(bridge->isHibernating()); |
842 EXPECT_TRUE(bridge->checkSurfaceValid()); | 842 EXPECT_TRUE(bridge->checkSurfaceValid()); |
843 | 843 |
844 // End hibernation normally | 844 // End hibernation normally |
845 OwnPtr<WaitableEvent> hibernationEndedEvent = adoptPtr(new WaitableEvent()); | 845 std::unique_ptr<WaitableEvent> hibernationEndedEvent = wrapUnique(new Waitab
leEvent()); |
846 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationEndedNormally)) | 846 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationEndedNormally)) |
847 .WillOnce(testing::InvokeWithoutArgs(hibernationEndedEvent.get(), &Waita
bleEvent::signal)); | 847 .WillOnce(testing::InvokeWithoutArgs(hibernationEndedEvent.get(), &Waita
bleEvent::signal)); |
848 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), false); | 848 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), false); |
849 hibernationEndedEvent->wait(); | 849 hibernationEndedEvent->wait(); |
850 | 850 |
851 // Tear down the bridge while hibernating | 851 // Tear down the bridge while hibernating |
852 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 852 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
853 } | 853 } |
854 | 854 |
855 class IdleFenceTask : public WebThread::IdleTask { | 855 class IdleFenceTask : public WebThread::IdleTask { |
(...skipping 13 matching lines...) Expand all Loading... |
869 WaitableEvent* m_doneEvent; | 869 WaitableEvent* m_doneEvent; |
870 }; | 870 }; |
871 | 871 |
872 #if CANVAS2D_HIBERNATION_ENABLED | 872 #if CANVAS2D_HIBERNATION_ENABLED |
873 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernationIsPending) | 873 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernationIsPending) |
874 #else | 874 #else |
875 TEST_F(Canvas2DLayerBridgeTest, DISABLED_TeardownWhileHibernationIsPending) | 875 TEST_F(Canvas2DLayerBridgeTest, DISABLED_TeardownWhileHibernationIsPending) |
876 #endif | 876 #endif |
877 { | 877 { |
878 FakeGLES2Interface gl; | 878 FakeGLES2Interface gl; |
879 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 879 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); |
880 | 880 |
881 // The Canvas2DLayerBridge has to be created on the thread that will use it | 881 // The Canvas2DLayerBridge has to be created on the thread that will use it |
882 // to avoid WeakPtr thread check issues. | 882 // to avoid WeakPtr thread check issues. |
883 Canvas2DLayerBridgePtr bridge; | 883 Canvas2DLayerBridgePtr bridge; |
884 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); | 884 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
885 | 885 |
886 // Register an alternate Logger for tracking hibernation events | 886 // Register an alternate Logger for tracking hibernation events |
887 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 887 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); |
888 MockLogger* mockLoggerPtr = mockLogger.get(); | 888 MockLogger* mockLoggerPtr = mockLogger.get(); |
889 bridge->setLoggerForTesting(std::move(mockLogger)); | 889 bridge->setLoggerForTesting(std::move(mockLogger)); |
890 | 890 |
891 // Test entering hibernation | 891 // Test entering hibernation |
892 OwnPtr<WaitableEvent> hibernationScheduledEvent = adoptPtr(new WaitableEvent
()); | 892 std::unique_ptr<WaitableEvent> hibernationScheduledEvent = wrapUnique(new Wa
itableEvent()); |
893 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 893 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
894 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true, h
ibernationScheduledEvent.get()); | 894 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true, h
ibernationScheduledEvent.get()); |
895 postDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 895 postDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
896 // In production, we would expect a | 896 // In production, we would expect a |
897 // HibernationAbortedDueToDestructionWhileHibernatePending event to be | 897 // HibernationAbortedDueToDestructionWhileHibernatePending event to be |
898 // fired, but that signal is lost in the unit test due to no longer having | 898 // fired, but that signal is lost in the unit test due to no longer having |
899 // a bridge to hold the mockLogger. | 899 // a bridge to hold the mockLogger. |
900 hibernationScheduledEvent->wait(); | 900 hibernationScheduledEvent->wait(); |
901 // Once we know the hibernation task is scheduled, we can schedule a fence. | 901 // Once we know the hibernation task is scheduled, we can schedule a fence. |
902 // Assuming Idle tasks are guaranteed to run in the order they were | 902 // Assuming Idle tasks are guaranteed to run in the order they were |
903 // submitted, this fence will guarantee the attempt to hibernate runs to | 903 // submitted, this fence will guarantee the attempt to hibernate runs to |
904 // completion before the thread is destroyed. | 904 // completion before the thread is destroyed. |
905 // This test passes by not crashing, which proves that the WeakPtr logic | 905 // This test passes by not crashing, which proves that the WeakPtr logic |
906 // is sound. | 906 // is sound. |
907 OwnPtr<WaitableEvent> fenceEvent = adoptPtr(new WaitableEvent()); | 907 std::unique_ptr<WaitableEvent> fenceEvent = wrapUnique(new WaitableEvent()); |
908 testThread->scheduler()->postIdleTask(BLINK_FROM_HERE, new IdleFenceTask(fen
ceEvent.get())); | 908 testThread->scheduler()->postIdleTask(BLINK_FROM_HERE, new IdleFenceTask(fen
ceEvent.get())); |
909 fenceEvent->wait(); | 909 fenceEvent->wait(); |
910 } | 910 } |
911 | 911 |
912 #if CANVAS2D_HIBERNATION_ENABLED | 912 #if CANVAS2D_HIBERNATION_ENABLED |
913 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToPendingTeardown) | 913 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToPendingTeardown) |
914 #else | 914 #else |
915 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToPendingTeardown) | 915 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToPendingTeardown) |
916 #endif | 916 #endif |
917 { | 917 { |
918 FakeGLES2Interface gl; | 918 FakeGLES2Interface gl; |
919 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 919 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); |
920 | 920 |
921 // The Canvas2DLayerBridge has to be created on the thread that will use it | 921 // The Canvas2DLayerBridge has to be created on the thread that will use it |
922 // to avoid WeakPtr thread check issues. | 922 // to avoid WeakPtr thread check issues. |
923 Canvas2DLayerBridgePtr bridge; | 923 Canvas2DLayerBridgePtr bridge; |
924 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); | 924 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
925 | 925 |
926 // Register an alternate Logger for tracking hibernation events | 926 // Register an alternate Logger for tracking hibernation events |
927 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 927 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); |
928 MockLogger* mockLoggerPtr = mockLogger.get(); | 928 MockLogger* mockLoggerPtr = mockLogger.get(); |
929 bridge->setLoggerForTesting(std::move(mockLogger)); | 929 bridge->setLoggerForTesting(std::move(mockLogger)); |
930 | 930 |
931 // Test entering hibernation | 931 // Test entering hibernation |
932 OwnPtr<WaitableEvent> hibernationAbortedEvent = adoptPtr(new WaitableEvent()
); | 932 std::unique_ptr<WaitableEvent> hibernationAbortedEvent = wrapUnique(new Wait
ableEvent()); |
933 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 933 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
934 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationAbortedDueToPendingDestruction)) | 934 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationAbortedDueToPendingDestruction)) |
935 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Wai
tableEvent::signal)); | 935 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Wai
tableEvent::signal)); |
936 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 936 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
937 testThread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&Ca
nvas2DLayerBridge::beginDestruction, AllowCrossThreadAccess(bridge.get()))); | 937 testThread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&Ca
nvas2DLayerBridge::beginDestruction, AllowCrossThreadAccess(bridge.get()))); |
938 hibernationAbortedEvent->wait(); | 938 hibernationAbortedEvent->wait(); |
939 | 939 |
940 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 940 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
941 | 941 |
942 // Tear down bridge on thread | 942 // Tear down bridge on thread |
943 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 943 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
944 } | 944 } |
945 | 945 |
946 #if CANVAS2D_HIBERNATION_ENABLED | 946 #if CANVAS2D_HIBERNATION_ENABLED |
947 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToVisibilityChange) | 947 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToVisibilityChange) |
948 #else | 948 #else |
949 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToVisibilityChange
) | 949 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToVisibilityChange
) |
950 #endif | 950 #endif |
951 { | 951 { |
952 FakeGLES2Interface gl; | 952 FakeGLES2Interface gl; |
953 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 953 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); |
954 | 954 |
955 // The Canvas2DLayerBridge has to be created on the thread that will use it | 955 // The Canvas2DLayerBridge has to be created on the thread that will use it |
956 // to avoid WeakPtr thread check issues. | 956 // to avoid WeakPtr thread check issues. |
957 Canvas2DLayerBridgePtr bridge; | 957 Canvas2DLayerBridgePtr bridge; |
958 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); | 958 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
959 | 959 |
960 // Register an alternate Logger for tracking hibernation events | 960 // Register an alternate Logger for tracking hibernation events |
961 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 961 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); |
962 MockLogger* mockLoggerPtr = mockLogger.get(); | 962 MockLogger* mockLoggerPtr = mockLogger.get(); |
963 bridge->setLoggerForTesting(std::move(mockLogger)); | 963 bridge->setLoggerForTesting(std::move(mockLogger)); |
964 | 964 |
965 // Test entering hibernation | 965 // Test entering hibernation |
966 OwnPtr<WaitableEvent> hibernationAbortedEvent = adoptPtr(new WaitableEvent()
); | 966 std::unique_ptr<WaitableEvent> hibernationAbortedEvent = wrapUnique(new Wait
ableEvent()); |
967 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 967 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
968 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationAbortedDueToVisibilityChange)) | 968 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationAbortedDueToVisibilityChange)) |
969 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Wai
tableEvent::signal)); | 969 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Wai
tableEvent::signal)); |
970 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 970 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
971 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), false); | 971 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), false); |
972 hibernationAbortedEvent->wait(); | 972 hibernationAbortedEvent->wait(); |
973 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 973 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
974 EXPECT_TRUE(bridge->isAccelerated()); | 974 EXPECT_TRUE(bridge->isAccelerated()); |
975 EXPECT_FALSE(bridge->isHibernating()); | 975 EXPECT_FALSE(bridge->isHibernating()); |
976 EXPECT_TRUE(bridge->checkSurfaceValid()); | 976 EXPECT_TRUE(bridge->checkSurfaceValid()); |
977 | 977 |
978 // Tear down the bridge on the thread so that 'bridge' can go out of scope | 978 // Tear down the bridge on the thread so that 'bridge' can go out of scope |
979 // without crashing due to thread checks | 979 // without crashing due to thread checks |
980 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 980 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
981 } | 981 } |
982 | 982 |
983 #if CANVAS2D_HIBERNATION_ENABLED | 983 #if CANVAS2D_HIBERNATION_ENABLED |
984 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToLostContext) | 984 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToLostContext) |
985 #else | 985 #else |
986 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToLostContext) | 986 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToLostContext) |
987 #endif | 987 #endif |
988 { | 988 { |
989 FakeGLES2Interface gl; | 989 FakeGLES2Interface gl; |
990 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 990 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); |
991 | 991 |
992 // The Canvas2DLayerBridge has to be created on the thread that will use it | 992 // The Canvas2DLayerBridge has to be created on the thread that will use it |
993 // to avoid WeakPtr thread check issues. | 993 // to avoid WeakPtr thread check issues. |
994 Canvas2DLayerBridgePtr bridge; | 994 Canvas2DLayerBridgePtr bridge; |
995 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); | 995 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
996 | 996 |
997 // Register an alternate Logger for tracking hibernation events | 997 // Register an alternate Logger for tracking hibernation events |
998 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 998 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); |
999 MockLogger* mockLoggerPtr = mockLogger.get(); | 999 MockLogger* mockLoggerPtr = mockLogger.get(); |
1000 bridge->setLoggerForTesting(std::move(mockLogger)); | 1000 bridge->setLoggerForTesting(std::move(mockLogger)); |
1001 | 1001 |
1002 gl.setIsContextLost(true); | 1002 gl.setIsContextLost(true); |
1003 // Test entering hibernation | 1003 // Test entering hibernation |
1004 OwnPtr<WaitableEvent> hibernationAbortedEvent = adoptPtr(new WaitableEvent()
); | 1004 std::unique_ptr<WaitableEvent> hibernationAbortedEvent = wrapUnique(new Wait
ableEvent()); |
1005 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 1005 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
1006 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationAbortedDueGpuContextLoss)) | 1006 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationAbortedDueGpuContextLoss)) |
1007 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Wai
tableEvent::signal)); | 1007 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Wai
tableEvent::signal)); |
1008 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 1008 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
1009 hibernationAbortedEvent->wait(); | 1009 hibernationAbortedEvent->wait(); |
1010 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 1010 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
1011 EXPECT_FALSE(bridge->isHibernating()); | 1011 EXPECT_FALSE(bridge->isHibernating()); |
1012 | 1012 |
1013 // Tear down the bridge on the thread so that 'bridge' can go out of scope | 1013 // Tear down the bridge on the thread so that 'bridge' can go out of scope |
1014 // without crashing due to thread checks | 1014 // without crashing due to thread checks |
1015 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 1015 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
1016 } | 1016 } |
1017 | 1017 |
1018 #if CANVAS2D_HIBERNATION_ENABLED | 1018 #if CANVAS2D_HIBERNATION_ENABLED |
1019 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileHibernating) | 1019 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileHibernating) |
1020 #else | 1020 #else |
1021 TEST_F(Canvas2DLayerBridgeTest, DISABLED_PrepareMailboxWhileHibernating) | 1021 TEST_F(Canvas2DLayerBridgeTest, DISABLED_PrepareMailboxWhileHibernating) |
1022 #endif | 1022 #endif |
1023 { | 1023 { |
1024 FakeGLES2Interface gl; | 1024 FakeGLES2Interface gl; |
1025 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 1025 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); |
1026 | 1026 |
1027 // The Canvas2DLayerBridge has to be created on the thread that will use it | 1027 // The Canvas2DLayerBridge has to be created on the thread that will use it |
1028 // to avoid WeakPtr thread check issues. | 1028 // to avoid WeakPtr thread check issues. |
1029 Canvas2DLayerBridgePtr bridge; | 1029 Canvas2DLayerBridgePtr bridge; |
1030 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); | 1030 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
1031 | 1031 |
1032 // Register an alternate Logger for tracking hibernation events | 1032 // Register an alternate Logger for tracking hibernation events |
1033 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 1033 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); |
1034 MockLogger* mockLoggerPtr = mockLogger.get(); | 1034 MockLogger* mockLoggerPtr = mockLogger.get(); |
1035 bridge->setLoggerForTesting(std::move(mockLogger)); | 1035 bridge->setLoggerForTesting(std::move(mockLogger)); |
1036 | 1036 |
1037 // Test entering hibernation | 1037 // Test entering hibernation |
1038 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); | 1038 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); |
1039 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 1039 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
1040 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 1040 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
1041 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); | 1041 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); |
1042 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 1042 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
1043 hibernationStartedEvent->wait(); | 1043 hibernationStartedEvent->wait(); |
1044 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 1044 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
1045 | 1045 |
1046 // Test prepareMailbox while hibernating | 1046 // Test prepareMailbox while hibernating |
1047 WebExternalTextureMailbox mailbox; | 1047 WebExternalTextureMailbox mailbox; |
1048 EXPECT_FALSE(bridge->prepareMailbox(&mailbox, 0)); | 1048 EXPECT_FALSE(bridge->prepareMailbox(&mailbox, 0)); |
1049 EXPECT_TRUE(bridge->checkSurfaceValid()); | 1049 EXPECT_TRUE(bridge->checkSurfaceValid()); |
1050 | 1050 |
1051 // Tear down the bridge on the thread so that 'bridge' can go out of scope | 1051 // Tear down the bridge on the thread so that 'bridge' can go out of scope |
1052 // without crashing due to thread checks | 1052 // without crashing due to thread checks |
1053 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationEndedWithTeardown)); | 1053 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationEndedWithTeardown)); |
1054 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 1054 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
1055 } | 1055 } |
1056 | 1056 |
1057 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU | 1057 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU |
1058 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileBackgroundRendering) | 1058 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileBackgroundRendering) |
1059 #else | 1059 #else |
1060 TEST_F(Canvas2DLayerBridgeTest, DISABLED_PrepareMailboxWhileBackgroundRendering) | 1060 TEST_F(Canvas2DLayerBridgeTest, DISABLED_PrepareMailboxWhileBackgroundRendering) |
1061 #endif | 1061 #endif |
1062 { | 1062 { |
1063 FakeGLES2Interface gl; | 1063 FakeGLES2Interface gl; |
1064 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); | 1064 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); |
1065 | 1065 |
1066 // The Canvas2DLayerBridge has to be created on the thread that will use it | 1066 // The Canvas2DLayerBridge has to be created on the thread that will use it |
1067 // to avoid WeakPtr thread check issues. | 1067 // to avoid WeakPtr thread check issues. |
1068 Canvas2DLayerBridgePtr bridge; | 1068 Canvas2DLayerBridgePtr bridge; |
1069 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); | 1069 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl,
this); |
1070 | 1070 |
1071 // Register an alternate Logger for tracking hibernation events | 1071 // Register an alternate Logger for tracking hibernation events |
1072 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); | 1072 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); |
1073 MockLogger* mockLoggerPtr = mockLogger.get(); | 1073 MockLogger* mockLoggerPtr = mockLogger.get(); |
1074 bridge->setLoggerForTesting(std::move(mockLogger)); | 1074 bridge->setLoggerForTesting(std::move(mockLogger)); |
1075 | 1075 |
1076 // Test entering hibernation | 1076 // Test entering hibernation |
1077 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); | 1077 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); |
1078 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); | 1078 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationScheduled)); |
1079 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 1079 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
1080 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); | 1080 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent:
:signal)); |
1081 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 1081 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
1082 hibernationStartedEvent->wait(); | 1082 hibernationStartedEvent->wait(); |
1083 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 1083 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
1084 | 1084 |
1085 // Rendering in the background -> temp switch to SW | 1085 // Rendering in the background -> temp switch to SW |
1086 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationEndedWithSwitchToBackgroundRendering)); | 1086 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe
rnationEndedWithSwitchToBackgroundRendering)); |
1087 postAndWaitRenderingTask(BLINK_FROM_HERE, testThread.get(), bridge.get()); | 1087 postAndWaitRenderingTask(BLINK_FROM_HERE, testThread.get(), bridge.get()); |
1088 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 1088 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
1089 EXPECT_FALSE(bridge->isAccelerated()); | 1089 EXPECT_FALSE(bridge->isAccelerated()); |
1090 EXPECT_FALSE(bridge->isHibernating()); | 1090 EXPECT_FALSE(bridge->isHibernating()); |
1091 EXPECT_TRUE(bridge->checkSurfaceValid()); | 1091 EXPECT_TRUE(bridge->checkSurfaceValid()); |
1092 | 1092 |
1093 // Test prepareMailbox while background rendering | 1093 // Test prepareMailbox while background rendering |
1094 WebExternalTextureMailbox mailbox; | 1094 WebExternalTextureMailbox mailbox; |
1095 EXPECT_FALSE(bridge->prepareMailbox(&mailbox, 0)); | 1095 EXPECT_FALSE(bridge->prepareMailbox(&mailbox, 0)); |
1096 EXPECT_TRUE(bridge->checkSurfaceValid()); | 1096 EXPECT_TRUE(bridge->checkSurfaceValid()); |
1097 | 1097 |
1098 // Tear down the bridge on the thread so that 'bridge' can go out of scope | 1098 // Tear down the bridge on the thread so that 'bridge' can go out of scope |
1099 // without crashing due to thread checks | 1099 // without crashing due to thread checks |
1100 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 1100 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
1101 } | 1101 } |
1102 | 1102 |
1103 | 1103 |
1104 } // namespace blink | 1104 } // namespace blink |
OLD | NEW |