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

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