Chromium Code Reviews| 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/trees/layer_tree_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 2676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2687 FakeContentLayerClient client_; | 2687 FakeContentLayerClient client_; |
| 2688 scoped_refptr<Layer> layer_; | 2688 scoped_refptr<Layer> layer_; |
| 2689 int num_commit_complete_; | 2689 int num_commit_complete_; |
| 2690 int num_draw_layers_; | 2690 int num_draw_layers_; |
| 2691 }; | 2691 }; |
| 2692 | 2692 |
| 2693 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousInvalidate); | 2693 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousInvalidate); |
| 2694 | 2694 |
| 2695 class LayerTreeHostTestDeferCommits : public LayerTreeHostTest { | 2695 class LayerTreeHostTestDeferCommits : public LayerTreeHostTest { |
| 2696 public: | 2696 public: |
| 2697 LayerTreeHostTestDeferCommits() | 2697 LayerTreeHostTestDeferCommits() = default; |
| 2698 : num_will_begin_impl_frame_(0), num_send_begin_main_frame_(0) {} | |
| 2699 | 2698 |
| 2700 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | 2699 void BeginTest() override { |
| 2700 // Start with commits deferred. | |
| 2701 PostSetDeferCommitsToMainThread(true); | |
| 2702 PostSetNeedsCommitToMainThread(); | |
| 2703 } | |
| 2701 | 2704 |
| 2702 void WillBeginImplFrameOnThread(LayerTreeHostImpl* host_impl, | 2705 void WillBeginImplFrameOnThread(LayerTreeHostImpl* host_impl, |
| 2703 const BeginFrameArgs& args) override { | 2706 const BeginFrameArgs& args) override { |
| 2707 // Impl frames happen while commits are deferred. | |
| 2704 num_will_begin_impl_frame_++; | 2708 num_will_begin_impl_frame_++; |
| 2705 switch (num_will_begin_impl_frame_) { | 2709 switch (num_will_begin_impl_frame_) { |
| 2706 case 1: | 2710 case 1: |
| 2707 break; | |
| 2708 case 2: | 2711 case 2: |
| 2709 case 3: | 2712 case 3: |
| 2710 case 4: | 2713 case 4: |
| 2711 // Post a number of frames to increase the chance that, if there exist | 2714 // Post a number of frames to increase the chance that, if there exist |
| 2712 // bugs, an unexpected BeginMainFrame will be issued. | 2715 // bugs, an unexpected BeginMainFrame will be issued. |
| 2713 PostSetNeedsCommitToMainThread(); | 2716 PostSetNeedsCommitToMainThread(); |
| 2714 PostSetNeedsRedrawToMainThread(); | 2717 PostSetNeedsRedrawToMainThread(); |
| 2715 break; | 2718 break; |
| 2716 case 5: | 2719 case 5: |
| 2717 PostSetDeferCommitsToMainThread(false); | 2720 MainThreadTaskRunner()->PostTask( |
| 2721 FROM_HERE, | |
| 2722 // Unretained because the test should not end before allowing | |
| 2723 // commits via this running. | |
| 2724 base::Bind(&LayerTreeHostTestDeferCommits::AllowCommits, | |
| 2725 base::Unretained(this))); | |
| 2718 break; | 2726 break; |
| 2719 default: | 2727 default: |
| 2720 // Sometimes |num_will_begin_impl_frame_| will be greater than 5 if the | 2728 // Sometimes |num_will_begin_impl_frame_| will be greater than 5 if the |
| 2721 // main thread is slow to respond. | 2729 // main thread is slow to respond. |
| 2722 break; | 2730 break; |
| 2723 } | 2731 } |
| 2724 } | 2732 } |
| 2725 | 2733 |
| 2726 void WillBeginMainFrame() override { | 2734 void WillBeginMainFrame() override { |
| 2735 EXPECT_TRUE(allow_commits_); | |
| 2727 num_send_begin_main_frame_++; | 2736 num_send_begin_main_frame_++; |
| 2728 switch (num_send_begin_main_frame_) { | 2737 EndTest(); |
| 2729 case 1: | 2738 } |
| 2730 layer_tree_host()->SetDeferCommits(true); | 2739 |
| 2731 break; | 2740 void AllowCommits() { |
| 2732 case 2: | 2741 allow_commits_ = true; |
| 2733 EndTest(); | 2742 layer_tree_host()->SetDeferCommits(false); |
| 2734 break; | |
| 2735 default: | |
| 2736 NOTREACHED(); | |
| 2737 break; | |
| 2738 } | |
| 2739 } | 2743 } |
| 2740 | 2744 |
| 2741 void AfterTest() override { | 2745 void AfterTest() override { |
| 2742 EXPECT_GE(num_will_begin_impl_frame_, 5); | 2746 EXPECT_GE(num_will_begin_impl_frame_, 5); |
| 2743 EXPECT_EQ(2, num_send_begin_main_frame_); | 2747 EXPECT_EQ(1, num_send_begin_main_frame_); |
| 2744 } | 2748 } |
| 2745 | 2749 |
| 2746 private: | 2750 private: |
| 2747 int num_will_begin_impl_frame_; | 2751 bool allow_commits_ = false; |
| 2748 int num_send_begin_main_frame_; | 2752 int num_will_begin_impl_frame_ = 0; |
| 2753 int num_send_begin_main_frame_ = 0; | |
| 2749 }; | 2754 }; |
| 2750 | 2755 |
| 2751 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestDeferCommits); | 2756 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestDeferCommits); |
| 2752 | 2757 |
| 2758 // This verifies that we can abort a commit inside the main frame, and | |
| 2759 // we don't leave any weird states around if we never allow the commit | |
|
enne (OOO)
2017/03/26 23:50:06
Thanks for testing both of these states. :D
| |
| 2760 // to happen. | |
| 2761 class LayerTreeHostTestDeferCommitsInsideBeginMainFrame | |
| 2762 : public LayerTreeHostTest { | |
| 2763 public: | |
| 2764 LayerTreeHostTestDeferCommitsInsideBeginMainFrame() = default; | |
| 2765 | |
| 2766 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | |
| 2767 | |
| 2768 void WillBeginMainFrame() override { | |
| 2769 ++begin_main_frame_count_; | |
| 2770 if (allow_commits_) | |
| 2771 return; | |
| 2772 | |
| 2773 // This should prevent the commit from happening. | |
| 2774 layer_tree_host()->SetDeferCommits(true); | |
| 2775 // Wait to see if the commit happens. It's possible the deferred | |
|
enne (OOO)
2017/03/26 23:50:06
I looked at TestHooks and LayerTreeTest, but it do
| |
| 2776 // commit happens when it shouldn't but takes long enough that | |
| 2777 // this passes. But it won't fail when it shouldn't. | |
| 2778 MainThreadTaskRunner()->PostDelayedTask( | |
| 2779 FROM_HERE, | |
| 2780 // Unretained because the test doesn't end before this runs. | |
| 2781 base::Bind(&LayerTreeTest::EndTest, base::Unretained(this)), | |
| 2782 base::TimeDelta::FromMilliseconds(100)); | |
| 2783 } | |
| 2784 | |
| 2785 void DidCommit() override { ++commit_count_; } | |
| 2786 | |
| 2787 void AfterTest() override { | |
| 2788 EXPECT_EQ(0, commit_count_); | |
| 2789 EXPECT_EQ(1, begin_main_frame_count_); | |
| 2790 } | |
| 2791 | |
| 2792 private: | |
| 2793 bool allow_commits_ = false; | |
| 2794 int commit_count_ = 0; | |
| 2795 int begin_main_frame_count_ = 0; | |
| 2796 }; | |
| 2797 | |
| 2798 SINGLE_AND_MULTI_THREAD_TEST_F( | |
| 2799 LayerTreeHostTestDeferCommitsInsideBeginMainFrame); | |
| 2800 | |
| 2801 // This verifies that we can abort a commit inside the main frame, and | |
| 2802 // we will finish the commit once it is allowed. | |
| 2803 class LayerTreeHostTestDeferCommitsInsideBeginMainFrameWithCommitAfter | |
| 2804 : public LayerTreeHostTest { | |
| 2805 public: | |
| 2806 LayerTreeHostTestDeferCommitsInsideBeginMainFrameWithCommitAfter() = default; | |
| 2807 | |
| 2808 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | |
| 2809 | |
| 2810 void WillBeginMainFrame() override { | |
| 2811 ++begin_main_frame_count_; | |
| 2812 if (allow_commits_) | |
| 2813 return; | |
| 2814 | |
| 2815 // This should prevent the commit from happening. | |
| 2816 layer_tree_host()->SetDeferCommits(true); | |
| 2817 // Wait to see if the commit happens. It's possible the deferred | |
| 2818 // commit happens when it shouldn't but takes long enough that | |
| 2819 // this passes. But it won't fail when it shouldn't. | |
| 2820 MainThreadTaskRunner()->PostDelayedTask( | |
| 2821 FROM_HERE, | |
| 2822 // Unretained because the test doesn't end before this runs. | |
| 2823 base::Bind( | |
| 2824 &LayerTreeHostTestDeferCommitsInsideBeginMainFrameWithCommitAfter:: | |
| 2825 AllowCommits, | |
| 2826 base::Unretained(this)), | |
| 2827 base::TimeDelta::FromMilliseconds(100)); | |
| 2828 } | |
| 2829 | |
| 2830 void AllowCommits() { | |
| 2831 // Once we've waited and seen that commit did not happen, we | |
| 2832 // allow commits and should see this one go through. | |
| 2833 allow_commits_ = true; | |
| 2834 layer_tree_host()->SetDeferCommits(false); | |
| 2835 } | |
| 2836 | |
| 2837 void DidCommit() override { | |
| 2838 ++commit_count_; | |
| 2839 EXPECT_TRUE(allow_commits_); | |
| 2840 EndTest(); | |
| 2841 } | |
| 2842 | |
| 2843 void AfterTest() override { | |
| 2844 EXPECT_EQ(1, commit_count_); | |
| 2845 EXPECT_EQ(2, begin_main_frame_count_); | |
| 2846 } | |
| 2847 | |
| 2848 private: | |
| 2849 bool allow_commits_ = false; | |
| 2850 int commit_count_ = 0; | |
| 2851 int begin_main_frame_count_ = 0; | |
| 2852 }; | |
| 2853 | |
| 2854 SINGLE_AND_MULTI_THREAD_TEST_F( | |
| 2855 LayerTreeHostTestDeferCommitsInsideBeginMainFrameWithCommitAfter); | |
| 2856 | |
| 2753 class LayerTreeHostTestCompositeImmediatelyStateTransitions | 2857 class LayerTreeHostTestCompositeImmediatelyStateTransitions |
| 2754 : public LayerTreeHostTest { | 2858 : public LayerTreeHostTest { |
| 2755 public: | 2859 public: |
| 2756 enum { | 2860 enum { |
| 2757 kInvalid, | 2861 kInvalid, |
| 2758 kStartedTest, | 2862 kStartedTest, |
| 2759 kStartedImplFrame, | 2863 kStartedImplFrame, |
| 2760 kStartedMainFrame, | 2864 kStartedMainFrame, |
| 2761 kStartedCommit, | 2865 kStartedCommit, |
| 2762 kCompletedCommit, | 2866 kCompletedCommit, |
| (...skipping 4430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7193 | 7297 |
| 7194 private: | 7298 private: |
| 7195 bool first_ = true; | 7299 bool first_ = true; |
| 7196 SkBitmap bitmap_; | 7300 SkBitmap bitmap_; |
| 7197 }; | 7301 }; |
| 7198 | 7302 |
| 7199 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestQueueImageDecodeNonLazy); | 7303 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestQueueImageDecodeNonLazy); |
| 7200 | 7304 |
| 7201 } // namespace | 7305 } // namespace |
| 7202 } // namespace cc | 7306 } // namespace cc |
| OLD | NEW |