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

Side by Side Diff: cc/trees/layer_tree_host_unittest_scroll.cc

Issue 13844021: Move compositor thread input handling logic into content (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix win component build Created 7 years, 7 months 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 | Annotate | Revision Log
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/memory/weak_ptr.h"
7 #include "cc/base/thread_impl.h" 8 #include "cc/base/thread_impl.h"
8 #include "cc/layers/content_layer.h" 9 #include "cc/layers/content_layer.h"
9 #include "cc/layers/layer.h" 10 #include "cc/layers/layer.h"
10 #include "cc/layers/layer_impl.h" 11 #include "cc/layers/layer_impl.h"
11 #include "cc/test/fake_content_layer_client.h" 12 #include "cc/test/fake_content_layer_client.h"
12 #include "cc/test/fake_layer_tree_host_client.h" 13 #include "cc/test/fake_layer_tree_host_client.h"
13 #include "cc/test/geometry_test_utils.h" 14 #include "cc/test/geometry_test_utils.h"
14 #include "cc/test/layer_tree_test.h" 15 #include "cc/test/layer_tree_test.h"
15 #include "cc/trees/layer_tree_impl.h" 16 #include "cc/trees/layer_tree_impl.h"
16 #include "third_party/WebKit/Source/Platform/chromium/public/WebLayerScrollClien t.h" 17 #include "third_party/WebKit/Source/Platform/chromium/public/WebLayerScrollClien t.h"
17 #include "ui/gfx/point_conversions.h" 18 #include "ui/gfx/point_conversions.h"
18 #include "ui/gfx/size_conversions.h" 19 #include "ui/gfx/size_conversions.h"
19 #include "ui/gfx/vector2d_conversions.h" 20 #include "ui/gfx/vector2d_conversions.h"
20 21
21 namespace cc { 22 namespace cc {
22 namespace { 23 namespace {
23 24
24 class LayerTreeHostScrollTest : public LayerTreeTest {}; 25 class LayerTreeHostScrollTest : public LayerTreeTest {};
25 26
26 class LayerTreeHostScrollTestScrollSimple : public LayerTreeHostScrollTest { 27 class LayerTreeHostScrollTestScrollSimple : public LayerTreeHostScrollTest {
27 public: 28 public:
28 LayerTreeHostScrollTestScrollSimple() 29 LayerTreeHostScrollTestScrollSimple()
29 : initial_scroll_(10, 20), 30 : initial_scroll_(10, 20),
30 second_scroll_(40, 5), 31 second_scroll_(40, 5),
31 scroll_amount_(2, -1), 32 scroll_amount_(2, -1),
32 num_scrolls_(0) { 33 num_scrolls_(0) {}
33 }
34 34
35 virtual void BeginTest() OVERRIDE { 35 virtual void BeginTest() OVERRIDE {
36 layer_tree_host()->root_layer()->SetScrollable(true); 36 layer_tree_host()->root_layer()->SetScrollable(true);
37 layer_tree_host()->root_layer()->SetScrollOffset(initial_scroll_); 37 layer_tree_host()->root_layer()->SetScrollOffset(initial_scroll_);
38 PostSetNeedsCommitToMainThread(); 38 PostSetNeedsCommitToMainThread();
39 } 39 }
40 40
41 virtual void Layout() OVERRIDE { 41 virtual void Layout() OVERRIDE {
42 Layer* root = layer_tree_host()->root_layer(); 42 Layer* root = layer_tree_host()->root_layer();
43 if (!layer_tree_host()->commit_number()) { 43 if (!layer_tree_host()->commit_number()) {
(...skipping 21 matching lines...) Expand all
65 PostSetNeedsCommitToMainThread(); 65 PostSetNeedsCommitToMainThread();
66 break; 66 break;
67 case 1: 67 case 1:
68 EXPECT_VECTOR_EQ(root->scroll_offset(), second_scroll_); 68 EXPECT_VECTOR_EQ(root->scroll_offset(), second_scroll_);
69 EXPECT_VECTOR_EQ(root->ScrollDelta(), scroll_amount_); 69 EXPECT_VECTOR_EQ(root->ScrollDelta(), scroll_amount_);
70 EndTest(); 70 EndTest();
71 break; 71 break;
72 } 72 }
73 } 73 }
74 74
75 virtual void ApplyScrollAndScale( 75 virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta, float scale)
76 gfx::Vector2d scroll_delta, float scale) OVERRIDE { 76 OVERRIDE {
77 gfx::Vector2d offset = layer_tree_host()->root_layer()->scroll_offset(); 77 gfx::Vector2d offset = layer_tree_host()->root_layer()->scroll_offset();
78 layer_tree_host()->root_layer()->SetScrollOffset(offset + scroll_delta); 78 layer_tree_host()->root_layer()->SetScrollOffset(offset + scroll_delta);
79 num_scrolls_++; 79 num_scrolls_++;
80 } 80 }
81 81
82 virtual void AfterTest() OVERRIDE { 82 virtual void AfterTest() OVERRIDE { EXPECT_EQ(1, num_scrolls_); }
83 EXPECT_EQ(1, num_scrolls_);
84 }
85 83
86 private: 84 private:
87 gfx::Vector2d initial_scroll_; 85 gfx::Vector2d initial_scroll_;
88 gfx::Vector2d second_scroll_; 86 gfx::Vector2d second_scroll_;
89 gfx::Vector2d scroll_amount_; 87 gfx::Vector2d scroll_amount_;
90 int num_scrolls_; 88 int num_scrolls_;
91 }; 89 };
92 90
93 MULTI_THREAD_TEST_F(LayerTreeHostScrollTestScrollSimple); 91 MULTI_THREAD_TEST_F(LayerTreeHostScrollTestScrollSimple);
94 92
95 class LayerTreeHostScrollTestScrollMultipleRedraw 93 class LayerTreeHostScrollTestScrollMultipleRedraw
96 : public LayerTreeHostScrollTest { 94 : public LayerTreeHostScrollTest {
97 public: 95 public:
98 LayerTreeHostScrollTestScrollMultipleRedraw() 96 LayerTreeHostScrollTestScrollMultipleRedraw()
99 : initial_scroll_(40, 10), 97 : initial_scroll_(40, 10), scroll_amount_(-3, 17), num_scrolls_(0) {}
100 scroll_amount_(-3, 17),
101 num_scrolls_(0) {
102 }
103 98
104 virtual void BeginTest() OVERRIDE { 99 virtual void BeginTest() OVERRIDE {
105 layer_tree_host()->root_layer()->SetScrollable(true); 100 layer_tree_host()->root_layer()->SetScrollable(true);
106 layer_tree_host()->root_layer()->SetScrollOffset(initial_scroll_); 101 layer_tree_host()->root_layer()->SetScrollOffset(initial_scroll_);
107 PostSetNeedsCommitToMainThread(); 102 PostSetNeedsCommitToMainThread();
108 } 103 }
109 104
110 virtual void BeginCommitOnThread(LayerTreeHostImpl* impl) OVERRIDE { 105 virtual void BeginCommitOnThread(LayerTreeHostImpl* impl) OVERRIDE {
111 Layer* root = layer_tree_host()->root_layer(); 106 Layer* root = layer_tree_host()->root_layer();
112 switch (layer_tree_host()->commit_number()) { 107 switch (layer_tree_host()->commit_number()) {
113 case 0: 108 case 0:
114 EXPECT_VECTOR_EQ(root->scroll_offset(), initial_scroll_); 109 EXPECT_VECTOR_EQ(root->scroll_offset(), initial_scroll_);
115 break; 110 break;
116 case 1: 111 case 1:
117 EXPECT_VECTOR_EQ( 112 EXPECT_VECTOR_EQ(root->scroll_offset(),
118 root->scroll_offset(), 113 initial_scroll_ + scroll_amount_ + scroll_amount_);
119 initial_scroll_ + scroll_amount_ + scroll_amount_);
120 case 2: 114 case 2:
121 EXPECT_VECTOR_EQ( 115 EXPECT_VECTOR_EQ(root->scroll_offset(),
122 root->scroll_offset(), 116 initial_scroll_ + scroll_amount_ + scroll_amount_);
123 initial_scroll_ + scroll_amount_ + scroll_amount_);
124 break; 117 break;
125 } 118 }
126 } 119 }
127 120
128 virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 121 virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
129 LayerImpl* root = impl->active_tree()->root_layer(); 122 LayerImpl* root = impl->active_tree()->root_layer();
130 root->SetScrollable(true); 123 root->SetScrollable(true);
131 root->SetMaxScrollOffset(gfx::Vector2d(100, 100)); 124 root->SetMaxScrollOffset(gfx::Vector2d(100, 100));
132 125
133 if (impl->active_tree()->source_frame_number() == 0 && 126 if (impl->active_tree()->source_frame_number() == 0 &&
(...skipping 11 matching lines...) Expand all
145 EXPECT_EQ(root->ScrollDelta(), scroll_amount_); 138 EXPECT_EQ(root->ScrollDelta(), scroll_amount_);
146 root->ScrollBy(scroll_amount_); 139 root->ScrollBy(scroll_amount_);
147 EXPECT_VECTOR_EQ(root->ScrollDelta(), scroll_amount_ + scroll_amount_); 140 EXPECT_VECTOR_EQ(root->ScrollDelta(), scroll_amount_ + scroll_amount_);
148 141
149 EXPECT_VECTOR_EQ(root->scroll_offset(), initial_scroll_); 142 EXPECT_VECTOR_EQ(root->scroll_offset(), initial_scroll_);
150 PostSetNeedsCommitToMainThread(); 143 PostSetNeedsCommitToMainThread();
151 } else if (impl->active_tree()->source_frame_number() == 1) { 144 } else if (impl->active_tree()->source_frame_number() == 1) {
152 // Third or later draw after second commit. 145 // Third or later draw after second commit.
153 EXPECT_GE(impl->SourceAnimationFrameNumber(), 3); 146 EXPECT_GE(impl->SourceAnimationFrameNumber(), 3);
154 EXPECT_VECTOR_EQ(root->ScrollDelta(), gfx::Vector2d()); 147 EXPECT_VECTOR_EQ(root->ScrollDelta(), gfx::Vector2d());
155 EXPECT_VECTOR_EQ( 148 EXPECT_VECTOR_EQ(root->scroll_offset(),
156 root->scroll_offset(), 149 initial_scroll_ + scroll_amount_ + scroll_amount_);
157 initial_scroll_ + scroll_amount_ + scroll_amount_);
158 EndTest(); 150 EndTest();
159 } 151 }
160 } 152 }
161 153
162 virtual void ApplyScrollAndScale( 154 virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta, float scale)
163 gfx::Vector2d scroll_delta, float scale) OVERRIDE { 155 OVERRIDE {
164 gfx::Vector2d offset = layer_tree_host()->root_layer()->scroll_offset(); 156 gfx::Vector2d offset = layer_tree_host()->root_layer()->scroll_offset();
165 layer_tree_host()->root_layer()->SetScrollOffset(offset + scroll_delta); 157 layer_tree_host()->root_layer()->SetScrollOffset(offset + scroll_delta);
166 num_scrolls_++; 158 num_scrolls_++;
167 } 159 }
168 160
169 virtual void AfterTest() OVERRIDE { 161 virtual void AfterTest() OVERRIDE { EXPECT_EQ(1, num_scrolls_); }
170 EXPECT_EQ(1, num_scrolls_); 162
171 }
172 private: 163 private:
173 gfx::Vector2d initial_scroll_; 164 gfx::Vector2d initial_scroll_;
174 gfx::Vector2d scroll_amount_; 165 gfx::Vector2d scroll_amount_;
175 int num_scrolls_; 166 int num_scrolls_;
176 }; 167 };
177 168
178 MULTI_THREAD_TEST_F(LayerTreeHostScrollTestScrollMultipleRedraw); 169 MULTI_THREAD_TEST_F(LayerTreeHostScrollTestScrollMultipleRedraw);
179 170
180 class LayerTreeHostScrollTestFractionalScroll : public LayerTreeHostScrollTest { 171 class LayerTreeHostScrollTestFractionalScroll : public LayerTreeHostScrollTest {
181 public: 172 public:
182 LayerTreeHostScrollTestFractionalScroll() 173 LayerTreeHostScrollTestFractionalScroll() : scroll_amount_(1.75, 0) {}
183 : scroll_amount_(1.75, 0) {
184 }
185 174
186 virtual void BeginTest() OVERRIDE { 175 virtual void BeginTest() OVERRIDE {
187 layer_tree_host()->root_layer()->SetScrollable(true); 176 layer_tree_host()->root_layer()->SetScrollable(true);
188 PostSetNeedsCommitToMainThread(); 177 PostSetNeedsCommitToMainThread();
189 } 178 }
190 179
191 virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 180 virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
192 LayerImpl* root = impl->active_tree()->root_layer(); 181 LayerImpl* root = impl->active_tree()->root_layer();
193 root->SetMaxScrollOffset(gfx::Vector2d(100, 100)); 182 root->SetMaxScrollOffset(gfx::Vector2d(100, 100));
194 183
195 // Check that a fractional scroll delta is correctly accumulated over 184 // Check that a fractional scroll delta is correctly accumulated over
196 // multiple commits. 185 // multiple commits.
197 switch (impl->active_tree()->source_frame_number()) { 186 switch (impl->active_tree()->source_frame_number()) {
198 case 0: 187 case 0:
199 EXPECT_VECTOR_EQ(root->scroll_offset(), gfx::Vector2d(0, 0)); 188 EXPECT_VECTOR_EQ(root->scroll_offset(), gfx::Vector2d(0, 0));
200 EXPECT_VECTOR_EQ(root->ScrollDelta(), gfx::Vector2d(0, 0)); 189 EXPECT_VECTOR_EQ(root->ScrollDelta(), gfx::Vector2d(0, 0));
201 PostSetNeedsCommitToMainThread(); 190 PostSetNeedsCommitToMainThread();
202 break; 191 break;
203 case 1: 192 case 1:
204 EXPECT_VECTOR_EQ( 193 EXPECT_VECTOR_EQ(root->scroll_offset(),
205 root->scroll_offset(), 194 gfx::ToFlooredVector2d(scroll_amount_));
206 gfx::ToFlooredVector2d(scroll_amount_)); 195 EXPECT_VECTOR_EQ(root->ScrollDelta(),
207 EXPECT_VECTOR_EQ( 196 gfx::Vector2dF(fmod(scroll_amount_.x(), 1.0f), 0.0f));
208 root->ScrollDelta(),
209 gfx::Vector2dF(fmod(scroll_amount_.x(), 1.0f), 0.0f));
210 PostSetNeedsCommitToMainThread(); 197 PostSetNeedsCommitToMainThread();
211 break; 198 break;
212 case 2: 199 case 2:
213 EXPECT_VECTOR_EQ( 200 EXPECT_VECTOR_EQ(
214 root->scroll_offset(), 201 root->scroll_offset(),
215 gfx::ToFlooredVector2d(scroll_amount_ + scroll_amount_)); 202 gfx::ToFlooredVector2d(scroll_amount_ + scroll_amount_));
216 EXPECT_VECTOR_EQ( 203 EXPECT_VECTOR_EQ(
217 root->ScrollDelta(), 204 root->ScrollDelta(),
218 gfx::Vector2dF(fmod(2.0f * scroll_amount_.x(), 1.0f), 0.0f)); 205 gfx::Vector2dF(fmod(2.0f * scroll_amount_.x(), 1.0f), 0.0f));
219 EndTest(); 206 EndTest();
220 break; 207 break;
221 } 208 }
222 root->ScrollBy(scroll_amount_); 209 root->ScrollBy(scroll_amount_);
223 } 210 }
224 211
225 virtual void ApplyScrollAndScale( 212 virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta, float scale)
226 gfx::Vector2d scroll_delta, float scale) OVERRIDE { 213 OVERRIDE {
227 gfx::Vector2d offset = layer_tree_host()->root_layer()->scroll_offset(); 214 gfx::Vector2d offset = layer_tree_host()->root_layer()->scroll_offset();
228 layer_tree_host()->root_layer()->SetScrollOffset(offset + scroll_delta); 215 layer_tree_host()->root_layer()->SetScrollOffset(offset + scroll_delta);
229 } 216 }
230 217
231 virtual void AfterTest() OVERRIDE {} 218 virtual void AfterTest() OVERRIDE {}
232 219
233 private: 220 private:
234 gfx::Vector2dF scroll_amount_; 221 gfx::Vector2dF scroll_amount_;
235 }; 222 };
236 223
237 MULTI_THREAD_TEST_F(LayerTreeHostScrollTestFractionalScroll); 224 MULTI_THREAD_TEST_F(LayerTreeHostScrollTestFractionalScroll);
238 225
239 class LayerTreeHostScrollTestCaseWithChild 226 class LayerTreeHostScrollTestCaseWithChild
240 : public LayerTreeHostScrollTest, 227 : public LayerTreeHostScrollTest,
241 public WebKit::WebLayerScrollClient { 228 public WebKit::WebLayerScrollClient {
242 public: 229 public:
243 LayerTreeHostScrollTestCaseWithChild() 230 LayerTreeHostScrollTestCaseWithChild()
244 : initial_offset_(10, 20), 231 : initial_offset_(10, 20),
245 javascript_scroll_(40, 5), 232 javascript_scroll_(40, 5),
246 scroll_amount_(2, -1), 233 scroll_amount_(2, -1),
247 num_scrolls_(0) { 234 num_scrolls_(0) {}
248 }
249 235
250 virtual void SetupTree() OVERRIDE { 236 virtual void SetupTree() OVERRIDE {
251 layer_tree_host()->SetDeviceScaleFactor(device_scale_factor_); 237 layer_tree_host()->SetDeviceScaleFactor(device_scale_factor_);
252 238
253 scoped_refptr<Layer> root_layer = Layer::Create(); 239 scoped_refptr<Layer> root_layer = Layer::Create();
254 root_layer->SetBounds(gfx::Size(10, 10)); 240 root_layer->SetBounds(gfx::Size(10, 10));
255 241
256 root_scroll_layer_ = ContentLayer::Create(&fake_content_layer_client_); 242 root_scroll_layer_ = ContentLayer::Create(&fake_content_layer_client_);
257 root_scroll_layer_->SetBounds(gfx::Size(110, 110)); 243 root_scroll_layer_->SetBounds(gfx::Size(110, 110));
258 244
(...skipping 27 matching lines...) Expand all
286 expected_scroll_layer_ = root_scroll_layer_; 272 expected_scroll_layer_ = root_scroll_layer_;
287 expected_no_scroll_layer_ = child_layer_; 273 expected_no_scroll_layer_ = child_layer_;
288 } 274 }
289 275
290 expected_scroll_layer_->SetScrollOffset(initial_offset_); 276 expected_scroll_layer_->SetScrollOffset(initial_offset_);
291 277
292 layer_tree_host()->SetRootLayer(root_layer); 278 layer_tree_host()->SetRootLayer(root_layer);
293 LayerTreeHostScrollTest::SetupTree(); 279 LayerTreeHostScrollTest::SetupTree();
294 } 280 }
295 281
296 virtual void BeginTest() OVERRIDE { 282 virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
297 PostSetNeedsCommitToMainThread();
298 }
299 283
300 virtual void didScroll() OVERRIDE { 284 virtual void didScroll() OVERRIDE {
301 final_scroll_offset_ = expected_scroll_layer_->scroll_offset(); 285 final_scroll_offset_ = expected_scroll_layer_->scroll_offset();
302 } 286 }
303 287
304 virtual void ApplyScrollAndScale( 288 virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta, float scale)
305 gfx::Vector2d scroll_delta, float scale) OVERRIDE { 289 OVERRIDE {
306 gfx::Vector2d offset = root_scroll_layer_->scroll_offset(); 290 gfx::Vector2d offset = root_scroll_layer_->scroll_offset();
307 root_scroll_layer_->SetScrollOffset(offset + scroll_delta); 291 root_scroll_layer_->SetScrollOffset(offset + scroll_delta);
308 num_scrolls_++; 292 num_scrolls_++;
309 } 293 }
310 294
311 virtual void Layout() OVERRIDE { 295 virtual void Layout() OVERRIDE {
312 EXPECT_VECTOR_EQ( 296 EXPECT_VECTOR_EQ(gfx::Vector2d(),
313 gfx::Vector2d(), expected_no_scroll_layer_->scroll_offset()); 297 expected_no_scroll_layer_->scroll_offset());
314 298
315 switch (layer_tree_host()->commit_number()) { 299 switch (layer_tree_host()->commit_number()) {
316 case 0: 300 case 0:
317 EXPECT_VECTOR_EQ( 301 EXPECT_VECTOR_EQ(initial_offset_,
318 initial_offset_, 302 expected_scroll_layer_->scroll_offset());
319 expected_scroll_layer_->scroll_offset());
320 break; 303 break;
321 case 1: 304 case 1:
322 EXPECT_VECTOR_EQ( 305 EXPECT_VECTOR_EQ(initial_offset_ + scroll_amount_,
323 initial_offset_ + scroll_amount_, 306 expected_scroll_layer_->scroll_offset());
324 expected_scroll_layer_->scroll_offset());
325 307
326 // Pretend like Javascript updated the scroll position itself. 308 // Pretend like Javascript updated the scroll position itself.
327 expected_scroll_layer_->SetScrollOffset(javascript_scroll_); 309 expected_scroll_layer_->SetScrollOffset(javascript_scroll_);
328 break; 310 break;
329 case 2: 311 case 2:
330 EXPECT_VECTOR_EQ( 312 EXPECT_VECTOR_EQ(javascript_scroll_ + scroll_amount_,
331 javascript_scroll_ + scroll_amount_, 313 expected_scroll_layer_->scroll_offset());
332 expected_scroll_layer_->scroll_offset());
333 break; 314 break;
334 } 315 }
335 } 316 }
336 317
337 virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 318 virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
338 LayerImpl* root_impl = impl->active_tree()->root_layer(); 319 LayerImpl* root_impl = impl->active_tree()->root_layer();
339 LayerImpl* root_scroll_layer_impl = root_impl->children()[0]; 320 LayerImpl* root_scroll_layer_impl = root_impl->children()[0];
340 LayerImpl* child_layer_impl = root_scroll_layer_impl->children()[0]; 321 LayerImpl* child_layer_impl = root_scroll_layer_impl->children()[0];
341 322
342 LayerImpl* expected_scroll_layer_impl = NULL; 323 LayerImpl* expected_scroll_layer_impl = NULL;
343 LayerImpl* expected_no_scroll_layer_impl = NULL; 324 LayerImpl* expected_no_scroll_layer_impl = NULL;
344 if (scroll_child_layer_) { 325 if (scroll_child_layer_) {
345 expected_scroll_layer_impl = child_layer_impl; 326 expected_scroll_layer_impl = child_layer_impl;
346 expected_no_scroll_layer_impl = root_scroll_layer_impl; 327 expected_no_scroll_layer_impl = root_scroll_layer_impl;
347 } else { 328 } else {
348 expected_scroll_layer_impl = root_scroll_layer_impl; 329 expected_scroll_layer_impl = root_scroll_layer_impl;
349 expected_no_scroll_layer_impl = child_layer_impl; 330 expected_no_scroll_layer_impl = child_layer_impl;
350 } 331 }
351 332
352 EXPECT_VECTOR_EQ(gfx::Vector2d(), root_impl->ScrollDelta()); 333 EXPECT_VECTOR_EQ(gfx::Vector2d(), root_impl->ScrollDelta());
353 EXPECT_VECTOR_EQ( 334 EXPECT_VECTOR_EQ(gfx::Vector2d(),
354 gfx::Vector2d(), 335 expected_no_scroll_layer_impl->ScrollDelta());
355 expected_no_scroll_layer_impl->ScrollDelta());
356 336
357 // Ensure device scale factor is affecting the layers. 337 // Ensure device scale factor is affecting the layers.
358 gfx::Size expected_content_bounds = gfx::ToCeiledSize( 338 gfx::Size expected_content_bounds = gfx::ToCeiledSize(
359 gfx::ScaleSize(root_scroll_layer_impl->bounds(), device_scale_factor_)); 339 gfx::ScaleSize(root_scroll_layer_impl->bounds(), device_scale_factor_));
360 EXPECT_SIZE_EQ( 340 EXPECT_SIZE_EQ(expected_content_bounds,
361 expected_content_bounds, 341 root_scroll_layer_->content_bounds());
362 root_scroll_layer_->content_bounds());
363 342
364 expected_content_bounds = gfx::ToCeiledSize( 343 expected_content_bounds = gfx::ToCeiledSize(
365 gfx::ScaleSize(child_layer_impl->bounds(), device_scale_factor_)); 344 gfx::ScaleSize(child_layer_impl->bounds(), device_scale_factor_));
366 EXPECT_SIZE_EQ(expected_content_bounds, child_layer_->content_bounds()); 345 EXPECT_SIZE_EQ(expected_content_bounds, child_layer_->content_bounds());
367 346
368 switch (impl->active_tree()->source_frame_number()) { 347 switch (impl->active_tree()->source_frame_number()) {
369 case 0: { 348 case 0: {
370 // Gesture scroll on impl thread. 349 // Gesture scroll on impl thread.
371 InputHandler::ScrollStatus status = impl->ScrollBegin( 350 InputHandler::ScrollStatus status = impl->ScrollBegin(
372 gfx::ToCeiledPoint( 351 gfx::ToCeiledPoint(expected_scroll_layer_impl->position() +
373 expected_scroll_layer_impl->position() + 352 gfx::Vector2dF(0.5f, 0.5f)),
374 gfx::Vector2dF(0.5f, 0.5f)),
375 InputHandler::Gesture); 353 InputHandler::Gesture);
376 EXPECT_EQ(InputHandler::ScrollStarted, status); 354 EXPECT_EQ(InputHandler::ScrollStarted, status);
377 impl->ScrollBy(gfx::Point(), scroll_amount_); 355 impl->ScrollBy(gfx::Point(), scroll_amount_);
378 impl->ScrollEnd(); 356 impl->ScrollEnd();
379 357
380 // Check the scroll is applied as a delta. 358 // Check the scroll is applied as a delta.
381 EXPECT_VECTOR_EQ( 359 EXPECT_VECTOR_EQ(initial_offset_,
382 initial_offset_, 360 expected_scroll_layer_impl->scroll_offset());
383 expected_scroll_layer_impl->scroll_offset()); 361 EXPECT_VECTOR_EQ(scroll_amount_,
384 EXPECT_VECTOR_EQ( 362 expected_scroll_layer_impl->ScrollDelta());
385 scroll_amount_,
386 expected_scroll_layer_impl->ScrollDelta());
387 break; 363 break;
388 } 364 }
389 case 1: { 365 case 1: {
390 // Wheel scroll on impl thread. 366 // Wheel scroll on impl thread.
391 InputHandler::ScrollStatus status = impl->ScrollBegin( 367 InputHandler::ScrollStatus status = impl->ScrollBegin(
392 gfx::ToCeiledPoint( 368 gfx::ToCeiledPoint(expected_scroll_layer_impl->position() +
393 expected_scroll_layer_impl->position() + 369 gfx::Vector2dF(0.5f, 0.5f)),
394 gfx::Vector2dF(0.5f, 0.5f)),
395 InputHandler::Wheel); 370 InputHandler::Wheel);
396 EXPECT_EQ(InputHandler::ScrollStarted, status); 371 EXPECT_EQ(InputHandler::ScrollStarted, status);
397 impl->ScrollBy(gfx::Point(), scroll_amount_); 372 impl->ScrollBy(gfx::Point(), scroll_amount_);
398 impl->ScrollEnd(); 373 impl->ScrollEnd();
399 374
400 // Check the scroll is applied as a delta. 375 // Check the scroll is applied as a delta.
401 EXPECT_VECTOR_EQ( 376 EXPECT_VECTOR_EQ(javascript_scroll_,
402 javascript_scroll_, 377 expected_scroll_layer_impl->scroll_offset());
403 expected_scroll_layer_impl->scroll_offset()); 378 EXPECT_VECTOR_EQ(scroll_amount_,
404 EXPECT_VECTOR_EQ( 379 expected_scroll_layer_impl->ScrollDelta());
405 scroll_amount_,
406 expected_scroll_layer_impl->ScrollDelta());
407 break; 380 break;
408 } 381 }
409 case 2: 382 case 2:
410 383
411 EXPECT_VECTOR_EQ( 384 EXPECT_VECTOR_EQ(javascript_scroll_ + scroll_amount_,
412 javascript_scroll_ + scroll_amount_, 385 expected_scroll_layer_impl->scroll_offset());
413 expected_scroll_layer_impl->scroll_offset()); 386 EXPECT_VECTOR_EQ(gfx::Vector2d(),
414 EXPECT_VECTOR_EQ( 387 expected_scroll_layer_impl->ScrollDelta());
415 gfx::Vector2d(),
416 expected_scroll_layer_impl->ScrollDelta());
417 388
418 EndTest(); 389 EndTest();
419 break; 390 break;
420 } 391 }
421 } 392 }
422 393
423 virtual void AfterTest() OVERRIDE { 394 virtual void AfterTest() OVERRIDE {
424 if (scroll_child_layer_) { 395 if (scroll_child_layer_) {
425 EXPECT_EQ(0, num_scrolls_); 396 EXPECT_EQ(0, num_scrolls_);
426 EXPECT_VECTOR_EQ( 397 EXPECT_VECTOR_EQ(javascript_scroll_ + scroll_amount_,
427 javascript_scroll_ + scroll_amount_, 398 final_scroll_offset_);
428 final_scroll_offset_);
429 } else { 399 } else {
430 EXPECT_EQ(2, num_scrolls_); 400 EXPECT_EQ(2, num_scrolls_);
431 EXPECT_VECTOR_EQ(gfx::Vector2d(), final_scroll_offset_); 401 EXPECT_VECTOR_EQ(gfx::Vector2d(), final_scroll_offset_);
432 } 402 }
433 } 403 }
434 404
435 protected: 405 protected:
436 float device_scale_factor_; 406 float device_scale_factor_;
437 bool scroll_child_layer_; 407 bool scroll_child_layer_;
438 408
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 }; 473 };
504 474
505 class ImplSidePaintingScrollTestSimple : public ImplSidePaintingScrollTest { 475 class ImplSidePaintingScrollTestSimple : public ImplSidePaintingScrollTest {
506 public: 476 public:
507 ImplSidePaintingScrollTestSimple() 477 ImplSidePaintingScrollTestSimple()
508 : initial_scroll_(10, 20), 478 : initial_scroll_(10, 20),
509 main_thread_scroll_(40, 5), 479 main_thread_scroll_(40, 5),
510 impl_thread_scroll1_(2, -1), 480 impl_thread_scroll1_(2, -1),
511 impl_thread_scroll2_(-3, 10), 481 impl_thread_scroll2_(-3, 10),
512 num_scrolls_(0), 482 num_scrolls_(0),
513 can_activate_(true) { 483 can_activate_(true) {}
514 }
515 484
516 virtual void BeginTest() OVERRIDE { 485 virtual void BeginTest() OVERRIDE {
517 layer_tree_host()->root_layer()->SetScrollable(true); 486 layer_tree_host()->root_layer()->SetScrollable(true);
518 layer_tree_host()->root_layer()->SetScrollOffset(initial_scroll_); 487 layer_tree_host()->root_layer()->SetScrollOffset(initial_scroll_);
519 PostSetNeedsCommitToMainThread(); 488 PostSetNeedsCommitToMainThread();
520 } 489 }
521 490
522 virtual void Layout() OVERRIDE { 491 virtual void Layout() OVERRIDE {
523 Layer* root = layer_tree_host()->root_layer(); 492 Layer* root = layer_tree_host()->root_layer();
524 if (!layer_tree_host()->commit_number()) { 493 if (!layer_tree_host()->commit_number()) {
525 EXPECT_VECTOR_EQ(root->scroll_offset(), initial_scroll_); 494 EXPECT_VECTOR_EQ(root->scroll_offset(), initial_scroll_);
526 } else { 495 } else {
527 EXPECT_VECTOR_EQ(root->scroll_offset(), 496 EXPECT_VECTOR_EQ(root->scroll_offset(),
528 initial_scroll_ + impl_thread_scroll1_); 497 initial_scroll_ + impl_thread_scroll1_);
529 498
530 // Pretend like Javascript updated the scroll position itself with a 499 // Pretend like Javascript updated the scroll position itself with a
531 // change of main_thread_scroll. 500 // change of main_thread_scroll.
532 root->SetScrollOffset(initial_scroll_ + 501 root->SetScrollOffset(initial_scroll_ + main_thread_scroll_ +
533 main_thread_scroll_ +
534 impl_thread_scroll1_); 502 impl_thread_scroll1_);
535 } 503 }
536 } 504 }
537 505
538 virtual bool CanActivatePendingTree() OVERRIDE { 506 virtual bool CanActivatePendingTree() OVERRIDE { return can_activate_; }
539 return can_activate_;
540 }
541 507
542 virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 508 virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
543 // We force a second draw here of the first commit before activating 509 // We force a second draw here of the first commit before activating
544 // the second commit. 510 // the second commit.
545 if (impl->active_tree()->source_frame_number() == 0) 511 if (impl->active_tree()->source_frame_number() == 0)
546 impl->SetNeedsRedraw(); 512 impl->SetNeedsRedraw();
547 } 513 }
548 514
549 virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 515 virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
550 ImplSidePaintingScrollTest::DrawLayersOnThread(impl); 516 ImplSidePaintingScrollTest::DrawLayersOnThread(impl);
(...skipping 20 matching lines...) Expand all
571 // CommitCompleteOnThread will trigger this function again 537 // CommitCompleteOnThread will trigger this function again
572 // and cause us to take the else clause. 538 // and cause us to take the else clause.
573 } else { 539 } else {
574 can_activate_ = true; 540 can_activate_ = true;
575 ASSERT_TRUE(pending_root); 541 ASSERT_TRUE(pending_root);
576 EXPECT_EQ(impl->pending_tree()->source_frame_number(), 1); 542 EXPECT_EQ(impl->pending_tree()->source_frame_number(), 1);
577 543
578 root->ScrollBy(impl_thread_scroll2_); 544 root->ScrollBy(impl_thread_scroll2_);
579 EXPECT_VECTOR_EQ(root->scroll_offset(), initial_scroll_); 545 EXPECT_VECTOR_EQ(root->scroll_offset(), initial_scroll_);
580 EXPECT_VECTOR_EQ(root->ScrollDelta(), 546 EXPECT_VECTOR_EQ(root->ScrollDelta(),
581 impl_thread_scroll1_ + impl_thread_scroll2_); 547 impl_thread_scroll1_ + impl_thread_scroll2_);
582 EXPECT_VECTOR_EQ(root->sent_scroll_delta(), impl_thread_scroll1_); 548 EXPECT_VECTOR_EQ(root->sent_scroll_delta(), impl_thread_scroll1_);
583 549
584 EXPECT_VECTOR_EQ(pending_root->scroll_offset(), 550 EXPECT_VECTOR_EQ(
551 pending_root->scroll_offset(),
585 initial_scroll_ + main_thread_scroll_ + impl_thread_scroll1_); 552 initial_scroll_ + main_thread_scroll_ + impl_thread_scroll1_);
586 EXPECT_VECTOR_EQ(pending_root->ScrollDelta(), impl_thread_scroll2_); 553 EXPECT_VECTOR_EQ(pending_root->ScrollDelta(), impl_thread_scroll2_);
587 EXPECT_VECTOR_EQ(pending_root->sent_scroll_delta(), gfx::Vector2d()); 554 EXPECT_VECTOR_EQ(pending_root->sent_scroll_delta(), gfx::Vector2d());
588 } 555 }
589 break; 556 break;
590 case 1: 557 case 1:
591 EXPECT_FALSE(impl->pending_tree()); 558 EXPECT_FALSE(impl->pending_tree());
592 EXPECT_VECTOR_EQ(root->scroll_offset(), 559 EXPECT_VECTOR_EQ(
560 root->scroll_offset(),
593 initial_scroll_ + main_thread_scroll_ + impl_thread_scroll1_); 561 initial_scroll_ + main_thread_scroll_ + impl_thread_scroll1_);
594 EXPECT_VECTOR_EQ(root->ScrollDelta(), impl_thread_scroll2_); 562 EXPECT_VECTOR_EQ(root->ScrollDelta(), impl_thread_scroll2_);
595 EXPECT_VECTOR_EQ(root->sent_scroll_delta(), gfx::Vector2d()); 563 EXPECT_VECTOR_EQ(root->sent_scroll_delta(), gfx::Vector2d());
596 EndTest(); 564 EndTest();
597 break; 565 break;
598 } 566 }
599 } 567 }
600 568
601 virtual void ApplyScrollAndScale( 569 virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta, float scale)
602 gfx::Vector2d scroll_delta, float scale) OVERRIDE { 570 OVERRIDE {
603 gfx::Vector2d offset = layer_tree_host()->root_layer()->scroll_offset(); 571 gfx::Vector2d offset = layer_tree_host()->root_layer()->scroll_offset();
604 layer_tree_host()->root_layer()->SetScrollOffset(offset + scroll_delta); 572 layer_tree_host()->root_layer()->SetScrollOffset(offset + scroll_delta);
605 num_scrolls_++; 573 num_scrolls_++;
606 } 574 }
607 575
608 virtual void AfterTest() OVERRIDE { 576 virtual void AfterTest() OVERRIDE { EXPECT_EQ(1, num_scrolls_); }
609 EXPECT_EQ(1, num_scrolls_);
610 }
611 577
612 private: 578 private:
613 gfx::Vector2d initial_scroll_; 579 gfx::Vector2d initial_scroll_;
614 gfx::Vector2d main_thread_scroll_; 580 gfx::Vector2d main_thread_scroll_;
615 gfx::Vector2d impl_thread_scroll1_; 581 gfx::Vector2d impl_thread_scroll1_;
616 gfx::Vector2d impl_thread_scroll2_; 582 gfx::Vector2d impl_thread_scroll2_;
617 int num_scrolls_; 583 int num_scrolls_;
618 bool can_activate_; 584 bool can_activate_;
619 }; 585 };
620 586
621 MULTI_THREAD_TEST_F(ImplSidePaintingScrollTestSimple); 587 MULTI_THREAD_TEST_F(ImplSidePaintingScrollTestSimple);
622 588
623 class LayerTreeHostScrollTestScrollZeroMaxScrollOffset 589 class LayerTreeHostScrollTestScrollZeroMaxScrollOffset
624 : public LayerTreeHostScrollTest { 590 : public LayerTreeHostScrollTest {
625 public: 591 public:
626 LayerTreeHostScrollTestScrollZeroMaxScrollOffset() {} 592 LayerTreeHostScrollTestScrollZeroMaxScrollOffset() {}
627 593
628 virtual void BeginTest() OVERRIDE { 594 virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
629 PostSetNeedsCommitToMainThread();
630 }
631 595
632 virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 596 virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
633 LayerImpl* root = impl->active_tree()->root_layer(); 597 LayerImpl* root = impl->active_tree()->root_layer();
634 root->SetScrollable(true); 598 root->SetScrollable(true);
635 599
636 root->SetMaxScrollOffset(gfx::Vector2d(100, 100)); 600 root->SetMaxScrollOffset(gfx::Vector2d(100, 100));
637 EXPECT_EQ( 601 EXPECT_EQ(InputHandler::ScrollStarted,
638 InputHandler::ScrollStarted, 602 root->TryScroll(gfx::PointF(0.0f, 1.0f), InputHandler::Gesture));
639 root->TryScroll(
640 gfx::PointF(0.0f, 1.0f),
641 InputHandler::Gesture));
642 603
643 root->SetMaxScrollOffset(gfx::Vector2d(0, 0)); 604 root->SetMaxScrollOffset(gfx::Vector2d(0, 0));
644 EXPECT_EQ( 605 EXPECT_EQ(InputHandler::ScrollIgnored,
645 InputHandler::ScrollIgnored, 606 root->TryScroll(gfx::PointF(0.0f, 1.0f), InputHandler::Gesture));
646 root->TryScroll(
647 gfx::PointF(0.0f, 1.0f),
648 InputHandler::Gesture));
649 607
650 root->SetMaxScrollOffset(gfx::Vector2d(-100, -100)); 608 root->SetMaxScrollOffset(gfx::Vector2d(-100, -100));
651 EXPECT_EQ( 609 EXPECT_EQ(InputHandler::ScrollIgnored,
652 InputHandler::ScrollIgnored, 610 root->TryScroll(gfx::PointF(0.0f, 1.0f), InputHandler::Gesture));
653 root->TryScroll(
654 gfx::PointF(0.0f, 1.0f),
655 InputHandler::Gesture));
656 611
657 EndTest(); 612 EndTest();
658 } 613 }
659 614
660 virtual void AfterTest() OVERRIDE {} 615 virtual void AfterTest() OVERRIDE {}
661 }; 616 };
662 617
663 SINGLE_AND_MULTI_THREAD_TEST_F( 618 SINGLE_AND_MULTI_THREAD_TEST_F(
664 LayerTreeHostScrollTestScrollZeroMaxScrollOffset); 619 LayerTreeHostScrollTestScrollZeroMaxScrollOffset);
665 620
666 class ThreadCheckingInputHandlerClient : public InputHandlerClient { 621 class ThreadCheckingInputHandlerClient : public InputHandlerClient {
667 public: 622 public:
668 ThreadCheckingInputHandlerClient(base::SingleThreadTaskRunner* runner, 623 ThreadCheckingInputHandlerClient(base::SingleThreadTaskRunner* runner,
669 bool* received_stop_flinging) 624 bool* received_stop_flinging)
670 : task_runner_(runner) , 625 : task_runner_(runner), received_stop_flinging_(received_stop_flinging) {}
671 received_stop_flinging_(received_stop_flinging) {}
672
673 virtual void BindToHandler(InputHandler* handler) OVERRIDE {
674 if (!task_runner_->BelongsToCurrentThread())
675 ADD_FAILURE() << "BindToClient called on wrong thread";
676 }
677 626
678 virtual void Animate(base::TimeTicks time) OVERRIDE { 627 virtual void Animate(base::TimeTicks time) OVERRIDE {
679 if (!task_runner_->BelongsToCurrentThread()) 628 if (!task_runner_->BelongsToCurrentThread())
680 ADD_FAILURE() << "Animate called on wrong thread"; 629 ADD_FAILURE() << "Animate called on wrong thread";
681 } 630 }
682 631
683 virtual void MainThreadHasStoppedFlinging() OVERRIDE { 632 virtual void MainThreadHasStoppedFlinging() OVERRIDE {
684 if (!task_runner_->BelongsToCurrentThread()) 633 if (!task_runner_->BelongsToCurrentThread())
685 ADD_FAILURE() << "MainThreadHasStoppedFlinging called on wrong thread"; 634 ADD_FAILURE() << "MainThreadHasStoppedFlinging called on wrong thread";
686 *received_stop_flinging_ = true; 635 *received_stop_flinging_ = true;
687 } 636 }
688 637
689 private: 638 private:
690 base::SingleThreadTaskRunner* task_runner_; 639 base::SingleThreadTaskRunner* task_runner_;
691 bool* received_stop_flinging_; 640 bool* received_stop_flinging_;
692 }; 641 };
693 642
694 class ThreadCheckingFakeLayerTreeHostClient : public FakeLayerTreeHostClient { 643 void BindInputHandlerOnCompositorThread(
695 public: 644 const base::WeakPtr<InputHandler>& input_handler,
696 ThreadCheckingFakeLayerTreeHostClient( 645 scoped_ptr<ThreadCheckingInputHandlerClient> client) {
697 base::SingleThreadTaskRunner* task_runner, 646 input_handler->BindToClient(client.release());
698 bool* received_stop_flinging) 647 }
699 : FakeLayerTreeHostClient(DIRECT_3D) ,
700 task_runner_(task_runner),
701 received_stop_flinging_(received_stop_flinging) {}
702
703 virtual scoped_ptr<InputHandlerClient> CreateInputHandlerClient() OVERRIDE {
704 return scoped_ptr<InputHandlerClient>(new ThreadCheckingInputHandlerClient(
705 task_runner_, received_stop_flinging_)).Pass();
706 }
707
708 private:
709 base::SingleThreadTaskRunner* task_runner_;
710 bool* received_stop_flinging_;
711 };
712 648
713 TEST(LayerTreeHostFlingTest, DidStopFlingingThread) { 649 TEST(LayerTreeHostFlingTest, DidStopFlingingThread) {
714 base::Thread impl_thread("cc"); 650 base::Thread impl_thread("cc");
715 impl_thread.Start(); 651 impl_thread.Start();
716 scoped_ptr<cc::Thread> impl_ccthread = 652 scoped_ptr<Thread> impl_ccthread =
717 cc::ThreadImpl::CreateForDifferentThread( 653 ThreadImpl::CreateForDifferentThread(impl_thread.message_loop_proxy());
718 impl_thread.message_loop_proxy());
719 654
720 bool received_stop_flinging = false; 655 bool received_stop_flinging = false;
721 ThreadCheckingFakeLayerTreeHostClient client(
722 impl_thread.message_loop_proxy().get(),
723 &received_stop_flinging);
724 LayerTreeSettings settings; 656 LayerTreeSettings settings;
725 657
658 scoped_ptr<ThreadCheckingInputHandlerClient> input_handler_client(
659 new ThreadCheckingInputHandlerClient(
660 impl_thread.message_loop_proxy().get(), &received_stop_flinging));
661 FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
662
726 scoped_ptr<LayerTreeHost> layer_tree_host = 663 scoped_ptr<LayerTreeHost> layer_tree_host =
727 LayerTreeHost::Create(&client, settings, impl_ccthread.Pass()); 664 LayerTreeHost::Create(&client, settings, impl_ccthread.Pass());
728 665
666 impl_thread.message_loop_proxy()
667 ->PostTask(FROM_HERE,
668 base::Bind(&BindInputHandlerOnCompositorThread,
669 layer_tree_host->GetInputHandler(),
670 base::Passed(input_handler_client.Pass())));
danakj 2013/05/06 16:33:39 nit: base::Passed(&input_handler_client)
671
729 layer_tree_host->DidStopFlinging(); 672 layer_tree_host->DidStopFlinging();
730 layer_tree_host.reset(); 673 layer_tree_host.reset();
731 impl_thread.Stop(); 674 impl_thread.Stop();
732 EXPECT_TRUE(received_stop_flinging); 675 EXPECT_TRUE(received_stop_flinging);
733 } 676 }
734 677
735 } // namespace 678 } // namespace
736 } // namespace cc 679 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698