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

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

Powered by Google App Engine
This is Rietveld 408576698