| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/scheduler/begin_frame_source.h" | 5 #include "cc/scheduler/begin_frame_source.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/test/test_simple_task_runner.h" | 10 #include "base/test/test_simple_task_runner.h" |
| (...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 543 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); | 543 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); |
| 544 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 544 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); |
| 545 // Sequence number is incremented again, because the missed frame has | 545 // Sequence number is incremented again, because the missed frame has |
| 546 // different time/interval. | 546 // different time/interval. |
| 547 EXPECT_BEGIN_FRAME_USED_MISSED(obs, source_->source_id(), 3, 10000, 20000, | 547 EXPECT_BEGIN_FRAME_USED_MISSED(obs, source_->source_id(), 3, 10000, 20000, |
| 548 10000); | 548 10000); |
| 549 source_->AddObserver(&obs); | 549 source_->AddObserver(&obs); |
| 550 source_->RemoveObserver(&obs); | 550 source_->RemoveObserver(&obs); |
| 551 } | 551 } |
| 552 | 552 |
| 553 // BeginFrameObserverAckTracker testing ---------------------------------------- | |
| 554 class TestBeginFrameConsumer : public BeginFrameObserverBase { | |
| 555 private: | |
| 556 bool OnBeginFrameDerivedImpl(const BeginFrameArgs& args) override { | |
| 557 // Consume the args. | |
| 558 return true; | |
| 559 } | |
| 560 void OnBeginFrameSourcePausedChanged(bool paused) override {} | |
| 561 }; | |
| 562 | |
| 563 // Use EXPECT_TRUE instead of EXPECT_EQ for |finished| and |damage| as gcc 4.7 | |
| 564 // issues the following warning on EXPECT_EQ(false, x), which is turned into an | |
| 565 // error with -Werror=conversion-null: | |
| 566 // | |
| 567 // converting 'false' to pointer type for argument 1 of | |
| 568 // 'char testing::internal::IsNullLiteralHelper(testing::internal::Secret*)' | |
| 569 #define EXPECT_ACK_TRACKER_STATE(finished, damage, latest_confirmed) \ | |
| 570 EXPECT_TRUE(finished == tracker_->AllObserversFinishedFrame()) \ | |
| 571 << "expected: " << finished; \ | |
| 572 EXPECT_TRUE(damage == tracker_->AnyObserversHadDamage()) << "expected: " \ | |
| 573 << damage; \ | |
| 574 EXPECT_EQ(latest_confirmed, tracker_->LatestConfirmedSequenceNumber()) | |
| 575 | |
| 576 class BeginFrameObserverAckTrackerTest : public ::testing::Test { | |
| 577 public: | |
| 578 BeginFrameArgs current_args_; | |
| 579 std::unique_ptr<BeginFrameObserverAckTracker> tracker_; | |
| 580 TestBeginFrameConsumer obs1_; | |
| 581 TestBeginFrameConsumer obs2_; | |
| 582 | |
| 583 void SetUp() override { | |
| 584 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1); | |
| 585 tracker_.reset(new BeginFrameObserverAckTracker()); | |
| 586 } | |
| 587 }; | |
| 588 | |
| 589 TEST_F(BeginFrameObserverAckTrackerTest, CorrectnessWithoutObservers) { | |
| 590 // Check initial state. | |
| 591 EXPECT_ACK_TRACKER_STATE(true, false, 1u); | |
| 592 | |
| 593 // A new BeginFrame is immediately finished and confirmed. | |
| 594 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 2); | |
| 595 tracker_->OnBeginFrame(current_args_); | |
| 596 EXPECT_ACK_TRACKER_STATE(true, false, 2u); | |
| 597 } | |
| 598 | |
| 599 TEST_F(BeginFrameObserverAckTrackerTest, CorrectnessWith1Observer) { | |
| 600 // Check initial state. | |
| 601 EXPECT_ACK_TRACKER_STATE(true, false, 1u); | |
| 602 | |
| 603 // After adding an observer, the BeginFrame is not finished or confirmed. | |
| 604 tracker_->OnObserverAdded(&obs1_); | |
| 605 EXPECT_ACK_TRACKER_STATE(false, false, 0u); // up to date to previous frame. | |
| 606 | |
| 607 // On removing it, the BeginFrame is back to original state. | |
| 608 tracker_->OnObserverRemoved(&obs1_); | |
| 609 EXPECT_ACK_TRACKER_STATE(true, false, 1u); | |
| 610 | |
| 611 // After adding it back, the BeginFrame is again not finished or confirmed. | |
| 612 tracker_->OnObserverAdded(&obs1_); | |
| 613 EXPECT_ACK_TRACKER_STATE(false, false, 0u); // up to date to previous frame. | |
| 614 | |
| 615 // When the observer finishes and confirms, the BeginFrame is finished | |
| 616 // and confirmed. | |
| 617 obs1_.OnBeginFrame(current_args_); | |
| 618 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 1, 1, false)); | |
| 619 EXPECT_ACK_TRACKER_STATE(true, false, 1u); | |
| 620 | |
| 621 // A new BeginFrame is initially not finished or confirmed. | |
| 622 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 2); | |
| 623 tracker_->OnBeginFrame(current_args_); | |
| 624 EXPECT_ACK_TRACKER_STATE(false, false, 1u); | |
| 625 | |
| 626 // Stray ACK for an old BeginFrame is ignored. | |
| 627 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 1, 1, false)); | |
| 628 EXPECT_ACK_TRACKER_STATE(false, false, 1u); | |
| 629 | |
| 630 // When the observer finishes but doesn't confirm, the BeginFrame is finished | |
| 631 // but not confirmed. | |
| 632 obs1_.OnBeginFrame(current_args_); | |
| 633 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 2, 1, false)); | |
| 634 EXPECT_ACK_TRACKER_STATE(true, false, 1u); | |
| 635 | |
| 636 // Damage from ACK propagates. | |
| 637 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 3); | |
| 638 tracker_->OnBeginFrame(current_args_); | |
| 639 EXPECT_ACK_TRACKER_STATE(false, false, 1u); | |
| 640 obs1_.OnBeginFrame(current_args_); | |
| 641 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 3, 3, true)); | |
| 642 EXPECT_ACK_TRACKER_STATE(true, true, 3u); | |
| 643 | |
| 644 // Removing an out-of-date observer confirms the latest BeginFrame. | |
| 645 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 4); | |
| 646 tracker_->OnBeginFrame(current_args_); | |
| 647 EXPECT_ACK_TRACKER_STATE(false, false, 3u); | |
| 648 obs1_.OnBeginFrame(current_args_); | |
| 649 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 4, 3, false)); | |
| 650 EXPECT_ACK_TRACKER_STATE(true, false, 3u); | |
| 651 tracker_->OnObserverRemoved(&obs1_); | |
| 652 EXPECT_ACK_TRACKER_STATE(true, false, 4u); | |
| 653 } | |
| 654 | |
| 655 TEST_F(BeginFrameObserverAckTrackerTest, CorrectnessWith2Observers) { | |
| 656 // Check initial state. | |
| 657 EXPECT_ACK_TRACKER_STATE(true, false, 1u); | |
| 658 | |
| 659 // After adding observers, the BeginFrame is not finished or confirmed. | |
| 660 tracker_->OnObserverAdded(&obs1_); | |
| 661 EXPECT_ACK_TRACKER_STATE(false, false, 0u); // up to date to previous frame. | |
| 662 tracker_->OnObserverAdded(&obs2_); | |
| 663 EXPECT_ACK_TRACKER_STATE(false, false, 0u); // up to date to previous frame. | |
| 664 | |
| 665 // Removing one of them changes nothing. Same for adding back. | |
| 666 tracker_->OnObserverRemoved(&obs1_); | |
| 667 EXPECT_ACK_TRACKER_STATE(false, false, 0u); | |
| 668 tracker_->OnObserverAdded(&obs1_); | |
| 669 EXPECT_ACK_TRACKER_STATE(false, false, 0u); | |
| 670 | |
| 671 // When one observer finishes and confirms, nothing changes. | |
| 672 obs1_.OnBeginFrame(current_args_); | |
| 673 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 1, 1, false)); | |
| 674 EXPECT_ACK_TRACKER_STATE(false, false, 0u); | |
| 675 // When both finish and confirm, the BeginFrame is finished and confirmed. | |
| 676 obs2_.OnBeginFrame(current_args_); | |
| 677 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 1, 1, false)); | |
| 678 EXPECT_ACK_TRACKER_STATE(true, false, 1u); | |
| 679 | |
| 680 // A new BeginFrame is not finished or confirmed. | |
| 681 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 2); | |
| 682 tracker_->OnBeginFrame(current_args_); | |
| 683 EXPECT_ACK_TRACKER_STATE(false, false, 1u); | |
| 684 | |
| 685 // When both observers finish but only one confirms, the BeginFrame is | |
| 686 // finished but not confirmed. | |
| 687 obs1_.OnBeginFrame(current_args_); | |
| 688 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 2, 2, false)); | |
| 689 EXPECT_ACK_TRACKER_STATE(false, false, 1u); | |
| 690 obs2_.OnBeginFrame(current_args_); | |
| 691 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 2, 1, false)); | |
| 692 EXPECT_ACK_TRACKER_STATE(true, false, 1u); | |
| 693 | |
| 694 // With reversed confirmations in the next ACKs, the latest confirmed frame | |
| 695 // increases but the latest BeginFrame remains unconfirmed. | |
| 696 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 3); | |
| 697 tracker_->OnBeginFrame(current_args_); | |
| 698 EXPECT_ACK_TRACKER_STATE(false, false, 1u); | |
| 699 obs1_.OnBeginFrame(current_args_); | |
| 700 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 3, 2, false)); | |
| 701 EXPECT_ACK_TRACKER_STATE(false, false, 1u); | |
| 702 obs2_.OnBeginFrame(current_args_); | |
| 703 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 3, 3, false)); | |
| 704 EXPECT_ACK_TRACKER_STATE(true, false, 2u); | |
| 705 | |
| 706 // Only a single ACK with damage suffices. | |
| 707 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 4); | |
| 708 tracker_->OnBeginFrame(current_args_); | |
| 709 EXPECT_ACK_TRACKER_STATE(false, false, 2u); | |
| 710 obs1_.OnBeginFrame(current_args_); | |
| 711 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 4, 4, true)); | |
| 712 EXPECT_ACK_TRACKER_STATE(false, true, 3u); | |
| 713 obs2_.OnBeginFrame(current_args_); | |
| 714 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 4, 4, false)); | |
| 715 EXPECT_ACK_TRACKER_STATE(true, true, 4u); | |
| 716 | |
| 717 // Removing the damaging observer makes no difference in this case. | |
| 718 tracker_->OnObserverRemoved(&obs1_); | |
| 719 EXPECT_ACK_TRACKER_STATE(true, true, 4u); | |
| 720 | |
| 721 // Adding the observer back considers it up to date up to the current | |
| 722 // BeginFrame, because it is the last used one. Thus, the current BeginFrame | |
| 723 // is still finished, too. | |
| 724 tracker_->OnObserverAdded(&obs1_); | |
| 725 EXPECT_ACK_TRACKER_STATE(true, true, 4u); | |
| 726 | |
| 727 // Adding the observer back after the next BeginFrame considers it up to date | |
| 728 // up to last BeginFrame only. | |
| 729 tracker_->OnObserverRemoved(&obs1_); | |
| 730 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 5); | |
| 731 tracker_->OnBeginFrame(current_args_); | |
| 732 tracker_->OnObserverAdded(&obs1_); | |
| 733 EXPECT_ACK_TRACKER_STATE(false, false, 4u); | |
| 734 // Both observers need to finish for the BeginFrame to be finished. | |
| 735 obs1_.OnBeginFrame(current_args_); | |
| 736 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 5, 5, false)); | |
| 737 EXPECT_ACK_TRACKER_STATE(false, false, 4u); | |
| 738 obs2_.OnBeginFrame(current_args_); | |
| 739 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 5, 5, false)); | |
| 740 EXPECT_ACK_TRACKER_STATE(true, false, 5u); | |
| 741 } | |
| 742 | |
| 743 TEST_F(BeginFrameObserverAckTrackerTest, ChangingSourceIdOnBeginFrame) { | |
| 744 // Check initial state. | |
| 745 EXPECT_ACK_TRACKER_STATE(true, false, 1u); | |
| 746 | |
| 747 // Changing source id without observer updates confirmed BeginFrame. | |
| 748 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 1, 10); | |
| 749 tracker_->OnBeginFrame(current_args_); | |
| 750 EXPECT_ACK_TRACKER_STATE(true, false, 10u); | |
| 751 | |
| 752 // Setup an observer for current BeginFrame. | |
| 753 tracker_->OnObserverAdded(&obs1_); | |
| 754 EXPECT_ACK_TRACKER_STATE(false, false, 9u); // up to date to previous frame. | |
| 755 obs1_.OnBeginFrame(current_args_); | |
| 756 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(1, 10, 10, true)); | |
| 757 EXPECT_ACK_TRACKER_STATE(true, true, 10u); | |
| 758 | |
| 759 // Changing source id with an observer sets confirmed BeginFrame to invalid. | |
| 760 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 2, 20); | |
| 761 tracker_->OnBeginFrame(current_args_); | |
| 762 EXPECT_ACK_TRACKER_STATE(false, false, BeginFrameArgs::kInvalidFrameNumber); | |
| 763 } | |
| 764 | |
| 765 // ExternalBeginFrameSource testing -------------------------------------------- | 553 // ExternalBeginFrameSource testing -------------------------------------------- |
| 766 class MockExternalBeginFrameSourceClient | 554 class MockExternalBeginFrameSourceClient |
| 767 : public ExternalBeginFrameSourceClient { | 555 : public ExternalBeginFrameSourceClient { |
| 768 public: | 556 public: |
| 769 MOCK_METHOD1(OnNeedsBeginFrames, void(bool)); | 557 MOCK_METHOD1(OnNeedsBeginFrames, void(bool)); |
| 770 MOCK_METHOD1(OnDidFinishFrame, void(const BeginFrameAck&)); | |
| 771 }; | 558 }; |
| 772 | 559 |
| 773 class ExternalBeginFrameSourceTest : public ::testing::Test { | 560 class ExternalBeginFrameSourceTest : public ::testing::Test { |
| 774 public: | 561 public: |
| 775 std::unique_ptr<MockExternalBeginFrameSourceClient> client_; | 562 std::unique_ptr<MockExternalBeginFrameSourceClient> client_; |
| 776 std::unique_ptr<ExternalBeginFrameSource> source_; | 563 std::unique_ptr<ExternalBeginFrameSource> source_; |
| 777 std::unique_ptr<MockBeginFrameObserver> obs_; | 564 std::unique_ptr<MockBeginFrameObserver> obs_; |
| 778 | 565 |
| 779 void SetUp() override { | 566 void SetUp() override { |
| 780 client_.reset(new MockExternalBeginFrameSourceClient); | 567 client_.reset(new MockExternalBeginFrameSourceClient); |
| 781 source_.reset(new ExternalBeginFrameSource(client_.get())); | 568 source_.reset(new ExternalBeginFrameSource(client_.get())); |
| 782 obs_.reset(new MockBeginFrameObserver); | 569 obs_.reset(new MockBeginFrameObserver); |
| 783 } | 570 } |
| 784 | 571 |
| 785 void TearDown() override { | 572 void TearDown() override { |
| 786 client_.reset(); | 573 client_.reset(); |
| 787 obs_.reset(); | 574 obs_.reset(); |
| 788 } | 575 } |
| 789 }; | 576 }; |
| 790 | 577 |
| 791 TEST_F(ExternalBeginFrameSourceTest, CallsOnDidFinishFrameWithoutObservers) { | |
| 792 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 2, false))) | |
| 793 .Times(1); | |
| 794 source_->OnBeginFrame(CreateBeginFrameArgsForTesting( | |
| 795 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000))); | |
| 796 } | |
| 797 | |
| 798 TEST_F(ExternalBeginFrameSourceTest, | |
| 799 CallsOnDidFinishFrameWhenObserverFinishes) { | |
| 800 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | |
| 801 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1); | |
| 802 source_->AddObserver(obs_.get()); | |
| 803 | |
| 804 BeginFrameArgs args = CreateBeginFrameArgsForTesting( | |
| 805 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000)); | |
| 806 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args); | |
| 807 source_->OnBeginFrame(args); | |
| 808 | |
| 809 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 2, true))) | |
| 810 .Times(1); | |
| 811 source_->DidFinishFrame(obs_.get(), BeginFrameAck(0, 2, 2, true)); | |
| 812 | |
| 813 args = CreateBeginFrameArgsForTesting( | |
| 814 BEGINFRAME_FROM_HERE, 0, 3, base::TimeTicks::FromInternalValue(20000)); | |
| 815 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args); | |
| 816 source_->OnBeginFrame(args); | |
| 817 | |
| 818 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 3, 2, false))) | |
| 819 .Times(1); | |
| 820 source_->DidFinishFrame(obs_.get(), BeginFrameAck(0, 3, 2, false)); | |
| 821 } | |
| 822 | |
| 823 TEST_F(ExternalBeginFrameSourceTest, | |
| 824 CallsOnDidFinishFrameWhenObserverDropsBeginFrame) { | |
| 825 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | |
| 826 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1); | |
| 827 source_->AddObserver(obs_.get()); | |
| 828 | |
| 829 BeginFrameArgs args = CreateBeginFrameArgsForTesting( | |
| 830 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000)); | |
| 831 EXPECT_BEGIN_FRAME_ARGS_DROP(*obs_, args); | |
| 832 source_->OnBeginFrame(args); | |
| 833 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 0, false))) | |
| 834 .Times(1); | |
| 835 source_->DidFinishFrame(obs_.get(), BeginFrameAck(0, 2, 0, false)); | |
| 836 } | |
| 837 | |
| 838 TEST_F(ExternalBeginFrameSourceTest, CallsOnDidFinishFrameWhenObserverRemoved) { | |
| 839 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | |
| 840 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1); | |
| 841 source_->AddObserver(obs_.get()); | |
| 842 | |
| 843 BeginFrameArgs args = CreateBeginFrameArgsForTesting( | |
| 844 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000)); | |
| 845 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args); | |
| 846 source_->OnBeginFrame(args); | |
| 847 | |
| 848 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 2, false))) | |
| 849 .Times(1); | |
| 850 EXPECT_CALL((*client_), OnNeedsBeginFrames(false)).Times(1); | |
| 851 source_->RemoveObserver(obs_.get()); | |
| 852 } | |
| 853 | |
| 854 // https://crbug.com/690127: Duplicate BeginFrame caused DCHECK crash. | 578 // https://crbug.com/690127: Duplicate BeginFrame caused DCHECK crash. |
| 855 TEST_F(ExternalBeginFrameSourceTest, OnBeginFrameChecksBeginFrameContinuity) { | 579 TEST_F(ExternalBeginFrameSourceTest, OnBeginFrameChecksBeginFrameContinuity) { |
| 856 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 580 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 857 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1); | 581 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1); |
| 858 source_->AddObserver(obs_.get()); | 582 source_->AddObserver(obs_.get()); |
| 859 | 583 |
| 860 BeginFrameArgs args = CreateBeginFrameArgsForTesting( | 584 BeginFrameArgs args = CreateBeginFrameArgsForTesting( |
| 861 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000)); | 585 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000)); |
| 862 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args); | 586 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args); |
| 863 source_->OnBeginFrame(args); | 587 source_->OnBeginFrame(args); |
| 864 | 588 |
| 865 // Providing same args again to OnBeginFrame() should not notify observer. | 589 // Providing same args again to OnBeginFrame() should not notify observer. |
| 866 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 0, false))) | |
| 867 .Times(1); | |
| 868 source_->OnBeginFrame(args); | 590 source_->OnBeginFrame(args); |
| 869 | 591 |
| 870 // Providing same args through a different ExternalBeginFrameSource also does | 592 // Providing same args through a different ExternalBeginFrameSource also does |
| 871 // not notify observer. | 593 // not notify observer. |
| 872 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 594 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 873 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1); | 595 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1); |
| 874 ExternalBeginFrameSource source2(client_.get()); | 596 ExternalBeginFrameSource source2(client_.get()); |
| 875 source2.AddObserver(obs_.get()); | 597 source2.AddObserver(obs_.get()); |
| 876 source2.OnBeginFrame(args); | 598 source2.OnBeginFrame(args); |
| 877 } | 599 } |
| 878 | 600 |
| 879 } // namespace | 601 } // namespace |
| 880 } // namespace cc | 602 } // namespace cc |
| OLD | NEW |