| OLD | NEW |
| 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 Loading... |
| 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 |
| OLD | NEW |