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

Side by Side Diff: content/browser/web_contents/aura/window_slider_unittest.cc

Issue 202183003: Fixing race conditions in ui::content::WindowSlider which could cause the overscroll overlay to nev… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 9 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
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 "content/browser/web_contents/aura/window_slider.h" 5 #include "content/browser/web_contents/aura/window_slider.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/time/time.h"
9 #include "cc/animation/animation.h"
10 #include "cc/animation/animation_events.h"
8 #include "testing/gtest/include/gtest/gtest.h" 11 #include "testing/gtest/include/gtest/gtest.h"
9 #include "ui/aura/test/aura_test_base.h" 12 #include "ui/aura/test/aura_test_base.h"
10 #include "ui/aura/test/event_generator.h" 13 #include "ui/aura/test/event_generator.h"
11 #include "ui/aura/test/test_window_delegate.h" 14 #include "ui/aura/test/test_window_delegate.h"
12 #include "ui/aura/window.h" 15 #include "ui/aura/window.h"
13 #include "ui/base/hit_test.h" 16 #include "ui/base/hit_test.h"
17 #include "ui/compositor/layer_animation_sequence.h"
18 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
19 #include "ui/compositor/scoped_layer_animation_settings.h"
20 #include "ui/compositor/test/layer_animator_test_controller.h"
14 #include "ui/events/event_processor.h" 21 #include "ui/events/event_processor.h"
22 #include "ui/events/event_utils.h"
15 23
16 namespace content { 24 namespace content {
17 25
18 void DispatchEventDuringScrollCallback(ui::EventProcessor* dispatcher, 26 void DispatchEventDuringScrollCallback(ui::EventProcessor* dispatcher,
19 ui::Event* event, 27 ui::Event* event,
20 ui::EventType type, 28 ui::EventType type,
21 const gfx::Vector2dF& delta) { 29 const gfx::Vector2dF& delta) {
22 if (type != ui::ET_GESTURE_SCROLL_UPDATE) 30 if (type != ui::ET_GESTURE_SCROLL_UPDATE)
23 return; 31 return;
24 ui::EventDispatchDetails details = dispatcher->OnEventFromSource(event); 32 ui::EventDispatchDetails details = dispatcher->OnEventFromSource(event);
25 CHECK(!details.dispatcher_destroyed); 33 CHECK(!details.dispatcher_destroyed);
26 } 34 }
27 35
28 void ChangeSliderOwnerDuringScrollCallback(scoped_ptr<aura::Window>* window, 36 void ChangeSliderOwnerDuringScrollCallback(scoped_ptr<aura::Window>* window,
29 WindowSlider* slider, 37 WindowSlider* slider,
30 ui::EventType type, 38 ui::EventType type,
31 const gfx::Vector2dF& delta) { 39 const gfx::Vector2dF& delta) {
32 if (type != ui::ET_GESTURE_SCROLL_UPDATE) 40 if (type != ui::ET_GESTURE_SCROLL_UPDATE)
33 return; 41 return;
34 aura::Window* new_window = new aura::Window(NULL); 42 aura::Window* new_window = new aura::Window(NULL);
35 new_window->Init(aura::WINDOW_LAYER_TEXTURED); 43 new_window->Init(aura::WINDOW_LAYER_TEXTURED);
36 new_window->Show(); 44 new_window->Show();
37 slider->ChangeOwner(new_window); 45 slider->ChangeOwner(new_window);
38 (*window)->parent()->AddChild(new_window); 46 (*window)->parent()->AddChild(new_window);
39 window->reset(new_window); 47 window->reset(new_window);
40 } 48 }
41 49
50 void ConfirmSlideDuringScrollCallback(WindowSlider* slider,
51 ui::EventType type,
52 const gfx::Vector2dF& delta) {
53 static float total_delta_x = 0;
54 if (type == ui::ET_GESTURE_SCROLL_BEGIN)
55 total_delta_x = 0;
56
57 if (type == ui::ET_GESTURE_SCROLL_UPDATE) {
58 total_delta_x += delta.x();
59 if (total_delta_x >= 70)
60 EXPECT_TRUE(slider->IsSlideInProgress());
61 } else {
62 EXPECT_FALSE(slider->IsSlideInProgress());
63 }
64 }
65
66 void ConfirmNoSlideDuringScrollCallback(WindowSlider* slider,
67 ui::EventType type,
68 const gfx::Vector2dF& delta) {
69 EXPECT_FALSE(slider->IsSlideInProgress());
70 }
71
42 // The window delegate does not receive any events. 72 // The window delegate does not receive any events.
43 class NoEventWindowDelegate : public aura::test::TestWindowDelegate { 73 class NoEventWindowDelegate : public aura::test::TestWindowDelegate {
44 public: 74 public:
45 NoEventWindowDelegate() { 75 NoEventWindowDelegate() {
46 } 76 }
47 virtual ~NoEventWindowDelegate() {} 77 virtual ~NoEventWindowDelegate() {}
48 78
49 private: 79 private:
50 // Overridden from aura::WindowDelegate: 80 // Overridden from aura::WindowDelegate:
51 virtual bool HasHitTestMask() const OVERRIDE { return true; } 81 virtual bool HasHitTestMask() const OVERRIDE { return true; }
52 82
53 DISALLOW_COPY_AND_ASSIGN(NoEventWindowDelegate); 83 DISALLOW_COPY_AND_ASSIGN(NoEventWindowDelegate);
54 }; 84 };
55 85
56 class WindowSliderDelegateTest : public WindowSlider::Delegate { 86 class WindowSliderDelegateTest : public WindowSlider::Delegate {
57 public: 87 public:
58 WindowSliderDelegateTest() 88 WindowSliderDelegateTest()
59 : can_create_layer_(true), 89 : can_create_layer_(true),
60 created_back_layer_(false), 90 created_back_layer_(false),
61 created_front_layer_(false), 91 created_front_layer_(false),
62 slide_completed_(false), 92 fling_started_(false),
93 fling_completed_(false),
63 slide_aborted_(false), 94 slide_aborted_(false),
64 slider_destroyed_(false) { 95 slider_destroyed_(false) {
65 } 96 }
66 virtual ~WindowSliderDelegateTest() {} 97 virtual ~WindowSliderDelegateTest() {}
67 98
68 void Reset() { 99 void Reset() {
69 can_create_layer_ = true; 100 can_create_layer_ = true;
70 created_back_layer_ = false; 101 created_back_layer_ = false;
71 created_front_layer_ = false; 102 created_front_layer_ = false;
72 slide_completed_ = false; 103 fling_started_ = false;
104 fling_completed_ = false;
73 slide_aborted_ = false; 105 slide_aborted_ = false;
74 slider_destroyed_ = false; 106 slider_destroyed_ = false;
75 } 107 }
76 108
77 void SetCanCreateLayer(bool can_create_layer) { 109 void SetCanCreateLayer(bool can_create_layer) {
78 can_create_layer_ = can_create_layer; 110 can_create_layer_ = can_create_layer;
79 } 111 }
80 112
81 bool created_back_layer() const { return created_back_layer_; } 113 bool created_back_layer() const { return created_back_layer_; }
82 bool created_front_layer() const { return created_front_layer_; } 114 bool created_front_layer() const { return created_front_layer_; }
83 bool slide_completed() const { return slide_completed_; } 115 bool fling_started() const { return fling_started_; }
116 bool fling_completed() const { return fling_completed_; }
84 bool slide_aborted() const { return slide_aborted_; } 117 bool slide_aborted() const { return slide_aborted_; }
85 bool slider_destroyed() const { return slider_destroyed_; } 118 bool slider_destroyed() const { return slider_destroyed_; }
86 119
87 protected: 120 protected:
88 ui::Layer* CreateLayerForTest() { 121 ui::Layer* CreateLayerForTest() {
89 CHECK(can_create_layer_); 122 CHECK(can_create_layer_);
90 ui::Layer* layer = new ui::Layer(ui::LAYER_SOLID_COLOR); 123 ui::Layer* layer = new ui::Layer(ui::LAYER_SOLID_COLOR);
91 layer->SetColor(SK_ColorRED); 124 layer->SetColor(SK_ColorRED);
92 return layer; 125 return layer;
93 } 126 }
94 127
95 // Overridden from WindowSlider::Delegate: 128 // Overridden from WindowSlider::Delegate:
96 virtual ui::Layer* CreateBackLayer() OVERRIDE { 129 virtual ui::Layer* OnSlideBackStartedCreateLayer() OVERRIDE {
97 if (!can_create_layer_) 130 if (!can_create_layer_)
98 return NULL; 131 return NULL;
99 created_back_layer_ = true; 132 created_back_layer_ = true;
100 return CreateLayerForTest(); 133 return CreateLayerForTest();
101 } 134 }
102 135
103 virtual ui::Layer* CreateFrontLayer() OVERRIDE { 136 virtual ui::Layer* OnSlideForwardStartedCreateLayer() OVERRIDE {
104 if (!can_create_layer_) 137 if (!can_create_layer_)
105 return NULL; 138 return NULL;
106 created_front_layer_ = true; 139 created_front_layer_ = true;
107 return CreateLayerForTest(); 140 return CreateLayerForTest();
108 } 141 }
109 142
110 virtual void OnWindowSlideComplete() OVERRIDE { 143 virtual void OnWindowFlingCompleted() OVERRIDE {
111 slide_completed_ = true; 144 fling_completed_ = true;
145 }
146
147 virtual void OnWindowFlingStarted() OVERRIDE {
148 fling_started_ = true;
112 } 149 }
113 150
114 virtual void OnWindowSlideAborted() OVERRIDE { 151 virtual void OnWindowSlideAborted() OVERRIDE {
115 slide_aborted_ = true; 152 slide_aborted_ = true;
116 } 153 }
117 154
118 virtual void OnWindowSliderDestroyed() OVERRIDE { 155 virtual void OnWindowSliderDestroyed() OVERRIDE {
119 slider_destroyed_ = true; 156 slider_destroyed_ = true;
120 } 157 }
121 158
122 private: 159 private:
123 bool can_create_layer_; 160 bool can_create_layer_;
124 bool created_back_layer_; 161 bool created_back_layer_;
125 bool created_front_layer_; 162 bool created_front_layer_;
126 bool slide_completed_; 163 bool fling_started_;
164 bool fling_completed_;
127 bool slide_aborted_; 165 bool slide_aborted_;
128 bool slider_destroyed_; 166 bool slider_destroyed_;
129 167
130 DISALLOW_COPY_AND_ASSIGN(WindowSliderDelegateTest); 168 DISALLOW_COPY_AND_ASSIGN(WindowSliderDelegateTest);
131 }; 169 };
132 170
133 // This delegate destroys the owner window when the slider is destroyed. 171 // This delegate destroys the owner window when the slider is destroyed.
134 class WindowSliderDeleteOwnerOnDestroy : public WindowSliderDelegateTest { 172 class WindowSliderDeleteOwnerOnDestroy : public WindowSliderDelegateTest {
135 public: 173 public:
136 explicit WindowSliderDeleteOwnerOnDestroy(aura::Window* owner) 174 explicit WindowSliderDeleteOwnerOnDestroy(aura::Window* owner)
(...skipping 15 matching lines...) Expand all
152 // This delegate destroyes the owner window when a slide is completed. 190 // This delegate destroyes the owner window when a slide is completed.
153 class WindowSliderDeleteOwnerOnComplete : public WindowSliderDelegateTest { 191 class WindowSliderDeleteOwnerOnComplete : public WindowSliderDelegateTest {
154 public: 192 public:
155 explicit WindowSliderDeleteOwnerOnComplete(aura::Window* owner) 193 explicit WindowSliderDeleteOwnerOnComplete(aura::Window* owner)
156 : owner_(owner) { 194 : owner_(owner) {
157 } 195 }
158 virtual ~WindowSliderDeleteOwnerOnComplete() {} 196 virtual ~WindowSliderDeleteOwnerOnComplete() {}
159 197
160 private: 198 private:
161 // Overridden from WindowSlider::Delegate: 199 // Overridden from WindowSlider::Delegate:
162 virtual void OnWindowSlideComplete() OVERRIDE { 200 virtual void OnWindowFlingCompleted() OVERRIDE {
163 WindowSliderDelegateTest::OnWindowSlideComplete(); 201 WindowSliderDelegateTest::OnWindowFlingCompleted();
164 delete owner_; 202 delete owner_;
165 } 203 }
166 204
167 aura::Window* owner_; 205 aura::Window* owner_;
168 DISALLOW_COPY_AND_ASSIGN(WindowSliderDeleteOwnerOnComplete); 206 DISALLOW_COPY_AND_ASSIGN(WindowSliderDeleteOwnerOnComplete);
169 }; 207 };
170 208
171 typedef aura::test::AuraTestBase WindowSliderTest; 209 typedef aura::test::AuraTestBase WindowSliderTest;
172 210
173 TEST_F(WindowSliderTest, WindowSlideUsingGesture) { 211 TEST_F(WindowSliderTest, WindowSlideUsingGesture) {
174 scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL)); 212 scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL));
175 window->SetBounds(gfx::Rect(0, 0, 400, 400)); 213 window->SetBounds(gfx::Rect(0, 0, 400, 400));
176 WindowSliderDelegateTest slider_delegate; 214 WindowSliderDelegateTest slider_delegate;
177 215
178 aura::test::EventGenerator generator(root_window()); 216 aura::test::EventGenerator generator(root_window());
179 217
180 // Generate a horizontal overscroll. 218 // Generate a horizontal overscroll.
181 WindowSlider* slider = 219 WindowSlider* slider =
182 new WindowSlider(&slider_delegate, root_window(), window.get()); 220 new WindowSlider(&slider_delegate, root_window(), window.get());
183 generator.GestureScrollSequence(gfx::Point(10, 10), 221 generator.GestureScrollSequenceWithCallback(
184 gfx::Point(180, 10), 222 gfx::Point(10, 10),
185 base::TimeDelta::FromMilliseconds(10), 223 gfx::Point(180, 10),
186 10); 224 base::TimeDelta::FromMilliseconds(10),
225 10,
226 base::Bind(&ConfirmSlideDuringScrollCallback, slider));
187 EXPECT_TRUE(slider_delegate.created_back_layer()); 227 EXPECT_TRUE(slider_delegate.created_back_layer());
188 EXPECT_TRUE(slider_delegate.slide_completed()); 228 EXPECT_TRUE(slider_delegate.fling_started());
229 EXPECT_TRUE(slider_delegate.fling_completed());
189 EXPECT_FALSE(slider_delegate.created_front_layer()); 230 EXPECT_FALSE(slider_delegate.created_front_layer());
190 EXPECT_FALSE(slider_delegate.slide_aborted()); 231 EXPECT_FALSE(slider_delegate.slide_aborted());
191 EXPECT_FALSE(slider_delegate.slider_destroyed()); 232 EXPECT_FALSE(slider_delegate.slider_destroyed());
192 EXPECT_FALSE(slider->IsSlideInProgress()); 233 EXPECT_FALSE(slider->IsSlideInProgress());
193 slider_delegate.Reset(); 234 slider_delegate.Reset();
194 window->SetTransform(gfx::Transform()); 235 window->SetTransform(gfx::Transform());
195 236
196 // Generat a horizontal overscroll in the reverse direction. 237 // Generate a horizontal overscroll in the reverse direction.
197 generator.GestureScrollSequence(gfx::Point(180, 10), 238 generator.GestureScrollSequenceWithCallback(
198 gfx::Point(10, 10), 239 gfx::Point(180, 10),
199 base::TimeDelta::FromMilliseconds(10), 240 gfx::Point(10, 10),
200 10); 241 base::TimeDelta::FromMilliseconds(10),
242 10,
243 base::Bind(&ConfirmSlideDuringScrollCallback, slider));
201 EXPECT_TRUE(slider_delegate.created_front_layer()); 244 EXPECT_TRUE(slider_delegate.created_front_layer());
202 EXPECT_TRUE(slider_delegate.slide_completed()); 245 EXPECT_TRUE(slider_delegate.fling_started());
246 EXPECT_TRUE(slider_delegate.fling_completed());
203 EXPECT_FALSE(slider_delegate.created_back_layer()); 247 EXPECT_FALSE(slider_delegate.created_back_layer());
204 EXPECT_FALSE(slider_delegate.slide_aborted()); 248 EXPECT_FALSE(slider_delegate.slide_aborted());
205 EXPECT_FALSE(slider_delegate.slider_destroyed()); 249 EXPECT_FALSE(slider_delegate.slider_destroyed());
206 EXPECT_FALSE(slider->IsSlideInProgress()); 250 EXPECT_FALSE(slider->IsSlideInProgress());
207 slider_delegate.Reset(); 251 slider_delegate.Reset();
208 252
209 // Generate a vertical overscroll. 253 // Generate a vertical overscroll.
210 generator.GestureScrollSequence(gfx::Point(10, 10), 254 generator.GestureScrollSequenceWithCallback(
211 gfx::Point(10, 80), 255 gfx::Point(10, 10),
212 base::TimeDelta::FromMilliseconds(10), 256 gfx::Point(10, 80),
213 10); 257 base::TimeDelta::FromMilliseconds(10),
258 10,
259 base::Bind(&ConfirmNoSlideDuringScrollCallback, slider));
214 EXPECT_FALSE(slider_delegate.created_back_layer()); 260 EXPECT_FALSE(slider_delegate.created_back_layer());
215 EXPECT_FALSE(slider_delegate.slide_completed()); 261 EXPECT_FALSE(slider_delegate.fling_started());
262 EXPECT_FALSE(slider_delegate.fling_completed());
216 EXPECT_FALSE(slider_delegate.created_front_layer()); 263 EXPECT_FALSE(slider_delegate.created_front_layer());
217 EXPECT_FALSE(slider_delegate.slide_aborted()); 264 EXPECT_FALSE(slider_delegate.slide_aborted());
218 EXPECT_FALSE(slider->IsSlideInProgress()); 265 EXPECT_FALSE(slider->IsSlideInProgress());
219 slider_delegate.Reset(); 266 slider_delegate.Reset();
220 267
221 // Generate a horizontal scroll that starts overscroll, but doesn't scroll 268 // Generate a horizontal scroll that starts overscroll, but doesn't scroll
222 // enough to complete it. 269 // enough to complete it.
223 generator.GestureScrollSequence(gfx::Point(10, 10), 270 generator.GestureScrollSequenceWithCallback(
224 gfx::Point(80, 10), 271 gfx::Point(10, 10),
225 base::TimeDelta::FromMilliseconds(10), 272 gfx::Point(80, 10),
226 10); 273 base::TimeDelta::FromMilliseconds(10),
274 10,
275 base::Bind(&ConfirmSlideDuringScrollCallback, slider));
227 EXPECT_TRUE(slider_delegate.created_back_layer()); 276 EXPECT_TRUE(slider_delegate.created_back_layer());
228 EXPECT_TRUE(slider_delegate.slide_aborted()); 277 EXPECT_TRUE(slider_delegate.slide_aborted());
229 EXPECT_FALSE(slider_delegate.created_front_layer()); 278 EXPECT_FALSE(slider_delegate.created_front_layer());
230 EXPECT_FALSE(slider_delegate.slide_completed()); 279 EXPECT_FALSE(slider_delegate.fling_started());
280 EXPECT_FALSE(slider_delegate.fling_completed());
231 EXPECT_FALSE(slider_delegate.slider_destroyed()); 281 EXPECT_FALSE(slider_delegate.slider_destroyed());
232 EXPECT_FALSE(slider->IsSlideInProgress()); 282 EXPECT_FALSE(slider->IsSlideInProgress());
233 slider_delegate.Reset(); 283 slider_delegate.Reset();
234 284
235 // Destroy the window. This should destroy the slider. 285 // Destroy the window. This should destroy the slider.
236 window.reset(); 286 window.reset();
237 EXPECT_TRUE(slider_delegate.slider_destroyed()); 287 EXPECT_TRUE(slider_delegate.slider_destroyed());
238 } 288 }
239 289
240 // Tests that the window slide is cancelled when a different type of event 290 // Tests that the window slide is interrupted when a different type of event
241 // happens. 291 // happens.
242 TEST_F(WindowSliderTest, WindowSlideIsCancelledOnEvent) { 292 TEST_F(WindowSliderTest, WindowSlideIsCancelledOnEvent) {
243 scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL)); 293 scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL));
294 window->SetBounds(gfx::Rect(0, 0, 400, 400));
244 WindowSliderDelegateTest slider_delegate; 295 WindowSliderDelegateTest slider_delegate;
245 296
246 ui::Event* events[] = { 297 ui::Event* events[] = {
247 new ui::MouseEvent(ui::ET_MOUSE_MOVED, 298 new ui::MouseEvent(ui::ET_MOUSE_MOVED,
248 gfx::Point(55, 10), 299 gfx::Point(55, 10),
249 gfx::Point(55, 10), 300 gfx::Point(55, 10),
250 0, 0), 301 0, 0),
251 new ui::KeyEvent(ui::ET_KEY_PRESSED, 302 new ui::KeyEvent(ui::ET_KEY_PRESSED,
252 ui::VKEY_A, 303 ui::VKEY_A,
253 0, 304 0,
254 true), 305 true),
255 NULL 306 NULL
256 }; 307 };
257 308
258 new WindowSlider(&slider_delegate, root_window(), window.get()); 309 new WindowSlider(&slider_delegate, root_window(), window.get());
259 for (int i = 0; events[i]; ++i) { 310 for (int i = 0; events[i]; ++i) {
260 // Generate a horizontal overscroll. 311 // Generate a horizontal overscroll.
261 aura::test::EventGenerator generator(root_window()); 312 aura::test::EventGenerator generator(root_window());
262 generator.GestureScrollSequenceWithCallback( 313 generator.GestureScrollSequenceWithCallback(
263 gfx::Point(10, 10), 314 gfx::Point(10, 10),
264 gfx::Point(80, 10), 315 gfx::Point(80, 10),
265 base::TimeDelta::FromMilliseconds(10), 316 base::TimeDelta::FromMilliseconds(10),
266 1, 317 1,
267 base::Bind(&DispatchEventDuringScrollCallback, 318 base::Bind(&DispatchEventDuringScrollCallback,
268 root_window()->GetHost()->event_processor(), 319 root_window()->GetHost()->event_processor(),
269 base::Owned(events[i]))); 320 base::Owned(events[i])));
270 EXPECT_TRUE(slider_delegate.created_back_layer()); 321 EXPECT_TRUE(slider_delegate.created_back_layer());
271 EXPECT_TRUE(slider_delegate.slide_aborted()); 322 EXPECT_TRUE(slider_delegate.slide_aborted());
272 EXPECT_FALSE(slider_delegate.created_front_layer()); 323 EXPECT_FALSE(slider_delegate.created_front_layer());
273 EXPECT_FALSE(slider_delegate.slide_completed()); 324 EXPECT_FALSE(slider_delegate.fling_started());
325 EXPECT_FALSE(slider_delegate.fling_completed());
274 EXPECT_FALSE(slider_delegate.slider_destroyed()); 326 EXPECT_FALSE(slider_delegate.slider_destroyed());
275 slider_delegate.Reset(); 327 slider_delegate.Reset();
276 } 328 }
277 window.reset(); 329 window.reset();
278 EXPECT_TRUE(slider_delegate.slider_destroyed()); 330 EXPECT_TRUE(slider_delegate.slider_destroyed());
279 } 331 }
280 332
333 // Tests that the window slide can continue after it is interrupted by another
334 // event if the user continues scrolling.
335 TEST_F(WindowSliderTest, WindowSlideInterruptedThenContinues) {
336 scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL));
337 window->SetBounds(gfx::Rect(0, 0, 400, 400));
338 WindowSliderDelegateTest slider_delegate;
339
340 ui::ScopedAnimationDurationScaleMode normal_duration_(
341 ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION);
342 ui::LayerAnimator* animator = window->layer()->GetAnimator();
343 gfx::AnimationContainerElement* element = animator;
344 animator->set_disable_timer_for_test(true);
345 ui::LayerAnimatorTestController test_controller(animator);
346
347 WindowSlider* slider =
348 new WindowSlider(&slider_delegate, root_window(), window.get());
349
350 ui::MouseEvent interrupt_event(ui::ET_MOUSE_MOVED,
351 gfx::Point(55, 10),
352 gfx::Point(55, 10),
353 0, 0);
354
355 aura::test::EventGenerator generator(root_window());
356
357 // Start the scroll sequence. Scroll forward so that |window|'s layer is the
358 // one animating.
359 const int kTouchId = 5;
360 ui::TouchEvent press(ui::ET_TOUCH_PRESSED,
361 gfx::Point(10, 10),
362 kTouchId,
363 ui::EventTimeForNow());
364 generator.Dispatch(&press);
365
366 // First scroll event of the sequence.
367 ui::TouchEvent move1(ui::ET_TOUCH_MOVED,
368 gfx::Point(100, 10),
369 kTouchId,
370 ui::EventTimeForNow());
371 generator.Dispatch(&move1);
372 EXPECT_TRUE(slider->IsSlideInProgress());
373 EXPECT_FALSE(animator->is_animating());
374 // Dispatch the event after the first scroll and confirm it interrupts the
375 // scroll and starts the "reset slide" animation.
376 generator.Dispatch(&interrupt_event);
377 EXPECT_TRUE(slider->IsSlideInProgress());
378 EXPECT_TRUE(animator->is_animating());
379 EXPECT_TRUE(slider_delegate.created_back_layer());
380 // slide_aborted() should be false because the 'reset slide' animation
381 // hasn't completed yet.
382 EXPECT_FALSE(slider_delegate.slide_aborted());
383 EXPECT_FALSE(slider_delegate.created_front_layer());
384 EXPECT_FALSE(slider_delegate.fling_started());
385 EXPECT_FALSE(slider_delegate.fling_completed());
386 EXPECT_FALSE(slider_delegate.slider_destroyed());
387 slider_delegate.Reset();
388
389 // Second scroll event of the sequence.
390 ui::TouchEvent move2(ui::ET_TOUCH_MOVED,
391 gfx::Point(200, 10),
392 kTouchId,
393 ui::EventTimeForNow());
394 generator.Dispatch(&move2);
395 // The second scroll should instantly cause the animation to complete.
396 EXPECT_FALSE(animator->is_animating());
397 EXPECT_FALSE(slider_delegate.created_back_layer());
398 // The ResetScroll() animation was completed, so now slide_aborted()
399 // should be true.
400 EXPECT_TRUE(slider_delegate.slide_aborted());
401
402 // Third scroll event of the sequence.
403 ui::TouchEvent move3(ui::ET_TOUCH_MOVED,
404 gfx::Point(300, 10),
405 kTouchId,
406 ui::EventTimeForNow());
407 generator.Dispatch(&move3);
408 // The third scroll should re-start the sliding.
409 EXPECT_TRUE(slider->IsSlideInProgress());
410 EXPECT_TRUE(slider_delegate.created_back_layer());
411
412 // Generate the release event, finishing the scroll sequence.
413 ui::TouchEvent release(ui::ET_TOUCH_RELEASED,
414 gfx::Point(300, 10),
415 kTouchId,
416 ui::EventTimeForNow());
417 generator.Dispatch(&release);
418 // When the scroll gesture ends, the "fling" animation should start.
419 EXPECT_TRUE(slider->IsSlideInProgress());
420 EXPECT_TRUE(animator->is_animating());
421 EXPECT_TRUE(slider_delegate.fling_started());
422 EXPECT_FALSE(slider_delegate.created_front_layer());
423 EXPECT_FALSE(slider_delegate.fling_completed());
424 EXPECT_FALSE(slider_delegate.slider_destroyed());
425
426 // Progress the animator to complete the 'fling' animation.
427 base::TimeTicks start_time = animator->last_step_time();
428 animator->OnThreadedAnimationStarted(cc::AnimationEvent(
sadrul 2014/03/19 20:21:18 I don't think we are supposed to use cc::Animation
mfomitchev 2014/03/20 15:10:06 Done.
429 cc::AnimationEvent::Started,
430 0,
431 test_controller.GetRunningSequence(
432 ui::LayerAnimationElement::TRANSFORM)->animation_group_id(),
433 cc::Animation::Transform,
434 (start_time - base::TimeTicks()).InSecondsF()));
435 ui::ScopedLayerAnimationSettings settings(animator);
436 base::TimeDelta duration = settings.GetTransitionDuration();
437 element->Step(start_time + duration);
438 EXPECT_TRUE(slider_delegate.fling_completed());
439 EXPECT_FALSE(slider_delegate.slider_destroyed());
440
441 window.reset();
442 EXPECT_TRUE(slider_delegate.slider_destroyed());
443 }
444
281 // Tests that the slide works correctly when the owner of the window changes 445 // Tests that the slide works correctly when the owner of the window changes
282 // during the duration of the slide. 446 // during the duration of the slide.
283 TEST_F(WindowSliderTest, OwnerWindowChangesDuringWindowSlide) { 447 TEST_F(WindowSliderTest, OwnerWindowChangesDuringWindowSlide) {
284 scoped_ptr<aura::Window> parent(CreateNormalWindow(0, root_window(), NULL)); 448 scoped_ptr<aura::Window> parent(CreateNormalWindow(0, root_window(), NULL));
285 449
286 NoEventWindowDelegate window_delegate; 450 NoEventWindowDelegate window_delegate;
287 window_delegate.set_window_component(HTNOWHERE); 451 window_delegate.set_window_component(HTNOWHERE);
288 scoped_ptr<aura::Window> window(CreateNormalWindow(1, parent.get(), 452 scoped_ptr<aura::Window> window(CreateNormalWindow(1, parent.get(),
289 &window_delegate)); 453 &window_delegate));
290 454
(...skipping 10 matching lines...) Expand all
301 gfx::Point(80, 10), 465 gfx::Point(80, 10),
302 base::TimeDelta::FromMilliseconds(10), 466 base::TimeDelta::FromMilliseconds(10),
303 1, 467 1,
304 base::Bind(&ChangeSliderOwnerDuringScrollCallback, 468 base::Bind(&ChangeSliderOwnerDuringScrollCallback,
305 base::Unretained(&window), 469 base::Unretained(&window),
306 slider.get())); 470 slider.get()));
307 aura::Window* new_window = window.get(); 471 aura::Window* new_window = window.get();
308 EXPECT_NE(old_window, new_window); 472 EXPECT_NE(old_window, new_window);
309 473
310 EXPECT_TRUE(slider_delegate.created_back_layer()); 474 EXPECT_TRUE(slider_delegate.created_back_layer());
311 EXPECT_TRUE(slider_delegate.slide_completed()); 475 EXPECT_TRUE(slider_delegate.fling_started());
476 EXPECT_TRUE(slider_delegate.fling_completed());
312 EXPECT_FALSE(slider_delegate.created_front_layer()); 477 EXPECT_FALSE(slider_delegate.created_front_layer());
313 EXPECT_FALSE(slider_delegate.slide_aborted()); 478 EXPECT_FALSE(slider_delegate.slide_aborted());
314 EXPECT_FALSE(slider_delegate.slider_destroyed()); 479 EXPECT_FALSE(slider_delegate.slider_destroyed());
315 } 480 }
316 481
482 // If the delegate doesn't create the layer to show while sliding, WindowSlider
483 // shouldn't start the slide or change delegate's state in any way in response
484 // to user input.
317 TEST_F(WindowSliderTest, NoSlideWhenLayerCantBeCreated) { 485 TEST_F(WindowSliderTest, NoSlideWhenLayerCantBeCreated) {
318 scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL)); 486 scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL));
319 window->SetBounds(gfx::Rect(0, 0, 400, 400)); 487 window->SetBounds(gfx::Rect(0, 0, 400, 400));
320 WindowSliderDelegateTest slider_delegate; 488 WindowSliderDelegateTest slider_delegate;
321 slider_delegate.SetCanCreateLayer(false); 489 slider_delegate.SetCanCreateLayer(false);
490 WindowSlider* slider =
491 new WindowSlider(&slider_delegate, root_window(), window.get());
322 492
323 aura::test::EventGenerator generator(root_window()); 493 aura::test::EventGenerator generator(root_window());
324 494
325 // Generate a horizontal overscroll. 495 // No slide in progress should be reported during scroll since the layer
326 scoped_ptr<WindowSlider> slider( 496 // wasn't created.
327 new WindowSlider(&slider_delegate, root_window(), window.get())); 497 generator.GestureScrollSequenceWithCallback(
328 generator.GestureScrollSequence(gfx::Point(10, 10), 498 gfx::Point(10, 10),
329 gfx::Point(160, 10), 499 gfx::Point(180, 10),
330 base::TimeDelta::FromMilliseconds(10), 500 base::TimeDelta::FromMilliseconds(10),
331 10); 501 1,
502 base::Bind(&ConfirmNoSlideDuringScrollCallback, slider));
503
332 EXPECT_FALSE(slider_delegate.created_back_layer()); 504 EXPECT_FALSE(slider_delegate.created_back_layer());
333 EXPECT_FALSE(slider_delegate.slide_completed()); 505 EXPECT_FALSE(slider_delegate.fling_started());
506 EXPECT_FALSE(slider_delegate.fling_completed());
334 EXPECT_FALSE(slider_delegate.created_front_layer()); 507 EXPECT_FALSE(slider_delegate.created_front_layer());
335 EXPECT_FALSE(slider_delegate.slide_aborted()); 508 EXPECT_FALSE(slider_delegate.slide_aborted());
336 EXPECT_FALSE(slider_delegate.slider_destroyed()); 509 EXPECT_FALSE(slider_delegate.slider_destroyed());
337 window->SetTransform(gfx::Transform()); 510 window->SetTransform(gfx::Transform());
338 511
339 slider_delegate.SetCanCreateLayer(true); 512 slider_delegate.SetCanCreateLayer(true);
340 generator.GestureScrollSequence(gfx::Point(10, 10), 513 generator.GestureScrollSequenceWithCallback(
341 gfx::Point(160, 10), 514 gfx::Point(10, 10),
342 base::TimeDelta::FromMilliseconds(10), 515 gfx::Point(180, 10),
343 10); 516 base::TimeDelta::FromMilliseconds(10),
517 10,
518 base::Bind(&ConfirmSlideDuringScrollCallback, slider));
344 EXPECT_TRUE(slider_delegate.created_back_layer()); 519 EXPECT_TRUE(slider_delegate.created_back_layer());
345 EXPECT_TRUE(slider_delegate.slide_completed()); 520 EXPECT_TRUE(slider_delegate.fling_started());
521 EXPECT_TRUE(slider_delegate.fling_completed());
346 EXPECT_FALSE(slider_delegate.created_front_layer()); 522 EXPECT_FALSE(slider_delegate.created_front_layer());
347 EXPECT_FALSE(slider_delegate.slide_aborted()); 523 EXPECT_FALSE(slider_delegate.slide_aborted());
348 EXPECT_FALSE(slider_delegate.slider_destroyed()); 524 EXPECT_FALSE(slider_delegate.slider_destroyed());
525
526 window.reset();
527 EXPECT_TRUE(slider_delegate.slider_destroyed());
349 } 528 }
350 529
351 // Tests that the owner window can be destroyed from |OnWindowSliderDestroyed()| 530 // Tests that the owner window can be destroyed from |OnWindowSliderDestroyed()|
352 // delegate callback without causing a crash. 531 // delegate callback without causing a crash.
353 TEST_F(WindowSliderTest, OwnerIsDestroyedOnSliderDestroy) { 532 TEST_F(WindowSliderTest, OwnerIsDestroyedOnSliderDestroy) {
354 size_t child_windows = root_window()->children().size(); 533 size_t child_windows = root_window()->children().size();
355 aura::Window* window = CreateNormalWindow(0, root_window(), NULL); 534 aura::Window* window = CreateNormalWindow(0, root_window(), NULL);
356 window->SetBounds(gfx::Rect(0, 0, 400, 400)); 535 window->SetBounds(gfx::Rect(0, 0, 400, 400));
357 EXPECT_EQ(child_windows + 1, root_window()->children().size()); 536 EXPECT_EQ(child_windows + 1, root_window()->children().size());
358 537
359 WindowSliderDeleteOwnerOnDestroy slider_delegate(window); 538 WindowSliderDeleteOwnerOnDestroy slider_delegate(window);
360 aura::test::EventGenerator generator(root_window()); 539 aura::test::EventGenerator generator(root_window());
361 540
362 // Generate a horizontal overscroll. 541 // Generate a horizontal overscroll.
363 scoped_ptr<WindowSlider> slider( 542 scoped_ptr<WindowSlider> slider(
364 new WindowSlider(&slider_delegate, root_window(), window)); 543 new WindowSlider(&slider_delegate, root_window(), window));
365 generator.GestureScrollSequence(gfx::Point(10, 10), 544 generator.GestureScrollSequence(gfx::Point(10, 10),
366 gfx::Point(180, 10), 545 gfx::Point(180, 10),
367 base::TimeDelta::FromMilliseconds(10), 546 base::TimeDelta::FromMilliseconds(10),
368 10); 547 10);
369 EXPECT_TRUE(slider_delegate.created_back_layer()); 548 EXPECT_TRUE(slider_delegate.created_back_layer());
370 EXPECT_TRUE(slider_delegate.slide_completed()); 549 EXPECT_TRUE(slider_delegate.fling_started());
550 EXPECT_TRUE(slider_delegate.fling_completed());
371 EXPECT_FALSE(slider_delegate.created_front_layer()); 551 EXPECT_FALSE(slider_delegate.created_front_layer());
372 EXPECT_FALSE(slider_delegate.slide_aborted()); 552 EXPECT_FALSE(slider_delegate.slide_aborted());
373 EXPECT_FALSE(slider_delegate.slider_destroyed()); 553 EXPECT_FALSE(slider_delegate.slider_destroyed());
374 554
375 slider.reset(); 555 slider.reset();
376 // Destroying the slider would have destroyed |window| too. So |window| should 556 // Destroying the slider would have destroyed |window| too. So |window| should
377 // not need to be destroyed here. 557 // not need to be destroyed here.
378 EXPECT_EQ(child_windows, root_window()->children().size()); 558 EXPECT_EQ(child_windows, root_window()->children().size());
379 } 559 }
380 560
381 // Tests that the owner window can be destroyed from |OnWindowSlideComplete()| 561 // Tests that the owner window can be destroyed from |OnWindowSlideComplete()|
382 // delegate callback without causing a crash. 562 // delegate callback without causing a crash.
383 TEST_F(WindowSliderTest, OwnerIsDestroyedOnSlideComplete) { 563 TEST_F(WindowSliderTest, OwnerIsDestroyedOnSlideComplete) {
384 size_t child_windows = root_window()->children().size(); 564 size_t child_windows = root_window()->children().size();
385 aura::Window* window = CreateNormalWindow(0, root_window(), NULL); 565 aura::Window* window = CreateNormalWindow(0, root_window(), NULL);
386 window->SetBounds(gfx::Rect(0, 0, 400, 400)); 566 window->SetBounds(gfx::Rect(0, 0, 400, 400));
387 EXPECT_EQ(child_windows + 1, root_window()->children().size()); 567 EXPECT_EQ(child_windows + 1, root_window()->children().size());
388 568
389 WindowSliderDeleteOwnerOnComplete slider_delegate(window); 569 WindowSliderDeleteOwnerOnComplete slider_delegate(window);
390 aura::test::EventGenerator generator(root_window()); 570 aura::test::EventGenerator generator(root_window());
391 571
392 // Generate a horizontal overscroll. 572 // Generate a horizontal overscroll.
393 new WindowSlider(&slider_delegate, root_window(), window); 573 new WindowSlider(&slider_delegate, root_window(), window);
394 generator.GestureScrollSequence(gfx::Point(10, 10), 574 generator.GestureScrollSequence(gfx::Point(10, 10),
395 gfx::Point(180, 10), 575 gfx::Point(180, 10),
396 base::TimeDelta::FromMilliseconds(10), 576 base::TimeDelta::FromMilliseconds(10),
397 10); 577 10);
398 EXPECT_TRUE(slider_delegate.created_back_layer()); 578 EXPECT_TRUE(slider_delegate.created_back_layer());
399 EXPECT_TRUE(slider_delegate.slide_completed()); 579 EXPECT_TRUE(slider_delegate.fling_started());
580 EXPECT_TRUE(slider_delegate.fling_completed());
400 EXPECT_FALSE(slider_delegate.created_front_layer()); 581 EXPECT_FALSE(slider_delegate.created_front_layer());
401 EXPECT_FALSE(slider_delegate.slide_aborted()); 582 EXPECT_FALSE(slider_delegate.slide_aborted());
402 EXPECT_TRUE(slider_delegate.slider_destroyed()); 583 EXPECT_TRUE(slider_delegate.slider_destroyed());
403 584
404 // Destroying the slider would have destroyed |window| too. So |window| should 585 // Destroying the slider would have destroyed |window| too. So |window| should
405 // not need to be destroyed here. 586 // not need to be destroyed here.
406 EXPECT_EQ(child_windows, root_window()->children().size()); 587 EXPECT_EQ(child_windows, root_window()->children().size());
407 } 588 }
408 589
590 // Test the scenario when two swipe gesture occur quickly one after another so
591 // that the second swipe occurs while the transition animation triggered by the
592 // first swipe is in progress.
593 // The second swipe is supposed to instantly complete the animation caused by
594 // the first swipe, ask the delegate to create a new layer, and animate it.
595 TEST_F(WindowSliderTest, SwipeDuringSwipeAnimation) {
596 scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL));
597 window->SetBounds(gfx::Rect(0, 0, 400, 400));
598 WindowSliderDelegateTest slider_delegate;
599 new WindowSlider(&slider_delegate, root_window(), window.get());
600
601 ui::ScopedAnimationDurationScaleMode normal_duration_(
602 ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION);
603 ui::LayerAnimator* animator = window->layer()->GetAnimator();
604 gfx::AnimationContainerElement* element = animator;
605 animator->set_disable_timer_for_test(true);
606 ui::LayerAnimatorTestController test_controller(animator);
607
608 aura::test::EventGenerator generator(root_window());
609
610 // Swipe forward so that |window|'s layer is the one animating.
611 generator.GestureScrollSequence(
612 gfx::Point(10, 10),
613 gfx::Point(180, 10),
614 base::TimeDelta::FromMilliseconds(10),
615 2);
616 ui::ScopedLayerAnimationSettings settings(animator);
617 base::TimeDelta duration = settings.GetTransitionDuration();
618 base::TimeTicks start_time1 = animator->last_step_time();
619 EXPECT_TRUE(slider_delegate.created_back_layer());
620 EXPECT_FALSE(slider_delegate.slide_aborted());
621 EXPECT_FALSE(slider_delegate.created_front_layer());
622 EXPECT_TRUE(slider_delegate.fling_started());
623 EXPECT_FALSE(slider_delegate.fling_completed());
624 EXPECT_FALSE(slider_delegate.slider_destroyed());
625 // Transform animation is a threaded animation, so it needs an extra kick to
626 // emulate the start.
627 animator->OnThreadedAnimationStarted(cc::AnimationEvent(
628 cc::AnimationEvent::Started,
629 0,
630 test_controller.GetRunningSequence(ui::LayerAnimationElement::TRANSFORM)->
631 animation_group_id(),
632 cc::Animation::Transform,
633 (start_time1 - base::TimeTicks()).InSecondsF()));
634
635 base::TimeTicks start_time2 = start_time1 + duration/2;
636 element->Step(start_time2);
637 EXPECT_FALSE(slider_delegate.fling_completed());
638 slider_delegate.Reset();
639 // Generate another horizontal swipe while the animation from the previous
640 // swipe is in progress.
641 generator.GestureScrollSequence(
642 gfx::Point(10, 10),
643 gfx::Point(180, 10),
644 base::TimeDelta::FromMilliseconds(10),
645 2);
646 // Performing the second swipe should instantly complete the slide started
647 // by the first swipe and create a new layer.
648 EXPECT_TRUE(slider_delegate.created_back_layer());
649 EXPECT_FALSE(slider_delegate.slide_aborted());
650 EXPECT_FALSE(slider_delegate.created_front_layer());
651 EXPECT_TRUE(slider_delegate.fling_started());
652 EXPECT_TRUE(slider_delegate.fling_completed());
653 EXPECT_FALSE(slider_delegate.slider_destroyed());
654 animator->OnThreadedAnimationStarted(cc::AnimationEvent(
655 cc::AnimationEvent::Started,
656 0,
657 test_controller.GetRunningSequence(ui::LayerAnimationElement::TRANSFORM)->
658 animation_group_id(),
659 cc::Animation::Transform,
660 (start_time2 - base::TimeTicks()).InSecondsF()));
661 slider_delegate.Reset();
662 element->Step(start_time2 + duration);
663 // The animation for the second slide should now be completed.
664 EXPECT_TRUE(slider_delegate.fling_completed());
665 slider_delegate.Reset();
666
667 window.reset();
668 EXPECT_TRUE(slider_delegate.slider_destroyed());
669 }
670
409 } // namespace content 671 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698