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

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: move application of deltas to push time. 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 activation_count_++;
2072 LayerImpl* outer_viewport_layer = host_impl->OuterViewportScrollLayer();
2073
2074 switch (activation_count_) {
2075 case 1: {
2076 // We have the first tree, so let's scroll the outer viewport layer and
2077 // change the page scale.
2078 outer_viewport_layer->ScrollBy(outer_viewport_offset_deltas_[0]);
2079 last_active_offset_ = outer_viewport_layer->CurrentScrollOffset();
2080
2081 host_impl->active_tree()->page_scale_factor()->SetCurrent(
2082 initial_page_scale_ * page_scale_update_);
2083 last_page_scale_ =
2084 host_impl->active_tree()->current_page_scale_factor();
2085
2086 PostSetNeedsCommitToMainThread();
2087 } break;
2088 case 2:
2089 // The scroll offset on the active tree should remain unchanged.
2090 EXPECT_EQ(last_active_offset_,
2091 outer_viewport_layer->CurrentScrollOffset());
2092 EXPECT_EQ(last_page_scale_,
2093 host_impl->active_tree()->current_page_scale_factor());
2094
2095 // Scroll again to make sure that only the delta applied in this frame
2096 // is reported to the main thread.
2097 outer_viewport_layer->ScrollBy(outer_viewport_offset_deltas_[1]);
2098 last_active_offset_ = outer_viewport_layer->CurrentScrollOffset();
2099
2100 PostSetNeedsCommitToMainThread();
2101 break;
2102 case 3:
2103 // The scroll offset on the active tree should remain unchanged.
2104 EXPECT_EQ(last_active_offset_,
2105 outer_viewport_layer->CurrentScrollOffset());
2106 EXPECT_EQ(last_page_scale_,
2107 host_impl->active_tree()->current_page_scale_factor());
2108
2109 EndTest();
2110 break;
2111 }
2112 }
2113
2114 void BeginMainFrame(const BeginFrameArgs& args) override {
2115 switch (layer_tree_host()->SourceFrameNumber()) {
2116 case 1:
2117 // Pretend that we could not apply the deltas this frame and send them
2118 // back to the impl thread.
2119 layer_tree()->outer_viewport_scroll_layer()->SetScrollOffset(
2120 initial_offset_);
2121 layer_tree()->SetPageScaleFactorAndLimits(initial_page_scale_, 0.f,
2122 1.f);
2123
2124 SendReflectedMainFrameState(0);
2125 break;
2126 case 2:
2127 // Pretend that the previous delta was handled and now reflect back the
2128 // new delta.
2129 layer_tree()->outer_viewport_scroll_layer()->SetScrollOffset(
2130 gfx::ScrollOffsetWithDelta(initial_offset_,
2131 outer_viewport_offset_deltas_[0]));
2132 layer_tree()->SetPageScaleFactorAndLimits(
2133 initial_page_scale_ * page_scale_update_, 0.f, 1.f);
2134
2135 SendReflectedMainFrameState(1);
2136 break;
2137 }
2138 }
2139
2140 void DidScrollOuterViewport() {
2141 Layer* outer_viewport_layer = layer_tree()->outer_viewport_scroll_layer();
2142 gfx::ScrollOffset expected_offset;
2143 switch (layer_tree_host()->SourceFrameNumber()) {
2144 case 0:
2145 NOTREACHED();
2146 case 1:
2147 expected_offset = gfx::ScrollOffsetWithDelta(
2148 initial_offset_, outer_viewport_offset_deltas_[0]);
2149 EXPECT_EQ(outer_viewport_layer->scroll_offset(), expected_offset);
2150 break;
2151 case 2:
2152 // Since the first delta was reflected back and not applied on the main
2153 // thread, the value here should only include the delta from the second
2154 // update.
2155 expected_offset = gfx::ScrollOffsetWithDelta(
2156 initial_offset_, outer_viewport_offset_deltas_[1]);
2157 EXPECT_EQ(outer_viewport_layer->scroll_offset(), expected_offset);
2158 break;
2159 default:
2160 NOTREACHED();
2161 }
2162 }
2163
2164 void AfterTest() override {}
2165
2166 private:
2167 void SendReflectedMainFrameState(int delta_to_reflect) {
2168 std::unique_ptr<ReflectedMainFrameState> reflected_main_frame_state =
2169 base::MakeUnique<ReflectedMainFrameState>();
2170
2171 LayerTreeHostCommon::ScrollUpdateInfo scroll_update;
2172 scroll_update.layer_id = layer_tree()->outer_viewport_scroll_layer()->id();
2173 scroll_update.scroll_delta =
2174 gfx::Vector2d(outer_viewport_offset_deltas_[delta_to_reflect].x(),
aelias_OOO_until_Jul13 2016/10/28 03:40:20 gfx::Vector2dF
Khushal 2016/10/31 21:02:01 Done.
2175 outer_viewport_offset_deltas_[delta_to_reflect].y());
2176 reflected_main_frame_state->scrolls.push_back(scroll_update);
2177
2178 if (delta_to_reflect == 0)
2179 reflected_main_frame_state->page_scale_delta = page_scale_update_;
2180
2181 layer_tree()->SetReflectedMainFrameState(
2182 std::move(reflected_main_frame_state));
2183 }
2184
2185 // Accessed on the impl thread.
2186 int activation_count_ = 0;
2187 gfx::ScrollOffset last_active_offset_;
2188 float last_page_scale_ = 0.f;
2189
2190 const gfx::ScrollOffset initial_offset_ = gfx::ScrollOffset(2, 3);
2191 const gfx::Vector2dF outer_viewport_offset_deltas_[2] = {
2192 gfx::Vector2dF(10, 3), gfx::Vector2dF(5, 3)};
2193
2194 const float initial_page_scale_ = 0.5f;
2195 const float page_scale_update_ = 0.2f;
2196 };
2197
2198 // The reflected deltas are supported in threaded mode only.
2199 MULTI_THREAD_TEST_F(LayerTreeHostScrollTestAppliesReflectedDeltas);
2200
2049 } // namespace 2201 } // namespace
2050 } // namespace cc 2202 } // namespace cc
OLDNEW
« cc/trees/layer_tree_host_in_process.cc ('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