| // Copyright 2013 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "cc/test/fake_layer_tree_host.h" |
| |
| #include <memory> |
| #include <utility> |
| |
| #include "base/memory/ptr_util.h" |
| #include "base/task/sequenced_task_runner.h" |
| #include "base/task/single_thread_task_runner.h" |
| #include "cc/animation/animation_host.h" |
| #include "cc/layers/layer.h" |
| #include "cc/test/test_task_graph_runner.h" |
| #include "cc/trees/mutator_host.h" |
| |
| namespace cc { |
| |
| FakeLayerTreeHost::FakeLayerTreeHost(FakeLayerTreeHostDelegate* client, |
| LayerTreeHost::InitParams params, |
| CompositorMode mode) |
| : LayerTreeHost(std::move(params), mode), |
| client_(client), |
| needs_commit_(false) { |
| scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner = |
| mode == CompositorMode::THREADED |
| ? base::SingleThreadTaskRunner::GetCurrentDefault() |
| : nullptr; |
| SetTaskRunnerProviderForTesting(TaskRunnerProvider::Create( |
| base::SingleThreadTaskRunner::GetCurrentDefault(), impl_task_runner)); |
| client_->SetLayerTreeHost(this); |
| } |
| |
| void FakeLayerTreeHost::ClearPendingLayerCommitStates() { |
| for (auto layer_id : |
| pending_commit_state()->layer_ids_that_should_push_properties) { |
| LayerById(layer_id)->ClearChangedPushPropertiesForTesting(); |
| } |
| pending_commit_state()->layer_ids_that_should_push_properties.clear(); |
| } |
| |
| std::unique_ptr<FakeLayerTreeHost> FakeLayerTreeHost::Create( |
| FakeLayerTreeHostDelegate* client, |
| TestTaskGraphRunner* task_graph_runner, |
| MutatorHost* mutator_host) { |
| LayerTreeSettings settings; |
| return Create(client, task_graph_runner, mutator_host, settings); |
| } |
| |
| std::unique_ptr<FakeLayerTreeHost> FakeLayerTreeHost::Create( |
| FakeLayerTreeHostDelegate* client, |
| TestTaskGraphRunner* task_graph_runner, |
| MutatorHost* mutator_host, |
| const LayerTreeSettings& settings) { |
| return Create(client, task_graph_runner, mutator_host, settings, |
| CompositorMode::SINGLE_THREADED); |
| } |
| |
| std::unique_ptr<FakeLayerTreeHost> FakeLayerTreeHost::Create( |
| FakeLayerTreeHostDelegate* client, |
| TestTaskGraphRunner* task_graph_runner, |
| MutatorHost* mutator_host, |
| const LayerTreeSettings& settings, |
| CompositorMode mode) { |
| LayerTreeHost::InitParams params; |
| params.client = client; |
| params.settings = &settings; |
| params.task_graph_runner = task_graph_runner; |
| params.mutator_host = mutator_host; |
| return base::WrapUnique( |
| new FakeLayerTreeHost(client, std::move(params), mode)); |
| } |
| |
| FakeLayerTreeHost::~FakeLayerTreeHost() { |
| client_->SetLayerTreeHost(nullptr); |
| } |
| |
| void FakeLayerTreeHost::SetNeedsCommit(bool urgent) { |
| needs_commit_ = true; |
| } |
| |
| std::unique_ptr<ClientLayerTreeHostImpl> |
| FakeLayerTreeHost::CreateLayerTreeHostImplInternal( |
| LayerTreeHostImplDelegate*, |
| MutatorHost*, |
| const LayerTreeSettings& settings, |
| TaskRunnerProvider* task_runner_provider, |
| raw_ptr<RasterDarkModeFilter>&, |
| int, |
| raw_ptr<TaskGraphRunner>& task_graph_runner, |
| scoped_refptr<base::SequencedTaskRunner>, |
| LayerTreeHostSchedulingDelegate*, |
| RenderingStatsInstrumentation*, |
| base::WeakPtr<CompositorDelegateForInput>&) { |
| DCHECK(!host_impl_); |
| auto host_impl = std::make_unique<FakeLayerTreeHostImpl>( |
| settings, task_runner_provider, task_graph_runner); |
| host_impl_ = host_impl.get(); |
| return host_impl; |
| } |
| |
| void FakeLayerTreeHost::CreateFakeLayerTreeHostImpl() { |
| DCHECK(!host_impl_); |
| owned_host_impl_ = std::make_unique<FakeLayerTreeHostImpl>( |
| GetSettings(), &task_runner_provider(), task_graph_runner()); |
| host_impl_ = owned_host_impl_.get(); |
| } |
| |
| LayerImpl* FakeLayerTreeHost::CommitToActiveTree() { |
| CHECK(host_impl_->CommitsToActiveTree()); |
| CommitToTree(active_tree()); |
| // This is part of LayerTreeHostImpl::CommitComplete(), but unit tests don't |
| // expect this function to do other things, e.g. animation updates. |
| active_tree()->HandleScrollbarShowRequests(); |
| return active_tree()->root_layer(); |
| } |
| |
| LayerImpl* FakeLayerTreeHost::CommitToPendingTree() { |
| CHECK(!host_impl_->CommitsToActiveTree()); |
| return CommitToTree(pending_tree()); |
| } |
| |
| LayerImpl* FakeLayerTreeHost::CommitToTree(LayerTreeImpl* tree) { |
| // pending_commit_state() is used in this function because this is a phony |
| // commit that doesn't actually call WillCommit() or ActivateCommitState(). |
| tree->set_source_frame_number(SourceFrameNumber()); |
| pending_commit_state()->property_trees = *property_trees(); |
| host_impl_->FinishCommit(*pending_commit_state(), |
| thread_unsafe_commit_state()); |
| pending_commit_state()->picture_layer_ids_with_new_raster_source.clear(); |
| return tree->root_layer(); |
| } |
| |
| } // namespace cc |