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

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

Issue 1682423002: Remove WebWaitableEvent and replace it with WaitableEvent. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix android build Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution. 11 * documentation and/or other materials provided with the distribution.
12 * 12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND AN Y 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND AN Y
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR AN Y 16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR AN Y
17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND O N 19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND O N
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 */ 23 */
24 24
25 #include "platform/graphics/Canvas2DLayerBridge.h" 25 #include "platform/graphics/Canvas2DLayerBridge.h"
26 26
27 #include "SkSurface.h" 27 #include "SkSurface.h"
28 #include "base/memory/scoped_ptr.h" 28 #include "base/memory/scoped_ptr.h"
29 #include "platform/WaitableEvent.h"
29 #include "platform/graphics/ImageBuffer.h" 30 #include "platform/graphics/ImageBuffer.h"
30 #include "platform/graphics/UnacceleratedImageBufferSurface.h" 31 #include "platform/graphics/UnacceleratedImageBufferSurface.h"
31 #include "platform/graphics/test/MockWebGraphicsContext3D.h" 32 #include "platform/graphics/test/MockWebGraphicsContext3D.h"
32 #include "public/platform/Platform.h" 33 #include "public/platform/Platform.h"
33 #include "public/platform/WebExternalBitmap.h" 34 #include "public/platform/WebExternalBitmap.h"
34 #include "public/platform/WebGraphicsContext3DProvider.h" 35 #include "public/platform/WebGraphicsContext3DProvider.h"
35 #include "public/platform/WebScheduler.h" 36 #include "public/platform/WebScheduler.h"
36 #include "public/platform/WebTaskRunner.h" 37 #include "public/platform/WebTaskRunner.h"
37 #include "public/platform/WebThread.h" 38 #include "public/platform/WebThread.h"
38 #include "public/platform/WebTraceLocation.h" 39 #include "public/platform/WebTraceLocation.h"
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 class MockLogger : public Canvas2DLayerBridge::Logger { 368 class MockLogger : public Canvas2DLayerBridge::Logger {
368 public: 369 public:
369 MOCK_METHOD1(reportHibernationEvent, void(Canvas2DLayerBridge::HibernationEv ent)); 370 MOCK_METHOD1(reportHibernationEvent, void(Canvas2DLayerBridge::HibernationEv ent));
370 MOCK_METHOD0(didStartHibernating, void()); 371 MOCK_METHOD0(didStartHibernating, void());
371 virtual ~MockLogger() { } 372 virtual ~MockLogger() { }
372 }; 373 };
373 374
374 375
375 class CreateBridgeTask : public WebTaskRunner::Task { 376 class CreateBridgeTask : public WebTaskRunner::Task {
376 public: 377 public:
377 CreateBridgeTask(Canvas2DLayerBridgePtr* bridgePtr, MockCanvasContext* mockC anvasContext, Canvas2DLayerBridgeTest* testHost, WebWaitableEvent* doneEvent) 378 CreateBridgeTask(Canvas2DLayerBridgePtr* bridgePtr, MockCanvasContext* mockC anvasContext, Canvas2DLayerBridgeTest* testHost, WaitableEvent* doneEvent)
378 : m_bridgePtr(bridgePtr) 379 : m_bridgePtr(bridgePtr)
379 , m_mockCanvasContext(mockCanvasContext) 380 , m_mockCanvasContext(mockCanvasContext)
380 , m_testHost(testHost) 381 , m_testHost(testHost)
381 , m_doneEvent(doneEvent) 382 , m_doneEvent(doneEvent)
382 { } 383 { }
383 384
384 virtual ~CreateBridgeTask() { } 385 virtual ~CreateBridgeTask() { }
385 386
386 void run() override 387 void run() override
387 { 388 {
388 OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr(new MockWebGraphicsContext3DProvider(m_mockCanvasContext)); 389 OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr(new MockWebGraphicsContext3DProvider(m_mockCanvasContext));
389 *m_bridgePtr = m_testHost->makeBridge(mainMockProvider.release(), IntSiz e(300, 300), Canvas2DLayerBridge::EnableAcceleration); 390 *m_bridgePtr = m_testHost->makeBridge(mainMockProvider.release(), IntSiz e(300, 300), Canvas2DLayerBridge::EnableAcceleration);
390 // draw+flush to trigger the creation of a GPU surface 391 // draw+flush to trigger the creation of a GPU surface
391 (*m_bridgePtr)->didDraw(FloatRect(0, 0, 1, 1)); 392 (*m_bridgePtr)->didDraw(FloatRect(0, 0, 1, 1));
392 (*m_bridgePtr)->finalizeFrame(FloatRect(0, 0, 1, 1)); 393 (*m_bridgePtr)->finalizeFrame(FloatRect(0, 0, 1, 1));
393 (*m_bridgePtr)->flush(); 394 (*m_bridgePtr)->flush();
394 m_doneEvent->signal(); 395 m_doneEvent->signal();
395 } 396 }
396 397
397 private: 398 private:
398 Canvas2DLayerBridgePtr* m_bridgePtr; 399 Canvas2DLayerBridgePtr* m_bridgePtr;
399 MockCanvasContext* m_mockCanvasContext; 400 MockCanvasContext* m_mockCanvasContext;
400 Canvas2DLayerBridgeTest* m_testHost; 401 Canvas2DLayerBridgeTest* m_testHost;
401 WebWaitableEvent* m_doneEvent; 402 WaitableEvent* m_doneEvent;
402 }; 403 };
403 404
404 class DestroyBridgeTask : public WebTaskRunner::Task { 405 class DestroyBridgeTask : public WebTaskRunner::Task {
405 public: 406 public:
406 DestroyBridgeTask(Canvas2DLayerBridgePtr* bridgePtr, WebWaitableEvent* doneE vent = nullptr) 407 DestroyBridgeTask(Canvas2DLayerBridgePtr* bridgePtr, WaitableEvent* doneEven t = nullptr)
407 : m_bridgePtr(bridgePtr) 408 : m_bridgePtr(bridgePtr)
408 , m_doneEvent(doneEvent) 409 , m_doneEvent(doneEvent)
409 { } 410 { }
410 411
411 virtual ~DestroyBridgeTask() { } 412 virtual ~DestroyBridgeTask() { }
412 413
413 void run() override 414 void run() override
414 { 415 {
415 m_bridgePtr->clear(); 416 m_bridgePtr->clear();
416 if (m_doneEvent) 417 if (m_doneEvent)
417 m_doneEvent->signal(); 418 m_doneEvent->signal();
418 } 419 }
419 420
420 private: 421 private:
421 Canvas2DLayerBridgePtr* m_bridgePtr; 422 Canvas2DLayerBridgePtr* m_bridgePtr;
422 WebWaitableEvent* m_doneEvent; 423 WaitableEvent* m_doneEvent;
423 }; 424 };
424 425
425 class SetIsHiddenTask : public WebTaskRunner::Task { 426 class SetIsHiddenTask : public WebTaskRunner::Task {
426 public: 427 public:
427 SetIsHiddenTask(Canvas2DLayerBridge* bridge, bool value, WebWaitableEvent* d oneEvent = nullptr) 428 SetIsHiddenTask(Canvas2DLayerBridge* bridge, bool value, WaitableEvent* done Event = nullptr)
428 : m_bridge(bridge) 429 : m_bridge(bridge)
429 , m_value(value) 430 , m_value(value)
430 , m_doneEvent(doneEvent) 431 , m_doneEvent(doneEvent)
431 { } 432 { }
432 433
433 virtual ~SetIsHiddenTask() { } 434 virtual ~SetIsHiddenTask() { }
434 435
435 void run() override 436 void run() override
436 { 437 {
437 m_bridge->setIsHidden(m_value); 438 m_bridge->setIsHidden(m_value);
438 if (m_doneEvent) 439 if (m_doneEvent)
439 m_doneEvent->signal(); 440 m_doneEvent->signal();
440 } 441 }
441 442
442 private: 443 private:
443 Canvas2DLayerBridge* m_bridge; 444 Canvas2DLayerBridge* m_bridge;
444 bool m_value; 445 bool m_value;
445 WebWaitableEvent* m_doneEvent; 446 WaitableEvent* m_doneEvent;
446 }; 447 };
447 448
448 class MockImageBuffer : public ImageBuffer { 449 class MockImageBuffer : public ImageBuffer {
449 public: 450 public:
450 MockImageBuffer() 451 MockImageBuffer()
451 : ImageBuffer(adoptPtr(new UnacceleratedImageBufferSurface(IntSize(1, 1) ))) { } 452 : ImageBuffer(adoptPtr(new UnacceleratedImageBufferSurface(IntSize(1, 1) ))) { }
452 453
453 MOCK_CONST_METHOD1(resetCanvas, void(SkCanvas*)); 454 MOCK_CONST_METHOD1(resetCanvas, void(SkCanvas*));
454 455
455 virtual ~MockImageBuffer() { } 456 virtual ~MockImageBuffer() { }
456 }; 457 };
457 458
458 TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycle) 459 TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycle)
459 { 460 {
460 MockCanvasContext mainMock; 461 MockCanvasContext mainMock;
461 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread")); 462 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread"));
462 463
463 // The Canvas2DLayerBridge has to be created on the thread that will use it 464 // The Canvas2DLayerBridge has to be created on the thread that will use it
464 // to avoid WeakPtr thread check issues. 465 // to avoid WeakPtr thread check issues.
465 Canvas2DLayerBridgePtr bridge; 466 Canvas2DLayerBridgePtr bridge;
466 OwnPtr<WebWaitableEvent> bridgeCreatedEvent = adoptPtr(Platform::current()-> createWaitableEvent()); 467 OwnPtr<WaitableEvent> bridgeCreatedEvent = adoptPtr(new WaitableEvent());
467 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get())); 468 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get()));
468 bridgeCreatedEvent->wait(); 469 bridgeCreatedEvent->wait();
469 470
470 // Register an alternate Logger for tracking hibernation events 471 // Register an alternate Logger for tracking hibernation events
471 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); 472 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger);
472 MockLogger* mockLoggerPtr = mockLogger.get(); 473 MockLogger* mockLoggerPtr = mockLogger.get();
473 bridge->setLoggerForTesting(mockLogger.release()); 474 bridge->setLoggerForTesting(mockLogger.release());
474 475
475 // Test entering hibernation 476 // Test entering hibernation
476 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 477 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent() );
477 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 478 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
478 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) 479 EXPECT_CALL(*mockLoggerPtr, didStartHibernating())
479 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal)); 480 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent: :signal));
480 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 481 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
481 hibernationStartedEvent->wait(); 482 hibernationStartedEvent->wait();
482 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 483 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
483 EXPECT_FALSE(bridge->isAccelerated()); 484 EXPECT_FALSE(bridge->isAccelerated());
484 EXPECT_TRUE(bridge->isHibernating()); 485 EXPECT_TRUE(bridge->isHibernating());
485 EXPECT_TRUE(bridge->checkSurfaceValid()); 486 EXPECT_TRUE(bridge->checkSurfaceValid());
486 487
487 // Test exiting hibernation 488 // Test exiting hibernation
488 OwnPtr<WebWaitableEvent> hibernationEndedEvent = adoptPtr(Platform::current( )->createWaitableEvent()); 489 OwnPtr<WaitableEvent> hibernationEndedEvent = adoptPtr(new WaitableEvent());
489 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedNormally)); 490 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedNormally));
490 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, hibernationEndedEvent.get())); 491 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, hibernationEndedEvent.get()));
491 hibernationEndedEvent->wait(); 492 hibernationEndedEvent->wait();
492 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 493 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
493 EXPECT_TRUE(bridge->isAccelerated()); 494 EXPECT_TRUE(bridge->isAccelerated());
494 EXPECT_FALSE(bridge->isHibernating()); 495 EXPECT_FALSE(bridge->isHibernating());
495 EXPECT_TRUE(bridge->checkSurfaceValid()); 496 EXPECT_TRUE(bridge->checkSurfaceValid());
496 497
497 // Tear down the bridge on the thread so that 'bridge' can go out of scope 498 // Tear down the bridge on the thread so that 'bridge' can go out of scope
498 // without crashing due to thread checks 499 // without crashing due to thread checks
499 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 500 OwnPtr<WaitableEvent> bridgeDestroyedEvent = adoptPtr(new WaitableEvent());
500 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 501 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
501 bridgeDestroyedEvent->wait(); 502 bridgeDestroyedEvent->wait();
502 503
503 ::testing::Mock::VerifyAndClearExpectations(&mainMock); 504 ::testing::Mock::VerifyAndClearExpectations(&mainMock);
504 } 505 }
505 506
506 TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycleWithDeferredRenderingDisable d) 507 TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycleWithDeferredRenderingDisable d)
507 { 508 {
508 MockCanvasContext mainMock; 509 MockCanvasContext mainMock;
509 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread")); 510 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread"));
510 511
511 // The Canvas2DLayerBridge has to be created on the thread that will use it 512 // The Canvas2DLayerBridge has to be created on the thread that will use it
512 // to avoid WeakPtr thread check issues. 513 // to avoid WeakPtr thread check issues.
513 Canvas2DLayerBridgePtr bridge; 514 Canvas2DLayerBridgePtr bridge;
514 OwnPtr<WebWaitableEvent> bridgeCreatedEvent = adoptPtr(Platform::current()-> createWaitableEvent()); 515 OwnPtr<WaitableEvent> bridgeCreatedEvent = adoptPtr(new WaitableEvent());
515 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get())); 516 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get()));
516 bridgeCreatedEvent->wait(); 517 bridgeCreatedEvent->wait();
517 bridge->disableDeferral(DisableDeferralReasonUnknown); 518 bridge->disableDeferral(DisableDeferralReasonUnknown);
518 MockImageBuffer mockImageBuffer; 519 MockImageBuffer mockImageBuffer;
519 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); 520 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber());
520 bridge->setImageBuffer(&mockImageBuffer); 521 bridge->setImageBuffer(&mockImageBuffer);
521 522
522 // Register an alternate Logger for tracking hibernation events 523 // Register an alternate Logger for tracking hibernation events
523 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); 524 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger);
524 MockLogger* mockLoggerPtr = mockLogger.get(); 525 MockLogger* mockLoggerPtr = mockLogger.get();
525 bridge->setLoggerForTesting(mockLogger.release()); 526 bridge->setLoggerForTesting(mockLogger.release());
526 527
527 // Test entering hibernation 528 // Test entering hibernation
528 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 529 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent() );
529 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 530 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
530 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) 531 EXPECT_CALL(*mockLoggerPtr, didStartHibernating())
531 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal)); 532 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent: :signal));
532 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 533 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
533 hibernationStartedEvent->wait(); 534 hibernationStartedEvent->wait();
534 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 535 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
535 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); 536 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer);
536 EXPECT_FALSE(bridge->isAccelerated()); 537 EXPECT_FALSE(bridge->isAccelerated());
537 EXPECT_TRUE(bridge->isHibernating()); 538 EXPECT_TRUE(bridge->isHibernating());
538 EXPECT_TRUE(bridge->checkSurfaceValid()); 539 EXPECT_TRUE(bridge->checkSurfaceValid());
539 540
540 // Test exiting hibernation 541 // Test exiting hibernation
541 OwnPtr<WebWaitableEvent> hibernationEndedEvent = adoptPtr(Platform::current( )->createWaitableEvent()); 542 OwnPtr<WaitableEvent> hibernationEndedEvent = adoptPtr(new WaitableEvent());
542 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedNormally)); 543 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedNormally));
543 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1)); // Because d eferred rendering is disabled 544 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1)); // Because d eferred rendering is disabled
544 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, hibernationEndedEvent.get())); 545 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, hibernationEndedEvent.get()));
545 hibernationEndedEvent->wait(); 546 hibernationEndedEvent->wait();
546 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 547 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
547 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); 548 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer);
548 EXPECT_TRUE(bridge->isAccelerated()); 549 EXPECT_TRUE(bridge->isAccelerated());
549 EXPECT_FALSE(bridge->isHibernating()); 550 EXPECT_FALSE(bridge->isHibernating());
550 EXPECT_TRUE(bridge->checkSurfaceValid()); 551 EXPECT_TRUE(bridge->checkSurfaceValid());
551 552
552 // Tear down the bridge on the thread so that 'bridge' can go out of scope 553 // Tear down the bridge on the thread so that 'bridge' can go out of scope
553 // without crashing due to thread checks 554 // without crashing due to thread checks
554 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 555 OwnPtr<WaitableEvent> bridgeDestroyedEvent = adoptPtr(new WaitableEvent());
555 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 556 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
556 bridgeDestroyedEvent->wait(); 557 bridgeDestroyedEvent->wait();
557 558
558 ::testing::Mock::VerifyAndClearExpectations(&mainMock); 559 ::testing::Mock::VerifyAndClearExpectations(&mainMock);
559 } 560 }
560 561
561 class RenderingTask : public WebTaskRunner::Task { 562 class RenderingTask : public WebTaskRunner::Task {
562 public: 563 public:
563 RenderingTask(Canvas2DLayerBridge* bridge, WebWaitableEvent* doneEvent) 564 RenderingTask(Canvas2DLayerBridge* bridge, WaitableEvent* doneEvent)
564 : m_bridge(bridge) 565 : m_bridge(bridge)
565 , m_doneEvent(doneEvent) 566 , m_doneEvent(doneEvent)
566 { } 567 { }
567 568
568 virtual ~RenderingTask() { } 569 virtual ~RenderingTask() { }
569 570
570 void run() override 571 void run() override
571 { 572 {
572 m_bridge->didDraw(FloatRect(0, 0, 1, 1)); 573 m_bridge->didDraw(FloatRect(0, 0, 1, 1));
573 m_bridge->finalizeFrame(FloatRect(0, 0, 1, 1)); 574 m_bridge->finalizeFrame(FloatRect(0, 0, 1, 1));
574 m_bridge->flush(); 575 m_bridge->flush();
575 m_doneEvent->signal(); 576 m_doneEvent->signal();
576 } 577 }
577 578
578 private: 579 private:
579 Canvas2DLayerBridge* m_bridge; 580 Canvas2DLayerBridge* m_bridge;
580 WebWaitableEvent* m_doneEvent; 581 WaitableEvent* m_doneEvent;
581 }; 582 };
582 583
583 TEST_F(Canvas2DLayerBridgeTest, BackgroundRenderingWhileHibernating) 584 TEST_F(Canvas2DLayerBridgeTest, BackgroundRenderingWhileHibernating)
584 { 585 {
585 MockCanvasContext mainMock; 586 MockCanvasContext mainMock;
586 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread")); 587 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread"));
587 588
588 // 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
589 // to avoid WeakPtr thread check issues. 590 // to avoid WeakPtr thread check issues.
590 Canvas2DLayerBridgePtr bridge; 591 Canvas2DLayerBridgePtr bridge;
591 OwnPtr<WebWaitableEvent> bridgeCreatedEvent = adoptPtr(Platform::current()-> createWaitableEvent()); 592 OwnPtr<WaitableEvent> bridgeCreatedEvent = adoptPtr(new WaitableEvent());
592 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get())); 593 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get()));
593 bridgeCreatedEvent->wait(); 594 bridgeCreatedEvent->wait();
594 595
595 // Register an alternate Logger for tracking hibernation events 596 // Register an alternate Logger for tracking hibernation events
596 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); 597 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger);
597 MockLogger* mockLoggerPtr = mockLogger.get(); 598 MockLogger* mockLoggerPtr = mockLogger.get();
598 bridge->setLoggerForTesting(mockLogger.release()); 599 bridge->setLoggerForTesting(mockLogger.release());
599 600
600 // Test entering hibernation 601 // Test entering hibernation
601 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 602 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent() );
602 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 603 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
603 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) 604 EXPECT_CALL(*mockLoggerPtr, didStartHibernating())
604 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal)); 605 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent: :signal));
605 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 606 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
606 hibernationStartedEvent->wait(); 607 hibernationStartedEvent->wait();
607 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 608 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
608 EXPECT_FALSE(bridge->isAccelerated()); 609 EXPECT_FALSE(bridge->isAccelerated());
609 EXPECT_TRUE(bridge->isHibernating()); 610 EXPECT_TRUE(bridge->isHibernating());
610 EXPECT_TRUE(bridge->checkSurfaceValid()); 611 EXPECT_TRUE(bridge->checkSurfaceValid());
611 612
612 // Rendering in the background -> temp switch to SW 613 // Rendering in the background -> temp switch to SW
613 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithSwitchToBackgroundRendering)); 614 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithSwitchToBackgroundRendering));
614 OwnPtr<WebWaitableEvent> switchEvent = adoptPtr(Platform::current()->createW aitableEvent()); 615 OwnPtr<WaitableEvent> switchEvent = adoptPtr(new WaitableEvent());
615 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new RenderingTask(bridge .get(), switchEvent.get())); 616 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new RenderingTask(bridge .get(), switchEvent.get()));
616 switchEvent->wait(); 617 switchEvent->wait();
617 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 618 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
618 EXPECT_FALSE(bridge->isAccelerated()); 619 EXPECT_FALSE(bridge->isAccelerated());
619 EXPECT_FALSE(bridge->isHibernating()); 620 EXPECT_FALSE(bridge->isHibernating());
620 EXPECT_TRUE(bridge->checkSurfaceValid()); 621 EXPECT_TRUE(bridge->checkSurfaceValid());
621 622
622 // Unhide 623 // Unhide
623 OwnPtr<WebWaitableEvent> unhideEvent = adoptPtr(Platform::current()->createW aitableEvent()); 624 OwnPtr<WaitableEvent> unhideEvent = adoptPtr(new WaitableEvent());
624 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, unhideEvent.get())); 625 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, unhideEvent.get()));
625 unhideEvent->wait(); 626 unhideEvent->wait();
626 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 627 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
627 EXPECT_TRUE(bridge->isAccelerated()); // Becoming visible causes switch back to GPU 628 EXPECT_TRUE(bridge->isAccelerated()); // Becoming visible causes switch back to GPU
628 EXPECT_FALSE(bridge->isHibernating()); 629 EXPECT_FALSE(bridge->isHibernating());
629 EXPECT_TRUE(bridge->checkSurfaceValid()); 630 EXPECT_TRUE(bridge->checkSurfaceValid());
630 631
631 // Tear down the bridge on the thread so that 'bridge' can go out of scope 632 // Tear down the bridge on the thread so that 'bridge' can go out of scope
632 // without crashing due to thread checks 633 // without crashing due to thread checks
633 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 634 OwnPtr<WaitableEvent> bridgeDestroyedEvent = adoptPtr(new WaitableEvent());
634 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 635 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
635 bridgeDestroyedEvent->wait(); 636 bridgeDestroyedEvent->wait();
636 637
637 ::testing::Mock::VerifyAndClearExpectations(&mainMock); 638 ::testing::Mock::VerifyAndClearExpectations(&mainMock);
638 } 639 }
639 640
640 TEST_F(Canvas2DLayerBridgeTest, BackgroundRenderingWhileHibernatingWithDeferredR enderingDisabled) 641 TEST_F(Canvas2DLayerBridgeTest, BackgroundRenderingWhileHibernatingWithDeferredR enderingDisabled)
641 { 642 {
642 MockCanvasContext mainMock; 643 MockCanvasContext mainMock;
643 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread")); 644 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread"));
644 645
645 // The Canvas2DLayerBridge has to be created on the thread that will use it 646 // The Canvas2DLayerBridge has to be created on the thread that will use it
646 // to avoid WeakPtr thread check issues. 647 // to avoid WeakPtr thread check issues.
647 Canvas2DLayerBridgePtr bridge; 648 Canvas2DLayerBridgePtr bridge;
648 OwnPtr<WebWaitableEvent> bridgeCreatedEvent = adoptPtr(Platform::current()-> createWaitableEvent()); 649 OwnPtr<WaitableEvent> bridgeCreatedEvent = adoptPtr(new WaitableEvent());
649 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get())); 650 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get()));
650 bridgeCreatedEvent->wait(); 651 bridgeCreatedEvent->wait();
651 MockImageBuffer mockImageBuffer; 652 MockImageBuffer mockImageBuffer;
652 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); 653 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber());
653 bridge->setImageBuffer(&mockImageBuffer); 654 bridge->setImageBuffer(&mockImageBuffer);
654 bridge->disableDeferral(DisableDeferralReasonUnknown); 655 bridge->disableDeferral(DisableDeferralReasonUnknown);
655 656
656 // Register an alternate Logger for tracking hibernation events 657 // Register an alternate Logger for tracking hibernation events
657 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); 658 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger);
658 MockLogger* mockLoggerPtr = mockLogger.get(); 659 MockLogger* mockLoggerPtr = mockLogger.get();
659 bridge->setLoggerForTesting(mockLogger.release()); 660 bridge->setLoggerForTesting(mockLogger.release());
660 661
661 // Test entering hibernation 662 // Test entering hibernation
662 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 663 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent() );
663 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 664 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
664 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) 665 EXPECT_CALL(*mockLoggerPtr, didStartHibernating())
665 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal)); 666 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent: :signal));
666 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 667 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
667 hibernationStartedEvent->wait(); 668 hibernationStartedEvent->wait();
668 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 669 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
669 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); 670 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer);
670 EXPECT_FALSE(bridge->isAccelerated()); 671 EXPECT_FALSE(bridge->isAccelerated());
671 EXPECT_TRUE(bridge->isHibernating()); 672 EXPECT_TRUE(bridge->isHibernating());
672 EXPECT_TRUE(bridge->checkSurfaceValid()); 673 EXPECT_TRUE(bridge->checkSurfaceValid());
673 674
674 // Rendering in the background -> temp switch to SW 675 // Rendering in the background -> temp switch to SW
675 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithSwitchToBackgroundRendering)); 676 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithSwitchToBackgroundRendering));
676 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1)); 677 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1));
677 OwnPtr<WebWaitableEvent> switchEvent = adoptPtr(Platform::current()->createW aitableEvent()); 678 OwnPtr<WaitableEvent> switchEvent = adoptPtr(new WaitableEvent());
678 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new RenderingTask(bridge .get(), switchEvent.get())); 679 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new RenderingTask(bridge .get(), switchEvent.get()));
679 switchEvent->wait(); 680 switchEvent->wait();
680 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 681 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
681 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); 682 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer);
682 EXPECT_FALSE(bridge->isAccelerated()); 683 EXPECT_FALSE(bridge->isAccelerated());
683 EXPECT_FALSE(bridge->isHibernating()); 684 EXPECT_FALSE(bridge->isHibernating());
684 EXPECT_TRUE(bridge->checkSurfaceValid()); 685 EXPECT_TRUE(bridge->checkSurfaceValid());
685 686
686 // Unhide 687 // Unhide
687 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1)); 688 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1));
688 OwnPtr<WebWaitableEvent> unhideEvent = adoptPtr(Platform::current()->createW aitableEvent()); 689 OwnPtr<WaitableEvent> unhideEvent = adoptPtr(new WaitableEvent());
689 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, unhideEvent.get())); 690 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, unhideEvent.get()));
690 unhideEvent->wait(); 691 unhideEvent->wait();
691 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 692 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
692 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); 693 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer);
693 EXPECT_TRUE(bridge->isAccelerated()); // Becoming visible causes switch back to GPU 694 EXPECT_TRUE(bridge->isAccelerated()); // Becoming visible causes switch back to GPU
694 EXPECT_FALSE(bridge->isHibernating()); 695 EXPECT_FALSE(bridge->isHibernating());
695 EXPECT_TRUE(bridge->checkSurfaceValid()); 696 EXPECT_TRUE(bridge->checkSurfaceValid());
696 697
697 // Tear down the bridge on the thread so that 'bridge' can go out of scope 698 // Tear down the bridge on the thread so that 'bridge' can go out of scope
698 // without crashing due to thread checks 699 // without crashing due to thread checks
699 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); 700 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber());
700 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 701 OwnPtr<WaitableEvent> bridgeDestroyedEvent = adoptPtr(new WaitableEvent());
701 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 702 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
702 bridgeDestroyedEvent->wait(); 703 bridgeDestroyedEvent->wait();
703 } 704 }
704 705
705 TEST_F(Canvas2DLayerBridgeTest, DisableDeferredRenderingWhileHibernating) 706 TEST_F(Canvas2DLayerBridgeTest, DisableDeferredRenderingWhileHibernating)
706 { 707 {
707 MockCanvasContext mainMock; 708 MockCanvasContext mainMock;
708 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread")); 709 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread"));
709 710
710 // The Canvas2DLayerBridge has to be created on the thread that will use it 711 // The Canvas2DLayerBridge has to be created on the thread that will use it
711 // to avoid WeakPtr thread check issues. 712 // to avoid WeakPtr thread check issues.
712 Canvas2DLayerBridgePtr bridge; 713 Canvas2DLayerBridgePtr bridge;
713 OwnPtr<WebWaitableEvent> bridgeCreatedEvent = adoptPtr(Platform::current()-> createWaitableEvent()); 714 OwnPtr<WaitableEvent> bridgeCreatedEvent = adoptPtr(new WaitableEvent());
714 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get())); 715 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get()));
715 bridgeCreatedEvent->wait(); 716 bridgeCreatedEvent->wait();
716 MockImageBuffer mockImageBuffer; 717 MockImageBuffer mockImageBuffer;
717 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); 718 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber());
718 bridge->setImageBuffer(&mockImageBuffer); 719 bridge->setImageBuffer(&mockImageBuffer);
719 720
720 // Register an alternate Logger for tracking hibernation events 721 // Register an alternate Logger for tracking hibernation events
721 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); 722 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger);
722 MockLogger* mockLoggerPtr = mockLogger.get(); 723 MockLogger* mockLoggerPtr = mockLogger.get();
723 bridge->setLoggerForTesting(mockLogger.release()); 724 bridge->setLoggerForTesting(mockLogger.release());
724 725
725 // Test entering hibernation 726 // Test entering hibernation
726 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 727 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent() );
727 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 728 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
728 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) 729 EXPECT_CALL(*mockLoggerPtr, didStartHibernating())
729 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal)); 730 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent: :signal));
730 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 731 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
731 hibernationStartedEvent->wait(); 732 hibernationStartedEvent->wait();
732 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 733 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
733 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); 734 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer);
734 EXPECT_FALSE(bridge->isAccelerated()); 735 EXPECT_FALSE(bridge->isAccelerated());
735 EXPECT_TRUE(bridge->isHibernating()); 736 EXPECT_TRUE(bridge->isHibernating());
736 EXPECT_TRUE(bridge->checkSurfaceValid()); 737 EXPECT_TRUE(bridge->checkSurfaceValid());
737 738
738 // Disable deferral while background rendering 739 // Disable deferral while background rendering
739 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithSwitchToBackgroundRendering)); 740 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithSwitchToBackgroundRendering));
740 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1)); 741 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1));
741 bridge->disableDeferral(DisableDeferralReasonUnknown); 742 bridge->disableDeferral(DisableDeferralReasonUnknown);
742 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 743 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
743 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); 744 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer);
744 EXPECT_FALSE(bridge->isAccelerated()); 745 EXPECT_FALSE(bridge->isAccelerated());
745 EXPECT_FALSE(bridge->isHibernating()); 746 EXPECT_FALSE(bridge->isHibernating());
746 EXPECT_TRUE(bridge->checkSurfaceValid()); 747 EXPECT_TRUE(bridge->checkSurfaceValid());
747 748
748 // Unhide 749 // Unhide
749 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1)); 750 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1));
750 OwnPtr<WebWaitableEvent> unhideEvent = adoptPtr(Platform::current()->createW aitableEvent()); 751 OwnPtr<WaitableEvent> unhideEvent = adoptPtr(new WaitableEvent());
751 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, unhideEvent.get())); 752 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, unhideEvent.get()));
752 unhideEvent->wait(); 753 unhideEvent->wait();
753 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 754 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
754 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); 755 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer);
755 EXPECT_TRUE(bridge->isAccelerated()); // Becoming visible causes switch back to GPU 756 EXPECT_TRUE(bridge->isAccelerated()); // Becoming visible causes switch back to GPU
756 EXPECT_FALSE(bridge->isHibernating()); 757 EXPECT_FALSE(bridge->isHibernating());
757 EXPECT_TRUE(bridge->checkSurfaceValid()); 758 EXPECT_TRUE(bridge->checkSurfaceValid());
758 759
759 // Tear down the bridge on the thread so that 'bridge' can go out of scope 760 // Tear down the bridge on the thread so that 'bridge' can go out of scope
760 // without crashing due to thread checks 761 // without crashing due to thread checks
761 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); 762 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber());
762 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 763 OwnPtr<WaitableEvent> bridgeDestroyedEvent = adoptPtr(new WaitableEvent());
763 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 764 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
764 bridgeDestroyedEvent->wait(); 765 bridgeDestroyedEvent->wait();
765 } 766 }
766 767
767 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernating) 768 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernating)
768 { 769 {
769 MockCanvasContext mainMock; 770 MockCanvasContext mainMock;
770 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread")); 771 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread"));
771 772
772 // The Canvas2DLayerBridge has to be created on the thread that will use it 773 // The Canvas2DLayerBridge has to be created on the thread that will use it
773 // to avoid WeakPtr thread check issues. 774 // to avoid WeakPtr thread check issues.
774 Canvas2DLayerBridgePtr bridge; 775 Canvas2DLayerBridgePtr bridge;
775 OwnPtr<WebWaitableEvent> bridgeCreatedEvent = adoptPtr(Platform::current()-> createWaitableEvent()); 776 OwnPtr<WaitableEvent> bridgeCreatedEvent = adoptPtr(new WaitableEvent());
776 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get())); 777 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get()));
777 bridgeCreatedEvent->wait(); 778 bridgeCreatedEvent->wait();
778 779
779 // Register an alternate Logger for tracking hibernation events 780 // Register an alternate Logger for tracking hibernation events
780 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); 781 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger);
781 MockLogger* mockLoggerPtr = mockLogger.get(); 782 MockLogger* mockLoggerPtr = mockLogger.get();
782 bridge->setLoggerForTesting(mockLogger.release()); 783 bridge->setLoggerForTesting(mockLogger.release());
783 784
784 // Test entering hibernation 785 // Test entering hibernation
785 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 786 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent() );
786 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 787 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
787 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) 788 EXPECT_CALL(*mockLoggerPtr, didStartHibernating())
788 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal)); 789 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent: :signal));
789 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 790 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
790 hibernationStartedEvent->wait(); 791 hibernationStartedEvent->wait();
791 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 792 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
792 EXPECT_FALSE(bridge->isAccelerated()); 793 EXPECT_FALSE(bridge->isAccelerated());
793 EXPECT_TRUE(bridge->isHibernating()); 794 EXPECT_TRUE(bridge->isHibernating());
794 EXPECT_TRUE(bridge->checkSurfaceValid()); 795 EXPECT_TRUE(bridge->checkSurfaceValid());
795 796
796 // Tear down the bridge while hibernating 797 // Tear down the bridge while hibernating
797 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithTeardown)); 798 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithTeardown));
798 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 799 OwnPtr<WaitableEvent> bridgeDestroyedEvent = adoptPtr(new WaitableEvent());
799 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 800 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
800 bridgeDestroyedEvent->wait(); 801 bridgeDestroyedEvent->wait();
801 802
802 ::testing::Mock::VerifyAndClearExpectations(&mainMock); 803 ::testing::Mock::VerifyAndClearExpectations(&mainMock);
803 } 804 }
804 805
805 class IdleFenceTask : public WebThread::IdleTask { 806 class IdleFenceTask : public WebThread::IdleTask {
806 public: 807 public:
807 IdleFenceTask(WebWaitableEvent* doneEvent) 808 IdleFenceTask(WaitableEvent* doneEvent)
808 : m_doneEvent(doneEvent) 809 : m_doneEvent(doneEvent)
809 { } 810 { }
810 811
811 virtual ~IdleFenceTask() { } 812 virtual ~IdleFenceTask() { }
812 813
813 void run(double /*deadline*/) override 814 void run(double /*deadline*/) override
814 { 815 {
815 m_doneEvent->signal(); 816 m_doneEvent->signal();
816 } 817 }
817 818
818 private: 819 private:
819 WebWaitableEvent* m_doneEvent; 820 WaitableEvent* m_doneEvent;
820 }; 821 };
821 822
822 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernationIsPending) 823 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernationIsPending)
823 { 824 {
824 MockCanvasContext mainMock; 825 MockCanvasContext mainMock;
825 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread")); 826 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread"));
826 827
827 // The Canvas2DLayerBridge has to be created on the thread that will use it 828 // The Canvas2DLayerBridge has to be created on the thread that will use it
828 // to avoid WeakPtr thread check issues. 829 // to avoid WeakPtr thread check issues.
829 Canvas2DLayerBridgePtr bridge; 830 Canvas2DLayerBridgePtr bridge;
830 OwnPtr<WebWaitableEvent> bridgeCreatedEvent = adoptPtr(Platform::current()-> createWaitableEvent()); 831 OwnPtr<WaitableEvent> bridgeCreatedEvent = adoptPtr(new WaitableEvent());
831 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get())); 832 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get()));
832 bridgeCreatedEvent->wait(); 833 bridgeCreatedEvent->wait();
833 834
834 // Register an alternate Logger for tracking hibernation events 835 // Register an alternate Logger for tracking hibernation events
835 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); 836 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger);
836 MockLogger* mockLoggerPtr = mockLogger.get(); 837 MockLogger* mockLoggerPtr = mockLogger.get();
837 bridge->setLoggerForTesting(mockLogger.release()); 838 bridge->setLoggerForTesting(mockLogger.release());
838 839
839 // Test entering hibernation 840 // Test entering hibernation
840 OwnPtr<WebWaitableEvent> hibernationScheduledEvent = adoptPtr(Platform::curr ent()->createWaitableEvent()); 841 OwnPtr<WaitableEvent> hibernationScheduledEvent = adoptPtr(new WaitableEvent ());
841 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 842 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
842 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true, hibernationScheduledEvent.get())); 843 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true, hibernationScheduledEvent.get()));
843 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge)); 844 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge));
844 // In production, we would expect a 845 // In production, we would expect a
845 // HibernationAbortedDueToDestructionWhileHibernatePending event to be 846 // HibernationAbortedDueToDestructionWhileHibernatePending event to be
846 // fired, but that signal is lost in the unit test due to no longer having 847 // fired, but that signal is lost in the unit test due to no longer having
847 // a bridge to hold the mockLogger. 848 // a bridge to hold the mockLogger.
848 hibernationScheduledEvent->wait(); 849 hibernationScheduledEvent->wait();
849 // Once we know the hibernation task is scheduled, we can schedule a fence. 850 // Once we know the hibernation task is scheduled, we can schedule a fence.
850 // Assuming Idle tasks are guaranteed to run in the order they were 851 // Assuming Idle tasks are guaranteed to run in the order they were
851 // submitted, this fence will guarantee the attempt to hibernate runs to 852 // submitted, this fence will guarantee the attempt to hibernate runs to
852 // completion before the thread is destroyed. 853 // completion before the thread is destroyed.
853 // This test passes by not crashing, which proves that the WeakPtr logic 854 // This test passes by not crashing, which proves that the WeakPtr logic
854 // is sound. 855 // is sound.
855 OwnPtr<WebWaitableEvent> fenceEvent = adoptPtr(Platform::current()->createWa itableEvent()); 856 OwnPtr<WaitableEvent> fenceEvent = adoptPtr(new WaitableEvent());
856 testThread->scheduler()->postIdleTask(BLINK_FROM_HERE, new IdleFenceTask(fen ceEvent.get())); 857 testThread->scheduler()->postIdleTask(BLINK_FROM_HERE, new IdleFenceTask(fen ceEvent.get()));
857 fenceEvent->wait(); 858 fenceEvent->wait();
858 859
859 ::testing::Mock::VerifyAndClearExpectations(&mainMock); 860 ::testing::Mock::VerifyAndClearExpectations(&mainMock);
860 } 861 }
861 862
862 class BeginDestroyBridgeTask : public WebTaskRunner::Task { 863 class BeginDestroyBridgeTask : public WebTaskRunner::Task {
863 public: 864 public:
864 BeginDestroyBridgeTask(Canvas2DLayerBridge* bridge) 865 BeginDestroyBridgeTask(Canvas2DLayerBridge* bridge)
865 : m_bridge(bridge) 866 : m_bridge(bridge)
(...skipping 11 matching lines...) Expand all
877 }; 878 };
878 879
879 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToPendingTeardown) 880 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToPendingTeardown)
880 { 881 {
881 MockCanvasContext mainMock; 882 MockCanvasContext mainMock;
882 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread")); 883 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread"));
883 884
884 // The Canvas2DLayerBridge has to be created on the thread that will use it 885 // The Canvas2DLayerBridge has to be created on the thread that will use it
885 // to avoid WeakPtr thread check issues. 886 // to avoid WeakPtr thread check issues.
886 Canvas2DLayerBridgePtr bridge; 887 Canvas2DLayerBridgePtr bridge;
887 OwnPtr<WebWaitableEvent> bridgeCreatedEvent = adoptPtr(Platform::current()-> createWaitableEvent()); 888 OwnPtr<WaitableEvent> bridgeCreatedEvent = adoptPtr(new WaitableEvent());
888 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get())); 889 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get()));
889 bridgeCreatedEvent->wait(); 890 bridgeCreatedEvent->wait();
890 891
891 // Register an alternate Logger for tracking hibernation events 892 // Register an alternate Logger for tracking hibernation events
892 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); 893 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger);
893 MockLogger* mockLoggerPtr = mockLogger.get(); 894 MockLogger* mockLoggerPtr = mockLogger.get();
894 bridge->setLoggerForTesting(mockLogger.release()); 895 bridge->setLoggerForTesting(mockLogger.release());
895 896
896 // Test entering hibernation 897 // Test entering hibernation
897 OwnPtr<WebWaitableEvent> hibernationAbortedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 898 OwnPtr<WaitableEvent> hibernationAbortedEvent = adoptPtr(new WaitableEvent() );
898 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 899 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
899 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationAbortedDueToPendingDestruction)) 900 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationAbortedDueToPendingDestruction))
900 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Web WaitableEvent::signal)); 901 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Wai tableEvent::signal));
901 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 902 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
902 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new BeginDestroyBridgeTa sk(bridge.get())); 903 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new BeginDestroyBridgeTa sk(bridge.get()));
903 hibernationAbortedEvent->wait(); 904 hibernationAbortedEvent->wait();
904 905
905 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 906 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
906 907
907 // Tear down bridge on thread 908 // Tear down bridge on thread
908 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 909 OwnPtr<WaitableEvent> bridgeDestroyedEvent = adoptPtr(new WaitableEvent());
909 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 910 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
910 bridgeDestroyedEvent->wait(); 911 bridgeDestroyedEvent->wait();
911 912
912 ::testing::Mock::VerifyAndClearExpectations(&mainMock); 913 ::testing::Mock::VerifyAndClearExpectations(&mainMock);
913 } 914 }
914 915
915 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToVisibilityChange) 916 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToVisibilityChange)
916 { 917 {
917 MockCanvasContext mainMock; 918 MockCanvasContext mainMock;
918 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread")); 919 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread"));
919 920
920 // 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
921 // to avoid WeakPtr thread check issues. 922 // to avoid WeakPtr thread check issues.
922 Canvas2DLayerBridgePtr bridge; 923 Canvas2DLayerBridgePtr bridge;
923 OwnPtr<WebWaitableEvent> bridgeCreatedEvent = adoptPtr(Platform::current()-> createWaitableEvent()); 924 OwnPtr<WaitableEvent> bridgeCreatedEvent = adoptPtr(new WaitableEvent());
924 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get())); 925 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get()));
925 bridgeCreatedEvent->wait(); 926 bridgeCreatedEvent->wait();
926 927
927 // Register an alternate Logger for tracking hibernation events 928 // Register an alternate Logger for tracking hibernation events
928 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); 929 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger);
929 MockLogger* mockLoggerPtr = mockLogger.get(); 930 MockLogger* mockLoggerPtr = mockLogger.get();
930 bridge->setLoggerForTesting(mockLogger.release()); 931 bridge->setLoggerForTesting(mockLogger.release());
931 932
932 // Test entering hibernation 933 // Test entering hibernation
933 OwnPtr<WebWaitableEvent> hibernationAbortedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 934 OwnPtr<WaitableEvent> hibernationAbortedEvent = adoptPtr(new WaitableEvent() );
934 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 935 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
935 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationAbortedDueToVisibilityChange)) 936 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationAbortedDueToVisibilityChange))
936 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Web WaitableEvent::signal)); 937 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Wai tableEvent::signal));
937 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 938 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
938 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false)); 939 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false));
939 hibernationAbortedEvent->wait(); 940 hibernationAbortedEvent->wait();
940 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 941 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
941 EXPECT_TRUE(bridge->isAccelerated()); 942 EXPECT_TRUE(bridge->isAccelerated());
942 EXPECT_FALSE(bridge->isHibernating()); 943 EXPECT_FALSE(bridge->isHibernating());
943 EXPECT_TRUE(bridge->checkSurfaceValid()); 944 EXPECT_TRUE(bridge->checkSurfaceValid());
944 945
945 // Tear down the bridge on the thread so that 'bridge' can go out of scope 946 // Tear down the bridge on the thread so that 'bridge' can go out of scope
946 // without crashing due to thread checks 947 // without crashing due to thread checks
947 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 948 OwnPtr<WaitableEvent> bridgeDestroyedEvent = adoptPtr(new WaitableEvent());
948 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 949 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
949 bridgeDestroyedEvent->wait(); 950 bridgeDestroyedEvent->wait();
950 951
951 ::testing::Mock::VerifyAndClearExpectations(&mainMock); 952 ::testing::Mock::VerifyAndClearExpectations(&mainMock);
952 } 953 }
953 954
954 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToLostContext) 955 TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToLostContext)
955 { 956 {
956 MockCanvasContext mainMock; 957 MockCanvasContext mainMock;
957 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread")); 958 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread"));
958 959
959 // The Canvas2DLayerBridge has to be created on the thread that will use it 960 // The Canvas2DLayerBridge has to be created on the thread that will use it
960 // to avoid WeakPtr thread check issues. 961 // to avoid WeakPtr thread check issues.
961 Canvas2DLayerBridgePtr bridge; 962 Canvas2DLayerBridgePtr bridge;
962 OwnPtr<WebWaitableEvent> bridgeCreatedEvent = adoptPtr(Platform::current()-> createWaitableEvent()); 963 OwnPtr<WaitableEvent> bridgeCreatedEvent = adoptPtr(new WaitableEvent());
963 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get())); 964 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get()));
964 bridgeCreatedEvent->wait(); 965 bridgeCreatedEvent->wait();
965 966
966 // Register an alternate Logger for tracking hibernation events 967 // Register an alternate Logger for tracking hibernation events
967 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); 968 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger);
968 MockLogger* mockLoggerPtr = mockLogger.get(); 969 MockLogger* mockLoggerPtr = mockLogger.get();
969 bridge->setLoggerForTesting(mockLogger.release()); 970 bridge->setLoggerForTesting(mockLogger.release());
970 971
971 mainMock.fakeContextLost(); 972 mainMock.fakeContextLost();
972 // Test entering hibernation 973 // Test entering hibernation
973 OwnPtr<WebWaitableEvent> hibernationAbortedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 974 OwnPtr<WaitableEvent> hibernationAbortedEvent = adoptPtr(new WaitableEvent() );
974 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 975 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
975 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationAbortedDueGpuContextLoss)) 976 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationAbortedDueGpuContextLoss))
976 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Web WaitableEvent::signal)); 977 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Wai tableEvent::signal));
977 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 978 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
978 hibernationAbortedEvent->wait(); 979 hibernationAbortedEvent->wait();
979 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 980 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
980 EXPECT_FALSE(bridge->isHibernating()); 981 EXPECT_FALSE(bridge->isHibernating());
981 982
982 // Tear down the bridge on the thread so that 'bridge' can go out of scope 983 // Tear down the bridge on the thread so that 'bridge' can go out of scope
983 // without crashing due to thread checks 984 // without crashing due to thread checks
984 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 985 OwnPtr<WaitableEvent> bridgeDestroyedEvent = adoptPtr(new WaitableEvent());
985 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 986 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
986 bridgeDestroyedEvent->wait(); 987 bridgeDestroyedEvent->wait();
987 988
988 ::testing::Mock::VerifyAndClearExpectations(&mainMock); 989 ::testing::Mock::VerifyAndClearExpectations(&mainMock);
989 } 990 }
990 991
991 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileHibernating) 992 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileHibernating)
992 { 993 {
993 MockCanvasContext mainMock; 994 MockCanvasContext mainMock;
994 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread")); 995 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread"));
995 996
996 // The Canvas2DLayerBridge has to be created on the thread that will use it 997 // The Canvas2DLayerBridge has to be created on the thread that will use it
997 // to avoid WeakPtr thread check issues. 998 // to avoid WeakPtr thread check issues.
998 Canvas2DLayerBridgePtr bridge; 999 Canvas2DLayerBridgePtr bridge;
999 OwnPtr<WebWaitableEvent> bridgeCreatedEvent = adoptPtr(Platform::current()-> createWaitableEvent()); 1000 OwnPtr<WaitableEvent> bridgeCreatedEvent = adoptPtr(new WaitableEvent());
1000 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get())); 1001 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get()));
1001 bridgeCreatedEvent->wait(); 1002 bridgeCreatedEvent->wait();
1002 1003
1003 // Register an alternate Logger for tracking hibernation events 1004 // Register an alternate Logger for tracking hibernation events
1004 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); 1005 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger);
1005 MockLogger* mockLoggerPtr = mockLogger.get(); 1006 MockLogger* mockLoggerPtr = mockLogger.get();
1006 bridge->setLoggerForTesting(mockLogger.release()); 1007 bridge->setLoggerForTesting(mockLogger.release());
1007 1008
1008 // Test entering hibernation 1009 // Test entering hibernation
1009 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 1010 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent() );
1010 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 1011 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
1011 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) 1012 EXPECT_CALL(*mockLoggerPtr, didStartHibernating())
1012 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal)); 1013 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent: :signal));
1013 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 1014 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
1014 hibernationStartedEvent->wait(); 1015 hibernationStartedEvent->wait();
1015 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 1016 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
1016 1017
1017 // Test prepareMailbox while hibernating 1018 // Test prepareMailbox while hibernating
1018 WebExternalTextureMailbox mailbox; 1019 WebExternalTextureMailbox mailbox;
1019 EXPECT_FALSE(bridge->prepareMailbox(&mailbox, 0)); 1020 EXPECT_FALSE(bridge->prepareMailbox(&mailbox, 0));
1020 EXPECT_TRUE(bridge->checkSurfaceValid()); 1021 EXPECT_TRUE(bridge->checkSurfaceValid());
1021 1022
1022 // Tear down the bridge on the thread so that 'bridge' can go out of scope 1023 // Tear down the bridge on the thread so that 'bridge' can go out of scope
1023 // without crashing due to thread checks 1024 // without crashing due to thread checks
1024 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithTeardown)); 1025 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithTeardown));
1025 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 1026 OwnPtr<WaitableEvent> bridgeDestroyedEvent = adoptPtr(new WaitableEvent());
1026 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 1027 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
1027 bridgeDestroyedEvent->wait(); 1028 bridgeDestroyedEvent->wait();
1028 } 1029 }
1029 1030
1030 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileBackgroundRendering) 1031 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileBackgroundRendering)
1031 { 1032 {
1032 MockCanvasContext mainMock; 1033 MockCanvasContext mainMock;
1033 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread")); 1034 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread"));
1034 1035
1035 // The Canvas2DLayerBridge has to be created on the thread that will use it 1036 // The Canvas2DLayerBridge has to be created on the thread that will use it
1036 // to avoid WeakPtr thread check issues. 1037 // to avoid WeakPtr thread check issues.
1037 Canvas2DLayerBridgePtr bridge; 1038 Canvas2DLayerBridgePtr bridge;
1038 OwnPtr<WebWaitableEvent> bridgeCreatedEvent = adoptPtr(Platform::current()-> createWaitableEvent()); 1039 OwnPtr<WaitableEvent> bridgeCreatedEvent = adoptPtr(new WaitableEvent());
1039 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get())); 1040 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get()));
1040 bridgeCreatedEvent->wait(); 1041 bridgeCreatedEvent->wait();
1041 1042
1042 // Register an alternate Logger for tracking hibernation events 1043 // Register an alternate Logger for tracking hibernation events
1043 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); 1044 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger);
1044 MockLogger* mockLoggerPtr = mockLogger.get(); 1045 MockLogger* mockLoggerPtr = mockLogger.get();
1045 bridge->setLoggerForTesting(mockLogger.release()); 1046 bridge->setLoggerForTesting(mockLogger.release());
1046 1047
1047 // Test entering hibernation 1048 // Test entering hibernation
1048 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 1049 OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent() );
1049 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 1050 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
1050 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) 1051 EXPECT_CALL(*mockLoggerPtr, didStartHibernating())
1051 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal)); 1052 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent: :signal));
1052 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 1053 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
1053 hibernationStartedEvent->wait(); 1054 hibernationStartedEvent->wait();
1054 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 1055 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
1055 1056
1056 // Rendering in the background -> temp switch to SW 1057 // Rendering in the background -> temp switch to SW
1057 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithSwitchToBackgroundRendering)); 1058 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithSwitchToBackgroundRendering));
1058 OwnPtr<WebWaitableEvent> switchEvent = adoptPtr(Platform::current()->createW aitableEvent()); 1059 OwnPtr<WaitableEvent> switchEvent = adoptPtr(new WaitableEvent());
1059 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new RenderingTask(bridge .get(), switchEvent.get())); 1060 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new RenderingTask(bridge .get(), switchEvent.get()));
1060 switchEvent->wait(); 1061 switchEvent->wait();
1061 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 1062 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
1062 EXPECT_FALSE(bridge->isAccelerated()); 1063 EXPECT_FALSE(bridge->isAccelerated());
1063 EXPECT_FALSE(bridge->isHibernating()); 1064 EXPECT_FALSE(bridge->isHibernating());
1064 EXPECT_TRUE(bridge->checkSurfaceValid()); 1065 EXPECT_TRUE(bridge->checkSurfaceValid());
1065 1066
1066 // Test prepareMailbox while background rendering 1067 // Test prepareMailbox while background rendering
1067 WebExternalTextureMailbox mailbox; 1068 WebExternalTextureMailbox mailbox;
1068 EXPECT_FALSE(bridge->prepareMailbox(&mailbox, 0)); 1069 EXPECT_FALSE(bridge->prepareMailbox(&mailbox, 0));
1069 EXPECT_TRUE(bridge->checkSurfaceValid()); 1070 EXPECT_TRUE(bridge->checkSurfaceValid());
1070 1071
1071 // Tear down the bridge on the thread so that 'bridge' can go out of scope 1072 // Tear down the bridge on the thread so that 'bridge' can go out of scope
1072 // without crashing due to thread checks 1073 // without crashing due to thread checks
1073 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 1074 OwnPtr<WaitableEvent> bridgeDestroyedEvent = adoptPtr(new WaitableEvent());
1074 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 1075 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
1075 bridgeDestroyedEvent->wait(); 1076 bridgeDestroyedEvent->wait();
1076 } 1077 }
1077 1078
1078 } // namespace blink 1079 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698