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