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

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

Powered by Google App Engine
This is Rietveld 408576698