| 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 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 new Canvas2DLayerBridge(std::move(provider), size, 0, NonOpaque, | 128 new Canvas2DLayerBridge(std::move(provider), size, 0, NonOpaque, |
| 129 accelerationMode, nullptr, kN32_SkColorType)); | 129 accelerationMode, nullptr, kN32_SkColorType)); |
| 130 bridge->dontUseIdleSchedulingForTesting(); | 130 bridge->dontUseIdleSchedulingForTesting(); |
| 131 return bridge.release(); | 131 return bridge.release(); |
| 132 } | 132 } |
| 133 | 133 |
| 134 protected: | 134 protected: |
| 135 void fullLifecycleTest() { | 135 void fullLifecycleTest() { |
| 136 FakeGLES2Interface gl; | 136 FakeGLES2Interface gl; |
| 137 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = | 137 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = |
| 138 wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 138 WTF::wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
| 139 | 139 |
| 140 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( | 140 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( |
| 141 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, | 141 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, |
| 142 Canvas2DLayerBridge::DisableAcceleration, nullptr, kN32_SkColorType))); | 142 Canvas2DLayerBridge::DisableAcceleration, nullptr, kN32_SkColorType))); |
| 143 | 143 |
| 144 const GrGLTextureInfo* textureInfo = skia::GrBackendObjectToGrGLTextureInfo( | 144 const GrGLTextureInfo* textureInfo = skia::GrBackendObjectToGrGLTextureInfo( |
| 145 bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnitTests) | 145 bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnitTests) |
| 146 ->getTextureHandle(true)); | 146 ->getTextureHandle(true)); |
| 147 EXPECT_EQ(textureInfo, nullptr); | 147 EXPECT_EQ(textureInfo, nullptr); |
| 148 bridge.clear(); | 148 bridge.clear(); |
| 149 } | 149 } |
| 150 | 150 |
| 151 void fallbackToSoftwareIfContextLost() { | 151 void fallbackToSoftwareIfContextLost() { |
| 152 FakeGLES2Interface gl; | 152 FakeGLES2Interface gl; |
| 153 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = | 153 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = |
| 154 wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 154 WTF::wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
| 155 | 155 |
| 156 gl.setIsContextLost(true); | 156 gl.setIsContextLost(true); |
| 157 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( | 157 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( |
| 158 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, | 158 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, |
| 159 Canvas2DLayerBridge::EnableAcceleration, nullptr, kN32_SkColorType))); | 159 Canvas2DLayerBridge::EnableAcceleration, nullptr, kN32_SkColorType))); |
| 160 EXPECT_TRUE(bridge->checkSurfaceValid()); | 160 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 161 EXPECT_FALSE(bridge->isAccelerated()); | 161 EXPECT_FALSE(bridge->isAccelerated()); |
| 162 } | 162 } |
| 163 | 163 |
| 164 void fallbackToSoftwareOnFailedTextureAlloc() { | 164 void fallbackToSoftwareOnFailedTextureAlloc() { |
| 165 { | 165 { |
| 166 // No fallback case. | 166 // No fallback case. |
| 167 FakeGLES2Interface gl; | 167 FakeGLES2Interface gl; |
| 168 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = | 168 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = |
| 169 wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 169 WTF::wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
| 170 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( | 170 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( |
| 171 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, | 171 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, |
| 172 Canvas2DLayerBridge::EnableAcceleration, nullptr, kN32_SkColorType))); | 172 Canvas2DLayerBridge::EnableAcceleration, nullptr, kN32_SkColorType))); |
| 173 EXPECT_TRUE(bridge->checkSurfaceValid()); | 173 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 174 EXPECT_TRUE(bridge->isAccelerated()); | 174 EXPECT_TRUE(bridge->isAccelerated()); |
| 175 sk_sp<SkImage> snapshot = | 175 sk_sp<SkImage> snapshot = |
| 176 bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnitTests); | 176 bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnitTests); |
| 177 EXPECT_TRUE(bridge->isAccelerated()); | 177 EXPECT_TRUE(bridge->isAccelerated()); |
| 178 EXPECT_TRUE(snapshot->isTextureBacked()); | 178 EXPECT_TRUE(snapshot->isTextureBacked()); |
| 179 } | 179 } |
| 180 | 180 |
| 181 { | 181 { |
| 182 // Fallback case. | 182 // Fallback case. |
| 183 FakeGLES2Interface gl; | 183 FakeGLES2Interface gl; |
| 184 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = | 184 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = |
| 185 wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 185 WTF::wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
| 186 GrContext* gr = contextProvider->grContext(); | 186 GrContext* gr = contextProvider->grContext(); |
| 187 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( | 187 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( |
| 188 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, | 188 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, |
| 189 Canvas2DLayerBridge::EnableAcceleration, nullptr, kN32_SkColorType))); | 189 Canvas2DLayerBridge::EnableAcceleration, nullptr, kN32_SkColorType))); |
| 190 EXPECT_TRUE(bridge->checkSurfaceValid()); | 190 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 191 EXPECT_TRUE(bridge->isAccelerated()); // We don't yet know that | 191 EXPECT_TRUE(bridge->isAccelerated()); // We don't yet know that |
| 192 // allocation will fail. | 192 // allocation will fail. |
| 193 // This will cause SkSurface_Gpu creation to fail without | 193 // This will cause SkSurface_Gpu creation to fail without |
| 194 // Canvas2DLayerBridge otherwise detecting that anything was disabled. | 194 // Canvas2DLayerBridge otherwise detecting that anything was disabled. |
| 195 gr->abandonContext(); | 195 gr->abandonContext(); |
| 196 sk_sp<SkImage> snapshot = | 196 sk_sp<SkImage> snapshot = |
| 197 bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnitTests); | 197 bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnitTests); |
| 198 EXPECT_FALSE(bridge->isAccelerated()); | 198 EXPECT_FALSE(bridge->isAccelerated()); |
| 199 EXPECT_FALSE(snapshot->isTextureBacked()); | 199 EXPECT_FALSE(snapshot->isTextureBacked()); |
| 200 } | 200 } |
| 201 } | 201 } |
| 202 | 202 |
| 203 void noDrawOnContextLostTest() { | 203 void noDrawOnContextLostTest() { |
| 204 FakeGLES2Interface gl; | 204 FakeGLES2Interface gl; |
| 205 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = | 205 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = |
| 206 wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 206 WTF::wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
| 207 | 207 |
| 208 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( | 208 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( |
| 209 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, | 209 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, |
| 210 Canvas2DLayerBridge::ForceAccelerationForTesting, nullptr, | 210 Canvas2DLayerBridge::ForceAccelerationForTesting, nullptr, |
| 211 kN32_SkColorType))); | 211 kN32_SkColorType))); |
| 212 EXPECT_TRUE(bridge->checkSurfaceValid()); | 212 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 213 SkPaint paint; | 213 SkPaint paint; |
| 214 uint32_t genID = bridge->getOrCreateSurface()->generationID(); | 214 uint32_t genID = bridge->getOrCreateSurface()->generationID(); |
| 215 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); | 215 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
| 216 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); | 216 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); |
| 217 gl.setIsContextLost(true); | 217 gl.setIsContextLost(true); |
| 218 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); | 218 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); |
| 219 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); | 219 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
| 220 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); | 220 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); |
| 221 // This results in the internal surface being torn down in response to the | 221 // This results in the internal surface being torn down in response to the |
| 222 // context loss. | 222 // context loss. |
| 223 EXPECT_FALSE(bridge->checkSurfaceValid()); | 223 EXPECT_FALSE(bridge->checkSurfaceValid()); |
| 224 EXPECT_EQ(nullptr, bridge->getOrCreateSurface()); | 224 EXPECT_EQ(nullptr, bridge->getOrCreateSurface()); |
| 225 // The following passes by not crashing | 225 // The following passes by not crashing |
| 226 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); | 226 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
| 227 bridge->flush(); | 227 bridge->flush(); |
| 228 } | 228 } |
| 229 | 229 |
| 230 void prepareMailboxWhenContextIsLost() { | 230 void prepareMailboxWhenContextIsLost() { |
| 231 FakeGLES2Interface gl; | 231 FakeGLES2Interface gl; |
| 232 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = | 232 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = |
| 233 wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 233 WTF::wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
| 234 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( | 234 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( |
| 235 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, | 235 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, |
| 236 Canvas2DLayerBridge::ForceAccelerationForTesting, nullptr, | 236 Canvas2DLayerBridge::ForceAccelerationForTesting, nullptr, |
| 237 kN32_SkColorType))); | 237 kN32_SkColorType))); |
| 238 | 238 |
| 239 // TODO(junov): The PrepareTextureMailbox() method will fail a DCHECK if we | 239 // TODO(junov): The PrepareTextureMailbox() method will fail a DCHECK if we |
| 240 // don't do this before calling it the first time when the context is lost. | 240 // don't do this before calling it the first time when the context is lost. |
| 241 bridge->prepareSurfaceForPaintingIfNeeded(); | 241 bridge->prepareSurfaceForPaintingIfNeeded(); |
| 242 | 242 |
| 243 // When the context is lost we are not sure if we should still be producing | 243 // When the context is lost we are not sure if we should still be producing |
| 244 // GL frames for the compositor or not, so fail to generate frames. | 244 // GL frames for the compositor or not, so fail to generate frames. |
| 245 gl.setIsContextLost(true); | 245 gl.setIsContextLost(true); |
| 246 | 246 |
| 247 cc::TextureMailbox textureMailbox; | 247 cc::TextureMailbox textureMailbox; |
| 248 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; | 248 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; |
| 249 EXPECT_FALSE( | 249 EXPECT_FALSE( |
| 250 bridge->PrepareTextureMailbox(&textureMailbox, &releaseCallback)); | 250 bridge->PrepareTextureMailbox(&textureMailbox, &releaseCallback)); |
| 251 } | 251 } |
| 252 | 252 |
| 253 void prepareMailboxAndLoseResourceTest() { | 253 void prepareMailboxAndLoseResourceTest() { |
| 254 // Prepare a mailbox, then report the resource as lost. | 254 // Prepare a mailbox, then report the resource as lost. |
| 255 // This test passes by not crashing and not triggering assertions. | 255 // This test passes by not crashing and not triggering assertions. |
| 256 { | 256 { |
| 257 FakeGLES2Interface gl; | 257 FakeGLES2Interface gl; |
| 258 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = | 258 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = |
| 259 wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 259 WTF::wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
| 260 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( | 260 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( |
| 261 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, | 261 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, |
| 262 Canvas2DLayerBridge::ForceAccelerationForTesting, nullptr, | 262 Canvas2DLayerBridge::ForceAccelerationForTesting, nullptr, |
| 263 kN32_SkColorType))); | 263 kN32_SkColorType))); |
| 264 | 264 |
| 265 cc::TextureMailbox textureMailbox; | 265 cc::TextureMailbox textureMailbox; |
| 266 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; | 266 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; |
| 267 EXPECT_TRUE( | 267 EXPECT_TRUE( |
| 268 bridge->PrepareTextureMailbox(&textureMailbox, &releaseCallback)); | 268 bridge->PrepareTextureMailbox(&textureMailbox, &releaseCallback)); |
| 269 | 269 |
| 270 bool lostResource = true; | 270 bool lostResource = true; |
| 271 releaseCallback->Run(gpu::SyncToken(), lostResource); | 271 releaseCallback->Run(gpu::SyncToken(), lostResource); |
| 272 } | 272 } |
| 273 | 273 |
| 274 // Retry with mailbox released while bridge destruction is in progress. | 274 // Retry with mailbox released while bridge destruction is in progress. |
| 275 { | 275 { |
| 276 FakeGLES2Interface gl; | 276 FakeGLES2Interface gl; |
| 277 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = | 277 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = |
| 278 wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 278 WTF::wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
| 279 | 279 |
| 280 cc::TextureMailbox textureMailbox; | 280 cc::TextureMailbox textureMailbox; |
| 281 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; | 281 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; |
| 282 | 282 |
| 283 { | 283 { |
| 284 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( | 284 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( |
| 285 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, | 285 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, |
| 286 Canvas2DLayerBridge::ForceAccelerationForTesting, nullptr, | 286 Canvas2DLayerBridge::ForceAccelerationForTesting, nullptr, |
| 287 kN32_SkColorType))); | 287 kN32_SkColorType))); |
| 288 bridge->PrepareTextureMailbox(&textureMailbox, &releaseCallback); | 288 bridge->PrepareTextureMailbox(&textureMailbox, &releaseCallback); |
| 289 // |bridge| goes out of scope and would normally be destroyed, but | 289 // |bridge| goes out of scope and would normally be destroyed, but |
| 290 // object is kept alive by self references. | 290 // object is kept alive by self references. |
| 291 } | 291 } |
| 292 | 292 |
| 293 // This should cause the bridge to be destroyed. | 293 // This should cause the bridge to be destroyed. |
| 294 bool lostResource = true; | 294 bool lostResource = true; |
| 295 // Before fixing crbug.com/411864, the following line would cause a memory | 295 // Before fixing crbug.com/411864, the following line would cause a memory |
| 296 // use after free that sometimes caused a crash in normal builds and | 296 // use after free that sometimes caused a crash in normal builds and |
| 297 // crashed consistently with ASAN. | 297 // crashed consistently with ASAN. |
| 298 releaseCallback->Run(gpu::SyncToken(), lostResource); | 298 releaseCallback->Run(gpu::SyncToken(), lostResource); |
| 299 } | 299 } |
| 300 } | 300 } |
| 301 | 301 |
| 302 void accelerationHintTest() { | 302 void accelerationHintTest() { |
| 303 { | 303 { |
| 304 FakeGLES2Interface gl; | 304 FakeGLES2Interface gl; |
| 305 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = | 305 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = |
| 306 wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 306 WTF::wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
| 307 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( | 307 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( |
| 308 std::move(contextProvider), IntSize(300, 300), 0, NonOpaque, | 308 std::move(contextProvider), IntSize(300, 300), 0, NonOpaque, |
| 309 Canvas2DLayerBridge::EnableAcceleration, nullptr, kN32_SkColorType))); | 309 Canvas2DLayerBridge::EnableAcceleration, nullptr, kN32_SkColorType))); |
| 310 SkPaint paint; | 310 SkPaint paint; |
| 311 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); | 311 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
| 312 sk_sp<SkImage> image = | 312 sk_sp<SkImage> image = |
| 313 bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnitTests); | 313 bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnitTests); |
| 314 EXPECT_TRUE(bridge->checkSurfaceValid()); | 314 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 315 EXPECT_TRUE(bridge->isAccelerated()); | 315 EXPECT_TRUE(bridge->isAccelerated()); |
| 316 } | 316 } |
| 317 | 317 |
| 318 { | 318 { |
| 319 FakeGLES2Interface gl; | 319 FakeGLES2Interface gl; |
| 320 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = | 320 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = |
| 321 wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 321 WTF::wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
| 322 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( | 322 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( |
| 323 std::move(contextProvider), IntSize(300, 300), 0, NonOpaque, | 323 std::move(contextProvider), IntSize(300, 300), 0, NonOpaque, |
| 324 Canvas2DLayerBridge::EnableAcceleration, nullptr, kN32_SkColorType))); | 324 Canvas2DLayerBridge::EnableAcceleration, nullptr, kN32_SkColorType))); |
| 325 SkPaint paint; | 325 SkPaint paint; |
| 326 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); | 326 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
| 327 sk_sp<SkImage> image = bridge->newImageSnapshot(PreferNoAcceleration, | 327 sk_sp<SkImage> image = bridge->newImageSnapshot(PreferNoAcceleration, |
| 328 SnapshotReasonUnitTests); | 328 SnapshotReasonUnitTests); |
| 329 EXPECT_TRUE(bridge->checkSurfaceValid()); | 329 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 330 EXPECT_FALSE(bridge->isAccelerated()); | 330 EXPECT_FALSE(bridge->isAccelerated()); |
| 331 } | 331 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 void(Canvas2DLayerBridge::HibernationEvent)); | 366 void(Canvas2DLayerBridge::HibernationEvent)); |
| 367 MOCK_METHOD0(didStartHibernating, void()); | 367 MOCK_METHOD0(didStartHibernating, void()); |
| 368 virtual ~MockLogger() {} | 368 virtual ~MockLogger() {} |
| 369 }; | 369 }; |
| 370 | 370 |
| 371 void runCreateBridgeTask(Canvas2DLayerBridgePtr* bridgePtr, | 371 void runCreateBridgeTask(Canvas2DLayerBridgePtr* bridgePtr, |
| 372 gpu::gles2::GLES2Interface* gl, | 372 gpu::gles2::GLES2Interface* gl, |
| 373 Canvas2DLayerBridgeTest* testHost, | 373 Canvas2DLayerBridgeTest* testHost, |
| 374 WaitableEvent* doneEvent) { | 374 WaitableEvent* doneEvent) { |
| 375 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = | 375 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = |
| 376 makeUnique<FakeWebGraphicsContext3DProvider>(gl); | 376 WTF::makeUnique<FakeWebGraphicsContext3DProvider>(gl); |
| 377 *bridgePtr = | 377 *bridgePtr = |
| 378 testHost->makeBridge(std::move(contextProvider), IntSize(300, 300), | 378 testHost->makeBridge(std::move(contextProvider), IntSize(300, 300), |
| 379 Canvas2DLayerBridge::EnableAcceleration); | 379 Canvas2DLayerBridge::EnableAcceleration); |
| 380 // draw+flush to trigger the creation of a GPU surface | 380 // draw+flush to trigger the creation of a GPU surface |
| 381 (*bridgePtr)->didDraw(FloatRect(0, 0, 1, 1)); | 381 (*bridgePtr)->didDraw(FloatRect(0, 0, 1, 1)); |
| 382 (*bridgePtr)->finalizeFrame(FloatRect(0, 0, 1, 1)); | 382 (*bridgePtr)->finalizeFrame(FloatRect(0, 0, 1, 1)); |
| 383 (*bridgePtr)->flush(); | 383 (*bridgePtr)->flush(); |
| 384 doneEvent->signal(); | 384 doneEvent->signal(); |
| 385 } | 385 } |
| 386 | 386 |
| 387 void postAndWaitCreateBridgeTask(const WebTraceLocation& location, | 387 void postAndWaitCreateBridgeTask(const WebTraceLocation& location, |
| 388 WebThread* testThread, | 388 WebThread* testThread, |
| 389 Canvas2DLayerBridgePtr* bridgePtr, | 389 Canvas2DLayerBridgePtr* bridgePtr, |
| 390 gpu::gles2::GLES2Interface* gl, | 390 gpu::gles2::GLES2Interface* gl, |
| 391 Canvas2DLayerBridgeTest* testHost) { | 391 Canvas2DLayerBridgeTest* testHost) { |
| 392 std::unique_ptr<WaitableEvent> bridgeCreatedEvent = | 392 std::unique_ptr<WaitableEvent> bridgeCreatedEvent = |
| 393 makeUnique<WaitableEvent>(); | 393 WTF::makeUnique<WaitableEvent>(); |
| 394 testThread->getWebTaskRunner()->postTask( | 394 testThread->getWebTaskRunner()->postTask( |
| 395 location, crossThreadBind( | 395 location, crossThreadBind( |
| 396 &runCreateBridgeTask, crossThreadUnretained(bridgePtr), | 396 &runCreateBridgeTask, crossThreadUnretained(bridgePtr), |
| 397 crossThreadUnretained(gl), crossThreadUnretained(testHost), | 397 crossThreadUnretained(gl), crossThreadUnretained(testHost), |
| 398 crossThreadUnretained(bridgeCreatedEvent.get()))); | 398 crossThreadUnretained(bridgeCreatedEvent.get()))); |
| 399 bridgeCreatedEvent->wait(); | 399 bridgeCreatedEvent->wait(); |
| 400 } | 400 } |
| 401 | 401 |
| 402 void runDestroyBridgeTask(Canvas2DLayerBridgePtr* bridgePtr, | 402 void runDestroyBridgeTask(Canvas2DLayerBridgePtr* bridgePtr, |
| 403 WaitableEvent* doneEvent) { | 403 WaitableEvent* doneEvent) { |
| 404 bridgePtr->clear(); | 404 bridgePtr->clear(); |
| 405 if (doneEvent) | 405 if (doneEvent) |
| 406 doneEvent->signal(); | 406 doneEvent->signal(); |
| 407 } | 407 } |
| 408 | 408 |
| 409 void postDestroyBridgeTask(const WebTraceLocation& location, | 409 void postDestroyBridgeTask(const WebTraceLocation& location, |
| 410 WebThread* testThread, | 410 WebThread* testThread, |
| 411 Canvas2DLayerBridgePtr* bridgePtr) { | 411 Canvas2DLayerBridgePtr* bridgePtr) { |
| 412 testThread->getWebTaskRunner()->postTask( | 412 testThread->getWebTaskRunner()->postTask( |
| 413 location, crossThreadBind(&runDestroyBridgeTask, | 413 location, crossThreadBind(&runDestroyBridgeTask, |
| 414 crossThreadUnretained(bridgePtr), nullptr)); | 414 crossThreadUnretained(bridgePtr), nullptr)); |
| 415 } | 415 } |
| 416 | 416 |
| 417 void postAndWaitDestroyBridgeTask(const WebTraceLocation& location, | 417 void postAndWaitDestroyBridgeTask(const WebTraceLocation& location, |
| 418 WebThread* testThread, | 418 WebThread* testThread, |
| 419 Canvas2DLayerBridgePtr* bridgePtr) { | 419 Canvas2DLayerBridgePtr* bridgePtr) { |
| 420 std::unique_ptr<WaitableEvent> bridgeDestroyedEvent = | 420 std::unique_ptr<WaitableEvent> bridgeDestroyedEvent = |
| 421 makeUnique<WaitableEvent>(); | 421 WTF::makeUnique<WaitableEvent>(); |
| 422 testThread->getWebTaskRunner()->postTask( | 422 testThread->getWebTaskRunner()->postTask( |
| 423 location, | 423 location, |
| 424 crossThreadBind(&runDestroyBridgeTask, crossThreadUnretained(bridgePtr), | 424 crossThreadBind(&runDestroyBridgeTask, crossThreadUnretained(bridgePtr), |
| 425 crossThreadUnretained(bridgeDestroyedEvent.get()))); | 425 crossThreadUnretained(bridgeDestroyedEvent.get()))); |
| 426 bridgeDestroyedEvent->wait(); | 426 bridgeDestroyedEvent->wait(); |
| 427 } | 427 } |
| 428 | 428 |
| 429 void runSetIsHiddenTask(Canvas2DLayerBridge* bridge, | 429 void runSetIsHiddenTask(Canvas2DLayerBridge* bridge, |
| 430 bool value, | 430 bool value, |
| 431 WaitableEvent* doneEvent) { | 431 WaitableEvent* doneEvent) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 442 testThread->getWebTaskRunner()->postTask( | 442 testThread->getWebTaskRunner()->postTask( |
| 443 location, | 443 location, |
| 444 crossThreadBind(&runSetIsHiddenTask, crossThreadUnretained(bridge), value, | 444 crossThreadBind(&runSetIsHiddenTask, crossThreadUnretained(bridge), value, |
| 445 crossThreadUnretained(doneEvent))); | 445 crossThreadUnretained(doneEvent))); |
| 446 } | 446 } |
| 447 | 447 |
| 448 void postAndWaitSetIsHiddenTask(const WebTraceLocation& location, | 448 void postAndWaitSetIsHiddenTask(const WebTraceLocation& location, |
| 449 WebThread* testThread, | 449 WebThread* testThread, |
| 450 Canvas2DLayerBridge* bridge, | 450 Canvas2DLayerBridge* bridge, |
| 451 bool value) { | 451 bool value) { |
| 452 std::unique_ptr<WaitableEvent> doneEvent = makeUnique<WaitableEvent>(); | 452 std::unique_ptr<WaitableEvent> doneEvent = WTF::makeUnique<WaitableEvent>(); |
| 453 postSetIsHiddenTask(location, testThread, bridge, value, doneEvent.get()); | 453 postSetIsHiddenTask(location, testThread, bridge, value, doneEvent.get()); |
| 454 doneEvent->wait(); | 454 doneEvent->wait(); |
| 455 } | 455 } |
| 456 | 456 |
| 457 class MockImageBuffer : public ImageBuffer { | 457 class MockImageBuffer : public ImageBuffer { |
| 458 public: | 458 public: |
| 459 MockImageBuffer() | 459 MockImageBuffer() |
| 460 : ImageBuffer( | 460 : ImageBuffer(WTF::wrapUnique( |
| 461 wrapUnique(new UnacceleratedImageBufferSurface(IntSize(1, 1)))) {} | 461 new UnacceleratedImageBufferSurface(IntSize(1, 1)))) {} |
| 462 | 462 |
| 463 MOCK_CONST_METHOD1(resetCanvas, void(SkCanvas*)); | 463 MOCK_CONST_METHOD1(resetCanvas, void(SkCanvas*)); |
| 464 | 464 |
| 465 virtual ~MockImageBuffer() {} | 465 virtual ~MockImageBuffer() {} |
| 466 }; | 466 }; |
| 467 | 467 |
| 468 #if CANVAS2D_HIBERNATION_ENABLED | 468 #if CANVAS2D_HIBERNATION_ENABLED |
| 469 TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycle) | 469 TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycle) |
| 470 #else | 470 #else |
| 471 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationLifeCycle) | 471 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationLifeCycle) |
| 472 #endif | 472 #endif |
| 473 { | 473 { |
| 474 FakeGLES2Interface gl; | 474 FakeGLES2Interface gl; |
| 475 std::unique_ptr<WebThread> testThread = | 475 std::unique_ptr<WebThread> testThread = |
| 476 wrapUnique(Platform::current()->createThread("TestThread")); | 476 WTF::wrapUnique(Platform::current()->createThread("TestThread")); |
| 477 | 477 |
| 478 // The Canvas2DLayerBridge has to be created on the thread that will use it | 478 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 479 // to avoid WeakPtr thread check issues. | 479 // to avoid WeakPtr thread check issues. |
| 480 Canvas2DLayerBridgePtr bridge; | 480 Canvas2DLayerBridgePtr bridge; |
| 481 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, | 481 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, |
| 482 this); | 482 this); |
| 483 | 483 |
| 484 // Register an alternate Logger for tracking hibernation events | 484 // Register an alternate Logger for tracking hibernation events |
| 485 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 485 std::unique_ptr<MockLogger> mockLogger = WTF::wrapUnique(new MockLogger); |
| 486 MockLogger* mockLoggerPtr = mockLogger.get(); | 486 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 487 bridge->setLoggerForTesting(std::move(mockLogger)); | 487 bridge->setLoggerForTesting(std::move(mockLogger)); |
| 488 | 488 |
| 489 // Test entering hibernation | 489 // Test entering hibernation |
| 490 std::unique_ptr<WaitableEvent> hibernationStartedEvent = | 490 std::unique_ptr<WaitableEvent> hibernationStartedEvent = |
| 491 makeUnique<WaitableEvent>(); | 491 WTF::makeUnique<WaitableEvent>(); |
| 492 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( | 492 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( |
| 493 Canvas2DLayerBridge::HibernationScheduled)); | 493 Canvas2DLayerBridge::HibernationScheduled)); |
| 494 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 494 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
| 495 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), | 495 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), |
| 496 &WaitableEvent::signal)); | 496 &WaitableEvent::signal)); |
| 497 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 497 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 498 hibernationStartedEvent->wait(); | 498 hibernationStartedEvent->wait(); |
| 499 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 499 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 500 EXPECT_FALSE(bridge->isAccelerated()); | 500 EXPECT_FALSE(bridge->isAccelerated()); |
| 501 EXPECT_TRUE(bridge->isHibernating()); | 501 EXPECT_TRUE(bridge->isHibernating()); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 518 } | 518 } |
| 519 | 519 |
| 520 #if CANVAS2D_HIBERNATION_ENABLED | 520 #if CANVAS2D_HIBERNATION_ENABLED |
| 521 TEST_F(Canvas2DLayerBridgeTest, HibernationReEntry) | 521 TEST_F(Canvas2DLayerBridgeTest, HibernationReEntry) |
| 522 #else | 522 #else |
| 523 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationReEntry) | 523 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationReEntry) |
| 524 #endif | 524 #endif |
| 525 { | 525 { |
| 526 FakeGLES2Interface gl; | 526 FakeGLES2Interface gl; |
| 527 std::unique_ptr<WebThread> testThread = | 527 std::unique_ptr<WebThread> testThread = |
| 528 wrapUnique(Platform::current()->createThread("TestThread")); | 528 WTF::wrapUnique(Platform::current()->createThread("TestThread")); |
| 529 | 529 |
| 530 // The Canvas2DLayerBridge has to be created on the thread that will use it | 530 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 531 // to avoid WeakPtr thread check issues. | 531 // to avoid WeakPtr thread check issues. |
| 532 Canvas2DLayerBridgePtr bridge; | 532 Canvas2DLayerBridgePtr bridge; |
| 533 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, | 533 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, |
| 534 this); | 534 this); |
| 535 | 535 |
| 536 // Register an alternate Logger for tracking hibernation events | 536 // Register an alternate Logger for tracking hibernation events |
| 537 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 537 std::unique_ptr<MockLogger> mockLogger = WTF::wrapUnique(new MockLogger); |
| 538 MockLogger* mockLoggerPtr = mockLogger.get(); | 538 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 539 bridge->setLoggerForTesting(std::move(mockLogger)); | 539 bridge->setLoggerForTesting(std::move(mockLogger)); |
| 540 | 540 |
| 541 // Test entering hibernation | 541 // Test entering hibernation |
| 542 std::unique_ptr<WaitableEvent> hibernationStartedEvent = | 542 std::unique_ptr<WaitableEvent> hibernationStartedEvent = |
| 543 makeUnique<WaitableEvent>(); | 543 WTF::makeUnique<WaitableEvent>(); |
| 544 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( | 544 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( |
| 545 Canvas2DLayerBridge::HibernationScheduled)); | 545 Canvas2DLayerBridge::HibernationScheduled)); |
| 546 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 546 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
| 547 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), | 547 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), |
| 548 &WaitableEvent::signal)); | 548 &WaitableEvent::signal)); |
| 549 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 549 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 550 // Toggle visibility before the task that enters hibernation gets a | 550 // Toggle visibility before the task that enters hibernation gets a |
| 551 // chance to run. | 551 // chance to run. |
| 552 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), false); | 552 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), false); |
| 553 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 553 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 577 #if CANVAS2D_HIBERNATION_ENABLED | 577 #if CANVAS2D_HIBERNATION_ENABLED |
| 578 TEST_F(Canvas2DLayerBridgeTest, | 578 TEST_F(Canvas2DLayerBridgeTest, |
| 579 HibernationLifeCycleWithDeferredRenderingDisabled) | 579 HibernationLifeCycleWithDeferredRenderingDisabled) |
| 580 #else | 580 #else |
| 581 TEST_F(Canvas2DLayerBridgeTest, | 581 TEST_F(Canvas2DLayerBridgeTest, |
| 582 DISABLED_HibernationLifeCycleWithDeferredRenderingDisabled) | 582 DISABLED_HibernationLifeCycleWithDeferredRenderingDisabled) |
| 583 #endif | 583 #endif |
| 584 { | 584 { |
| 585 FakeGLES2Interface gl; | 585 FakeGLES2Interface gl; |
| 586 std::unique_ptr<WebThread> testThread = | 586 std::unique_ptr<WebThread> testThread = |
| 587 wrapUnique(Platform::current()->createThread("TestThread")); | 587 WTF::wrapUnique(Platform::current()->createThread("TestThread")); |
| 588 | 588 |
| 589 // The Canvas2DLayerBridge has to be created on the thread that will use it | 589 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 590 // to avoid WeakPtr thread check issues. | 590 // to avoid WeakPtr thread check issues. |
| 591 Canvas2DLayerBridgePtr bridge; | 591 Canvas2DLayerBridgePtr bridge; |
| 592 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, | 592 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, |
| 593 this); | 593 this); |
| 594 bridge->disableDeferral(DisableDeferralReasonUnknown); | 594 bridge->disableDeferral(DisableDeferralReasonUnknown); |
| 595 MockImageBuffer mockImageBuffer; | 595 MockImageBuffer mockImageBuffer; |
| 596 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); | 596 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); |
| 597 bridge->setImageBuffer(&mockImageBuffer); | 597 bridge->setImageBuffer(&mockImageBuffer); |
| 598 | 598 |
| 599 // Register an alternate Logger for tracking hibernation events | 599 // Register an alternate Logger for tracking hibernation events |
| 600 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 600 std::unique_ptr<MockLogger> mockLogger = WTF::wrapUnique(new MockLogger); |
| 601 MockLogger* mockLoggerPtr = mockLogger.get(); | 601 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 602 bridge->setLoggerForTesting(std::move(mockLogger)); | 602 bridge->setLoggerForTesting(std::move(mockLogger)); |
| 603 | 603 |
| 604 // Test entering hibernation | 604 // Test entering hibernation |
| 605 std::unique_ptr<WaitableEvent> hibernationStartedEvent = | 605 std::unique_ptr<WaitableEvent> hibernationStartedEvent = |
| 606 makeUnique<WaitableEvent>(); | 606 WTF::makeUnique<WaitableEvent>(); |
| 607 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( | 607 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( |
| 608 Canvas2DLayerBridge::HibernationScheduled)); | 608 Canvas2DLayerBridge::HibernationScheduled)); |
| 609 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 609 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
| 610 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), | 610 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), |
| 611 &WaitableEvent::signal)); | 611 &WaitableEvent::signal)); |
| 612 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 612 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 613 hibernationStartedEvent->wait(); | 613 hibernationStartedEvent->wait(); |
| 614 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 614 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 615 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); | 615 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); |
| 616 EXPECT_FALSE(bridge->isAccelerated()); | 616 EXPECT_FALSE(bridge->isAccelerated()); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 639 void runRenderingTask(Canvas2DLayerBridge* bridge, WaitableEvent* doneEvent) { | 639 void runRenderingTask(Canvas2DLayerBridge* bridge, WaitableEvent* doneEvent) { |
| 640 bridge->didDraw(FloatRect(0, 0, 1, 1)); | 640 bridge->didDraw(FloatRect(0, 0, 1, 1)); |
| 641 bridge->finalizeFrame(FloatRect(0, 0, 1, 1)); | 641 bridge->finalizeFrame(FloatRect(0, 0, 1, 1)); |
| 642 bridge->flush(); | 642 bridge->flush(); |
| 643 doneEvent->signal(); | 643 doneEvent->signal(); |
| 644 } | 644 } |
| 645 | 645 |
| 646 void postAndWaitRenderingTask(const WebTraceLocation& location, | 646 void postAndWaitRenderingTask(const WebTraceLocation& location, |
| 647 WebThread* testThread, | 647 WebThread* testThread, |
| 648 Canvas2DLayerBridge* bridge) { | 648 Canvas2DLayerBridge* bridge) { |
| 649 std::unique_ptr<WaitableEvent> doneEvent = makeUnique<WaitableEvent>(); | 649 std::unique_ptr<WaitableEvent> doneEvent = WTF::makeUnique<WaitableEvent>(); |
| 650 testThread->getWebTaskRunner()->postTask( | 650 testThread->getWebTaskRunner()->postTask( |
| 651 location, | 651 location, |
| 652 crossThreadBind(&runRenderingTask, crossThreadUnretained(bridge), | 652 crossThreadBind(&runRenderingTask, crossThreadUnretained(bridge), |
| 653 crossThreadUnretained(doneEvent.get()))); | 653 crossThreadUnretained(doneEvent.get()))); |
| 654 doneEvent->wait(); | 654 doneEvent->wait(); |
| 655 } | 655 } |
| 656 | 656 |
| 657 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU | 657 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU |
| 658 TEST_F(Canvas2DLayerBridgeTest, BackgroundRenderingWhileHibernating) | 658 TEST_F(Canvas2DLayerBridgeTest, BackgroundRenderingWhileHibernating) |
| 659 #else | 659 #else |
| 660 TEST_F(Canvas2DLayerBridgeTest, DISABLED_BackgroundRenderingWhileHibernating) | 660 TEST_F(Canvas2DLayerBridgeTest, DISABLED_BackgroundRenderingWhileHibernating) |
| 661 #endif | 661 #endif |
| 662 { | 662 { |
| 663 FakeGLES2Interface gl; | 663 FakeGLES2Interface gl; |
| 664 std::unique_ptr<WebThread> testThread = | 664 std::unique_ptr<WebThread> testThread = |
| 665 wrapUnique(Platform::current()->createThread("TestThread")); | 665 WTF::wrapUnique(Platform::current()->createThread("TestThread")); |
| 666 | 666 |
| 667 // The Canvas2DLayerBridge has to be created on the thread that will use it | 667 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 668 // to avoid WeakPtr thread check issues. | 668 // to avoid WeakPtr thread check issues. |
| 669 Canvas2DLayerBridgePtr bridge; | 669 Canvas2DLayerBridgePtr bridge; |
| 670 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, | 670 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, |
| 671 this); | 671 this); |
| 672 | 672 |
| 673 // Register an alternate Logger for tracking hibernation events | 673 // Register an alternate Logger for tracking hibernation events |
| 674 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 674 std::unique_ptr<MockLogger> mockLogger = WTF::wrapUnique(new MockLogger); |
| 675 MockLogger* mockLoggerPtr = mockLogger.get(); | 675 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 676 bridge->setLoggerForTesting(std::move(mockLogger)); | 676 bridge->setLoggerForTesting(std::move(mockLogger)); |
| 677 | 677 |
| 678 // Test entering hibernation | 678 // Test entering hibernation |
| 679 std::unique_ptr<WaitableEvent> hibernationStartedEvent = | 679 std::unique_ptr<WaitableEvent> hibernationStartedEvent = |
| 680 makeUnique<WaitableEvent>(); | 680 WTF::makeUnique<WaitableEvent>(); |
| 681 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( | 681 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( |
| 682 Canvas2DLayerBridge::HibernationScheduled)); | 682 Canvas2DLayerBridge::HibernationScheduled)); |
| 683 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 683 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
| 684 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), | 684 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), |
| 685 &WaitableEvent::signal)); | 685 &WaitableEvent::signal)); |
| 686 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 686 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 687 hibernationStartedEvent->wait(); | 687 hibernationStartedEvent->wait(); |
| 688 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 688 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 689 EXPECT_FALSE(bridge->isAccelerated()); | 689 EXPECT_FALSE(bridge->isAccelerated()); |
| 690 EXPECT_TRUE(bridge->isHibernating()); | 690 EXPECT_TRUE(bridge->isHibernating()); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 719 TEST_F(Canvas2DLayerBridgeTest, | 719 TEST_F(Canvas2DLayerBridgeTest, |
| 720 BackgroundRenderingWhileHibernatingWithDeferredRenderingDisabled) | 720 BackgroundRenderingWhileHibernatingWithDeferredRenderingDisabled) |
| 721 #else | 721 #else |
| 722 TEST_F( | 722 TEST_F( |
| 723 Canvas2DLayerBridgeTest, | 723 Canvas2DLayerBridgeTest, |
| 724 DISABLED_BackgroundRenderingWhileHibernatingWithDeferredRenderingDisabled) | 724 DISABLED_BackgroundRenderingWhileHibernatingWithDeferredRenderingDisabled) |
| 725 #endif | 725 #endif |
| 726 { | 726 { |
| 727 FakeGLES2Interface gl; | 727 FakeGLES2Interface gl; |
| 728 std::unique_ptr<WebThread> testThread = | 728 std::unique_ptr<WebThread> testThread = |
| 729 wrapUnique(Platform::current()->createThread("TestThread")); | 729 WTF::wrapUnique(Platform::current()->createThread("TestThread")); |
| 730 | 730 |
| 731 // The Canvas2DLayerBridge has to be created on the thread that will use it | 731 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 732 // to avoid WeakPtr thread check issues. | 732 // to avoid WeakPtr thread check issues. |
| 733 Canvas2DLayerBridgePtr bridge; | 733 Canvas2DLayerBridgePtr bridge; |
| 734 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, | 734 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, |
| 735 this); | 735 this); |
| 736 MockImageBuffer mockImageBuffer; | 736 MockImageBuffer mockImageBuffer; |
| 737 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); | 737 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); |
| 738 bridge->setImageBuffer(&mockImageBuffer); | 738 bridge->setImageBuffer(&mockImageBuffer); |
| 739 bridge->disableDeferral(DisableDeferralReasonUnknown); | 739 bridge->disableDeferral(DisableDeferralReasonUnknown); |
| 740 | 740 |
| 741 // Register an alternate Logger for tracking hibernation events | 741 // Register an alternate Logger for tracking hibernation events |
| 742 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 742 std::unique_ptr<MockLogger> mockLogger = WTF::wrapUnique(new MockLogger); |
| 743 MockLogger* mockLoggerPtr = mockLogger.get(); | 743 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 744 bridge->setLoggerForTesting(std::move(mockLogger)); | 744 bridge->setLoggerForTesting(std::move(mockLogger)); |
| 745 | 745 |
| 746 // Test entering hibernation | 746 // Test entering hibernation |
| 747 std::unique_ptr<WaitableEvent> hibernationStartedEvent = | 747 std::unique_ptr<WaitableEvent> hibernationStartedEvent = |
| 748 makeUnique<WaitableEvent>(); | 748 WTF::makeUnique<WaitableEvent>(); |
| 749 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( | 749 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( |
| 750 Canvas2DLayerBridge::HibernationScheduled)); | 750 Canvas2DLayerBridge::HibernationScheduled)); |
| 751 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 751 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
| 752 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), | 752 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), |
| 753 &WaitableEvent::signal)); | 753 &WaitableEvent::signal)); |
| 754 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 754 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 755 hibernationStartedEvent->wait(); | 755 hibernationStartedEvent->wait(); |
| 756 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 756 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 757 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); | 757 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); |
| 758 EXPECT_FALSE(bridge->isAccelerated()); | 758 EXPECT_FALSE(bridge->isAccelerated()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 791 | 791 |
| 792 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU | 792 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU |
| 793 TEST_F(Canvas2DLayerBridgeTest, DisableDeferredRenderingWhileHibernating) | 793 TEST_F(Canvas2DLayerBridgeTest, DisableDeferredRenderingWhileHibernating) |
| 794 #else | 794 #else |
| 795 TEST_F(Canvas2DLayerBridgeTest, | 795 TEST_F(Canvas2DLayerBridgeTest, |
| 796 DISABLED_DisableDeferredRenderingWhileHibernating) | 796 DISABLED_DisableDeferredRenderingWhileHibernating) |
| 797 #endif | 797 #endif |
| 798 { | 798 { |
| 799 FakeGLES2Interface gl; | 799 FakeGLES2Interface gl; |
| 800 std::unique_ptr<WebThread> testThread = | 800 std::unique_ptr<WebThread> testThread = |
| 801 wrapUnique(Platform::current()->createThread("TestThread")); | 801 WTF::wrapUnique(Platform::current()->createThread("TestThread")); |
| 802 | 802 |
| 803 // The Canvas2DLayerBridge has to be created on the thread that will use it | 803 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 804 // to avoid WeakPtr thread check issues. | 804 // to avoid WeakPtr thread check issues. |
| 805 Canvas2DLayerBridgePtr bridge; | 805 Canvas2DLayerBridgePtr bridge; |
| 806 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, | 806 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, |
| 807 this); | 807 this); |
| 808 MockImageBuffer mockImageBuffer; | 808 MockImageBuffer mockImageBuffer; |
| 809 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); | 809 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); |
| 810 bridge->setImageBuffer(&mockImageBuffer); | 810 bridge->setImageBuffer(&mockImageBuffer); |
| 811 | 811 |
| 812 // Register an alternate Logger for tracking hibernation events | 812 // Register an alternate Logger for tracking hibernation events |
| 813 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 813 std::unique_ptr<MockLogger> mockLogger = WTF::wrapUnique(new MockLogger); |
| 814 MockLogger* mockLoggerPtr = mockLogger.get(); | 814 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 815 bridge->setLoggerForTesting(std::move(mockLogger)); | 815 bridge->setLoggerForTesting(std::move(mockLogger)); |
| 816 | 816 |
| 817 // Test entering hibernation | 817 // Test entering hibernation |
| 818 std::unique_ptr<WaitableEvent> hibernationStartedEvent = | 818 std::unique_ptr<WaitableEvent> hibernationStartedEvent = |
| 819 makeUnique<WaitableEvent>(); | 819 WTF::makeUnique<WaitableEvent>(); |
| 820 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( | 820 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( |
| 821 Canvas2DLayerBridge::HibernationScheduled)); | 821 Canvas2DLayerBridge::HibernationScheduled)); |
| 822 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 822 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
| 823 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), | 823 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), |
| 824 &WaitableEvent::signal)); | 824 &WaitableEvent::signal)); |
| 825 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 825 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 826 hibernationStartedEvent->wait(); | 826 hibernationStartedEvent->wait(); |
| 827 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 827 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 828 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); | 828 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); |
| 829 EXPECT_FALSE(bridge->isAccelerated()); | 829 EXPECT_FALSE(bridge->isAccelerated()); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 861 } | 861 } |
| 862 | 862 |
| 863 #if CANVAS2D_HIBERNATION_ENABLED | 863 #if CANVAS2D_HIBERNATION_ENABLED |
| 864 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernating) | 864 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernating) |
| 865 #else | 865 #else |
| 866 TEST_F(Canvas2DLayerBridgeTest, DISABLED_TeardownWhileHibernating) | 866 TEST_F(Canvas2DLayerBridgeTest, DISABLED_TeardownWhileHibernating) |
| 867 #endif | 867 #endif |
| 868 { | 868 { |
| 869 FakeGLES2Interface gl; | 869 FakeGLES2Interface gl; |
| 870 std::unique_ptr<WebThread> testThread = | 870 std::unique_ptr<WebThread> testThread = |
| 871 wrapUnique(Platform::current()->createThread("TestThread")); | 871 WTF::wrapUnique(Platform::current()->createThread("TestThread")); |
| 872 | 872 |
| 873 // The Canvas2DLayerBridge has to be created on the thread that will use it | 873 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 874 // to avoid WeakPtr thread check issues. | 874 // to avoid WeakPtr thread check issues. |
| 875 Canvas2DLayerBridgePtr bridge; | 875 Canvas2DLayerBridgePtr bridge; |
| 876 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, | 876 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, |
| 877 this); | 877 this); |
| 878 | 878 |
| 879 // Register an alternate Logger for tracking hibernation events | 879 // Register an alternate Logger for tracking hibernation events |
| 880 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 880 std::unique_ptr<MockLogger> mockLogger = WTF::wrapUnique(new MockLogger); |
| 881 MockLogger* mockLoggerPtr = mockLogger.get(); | 881 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 882 bridge->setLoggerForTesting(std::move(mockLogger)); | 882 bridge->setLoggerForTesting(std::move(mockLogger)); |
| 883 | 883 |
| 884 // Test entering hibernation | 884 // Test entering hibernation |
| 885 std::unique_ptr<WaitableEvent> hibernationStartedEvent = | 885 std::unique_ptr<WaitableEvent> hibernationStartedEvent = |
| 886 makeUnique<WaitableEvent>(); | 886 WTF::makeUnique<WaitableEvent>(); |
| 887 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( | 887 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( |
| 888 Canvas2DLayerBridge::HibernationScheduled)); | 888 Canvas2DLayerBridge::HibernationScheduled)); |
| 889 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 889 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
| 890 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), | 890 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), |
| 891 &WaitableEvent::signal)); | 891 &WaitableEvent::signal)); |
| 892 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 892 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 893 hibernationStartedEvent->wait(); | 893 hibernationStartedEvent->wait(); |
| 894 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 894 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 895 EXPECT_FALSE(bridge->isAccelerated()); | 895 EXPECT_FALSE(bridge->isAccelerated()); |
| 896 EXPECT_TRUE(bridge->isHibernating()); | 896 EXPECT_TRUE(bridge->isHibernating()); |
| 897 EXPECT_TRUE(bridge->checkSurfaceValid()); | 897 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 898 | 898 |
| 899 // Tear down the bridge while hibernating | 899 // Tear down the bridge while hibernating |
| 900 EXPECT_CALL(*mockLoggerPtr, | 900 EXPECT_CALL(*mockLoggerPtr, |
| 901 reportHibernationEvent( | 901 reportHibernationEvent( |
| 902 Canvas2DLayerBridge::HibernationEndedWithTeardown)); | 902 Canvas2DLayerBridge::HibernationEndedWithTeardown)); |
| 903 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 903 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 904 } | 904 } |
| 905 | 905 |
| 906 #if CANVAS2D_HIBERNATION_ENABLED | 906 #if CANVAS2D_HIBERNATION_ENABLED |
| 907 TEST_F(Canvas2DLayerBridgeTest, SnapshotWhileHibernating) | 907 TEST_F(Canvas2DLayerBridgeTest, SnapshotWhileHibernating) |
| 908 #else | 908 #else |
| 909 TEST_F(Canvas2DLayerBridgeTest, DISABLED_SnapshotWhileHibernating) | 909 TEST_F(Canvas2DLayerBridgeTest, DISABLED_SnapshotWhileHibernating) |
| 910 #endif | 910 #endif |
| 911 { | 911 { |
| 912 FakeGLES2Interface gl; | 912 FakeGLES2Interface gl; |
| 913 std::unique_ptr<WebThread> testThread = | 913 std::unique_ptr<WebThread> testThread = |
| 914 wrapUnique(Platform::current()->createThread("TestThread")); | 914 WTF::wrapUnique(Platform::current()->createThread("TestThread")); |
| 915 | 915 |
| 916 // The Canvas2DLayerBridge has to be created on the thread that will use it | 916 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 917 // to avoid WeakPtr thread check issues. | 917 // to avoid WeakPtr thread check issues. |
| 918 Canvas2DLayerBridgePtr bridge; | 918 Canvas2DLayerBridgePtr bridge; |
| 919 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, | 919 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, |
| 920 this); | 920 this); |
| 921 | 921 |
| 922 // Register an alternate Logger for tracking hibernation events | 922 // Register an alternate Logger for tracking hibernation events |
| 923 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 923 std::unique_ptr<MockLogger> mockLogger = WTF::wrapUnique(new MockLogger); |
| 924 MockLogger* mockLoggerPtr = mockLogger.get(); | 924 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 925 bridge->setLoggerForTesting(std::move(mockLogger)); | 925 bridge->setLoggerForTesting(std::move(mockLogger)); |
| 926 | 926 |
| 927 // Test entering hibernation | 927 // Test entering hibernation |
| 928 std::unique_ptr<WaitableEvent> hibernationStartedEvent = | 928 std::unique_ptr<WaitableEvent> hibernationStartedEvent = |
| 929 makeUnique<WaitableEvent>(); | 929 WTF::makeUnique<WaitableEvent>(); |
| 930 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( | 930 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( |
| 931 Canvas2DLayerBridge::HibernationScheduled)); | 931 Canvas2DLayerBridge::HibernationScheduled)); |
| 932 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 932 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
| 933 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), | 933 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), |
| 934 &WaitableEvent::signal)); | 934 &WaitableEvent::signal)); |
| 935 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 935 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 936 hibernationStartedEvent->wait(); | 936 hibernationStartedEvent->wait(); |
| 937 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 937 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 938 EXPECT_FALSE(bridge->isAccelerated()); | 938 EXPECT_FALSE(bridge->isAccelerated()); |
| 939 EXPECT_TRUE(bridge->isHibernating()); | 939 EXPECT_TRUE(bridge->isHibernating()); |
| 940 EXPECT_TRUE(bridge->checkSurfaceValid()); | 940 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 941 | 941 |
| 942 // Take a snapshot and verify that it is not accelerated due to hibernation | 942 // Take a snapshot and verify that it is not accelerated due to hibernation |
| 943 sk_sp<SkImage> image = | 943 sk_sp<SkImage> image = |
| 944 bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnitTests); | 944 bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnitTests); |
| 945 EXPECT_FALSE(image->isTextureBacked()); | 945 EXPECT_FALSE(image->isTextureBacked()); |
| 946 image.reset(); | 946 image.reset(); |
| 947 | 947 |
| 948 // Verify that taking a snapshot did not affect the state of bridge | 948 // Verify that taking a snapshot did not affect the state of bridge |
| 949 EXPECT_FALSE(bridge->isAccelerated()); | 949 EXPECT_FALSE(bridge->isAccelerated()); |
| 950 EXPECT_TRUE(bridge->isHibernating()); | 950 EXPECT_TRUE(bridge->isHibernating()); |
| 951 EXPECT_TRUE(bridge->checkSurfaceValid()); | 951 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 952 | 952 |
| 953 // End hibernation normally | 953 // End hibernation normally |
| 954 std::unique_ptr<WaitableEvent> hibernationEndedEvent = | 954 std::unique_ptr<WaitableEvent> hibernationEndedEvent = |
| 955 makeUnique<WaitableEvent>(); | 955 WTF::makeUnique<WaitableEvent>(); |
| 956 EXPECT_CALL( | 956 EXPECT_CALL( |
| 957 *mockLoggerPtr, | 957 *mockLoggerPtr, |
| 958 reportHibernationEvent(Canvas2DLayerBridge::HibernationEndedNormally)) | 958 reportHibernationEvent(Canvas2DLayerBridge::HibernationEndedNormally)) |
| 959 .WillOnce(testing::InvokeWithoutArgs(hibernationEndedEvent.get(), | 959 .WillOnce(testing::InvokeWithoutArgs(hibernationEndedEvent.get(), |
| 960 &WaitableEvent::signal)); | 960 &WaitableEvent::signal)); |
| 961 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), false); | 961 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), false); |
| 962 hibernationEndedEvent->wait(); | 962 hibernationEndedEvent->wait(); |
| 963 | 963 |
| 964 // Tear down the bridge while hibernating | 964 // Tear down the bridge while hibernating |
| 965 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 965 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 966 } | 966 } |
| 967 | 967 |
| 968 #if CANVAS2D_HIBERNATION_ENABLED | 968 #if CANVAS2D_HIBERNATION_ENABLED |
| 969 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernationIsPending) | 969 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernationIsPending) |
| 970 #else | 970 #else |
| 971 TEST_F(Canvas2DLayerBridgeTest, DISABLED_TeardownWhileHibernationIsPending) | 971 TEST_F(Canvas2DLayerBridgeTest, DISABLED_TeardownWhileHibernationIsPending) |
| 972 #endif | 972 #endif |
| 973 { | 973 { |
| 974 FakeGLES2Interface gl; | 974 FakeGLES2Interface gl; |
| 975 std::unique_ptr<WebThread> testThread = | 975 std::unique_ptr<WebThread> testThread = |
| 976 wrapUnique(Platform::current()->createThread("TestThread")); | 976 WTF::wrapUnique(Platform::current()->createThread("TestThread")); |
| 977 | 977 |
| 978 // The Canvas2DLayerBridge has to be created on the thread that will use it | 978 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 979 // to avoid WeakPtr thread check issues. | 979 // to avoid WeakPtr thread check issues. |
| 980 Canvas2DLayerBridgePtr bridge; | 980 Canvas2DLayerBridgePtr bridge; |
| 981 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, | 981 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, |
| 982 this); | 982 this); |
| 983 | 983 |
| 984 // Register an alternate Logger for tracking hibernation events | 984 // Register an alternate Logger for tracking hibernation events |
| 985 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 985 std::unique_ptr<MockLogger> mockLogger = WTF::wrapUnique(new MockLogger); |
| 986 MockLogger* mockLoggerPtr = mockLogger.get(); | 986 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 987 bridge->setLoggerForTesting(std::move(mockLogger)); | 987 bridge->setLoggerForTesting(std::move(mockLogger)); |
| 988 | 988 |
| 989 // Test entering hibernation | 989 // Test entering hibernation |
| 990 std::unique_ptr<WaitableEvent> hibernationScheduledEvent = | 990 std::unique_ptr<WaitableEvent> hibernationScheduledEvent = |
| 991 makeUnique<WaitableEvent>(); | 991 WTF::makeUnique<WaitableEvent>(); |
| 992 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( | 992 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( |
| 993 Canvas2DLayerBridge::HibernationScheduled)); | 993 Canvas2DLayerBridge::HibernationScheduled)); |
| 994 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true, | 994 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true, |
| 995 hibernationScheduledEvent.get()); | 995 hibernationScheduledEvent.get()); |
| 996 postDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 996 postDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 997 // In production, we would expect a | 997 // In production, we would expect a |
| 998 // HibernationAbortedDueToDestructionWhileHibernatePending event to be | 998 // HibernationAbortedDueToDestructionWhileHibernatePending event to be |
| 999 // fired, but that signal is lost in the unit test due to no longer having | 999 // fired, but that signal is lost in the unit test due to no longer having |
| 1000 // a bridge to hold the mockLogger. | 1000 // a bridge to hold the mockLogger. |
| 1001 hibernationScheduledEvent->wait(); | 1001 hibernationScheduledEvent->wait(); |
| 1002 // Once we know the hibernation task is scheduled, we can schedule a fence. | 1002 // Once we know the hibernation task is scheduled, we can schedule a fence. |
| 1003 // Assuming tasks are guaranteed to run in the order they were | 1003 // Assuming tasks are guaranteed to run in the order they were |
| 1004 // submitted, this fence will guarantee the attempt to hibernate runs to | 1004 // submitted, this fence will guarantee the attempt to hibernate runs to |
| 1005 // completion before the thread is destroyed. | 1005 // completion before the thread is destroyed. |
| 1006 // This test passes by not crashing, which proves that the WeakPtr logic | 1006 // This test passes by not crashing, which proves that the WeakPtr logic |
| 1007 // is sound. | 1007 // is sound. |
| 1008 std::unique_ptr<WaitableEvent> fenceEvent = makeUnique<WaitableEvent>(); | 1008 std::unique_ptr<WaitableEvent> fenceEvent = WTF::makeUnique<WaitableEvent>(); |
| 1009 testThread->getWebTaskRunner()->postTask( | 1009 testThread->getWebTaskRunner()->postTask( |
| 1010 BLINK_FROM_HERE, | 1010 BLINK_FROM_HERE, |
| 1011 WTF::bind(&WaitableEvent::signal, unretained(fenceEvent.get()))); | 1011 WTF::bind(&WaitableEvent::signal, WTF::unretained(fenceEvent.get()))); |
| 1012 fenceEvent->wait(); | 1012 fenceEvent->wait(); |
| 1013 } | 1013 } |
| 1014 | 1014 |
| 1015 #if CANVAS2D_HIBERNATION_ENABLED | 1015 #if CANVAS2D_HIBERNATION_ENABLED |
| 1016 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToPendingTeardown) | 1016 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToPendingTeardown) |
| 1017 #else | 1017 #else |
| 1018 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToPendingTeardown) | 1018 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToPendingTeardown) |
| 1019 #endif | 1019 #endif |
| 1020 { | 1020 { |
| 1021 FakeGLES2Interface gl; | 1021 FakeGLES2Interface gl; |
| 1022 std::unique_ptr<WebThread> testThread = | 1022 std::unique_ptr<WebThread> testThread = |
| 1023 wrapUnique(Platform::current()->createThread("TestThread")); | 1023 WTF::wrapUnique(Platform::current()->createThread("TestThread")); |
| 1024 | 1024 |
| 1025 // The Canvas2DLayerBridge has to be created on the thread that will use it | 1025 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 1026 // to avoid WeakPtr thread check issues. | 1026 // to avoid WeakPtr thread check issues. |
| 1027 Canvas2DLayerBridgePtr bridge; | 1027 Canvas2DLayerBridgePtr bridge; |
| 1028 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, | 1028 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, |
| 1029 this); | 1029 this); |
| 1030 | 1030 |
| 1031 // Register an alternate Logger for tracking hibernation events | 1031 // Register an alternate Logger for tracking hibernation events |
| 1032 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 1032 std::unique_ptr<MockLogger> mockLogger = WTF::wrapUnique(new MockLogger); |
| 1033 MockLogger* mockLoggerPtr = mockLogger.get(); | 1033 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 1034 bridge->setLoggerForTesting(std::move(mockLogger)); | 1034 bridge->setLoggerForTesting(std::move(mockLogger)); |
| 1035 | 1035 |
| 1036 // Test entering hibernation | 1036 // Test entering hibernation |
| 1037 std::unique_ptr<WaitableEvent> hibernationAbortedEvent = | 1037 std::unique_ptr<WaitableEvent> hibernationAbortedEvent = |
| 1038 makeUnique<WaitableEvent>(); | 1038 WTF::makeUnique<WaitableEvent>(); |
| 1039 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( | 1039 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( |
| 1040 Canvas2DLayerBridge::HibernationScheduled)); | 1040 Canvas2DLayerBridge::HibernationScheduled)); |
| 1041 EXPECT_CALL( | 1041 EXPECT_CALL( |
| 1042 *mockLoggerPtr, | 1042 *mockLoggerPtr, |
| 1043 reportHibernationEvent( | 1043 reportHibernationEvent( |
| 1044 Canvas2DLayerBridge::HibernationAbortedDueToPendingDestruction)) | 1044 Canvas2DLayerBridge::HibernationAbortedDueToPendingDestruction)) |
| 1045 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), | 1045 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), |
| 1046 &WaitableEvent::signal)); | 1046 &WaitableEvent::signal)); |
| 1047 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 1047 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 1048 testThread->getWebTaskRunner()->postTask( | 1048 testThread->getWebTaskRunner()->postTask( |
| 1049 BLINK_FROM_HERE, crossThreadBind(&Canvas2DLayerBridge::beginDestruction, | 1049 BLINK_FROM_HERE, crossThreadBind(&Canvas2DLayerBridge::beginDestruction, |
| 1050 crossThreadUnretained(bridge.get()))); | 1050 crossThreadUnretained(bridge.get()))); |
| 1051 hibernationAbortedEvent->wait(); | 1051 hibernationAbortedEvent->wait(); |
| 1052 | 1052 |
| 1053 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 1053 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 1054 | 1054 |
| 1055 // Tear down bridge on thread | 1055 // Tear down bridge on thread |
| 1056 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 1056 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 1057 } | 1057 } |
| 1058 | 1058 |
| 1059 #if CANVAS2D_HIBERNATION_ENABLED | 1059 #if CANVAS2D_HIBERNATION_ENABLED |
| 1060 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToVisibilityChange) | 1060 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToVisibilityChange) |
| 1061 #else | 1061 #else |
| 1062 TEST_F(Canvas2DLayerBridgeTest, | 1062 TEST_F(Canvas2DLayerBridgeTest, |
| 1063 DISABLED_HibernationAbortedDueToVisibilityChange) | 1063 DISABLED_HibernationAbortedDueToVisibilityChange) |
| 1064 #endif | 1064 #endif |
| 1065 { | 1065 { |
| 1066 FakeGLES2Interface gl; | 1066 FakeGLES2Interface gl; |
| 1067 std::unique_ptr<WebThread> testThread = | 1067 std::unique_ptr<WebThread> testThread = |
| 1068 wrapUnique(Platform::current()->createThread("TestThread")); | 1068 WTF::wrapUnique(Platform::current()->createThread("TestThread")); |
| 1069 | 1069 |
| 1070 // The Canvas2DLayerBridge has to be created on the thread that will use it | 1070 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 1071 // to avoid WeakPtr thread check issues. | 1071 // to avoid WeakPtr thread check issues. |
| 1072 Canvas2DLayerBridgePtr bridge; | 1072 Canvas2DLayerBridgePtr bridge; |
| 1073 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, | 1073 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, |
| 1074 this); | 1074 this); |
| 1075 | 1075 |
| 1076 // Register an alternate Logger for tracking hibernation events | 1076 // Register an alternate Logger for tracking hibernation events |
| 1077 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 1077 std::unique_ptr<MockLogger> mockLogger = WTF::wrapUnique(new MockLogger); |
| 1078 MockLogger* mockLoggerPtr = mockLogger.get(); | 1078 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 1079 bridge->setLoggerForTesting(std::move(mockLogger)); | 1079 bridge->setLoggerForTesting(std::move(mockLogger)); |
| 1080 | 1080 |
| 1081 // Test entering hibernation | 1081 // Test entering hibernation |
| 1082 std::unique_ptr<WaitableEvent> hibernationAbortedEvent = | 1082 std::unique_ptr<WaitableEvent> hibernationAbortedEvent = |
| 1083 makeUnique<WaitableEvent>(); | 1083 WTF::makeUnique<WaitableEvent>(); |
| 1084 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( | 1084 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( |
| 1085 Canvas2DLayerBridge::HibernationScheduled)); | 1085 Canvas2DLayerBridge::HibernationScheduled)); |
| 1086 EXPECT_CALL(*mockLoggerPtr, | 1086 EXPECT_CALL(*mockLoggerPtr, |
| 1087 reportHibernationEvent( | 1087 reportHibernationEvent( |
| 1088 Canvas2DLayerBridge::HibernationAbortedDueToVisibilityChange)) | 1088 Canvas2DLayerBridge::HibernationAbortedDueToVisibilityChange)) |
| 1089 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), | 1089 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), |
| 1090 &WaitableEvent::signal)); | 1090 &WaitableEvent::signal)); |
| 1091 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 1091 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 1092 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), false); | 1092 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), false); |
| 1093 hibernationAbortedEvent->wait(); | 1093 hibernationAbortedEvent->wait(); |
| 1094 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 1094 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 1095 EXPECT_TRUE(bridge->isAccelerated()); | 1095 EXPECT_TRUE(bridge->isAccelerated()); |
| 1096 EXPECT_FALSE(bridge->isHibernating()); | 1096 EXPECT_FALSE(bridge->isHibernating()); |
| 1097 EXPECT_TRUE(bridge->checkSurfaceValid()); | 1097 EXPECT_TRUE(bridge->checkSurfaceValid()); |
| 1098 | 1098 |
| 1099 // Tear down the bridge on the thread so that 'bridge' can go out of scope | 1099 // Tear down the bridge on the thread so that 'bridge' can go out of scope |
| 1100 // without crashing due to thread checks | 1100 // without crashing due to thread checks |
| 1101 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 1101 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 1102 } | 1102 } |
| 1103 | 1103 |
| 1104 #if CANVAS2D_HIBERNATION_ENABLED | 1104 #if CANVAS2D_HIBERNATION_ENABLED |
| 1105 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToLostContext) | 1105 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToLostContext) |
| 1106 #else | 1106 #else |
| 1107 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToLostContext) | 1107 TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToLostContext) |
| 1108 #endif | 1108 #endif |
| 1109 { | 1109 { |
| 1110 FakeGLES2Interface gl; | 1110 FakeGLES2Interface gl; |
| 1111 std::unique_ptr<WebThread> testThread = | 1111 std::unique_ptr<WebThread> testThread = |
| 1112 wrapUnique(Platform::current()->createThread("TestThread")); | 1112 WTF::wrapUnique(Platform::current()->createThread("TestThread")); |
| 1113 | 1113 |
| 1114 // The Canvas2DLayerBridge has to be created on the thread that will use it | 1114 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 1115 // to avoid WeakPtr thread check issues. | 1115 // to avoid WeakPtr thread check issues. |
| 1116 Canvas2DLayerBridgePtr bridge; | 1116 Canvas2DLayerBridgePtr bridge; |
| 1117 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, | 1117 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, |
| 1118 this); | 1118 this); |
| 1119 | 1119 |
| 1120 // Register an alternate Logger for tracking hibernation events | 1120 // Register an alternate Logger for tracking hibernation events |
| 1121 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 1121 std::unique_ptr<MockLogger> mockLogger = WTF::wrapUnique(new MockLogger); |
| 1122 MockLogger* mockLoggerPtr = mockLogger.get(); | 1122 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 1123 bridge->setLoggerForTesting(std::move(mockLogger)); | 1123 bridge->setLoggerForTesting(std::move(mockLogger)); |
| 1124 | 1124 |
| 1125 gl.setIsContextLost(true); | 1125 gl.setIsContextLost(true); |
| 1126 // Test entering hibernation | 1126 // Test entering hibernation |
| 1127 std::unique_ptr<WaitableEvent> hibernationAbortedEvent = | 1127 std::unique_ptr<WaitableEvent> hibernationAbortedEvent = |
| 1128 makeUnique<WaitableEvent>(); | 1128 WTF::makeUnique<WaitableEvent>(); |
| 1129 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( | 1129 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( |
| 1130 Canvas2DLayerBridge::HibernationScheduled)); | 1130 Canvas2DLayerBridge::HibernationScheduled)); |
| 1131 EXPECT_CALL(*mockLoggerPtr, | 1131 EXPECT_CALL(*mockLoggerPtr, |
| 1132 reportHibernationEvent( | 1132 reportHibernationEvent( |
| 1133 Canvas2DLayerBridge::HibernationAbortedDueGpuContextLoss)) | 1133 Canvas2DLayerBridge::HibernationAbortedDueGpuContextLoss)) |
| 1134 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), | 1134 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), |
| 1135 &WaitableEvent::signal)); | 1135 &WaitableEvent::signal)); |
| 1136 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 1136 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 1137 hibernationAbortedEvent->wait(); | 1137 hibernationAbortedEvent->wait(); |
| 1138 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 1138 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 1139 EXPECT_FALSE(bridge->isHibernating()); | 1139 EXPECT_FALSE(bridge->isHibernating()); |
| 1140 | 1140 |
| 1141 // Tear down the bridge on the thread so that 'bridge' can go out of scope | 1141 // Tear down the bridge on the thread so that 'bridge' can go out of scope |
| 1142 // without crashing due to thread checks | 1142 // without crashing due to thread checks |
| 1143 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); | 1143 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); |
| 1144 } | 1144 } |
| 1145 | 1145 |
| 1146 #if CANVAS2D_HIBERNATION_ENABLED | 1146 #if CANVAS2D_HIBERNATION_ENABLED |
| 1147 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileHibernating) | 1147 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileHibernating) |
| 1148 #else | 1148 #else |
| 1149 TEST_F(Canvas2DLayerBridgeTest, DISABLED_PrepareMailboxWhileHibernating) | 1149 TEST_F(Canvas2DLayerBridgeTest, DISABLED_PrepareMailboxWhileHibernating) |
| 1150 #endif | 1150 #endif |
| 1151 { | 1151 { |
| 1152 FakeGLES2Interface gl; | 1152 FakeGLES2Interface gl; |
| 1153 std::unique_ptr<WebThread> testThread = | 1153 std::unique_ptr<WebThread> testThread = |
| 1154 wrapUnique(Platform::current()->createThread("TestThread")); | 1154 WTF::wrapUnique(Platform::current()->createThread("TestThread")); |
| 1155 | 1155 |
| 1156 // The Canvas2DLayerBridge has to be created on the thread that will use it | 1156 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 1157 // to avoid WeakPtr thread check issues. | 1157 // to avoid WeakPtr thread check issues. |
| 1158 Canvas2DLayerBridgePtr bridge; | 1158 Canvas2DLayerBridgePtr bridge; |
| 1159 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, | 1159 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, |
| 1160 this); | 1160 this); |
| 1161 | 1161 |
| 1162 // Register an alternate Logger for tracking hibernation events | 1162 // Register an alternate Logger for tracking hibernation events |
| 1163 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 1163 std::unique_ptr<MockLogger> mockLogger = WTF::wrapUnique(new MockLogger); |
| 1164 MockLogger* mockLoggerPtr = mockLogger.get(); | 1164 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 1165 bridge->setLoggerForTesting(std::move(mockLogger)); | 1165 bridge->setLoggerForTesting(std::move(mockLogger)); |
| 1166 | 1166 |
| 1167 // Test entering hibernation | 1167 // Test entering hibernation |
| 1168 std::unique_ptr<WaitableEvent> hibernationStartedEvent = | 1168 std::unique_ptr<WaitableEvent> hibernationStartedEvent = |
| 1169 makeUnique<WaitableEvent>(); | 1169 WTF::makeUnique<WaitableEvent>(); |
| 1170 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( | 1170 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( |
| 1171 Canvas2DLayerBridge::HibernationScheduled)); | 1171 Canvas2DLayerBridge::HibernationScheduled)); |
| 1172 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 1172 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
| 1173 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), | 1173 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), |
| 1174 &WaitableEvent::signal)); | 1174 &WaitableEvent::signal)); |
| 1175 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 1175 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 1176 hibernationStartedEvent->wait(); | 1176 hibernationStartedEvent->wait(); |
| 1177 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 1177 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 1178 | 1178 |
| 1179 // Test prepareMailbox while hibernating | 1179 // Test prepareMailbox while hibernating |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1192 } | 1192 } |
| 1193 | 1193 |
| 1194 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU | 1194 #if CANVAS2D_HIBERNATION_ENABLED && CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU |
| 1195 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileBackgroundRendering) | 1195 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileBackgroundRendering) |
| 1196 #else | 1196 #else |
| 1197 TEST_F(Canvas2DLayerBridgeTest, DISABLED_PrepareMailboxWhileBackgroundRendering) | 1197 TEST_F(Canvas2DLayerBridgeTest, DISABLED_PrepareMailboxWhileBackgroundRendering) |
| 1198 #endif | 1198 #endif |
| 1199 { | 1199 { |
| 1200 FakeGLES2Interface gl; | 1200 FakeGLES2Interface gl; |
| 1201 std::unique_ptr<WebThread> testThread = | 1201 std::unique_ptr<WebThread> testThread = |
| 1202 wrapUnique(Platform::current()->createThread("TestThread")); | 1202 WTF::wrapUnique(Platform::current()->createThread("TestThread")); |
| 1203 | 1203 |
| 1204 // The Canvas2DLayerBridge has to be created on the thread that will use it | 1204 // The Canvas2DLayerBridge has to be created on the thread that will use it |
| 1205 // to avoid WeakPtr thread check issues. | 1205 // to avoid WeakPtr thread check issues. |
| 1206 Canvas2DLayerBridgePtr bridge; | 1206 Canvas2DLayerBridgePtr bridge; |
| 1207 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, | 1207 postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &gl, |
| 1208 this); | 1208 this); |
| 1209 | 1209 |
| 1210 // Register an alternate Logger for tracking hibernation events | 1210 // Register an alternate Logger for tracking hibernation events |
| 1211 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 1211 std::unique_ptr<MockLogger> mockLogger = WTF::wrapUnique(new MockLogger); |
| 1212 MockLogger* mockLoggerPtr = mockLogger.get(); | 1212 MockLogger* mockLoggerPtr = mockLogger.get(); |
| 1213 bridge->setLoggerForTesting(std::move(mockLogger)); | 1213 bridge->setLoggerForTesting(std::move(mockLogger)); |
| 1214 | 1214 |
| 1215 // Test entering hibernation | 1215 // Test entering hibernation |
| 1216 std::unique_ptr<WaitableEvent> hibernationStartedEvent = | 1216 std::unique_ptr<WaitableEvent> hibernationStartedEvent = |
| 1217 makeUnique<WaitableEvent>(); | 1217 WTF::makeUnique<WaitableEvent>(); |
| 1218 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( | 1218 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent( |
| 1219 Canvas2DLayerBridge::HibernationScheduled)); | 1219 Canvas2DLayerBridge::HibernationScheduled)); |
| 1220 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) | 1220 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) |
| 1221 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), | 1221 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), |
| 1222 &WaitableEvent::signal)); | 1222 &WaitableEvent::signal)); |
| 1223 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); | 1223 postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); |
| 1224 hibernationStartedEvent->wait(); | 1224 hibernationStartedEvent->wait(); |
| 1225 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); | 1225 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); |
| 1226 | 1226 |
| 1227 // Rendering in the background -> temp switch to SW | 1227 // Rendering in the background -> temp switch to SW |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1249 | 1249 |
| 1250 #if USE_IOSURFACE_FOR_2D_CANVAS | 1250 #if USE_IOSURFACE_FOR_2D_CANVAS |
| 1251 TEST_F(Canvas2DLayerBridgeTest, DeleteIOSurfaceAfterTeardown) | 1251 TEST_F(Canvas2DLayerBridgeTest, DeleteIOSurfaceAfterTeardown) |
| 1252 #else | 1252 #else |
| 1253 TEST_F(Canvas2DLayerBridgeTest, DISABLED_DeleteIOSurfaceAfterTeardown) | 1253 TEST_F(Canvas2DLayerBridgeTest, DISABLED_DeleteIOSurfaceAfterTeardown) |
| 1254 #endif | 1254 #endif |
| 1255 { | 1255 { |
| 1256 FakeGLES2InterfaceWithImageSupport gl; | 1256 FakeGLES2InterfaceWithImageSupport gl; |
| 1257 FakePlatformSupport testingPlatformSupport; | 1257 FakePlatformSupport testingPlatformSupport; |
| 1258 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = | 1258 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = |
| 1259 wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 1259 WTF::wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); |
| 1260 | 1260 |
| 1261 cc::TextureMailbox textureMailbox; | 1261 cc::TextureMailbox textureMailbox; |
| 1262 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; | 1262 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; |
| 1263 | 1263 |
| 1264 { | 1264 { |
| 1265 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( | 1265 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge( |
| 1266 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, | 1266 std::move(contextProvider), IntSize(300, 150), 0, NonOpaque, |
| 1267 Canvas2DLayerBridge::ForceAccelerationForTesting, nullptr, | 1267 Canvas2DLayerBridge::ForceAccelerationForTesting, nullptr, |
| 1268 kN32_SkColorType))); | 1268 kN32_SkColorType))); |
| 1269 bridge->PrepareTextureMailbox(&textureMailbox, &releaseCallback); | 1269 bridge->PrepareTextureMailbox(&textureMailbox, &releaseCallback); |
| 1270 } | 1270 } |
| 1271 | 1271 |
| 1272 bool lostResource = false; | 1272 bool lostResource = false; |
| 1273 releaseCallback->Run(gpu::SyncToken(), lostResource); | 1273 releaseCallback->Run(gpu::SyncToken(), lostResource); |
| 1274 | 1274 |
| 1275 EXPECT_EQ(1u, gl.createImageCount()); | 1275 EXPECT_EQ(1u, gl.createImageCount()); |
| 1276 EXPECT_EQ(1u, gl.destroyImageCount()); | 1276 EXPECT_EQ(1u, gl.destroyImageCount()); |
| 1277 } | 1277 } |
| 1278 | 1278 |
| 1279 } // namespace blink | 1279 } // namespace blink |
| OLD | NEW |