| 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" | |
| 51 #include "wtf/RefPtr.h" | 50 #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(std::unique_ptr<FakeWebGraphicsCo
ntext3DProvider> provider, const IntSize& size, Canvas2DLayerBridge::Acceleratio
nMode accelerationMode) | 152 PassRefPtr<Canvas2DLayerBridge> makeBridge(PassOwnPtr<FakeWebGraphicsContext
3DProvider> provider, const IntSize& size, Canvas2DLayerBridge::AccelerationMode
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 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrap
Unique(new FakeWebGraphicsContext3DProvider(&gl)); | 161 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(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 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrap
Unique(new FakeWebGraphicsContext3DProvider(&gl)); | 173 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(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 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider =
wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 186 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
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 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider =
wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 198 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
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 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrap
Unique(new FakeWebGraphicsContext3DProvider(&gl)); | 215 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(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 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrap
Unique(new FakeWebGraphicsContext3DProvider(&gl)); | 238 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(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 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider =
wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 255 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
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 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider =
wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 265 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
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 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider =
wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 283 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
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 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider =
wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); | 294 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(
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 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrapUniq
ue(new FakeWebGraphicsContext3DProvider(gl)); | 349 OwnPtr<FakeWebGraphicsContext3DProvider> contextProvider = adoptPtr(new Fake
WebGraphicsContext3DProvider(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 std::unique_ptr<WaitableEvent> bridgeCreatedEvent = wrapUnique(new WaitableE
vent()); | 360 OwnPtr<WaitableEvent> bridgeCreatedEvent = adoptPtr(new WaitableEvent()); |
| 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 std::unique_ptr<WaitableEvent> bridgeDestroyedEvent = wrapUnique(new Waitabl
eEvent()); | 389 OwnPtr<WaitableEvent> bridgeDestroyedEvent = adoptPtr(new WaitableEvent()); |
| 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 std::unique_ptr<WaitableEvent> doneEvent = wrapUnique(new WaitableEvent()); | 417 OwnPtr<WaitableEvent> doneEvent = adoptPtr(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(wrapUnique(new UnacceleratedImageBufferSurface(IntSize(1,
1)))) { } | 425 : ImageBuffer(adoptPtr(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 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); | 439 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 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 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 447 OwnPtr<MockLogger> mockLogger = adoptPtr(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 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); | 452 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); |
| 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 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); | 483 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 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 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 491 OwnPtr<MockLogger> mockLogger = adoptPtr(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 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); | 496 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); |
| 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 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); | 532 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 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 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 544 OwnPtr<MockLogger> mockLogger = adoptPtr(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 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); | 549 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); |
| 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 std::unique_ptr<WaitableEvent> doneEvent = wrapUnique(new WaitableEvent()); | 586 OwnPtr<WaitableEvent> doneEvent = adoptPtr(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 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); | 602 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 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 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 610 OwnPtr<MockLogger> mockLogger = adoptPtr(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 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); | 615 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); |
| 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 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); | 653 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 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 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 665 OwnPtr<MockLogger> mockLogger = adoptPtr(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 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); | 670 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); |
| 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 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); | 714 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 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 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 725 OwnPtr<MockLogger> mockLogger = adoptPtr(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 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); | 730 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); |
| 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 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); | 774 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 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 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 782 OwnPtr<MockLogger> mockLogger = adoptPtr(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 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); | 787 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); |
| 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 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); | 810 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 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 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 818 OwnPtr<MockLogger> mockLogger = adoptPtr(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 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); | 823 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); |
| 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 std::unique_ptr<WaitableEvent> hibernationEndedEvent = wrapUnique(new Waitab
leEvent()); | 845 OwnPtr<WaitableEvent> hibernationEndedEvent = adoptPtr(new WaitableEvent()); |
| 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 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); | 879 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 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 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 887 OwnPtr<MockLogger> mockLogger = adoptPtr(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 std::unique_ptr<WaitableEvent> hibernationScheduledEvent = wrapUnique(new Wa
itableEvent()); | 892 OwnPtr<WaitableEvent> hibernationScheduledEvent = adoptPtr(new WaitableEvent
()); |
| 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 std::unique_ptr<WaitableEvent> fenceEvent = wrapUnique(new WaitableEvent()); | 907 OwnPtr<WaitableEvent> fenceEvent = adoptPtr(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 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); | 919 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 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 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 927 OwnPtr<MockLogger> mockLogger = adoptPtr(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 std::unique_ptr<WaitableEvent> hibernationAbortedEvent = wrapUnique(new Wait
ableEvent()); | 932 OwnPtr<WaitableEvent> hibernationAbortedEvent = adoptPtr(new WaitableEvent()
); |
| 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 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); | 953 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 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 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 961 OwnPtr<MockLogger> mockLogger = adoptPtr(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 std::unique_ptr<WaitableEvent> hibernationAbortedEvent = wrapUnique(new Wait
ableEvent()); | 966 OwnPtr<WaitableEvent> hibernationAbortedEvent = adoptPtr(new WaitableEvent()
); |
| 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 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); | 990 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 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 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 998 OwnPtr<MockLogger> mockLogger = adoptPtr(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 std::unique_ptr<WaitableEvent> hibernationAbortedEvent = wrapUnique(new Wait
ableEvent()); | 1004 OwnPtr<WaitableEvent> hibernationAbortedEvent = adoptPtr(new WaitableEvent()
); |
| 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 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); | 1025 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 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 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 1033 OwnPtr<MockLogger> mockLogger = adoptPtr(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 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); | 1038 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); |
| 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 std::unique_ptr<WebThread> testThread = wrapUnique(Platform::current()->crea
teThread("TestThread")); | 1064 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T
estThread")); |
| 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 std::unique_ptr<MockLogger> mockLogger = wrapUnique(new MockLogger); | 1072 OwnPtr<MockLogger> mockLogger = adoptPtr(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 std::unique_ptr<WaitableEvent> hibernationStartedEvent = wrapUnique(new Wait
ableEvent()); | 1077 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()
); |
| 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 |