| // Copyright 2015 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "cc/trees/threaded_channel.h" | 
 |  | 
 | #include "base/macros.h" | 
 | #include "base/memory/ptr_util.h" | 
 | #include "cc/animation/animation_events.h" | 
 | #include "cc/test/layer_tree_test.h" | 
 | #include "cc/trees/single_thread_proxy.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | namespace cc { | 
 |  | 
 | // The ThreadedChannel tests are run only for threaded and direct mode. | 
 | class ThreadedChannelTest : public LayerTreeTest { | 
 |  protected: | 
 |   ThreadedChannelTest() : calls_received_(0) {} | 
 |  | 
 |   ~ThreadedChannelTest() override {} | 
 |  | 
 |   void BeginTest() override { | 
 |     DCHECK(HasImplThread()); | 
 |     BeginChannelTest(); | 
 |   }; | 
 |   virtual void BeginChannelTest() {} | 
 |  | 
 |   void PostOnImplThread() { | 
 |     ImplThreadTaskRunner()->PostTask( | 
 |         FROM_HERE, base::Bind(&ThreadedChannelTest::StartTestOnImplThread, | 
 |                               base::Unretained(this))); | 
 |   } | 
 |  | 
 |   virtual void StartTestOnImplThread() { | 
 |     DCHECK(task_runner_provider()->IsImplThread()); | 
 |   } | 
 |  | 
 |   void AfterTest() override {} | 
 |  | 
 |   int calls_received_; | 
 |  | 
 |  private: | 
 |   DISALLOW_COPY_AND_ASSIGN(ThreadedChannelTest); | 
 | }; | 
 |  | 
 | class ThreadedChannelTestInitializationAndShutdown | 
 |     : public ThreadedChannelTest { | 
 |   void SetVisibleOnImpl(bool visible) override { calls_received_++; } | 
 |  | 
 |   void ReceivedRequestNewOutputSurface() override { calls_received_++; } | 
 |  | 
 |   void InitializeOutputSurfaceOnImpl(OutputSurface* output_surface) override { | 
 |     calls_received_++; | 
 |   } | 
 |  | 
 |   void ReceivedSetRendererCapabilitiesMainCopy( | 
 |       const RendererCapabilities& capabilities) override { | 
 |     calls_received_++; | 
 |   } | 
 |  | 
 |   void ReceivedDidInitializeOutputSurface( | 
 |       bool success, | 
 |       const RendererCapabilities& capabilities) override { | 
 |     calls_received_++; | 
 |     EndTest(); | 
 |   } | 
 |  | 
 |   void FinishGLOnImpl() override { calls_received_++; } | 
 |  | 
 |   void AfterTest() override { EXPECT_EQ(6, calls_received_); } | 
 | }; | 
 |  | 
 | MULTI_THREAD_DIRECT_RENDERER_TEST_F( | 
 |     ThreadedChannelTestInitializationAndShutdown); | 
 |  | 
 | class ThreadedChannelTestTopControlsState : public ThreadedChannelTest { | 
 |   void BeginChannelTest() override { | 
 |     proxy()->UpdateTopControlsState(TopControlsState::BOTH, | 
 |                                     TopControlsState::BOTH, true); | 
 |   } | 
 |  | 
 |   void UpdateTopControlsStateOnImpl(TopControlsState constraints, | 
 |                                     TopControlsState current, | 
 |                                     bool animate) override { | 
 |     calls_received_++; | 
 |     EndTest(); | 
 |   } | 
 |  | 
 |   void AfterTest() override { EXPECT_EQ(1, calls_received_); } | 
 | }; | 
 |  | 
 | MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestTopControlsState); | 
 |  | 
 | class ThreadedChannelTestMainThreadStoppedFlinging | 
 |     : public ThreadedChannelTest { | 
 |   void BeginChannelTest() override { proxy()->MainThreadHasStoppedFlinging(); } | 
 |  | 
 |   void MainThreadHasStoppedFlingingOnImpl() override { | 
 |     calls_received_++; | 
 |     EndTest(); | 
 |   } | 
 |  | 
 |   void AfterTest() override { EXPECT_EQ(1, calls_received_); } | 
 | }; | 
 |  | 
 | MULTI_THREAD_DIRECT_RENDERER_TEST_F( | 
 |     ThreadedChannelTestMainThreadStoppedFlinging); | 
 |  | 
 | class ThreadedChannelTestDeferCommits : public ThreadedChannelTest { | 
 |   void BeginChannelTest() override { DispatchSetDeferCommits(true); } | 
 |  | 
 |   void SetDeferCommitsOnImpl(bool defer_commits) override { | 
 |     ASSERT_TRUE(defer_commits); | 
 |     calls_received_++; | 
 |     EndTest(); | 
 |   } | 
 |  | 
 |   void AfterTest() override { EXPECT_EQ(1, calls_received_); } | 
 | }; | 
 |  | 
 | MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestDeferCommits); | 
 |  | 
 | class ThreadedChannelTestInputThrottled : public ThreadedChannelTest { | 
 |   void BeginChannelTest() override { | 
 |     proxy()->NotifyInputThrottledUntilCommit(); | 
 |   } | 
 |  | 
 |   void SetInputThrottledUntilCommitOnImpl(bool is_throttled) override { | 
 |     calls_received_++; | 
 |     EndTest(); | 
 |   } | 
 |  | 
 |   void AfterTest() override { EXPECT_EQ(1, calls_received_); } | 
 | }; | 
 |  | 
 | MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestInputThrottled); | 
 |  | 
 | class ThreadedChannelTestNeedsRedraw : public ThreadedChannelTest { | 
 |   void BeginChannelTest() override { DispatchSetNeedsRedraw(); } | 
 |  | 
 |   void SetNeedsRedrawOnImpl(const gfx::Rect& damage_rect) override { | 
 |     calls_received_++; | 
 |     EndTest(); | 
 |   } | 
 |  | 
 |   void AfterTest() override { EXPECT_EQ(1, calls_received_); } | 
 | }; | 
 |  | 
 | MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestNeedsRedraw); | 
 |  | 
 | class ThreadedChannelTestFinishAllRendering : public ThreadedChannelTest { | 
 |   void BeginChannelTest() override { proxy()->FinishAllRendering(); } | 
 |  | 
 |   void FinishAllRenderingOnImpl() override { | 
 |     calls_received_++; | 
 |     EndTest(); | 
 |   } | 
 |  | 
 |   void AfterTest() override { EXPECT_EQ(1, calls_received_); } | 
 | }; | 
 |  | 
 | MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestFinishAllRendering); | 
 |  | 
 | class ThreadedChannelTestReleaseOutputSurface : public ThreadedChannelTest { | 
 |   void BeginChannelTest() override { proxy()->ReleaseOutputSurface(); } | 
 |  | 
 |   void ReleaseOutputSurfaceOnImpl() override { | 
 |     calls_received_++; | 
 |     EndTest(); | 
 |   } | 
 |  | 
 |   void AfterTest() override { EXPECT_EQ(1, calls_received_); } | 
 | }; | 
 |  | 
 | MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestReleaseOutputSurface); | 
 |  | 
 | class ThreadedChannelTestCommit : public ThreadedChannelTest { | 
 |   void BeginChannelTest() override { PostSetNeedsCommitToMainThread(); } | 
 |  | 
 |   void SetNeedsCommitOnImpl() override { EXPECT_EQ(0, calls_received_++); } | 
 |  | 
 |   void ReceivedBeginMainFrame() override { EXPECT_EQ(1, calls_received_++); } | 
 |  | 
 |   void StartCommitOnImpl() override { EXPECT_EQ(2, calls_received_++); } | 
 |  | 
 |   void ReceivedDidCommitAndDrawFrame() override { | 
 |     EXPECT_EQ(3, calls_received_++); | 
 |   } | 
 |  | 
 |   void ReceivedDidCompleteSwapBuffers() override { | 
 |     EXPECT_EQ(4, calls_received_++); | 
 |     EndTest(); | 
 |   } | 
 |  | 
 |   void AfterTest() override { EXPECT_EQ(5, calls_received_); } | 
 | }; | 
 |  | 
 | MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestCommit); | 
 |  | 
 | class ThreadedChannelTestBeginMainFrameAborted : public ThreadedChannelTest { | 
 |   void BeginChannelTest() override { PostSetNeedsCommitToMainThread(); } | 
 |  | 
 |   void ScheduledActionWillSendBeginMainFrame() override { | 
 |     // Set visible to false to abort the commit. | 
 |     MainThreadTaskRunner()->PostTask( | 
 |         FROM_HERE, | 
 |         base::Bind(&ThreadedChannelTestBeginMainFrameAborted::SetVisibleFalse, | 
 |                    base::Unretained(this))); | 
 |   } | 
 |  | 
 |   void SetVisibleFalse() { layer_tree_host()->SetVisible(false); } | 
 |  | 
 |   void BeginMainFrameAbortedOnImpl(CommitEarlyOutReason reason) override { | 
 |     calls_received_++; | 
 |     EndTest(); | 
 |   } | 
 |  | 
 |   void AfterTest() override { EXPECT_EQ(1, calls_received_); } | 
 | }; | 
 |  | 
 | MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestBeginMainFrameAborted); | 
 |  | 
 | class ThreadedChannelTestBeginMainFrameNotExpectedSoon | 
 |     : public ThreadedChannelTest { | 
 |   void BeginChannelTest() override { PostOnImplThread(); } | 
 |  | 
 |   void StartTestOnImplThread() override { | 
 |     GetProxyImplForTest()->SendBeginMainFrameNotExpectedSoon(); | 
 |   } | 
 |  | 
 |   void ReceivedBeginMainFrameNotExpectedSoon() override { | 
 |     calls_received_++; | 
 |     EndTest(); | 
 |   } | 
 |  | 
 |   void AfterTest() override { EXPECT_EQ(1, calls_received_); } | 
 | }; | 
 |  | 
 | MULTI_THREAD_DIRECT_RENDERER_TEST_F( | 
 |     ThreadedChannelTestBeginMainFrameNotExpectedSoon); | 
 |  | 
 | class ThreadedChannelTestSetAnimationEvents : public ThreadedChannelTest { | 
 |   void BeginChannelTest() override { PostOnImplThread(); } | 
 |  | 
 |   void StartTestOnImplThread() override { | 
 |     std::unique_ptr<AnimationEvents> events( | 
 |         base::WrapUnique(new AnimationEvents)); | 
 |     GetProxyImplForTest()->PostAnimationEventsToMainThreadOnImplThread( | 
 |         std::move(events)); | 
 |   } | 
 |  | 
 |   void ReceivedSetAnimationEvents() override { | 
 |     calls_received_++; | 
 |     EndTest(); | 
 |   } | 
 |  | 
 |   void AfterTest() override { EXPECT_EQ(1, calls_received_); } | 
 | }; | 
 |  | 
 | MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestSetAnimationEvents); | 
 |  | 
 | class ThreadedChannelTestLoseOutputSurface : public ThreadedChannelTest { | 
 |   void BeginChannelTest() override { PostOnImplThread(); } | 
 |  | 
 |   void StartTestOnImplThread() override { | 
 |     GetProxyImplForTest()->DidLoseOutputSurfaceOnImplThread(); | 
 |   } | 
 |  | 
 |   void ReceivedDidLoseOutputSurface() override { | 
 |     calls_received_++; | 
 |     EndTest(); | 
 |   } | 
 |  | 
 |   void AfterTest() override { EXPECT_EQ(1, calls_received_); } | 
 | }; | 
 |  | 
 | MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestLoseOutputSurface); | 
 |  | 
 | class ThreadedChannelTestPageScaleAnimation : public ThreadedChannelTest { | 
 |   void BeginChannelTest() override { PostOnImplThread(); } | 
 |  | 
 |   void StartTestOnImplThread() override { | 
 |     GetProxyImplForTest()->DidCompletePageScaleAnimationOnImplThread(); | 
 |   } | 
 |  | 
 |   void ReceivedDidCompletePageScaleAnimation() override { | 
 |     calls_received_++; | 
 |     EndTest(); | 
 |   } | 
 |  | 
 |   void AfterTest() override { EXPECT_EQ(1, calls_received_); } | 
 | }; | 
 |  | 
 | MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestPageScaleAnimation); | 
 |  | 
 | }  // namespace cc |