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

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

Issue 1652293002: Fix 2D canvas content loss while page is hidden (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update 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
« no previous file with comments | « third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 // Test entering hibernation 475 // Test entering hibernation
476 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 476 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent());
477 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 477 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
478 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) 478 EXPECT_CALL(*mockLoggerPtr, didStartHibernating())
479 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal)); 479 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal));
480 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 480 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
481 hibernationStartedEvent->wait(); 481 hibernationStartedEvent->wait();
482 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 482 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
483 EXPECT_FALSE(bridge->isAccelerated()); 483 EXPECT_FALSE(bridge->isAccelerated());
484 EXPECT_TRUE(bridge->isHibernating()); 484 EXPECT_TRUE(bridge->isHibernating());
485 EXPECT_TRUE(bridge->checkSurfaceValid());
485 486
486 // Test exiting hibernation 487 // Test exiting hibernation
487 OwnPtr<WebWaitableEvent> hibernationEndedEvent = adoptPtr(Platform::current( )->createWaitableEvent()); 488 OwnPtr<WebWaitableEvent> hibernationEndedEvent = adoptPtr(Platform::current( )->createWaitableEvent());
488 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedNormally)); 489 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedNormally));
489 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, hibernationEndedEvent.get())); 490 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, hibernationEndedEvent.get()));
490 hibernationEndedEvent->wait(); 491 hibernationEndedEvent->wait();
491 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 492 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
492 EXPECT_TRUE(bridge->isAccelerated()); 493 EXPECT_TRUE(bridge->isAccelerated());
493 EXPECT_FALSE(bridge->isHibernating()); 494 EXPECT_FALSE(bridge->isHibernating());
495 EXPECT_TRUE(bridge->checkSurfaceValid());
494 496
495 // Tear down the bridge on the thread so that 'bridge' can go out of scope 497 // Tear down the bridge on the thread so that 'bridge' can go out of scope
496 // without crashing due to thread checks 498 // without crashing due to thread checks
497 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 499 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent());
498 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 500 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
499 bridgeDestroyedEvent->wait(); 501 bridgeDestroyedEvent->wait();
500 502
501 ::testing::Mock::VerifyAndClearExpectations(&mainMock); 503 ::testing::Mock::VerifyAndClearExpectations(&mainMock);
502 } 504 }
503 505
(...skipping 22 matching lines...) Expand all
526 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 528 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent());
527 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 529 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
528 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) 530 EXPECT_CALL(*mockLoggerPtr, didStartHibernating())
529 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal)); 531 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal));
530 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 532 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
531 hibernationStartedEvent->wait(); 533 hibernationStartedEvent->wait();
532 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 534 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
533 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); 535 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer);
534 EXPECT_FALSE(bridge->isAccelerated()); 536 EXPECT_FALSE(bridge->isAccelerated());
535 EXPECT_TRUE(bridge->isHibernating()); 537 EXPECT_TRUE(bridge->isHibernating());
538 EXPECT_TRUE(bridge->checkSurfaceValid());
536 539
537 // Test exiting hibernation 540 // Test exiting hibernation
538 OwnPtr<WebWaitableEvent> hibernationEndedEvent = adoptPtr(Platform::current( )->createWaitableEvent()); 541 OwnPtr<WebWaitableEvent> hibernationEndedEvent = adoptPtr(Platform::current( )->createWaitableEvent());
539 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedNormally)); 542 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedNormally));
540 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1)); // Because d eferred rendering is disabled 543 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1)); // Because d eferred rendering is disabled
541 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, hibernationEndedEvent.get())); 544 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, hibernationEndedEvent.get()));
542 hibernationEndedEvent->wait(); 545 hibernationEndedEvent->wait();
543 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 546 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
544 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); 547 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer);
545 EXPECT_TRUE(bridge->isAccelerated()); 548 EXPECT_TRUE(bridge->isAccelerated());
546 EXPECT_FALSE(bridge->isHibernating()); 549 EXPECT_FALSE(bridge->isHibernating());
550 EXPECT_TRUE(bridge->checkSurfaceValid());
547 551
548 // Tear down the bridge on the thread so that 'bridge' can go out of scope 552 // Tear down the bridge on the thread so that 'bridge' can go out of scope
549 // without crashing due to thread checks 553 // without crashing due to thread checks
550 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 554 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent());
551 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 555 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
552 bridgeDestroyedEvent->wait(); 556 bridgeDestroyedEvent->wait();
553 557
554 ::testing::Mock::VerifyAndClearExpectations(&mainMock); 558 ::testing::Mock::VerifyAndClearExpectations(&mainMock);
555 } 559 }
556 560
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 // Test entering hibernation 600 // Test entering hibernation
597 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 601 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent());
598 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 602 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
599 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) 603 EXPECT_CALL(*mockLoggerPtr, didStartHibernating())
600 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal)); 604 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal));
601 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 605 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
602 hibernationStartedEvent->wait(); 606 hibernationStartedEvent->wait();
603 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 607 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
604 EXPECT_FALSE(bridge->isAccelerated()); 608 EXPECT_FALSE(bridge->isAccelerated());
605 EXPECT_TRUE(bridge->isHibernating()); 609 EXPECT_TRUE(bridge->isHibernating());
610 EXPECT_TRUE(bridge->checkSurfaceValid());
606 611
607 // Rendering in the background -> temp switch to SW 612 // Rendering in the background -> temp switch to SW
608 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithSwitchToBackgroundRendering)); 613 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithSwitchToBackgroundRendering));
609 OwnPtr<WebWaitableEvent> switchEvent = adoptPtr(Platform::current()->createW aitableEvent()); 614 OwnPtr<WebWaitableEvent> switchEvent = adoptPtr(Platform::current()->createW aitableEvent());
610 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new RenderingTask(bridge .get(), switchEvent.get())); 615 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new RenderingTask(bridge .get(), switchEvent.get()));
611 switchEvent->wait(); 616 switchEvent->wait();
612 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 617 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
613 EXPECT_FALSE(bridge->isAccelerated()); 618 EXPECT_FALSE(bridge->isAccelerated());
614 EXPECT_FALSE(bridge->isHibernating()); 619 EXPECT_FALSE(bridge->isHibernating());
620 EXPECT_TRUE(bridge->checkSurfaceValid());
615 621
616 // Unhide 622 // Unhide
617 OwnPtr<WebWaitableEvent> unhideEvent = adoptPtr(Platform::current()->createW aitableEvent()); 623 OwnPtr<WebWaitableEvent> unhideEvent = adoptPtr(Platform::current()->createW aitableEvent());
618 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, unhideEvent.get())); 624 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, unhideEvent.get()));
619 unhideEvent->wait(); 625 unhideEvent->wait();
620 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 626 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
621 EXPECT_TRUE(bridge->isAccelerated()); // Becoming visible causes switch back to GPU 627 EXPECT_TRUE(bridge->isAccelerated()); // Becoming visible causes switch back to GPU
622 EXPECT_FALSE(bridge->isHibernating()); 628 EXPECT_FALSE(bridge->isHibernating());
629 EXPECT_TRUE(bridge->checkSurfaceValid());
623 630
624 // Tear down the bridge on the thread so that 'bridge' can go out of scope 631 // Tear down the bridge on the thread so that 'bridge' can go out of scope
625 // without crashing due to thread checks 632 // without crashing due to thread checks
626 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 633 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent());
627 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 634 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
628 bridgeDestroyedEvent->wait(); 635 bridgeDestroyedEvent->wait();
629 636
630 ::testing::Mock::VerifyAndClearExpectations(&mainMock); 637 ::testing::Mock::VerifyAndClearExpectations(&mainMock);
631 } 638 }
632 639
(...skipping 22 matching lines...) Expand all
655 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 662 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent());
656 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 663 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
657 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) 664 EXPECT_CALL(*mockLoggerPtr, didStartHibernating())
658 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal)); 665 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal));
659 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 666 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
660 hibernationStartedEvent->wait(); 667 hibernationStartedEvent->wait();
661 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 668 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
662 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); 669 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer);
663 EXPECT_FALSE(bridge->isAccelerated()); 670 EXPECT_FALSE(bridge->isAccelerated());
664 EXPECT_TRUE(bridge->isHibernating()); 671 EXPECT_TRUE(bridge->isHibernating());
672 EXPECT_TRUE(bridge->checkSurfaceValid());
665 673
666 // Rendering in the background -> temp switch to SW 674 // Rendering in the background -> temp switch to SW
667 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithSwitchToBackgroundRendering)); 675 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithSwitchToBackgroundRendering));
668 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1)); 676 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1));
669 OwnPtr<WebWaitableEvent> switchEvent = adoptPtr(Platform::current()->createW aitableEvent()); 677 OwnPtr<WebWaitableEvent> switchEvent = adoptPtr(Platform::current()->createW aitableEvent());
670 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new RenderingTask(bridge .get(), switchEvent.get())); 678 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new RenderingTask(bridge .get(), switchEvent.get()));
671 switchEvent->wait(); 679 switchEvent->wait();
672 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 680 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
673 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); 681 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer);
674 EXPECT_FALSE(bridge->isAccelerated()); 682 EXPECT_FALSE(bridge->isAccelerated());
675 EXPECT_FALSE(bridge->isHibernating()); 683 EXPECT_FALSE(bridge->isHibernating());
684 EXPECT_TRUE(bridge->checkSurfaceValid());
676 685
677 // Unhide 686 // Unhide
678 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1)); 687 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1));
679 OwnPtr<WebWaitableEvent> unhideEvent = adoptPtr(Platform::current()->createW aitableEvent()); 688 OwnPtr<WebWaitableEvent> unhideEvent = adoptPtr(Platform::current()->createW aitableEvent());
680 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, unhideEvent.get())); 689 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, unhideEvent.get()));
681 unhideEvent->wait(); 690 unhideEvent->wait();
682 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 691 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
683 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); 692 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer);
684 EXPECT_TRUE(bridge->isAccelerated()); // Becoming visible causes switch back to GPU 693 EXPECT_TRUE(bridge->isAccelerated()); // Becoming visible causes switch back to GPU
685 EXPECT_FALSE(bridge->isHibernating()); 694 EXPECT_FALSE(bridge->isHibernating());
695 EXPECT_TRUE(bridge->checkSurfaceValid());
686 696
687 // Tear down the bridge on the thread so that 'bridge' can go out of scope 697 // Tear down the bridge on the thread so that 'bridge' can go out of scope
688 // without crashing due to thread checks 698 // without crashing due to thread checks
689 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); 699 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber());
690 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 700 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent());
691 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 701 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
692 bridgeDestroyedEvent->wait(); 702 bridgeDestroyedEvent->wait();
693 } 703 }
694 704
695 TEST_F(Canvas2DLayerBridgeTest, DisableDeferredRenderingWhileHibernating) 705 TEST_F(Canvas2DLayerBridgeTest, DisableDeferredRenderingWhileHibernating)
(...skipping 20 matching lines...) Expand all
716 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 726 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent());
717 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 727 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
718 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) 728 EXPECT_CALL(*mockLoggerPtr, didStartHibernating())
719 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal)); 729 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal));
720 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 730 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
721 hibernationStartedEvent->wait(); 731 hibernationStartedEvent->wait();
722 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 732 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
723 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); 733 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer);
724 EXPECT_FALSE(bridge->isAccelerated()); 734 EXPECT_FALSE(bridge->isAccelerated());
725 EXPECT_TRUE(bridge->isHibernating()); 735 EXPECT_TRUE(bridge->isHibernating());
736 EXPECT_TRUE(bridge->checkSurfaceValid());
726 737
727 // Disable deferral while background rendering 738 // Disable deferral while background rendering
728 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithSwitchToBackgroundRendering)); 739 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithSwitchToBackgroundRendering));
729 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1)); 740 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1));
730 bridge->disableDeferral(); 741 bridge->disableDeferral();
731 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 742 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
732 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); 743 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer);
733 EXPECT_FALSE(bridge->isAccelerated()); 744 EXPECT_FALSE(bridge->isAccelerated());
734 EXPECT_FALSE(bridge->isHibernating()); 745 EXPECT_FALSE(bridge->isHibernating());
746 EXPECT_TRUE(bridge->checkSurfaceValid());
735 747
736 // Unhide 748 // Unhide
737 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1)); 749 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AtLeast(1));
738 OwnPtr<WebWaitableEvent> unhideEvent = adoptPtr(Platform::current()->createW aitableEvent()); 750 OwnPtr<WebWaitableEvent> unhideEvent = adoptPtr(Platform::current()->createW aitableEvent());
739 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, unhideEvent.get())); 751 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false, unhideEvent.get()));
740 unhideEvent->wait(); 752 unhideEvent->wait();
741 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 753 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
742 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer); 754 ::testing::Mock::VerifyAndClearExpectations(&mockImageBuffer);
743 EXPECT_TRUE(bridge->isAccelerated()); // Becoming visible causes switch back to GPU 755 EXPECT_TRUE(bridge->isAccelerated()); // Becoming visible causes switch back to GPU
744 EXPECT_FALSE(bridge->isHibernating()); 756 EXPECT_FALSE(bridge->isHibernating());
757 EXPECT_TRUE(bridge->checkSurfaceValid());
745 758
746 // Tear down the bridge on the thread so that 'bridge' can go out of scope 759 // Tear down the bridge on the thread so that 'bridge' can go out of scope
747 // without crashing due to thread checks 760 // without crashing due to thread checks
748 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber()); 761 EXPECT_CALL(mockImageBuffer, resetCanvas(_)).Times(AnyNumber());
749 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 762 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent());
750 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 763 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
751 bridgeDestroyedEvent->wait(); 764 bridgeDestroyedEvent->wait();
752 } 765 }
753 766
754 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernating) 767 TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernating)
(...skipping 16 matching lines...) Expand all
771 // Test entering hibernation 784 // Test entering hibernation
772 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 785 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent());
773 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 786 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
774 EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) 787 EXPECT_CALL(*mockLoggerPtr, didStartHibernating())
775 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal)); 788 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal));
776 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 789 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
777 hibernationStartedEvent->wait(); 790 hibernationStartedEvent->wait();
778 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 791 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
779 EXPECT_FALSE(bridge->isAccelerated()); 792 EXPECT_FALSE(bridge->isAccelerated());
780 EXPECT_TRUE(bridge->isHibernating()); 793 EXPECT_TRUE(bridge->isHibernating());
794 EXPECT_TRUE(bridge->checkSurfaceValid());
781 795
782 // Tear down the bridge while hibernating 796 // Tear down the bridge while hibernating
783 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithTeardown)); 797 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithTeardown));
784 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 798 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent());
785 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 799 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
786 bridgeDestroyedEvent->wait(); 800 bridgeDestroyedEvent->wait();
787 801
788 ::testing::Mock::VerifyAndClearExpectations(&mainMock); 802 ::testing::Mock::VerifyAndClearExpectations(&mainMock);
789 } 803 }
790 804
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
919 OwnPtr<WebWaitableEvent> hibernationAbortedEvent = adoptPtr(Platform::curren t()->createWaitableEvent()); 933 OwnPtr<WebWaitableEvent> hibernationAbortedEvent = adoptPtr(Platform::curren t()->createWaitableEvent());
920 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled)); 934 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
921 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationAbortedDueToVisibilityChange)) 935 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationAbortedDueToVisibilityChange))
922 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Web WaitableEvent::signal)); 936 .WillOnce(testing::InvokeWithoutArgs(hibernationAbortedEvent.get(), &Web WaitableEvent::signal));
923 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true)); 937 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
924 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false)); 938 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), false));
925 hibernationAbortedEvent->wait(); 939 hibernationAbortedEvent->wait();
926 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); 940 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
927 EXPECT_TRUE(bridge->isAccelerated()); 941 EXPECT_TRUE(bridge->isAccelerated());
928 EXPECT_FALSE(bridge->isHibernating()); 942 EXPECT_FALSE(bridge->isHibernating());
943 EXPECT_TRUE(bridge->checkSurfaceValid());
929 944
930 // Tear down the bridge on the thread so that 'bridge' can go out of scope 945 // Tear down the bridge on the thread so that 'bridge' can go out of scope
931 // without crashing due to thread checks 946 // without crashing due to thread checks
932 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 947 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent());
933 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 948 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
934 bridgeDestroyedEvent->wait(); 949 bridgeDestroyedEvent->wait();
935 950
936 ::testing::Mock::VerifyAndClearExpectations(&mainMock); 951 ::testing::Mock::VerifyAndClearExpectations(&mainMock);
937 } 952 }
938 953
(...skipping 27 matching lines...) Expand all
966 981
967 // Tear down the bridge on the thread so that 'bridge' can go out of scope 982 // Tear down the bridge on the thread so that 'bridge' can go out of scope
968 // without crashing due to thread checks 983 // without crashing due to thread checks
969 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent()); 984 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent());
970 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get())); 985 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
971 bridgeDestroyedEvent->wait(); 986 bridgeDestroyedEvent->wait();
972 987
973 ::testing::Mock::VerifyAndClearExpectations(&mainMock); 988 ::testing::Mock::VerifyAndClearExpectations(&mainMock);
974 } 989 }
975 990
991 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileHibernating)
992 {
993 MockCanvasContext mainMock;
994 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread"));
995
996 // The Canvas2DLayerBridge has to be created on the thread that will use it
997 // to avoid WeakPtr thread check issues.
998 Canvas2DLayerBridgePtr bridge;
999 OwnPtr<WebWaitableEvent> bridgeCreatedEvent = adoptPtr(Platform::current()-> createWaitableEvent());
1000 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get()));
1001 bridgeCreatedEvent->wait();
1002
1003 // Register an alternate Logger for tracking hibernation events
1004 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger);
1005 MockLogger* mockLoggerPtr = mockLogger.get();
1006 bridge->setLoggerForTesting(mockLogger.release());
1007
1008 // Test entering hibernation
1009 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent());
1010 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
1011 EXPECT_CALL(*mockLoggerPtr, didStartHibernating())
1012 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal));
1013 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
1014 hibernationStartedEvent->wait();
1015 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
1016
1017 // Test prepareMailbox while hibernating
1018 WebExternalTextureMailbox mailbox;
1019 EXPECT_FALSE(bridge->prepareMailbox(&mailbox, 0));
1020 EXPECT_TRUE(bridge->checkSurfaceValid());
1021
1022 // Tear down the bridge on the thread so that 'bridge' can go out of scope
1023 // without crashing due to thread checks
1024 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithTeardown));
1025 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent());
1026 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
1027 bridgeDestroyedEvent->wait();
1028 }
1029
1030 TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileBackgroundRendering)
1031 {
1032 MockCanvasContext mainMock;
1033 OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("T estThread"));
1034
1035 // The Canvas2DLayerBridge has to be created on the thread that will use it
1036 // to avoid WeakPtr thread check issues.
1037 Canvas2DLayerBridgePtr bridge;
1038 OwnPtr<WebWaitableEvent> bridgeCreatedEvent = adoptPtr(Platform::current()-> createWaitableEvent());
1039 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new CreateBridgeTask(&br idge, &mainMock, this, bridgeCreatedEvent.get()));
1040 bridgeCreatedEvent->wait();
1041
1042 // Register an alternate Logger for tracking hibernation events
1043 OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger);
1044 MockLogger* mockLoggerPtr = mockLogger.get();
1045 bridge->setLoggerForTesting(mockLogger.release());
1046
1047 // Test entering hibernation
1048 OwnPtr<WebWaitableEvent> hibernationStartedEvent = adoptPtr(Platform::curren t()->createWaitableEvent());
1049 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationScheduled));
1050 EXPECT_CALL(*mockLoggerPtr, didStartHibernating())
1051 .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WebWaitableEve nt::signal));
1052 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new SetIsHiddenTask(brid ge.get(), true));
1053 hibernationStartedEvent->wait();
1054 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
1055
1056 // Rendering in the background -> temp switch to SW
1057 EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::Hibe rnationEndedWithSwitchToBackgroundRendering));
1058 OwnPtr<WebWaitableEvent> switchEvent = adoptPtr(Platform::current()->createW aitableEvent());
1059 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new RenderingTask(bridge .get(), switchEvent.get()));
1060 switchEvent->wait();
1061 ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr);
1062 EXPECT_FALSE(bridge->isAccelerated());
1063 EXPECT_FALSE(bridge->isHibernating());
1064 EXPECT_TRUE(bridge->checkSurfaceValid());
1065
1066 // Test prepareMailbox while background rendering
1067 WebExternalTextureMailbox mailbox;
1068 EXPECT_FALSE(bridge->prepareMailbox(&mailbox, 0));
1069 EXPECT_TRUE(bridge->checkSurfaceValid());
1070
1071 // Tear down the bridge on the thread so that 'bridge' can go out of scope
1072 // without crashing due to thread checks
1073 OwnPtr<WebWaitableEvent> bridgeDestroyedEvent = adoptPtr(Platform::current() ->createWaitableEvent());
1074 testThread->taskRunner()->postTask(BLINK_FROM_HERE, new DestroyBridgeTask(&b ridge, bridgeDestroyedEvent.get()));
1075 bridgeDestroyedEvent->wait();
1076 }
1077
976 } // namespace blink 1078 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698