Chromium Code Reviews| 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_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 Loading... | |
| 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 |
| OLD | NEW |