OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |