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