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

Side by Side Diff: cc/trees/layer_tree_host_unittest_scroll.cc

Issue 2445093002: cc/blimp: Add synchronization for scroll/scale state. (Closed)
Patch Set: missed a comment Created 4 years, 1 month 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
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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 "base/location.h" 7 #include "base/location.h"
8 #include "base/memory/weak_ptr.h" 8 #include "base/memory/weak_ptr.h"
9 #include "base/single_thread_task_runner.h" 9 #include "base/single_thread_task_runner.h"
10 #include "base/threading/thread_task_runner_handle.h" 10 #include "base/threading/thread_task_runner_handle.h"
11 #include "cc/animation/animation_host.h" 11 #include "cc/animation/animation_host.h"
12 #include "cc/input/main_thread_scrolling_reason.h" 12 #include "cc/input/main_thread_scrolling_reason.h"
13 #include "cc/input/scroll_elasticity_helper.h" 13 #include "cc/input/scroll_elasticity_helper.h"
14 #include "cc/layers/layer.h" 14 #include "cc/layers/layer.h"
15 #include "cc/layers/layer_impl.h" 15 #include "cc/layers/layer_impl.h"
16 #include "cc/layers/picture_layer.h" 16 #include "cc/layers/picture_layer.h"
17 #include "cc/scheduler/begin_frame_source.h" 17 #include "cc/scheduler/begin_frame_source.h"
18 #include "cc/test/fake_content_layer_client.h" 18 #include "cc/test/fake_content_layer_client.h"
19 #include "cc/test/fake_layer_tree_host_client.h" 19 #include "cc/test/fake_layer_tree_host_client.h"
20 #include "cc/test/fake_picture_layer.h" 20 #include "cc/test/fake_picture_layer.h"
21 #include "cc/test/fake_picture_layer_impl.h" 21 #include "cc/test/fake_picture_layer_impl.h"
22 #include "cc/test/geometry_test_utils.h" 22 #include "cc/test/geometry_test_utils.h"
23 #include "cc/test/layer_tree_test.h" 23 #include "cc/test/layer_tree_test.h"
24 #include "cc/test/test_shared_bitmap_manager.h" 24 #include "cc/test/test_shared_bitmap_manager.h"
25 #include "cc/test/test_task_graph_runner.h" 25 #include "cc/test/test_task_graph_runner.h"
26 #include "cc/trees/layer_tree_host_common.h"
26 #include "cc/trees/layer_tree_impl.h" 27 #include "cc/trees/layer_tree_impl.h"
27 #include "cc/trees/scroll_node.h" 28 #include "cc/trees/scroll_node.h"
28 #include "cc/trees/transform_node.h" 29 #include "cc/trees/transform_node.h"
29 #include "testing/gmock/include/gmock/gmock.h" 30 #include "testing/gmock/include/gmock/gmock.h"
30 #include "ui/gfx/geometry/point_conversions.h" 31 #include "ui/gfx/geometry/point_conversions.h"
31 #include "ui/gfx/geometry/size_conversions.h" 32 #include "ui/gfx/geometry/size_conversions.h"
32 #include "ui/gfx/geometry/vector2d_conversions.h" 33 #include "ui/gfx/geometry/vector2d_conversions.h"
33 34
34 using ::testing::Mock; 35 using ::testing::Mock;
35 36
(...skipping 2003 matching lines...) Expand 10 before | Expand all | Expand 10 after
2039 void AfterTest() override {} 2040 void AfterTest() override {}
2040 2041
2041 private: 2042 private:
2042 gfx::ScrollOffset initial_scroll_; 2043 gfx::ScrollOffset initial_scroll_;
2043 gfx::ScrollOffset second_scroll_; 2044 gfx::ScrollOffset second_scroll_;
2044 gfx::Vector2dF scroll_amount_; 2045 gfx::Vector2dF scroll_amount_;
2045 }; 2046 };
2046 2047
2047 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostScrollTestPropertyTreeUpdate); 2048 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostScrollTestPropertyTreeUpdate);
2048 2049
2050 class LayerTreeHostScrollTestAppliesReflectedDeltas
2051 : public LayerTreeHostScrollTest {
2052 public:
2053 void BeginTest() override { PostSetNeedsCommitToMainThread(); }
2054
2055 void SetupTree() override {
2056 LayerTreeHostScrollTest::SetupTree();
2057
2058 gfx::Size scroll_layer_bounds(200, 200);
2059 layer_tree()->outer_viewport_scroll_layer()->SetBounds(scroll_layer_bounds);
2060 layer_tree()->outer_viewport_scroll_layer()->SetScrollOffset(
2061 initial_offset_);
2062 layer_tree()->outer_viewport_scroll_layer()->set_did_scroll_callback(
2063 base::Bind(&LayerTreeHostScrollTestAppliesReflectedDeltas::
2064 DidScrollOuterViewport,
2065 base::Unretained(this)));
2066
2067 layer_tree()->SetPageScaleFactorAndLimits(initial_page_scale_, 0.f, 1.f);
2068 }
2069
2070 void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
2071 LayerImpl* outer_viewport_layer = host_impl->OuterViewportScrollLayer();
2072
2073 switch (host_impl->active_tree()->source_frame_number()) {
2074 case 0: {
2075 // We have the first tree, so let's scroll the outer viewport layer and
2076 // change the page scale.
2077 outer_viewport_layer->ScrollBy(outer_viewport_offset_deltas_[0]);
2078 last_active_offset_ = outer_viewport_layer->CurrentScrollOffset();
2079
2080 host_impl->active_tree()->page_scale_factor()->SetCurrent(
2081 initial_page_scale_ * page_scale_update_);
2082 last_page_scale_ =
2083 host_impl->active_tree()->current_page_scale_factor();
2084
2085 PostSetNeedsCommitToMainThread();
2086 } break;
2087 case 1:
2088 // The scroll offset on the active tree should remain unchanged.
2089 EXPECT_EQ(last_active_offset_,
2090 outer_viewport_layer->CurrentScrollOffset());
2091 EXPECT_EQ(last_page_scale_,
2092 host_impl->active_tree()->current_page_scale_factor());
2093
2094 // Scroll again to make sure that only the delta applied in this frame
2095 // is reported to the main thread.
2096 outer_viewport_layer->ScrollBy(outer_viewport_offset_deltas_[1]);
2097 last_active_offset_ = outer_viewport_layer->CurrentScrollOffset();
2098
2099 PostSetNeedsCommitToMainThread();
2100 break;
2101 case 2:
2102 // The scroll offset on the active tree should remain unchanged.
2103 EXPECT_EQ(last_active_offset_,
2104 outer_viewport_layer->CurrentScrollOffset());
2105 EXPECT_EQ(last_page_scale_,
2106 host_impl->active_tree()->current_page_scale_factor());
2107
2108 EndTest();
2109 break;
2110 }
2111 }
2112
2113 void WillCommitCompleteOnThread(LayerTreeHostImpl* host_impl) override {
2114 LayerTreeImpl* sync_tree = host_impl->sync_tree();
2115 LayerImpl* outer_viewport_layer = sync_tree->OuterViewportScrollLayer();
2116 TransformNode* node = sync_tree->property_trees()->transform_tree.Node(
2117 outer_viewport_layer->transform_tree_index());
2118
2119 switch (host_impl->sync_tree()->source_frame_number()) {
2120 case 1:
2121 case 2:
2122 // Pushing page scale/scroll offset from the main thread should have
2123 // resulted in a request to update draw properties. This is necessary
2124 // to ensure that the draw properties are recomputed on the pending
2125 // tree post-commit, since the property trees update on the main thread
2126 // did not include the additionally reflected delta.
2127 EXPECT_TRUE(host_impl->sync_tree()->needs_update_draw_properties());
2128 EXPECT_TRUE(node->needs_local_transform_update);
2129 break;
2130 }
2131 }
2132
2133 void BeginMainFrame(const BeginFrameArgs& args) override {
2134 switch (layer_tree_host()->SourceFrameNumber()) {
2135 case 1:
2136 // Pretend that we could not apply the deltas this frame and send them
2137 // back to the impl thread.
2138 layer_tree()->outer_viewport_scroll_layer()->SetScrollOffset(
2139 initial_offset_);
2140 layer_tree()->SetPageScaleFactorAndLimits(initial_page_scale_, 0.f,
2141 1.f);
2142
2143 SendReflectedMainFrameState(0);
2144 break;
2145 case 2:
2146 // Pretend that the previous delta was handled and now reflect back the
2147 // new delta.
2148 layer_tree()->outer_viewport_scroll_layer()->SetScrollOffset(
2149 gfx::ScrollOffsetWithDelta(initial_offset_,
2150 outer_viewport_offset_deltas_[0]));
2151 layer_tree()->SetPageScaleFactorAndLimits(
2152 initial_page_scale_ * page_scale_update_, 0.f, 1.f);
2153
2154 SendReflectedMainFrameState(1);
2155 break;
2156 }
2157 }
2158
2159 void DidScrollOuterViewport() {
2160 Layer* outer_viewport_layer = layer_tree()->outer_viewport_scroll_layer();
2161 gfx::ScrollOffset expected_offset;
2162 switch (layer_tree_host()->SourceFrameNumber()) {
2163 case 0:
2164 NOTREACHED();
2165 case 1:
2166 expected_offset = gfx::ScrollOffsetWithDelta(
2167 initial_offset_, outer_viewport_offset_deltas_[0]);
2168 EXPECT_EQ(outer_viewport_layer->scroll_offset(), expected_offset);
2169 break;
2170 case 2:
2171 // Since the first delta was reflected back and not applied on the main
2172 // thread, the value here should only include the delta from the second
2173 // update.
2174 expected_offset = gfx::ScrollOffsetWithDelta(
2175 initial_offset_, outer_viewport_offset_deltas_[1]);
2176 EXPECT_EQ(outer_viewport_layer->scroll_offset(), expected_offset);
2177 break;
2178 default:
2179 NOTREACHED();
2180 }
2181 }
2182
2183 void AfterTest() override {}
2184
2185 private:
2186 void SendReflectedMainFrameState(int delta_to_reflect) {
2187 std::unique_ptr<ReflectedMainFrameState> reflected_main_frame_state =
2188 base::MakeUnique<ReflectedMainFrameState>();
2189
2190 LayerTreeHostCommon::ScrollUpdateInfo scroll_update;
2191 scroll_update.layer_id = layer_tree()->outer_viewport_scroll_layer()->id();
2192 scroll_update.scroll_delta =
2193 gfx::Vector2d(outer_viewport_offset_deltas_[delta_to_reflect].x(),
2194 outer_viewport_offset_deltas_[delta_to_reflect].y());
2195 reflected_main_frame_state->scrolls.push_back(scroll_update);
2196
2197 if (delta_to_reflect == 0)
2198 reflected_main_frame_state->page_scale_delta = page_scale_update_;
2199
2200 layer_tree_host_in_process()->SetReflectedMainFrameState(
2201 std::move(reflected_main_frame_state));
2202 }
2203
2204 // Accessed on the impl thread.
2205 gfx::ScrollOffset last_active_offset_;
2206 float last_page_scale_ = 0.f;
2207
2208 const gfx::ScrollOffset initial_offset_ = gfx::ScrollOffset(2, 3);
2209 const gfx::Vector2dF outer_viewport_offset_deltas_[2] = {
2210 gfx::Vector2dF(10, 3), gfx::Vector2dF(5, 3)};
2211
2212 const float initial_page_scale_ = 0.5f;
2213 const float page_scale_update_ = 0.2f;
2214 };
2215
2216 // The reflected deltas are supported in threaded mode only.
2217 MULTI_THREAD_TEST_F(LayerTreeHostScrollTestAppliesReflectedDeltas);
2218
2049 } // namespace 2219 } // namespace
2050 } // namespace cc 2220 } // namespace cc
OLDNEW
« cc/test/layer_tree_host_remote_for_testing.h ('K') | « cc/trees/layer_tree_host_in_process.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698