17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/web_contents/aura/window_slider.h"
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/bind.h"
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/time/time.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/aura/test/aura_test_base.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/aura/window.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/base/hit_test.h"
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/compositor/scoped_animation_duration_scale_mode.h"
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/compositor/scoped_layer_animation_settings.h"
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/compositor/test/layer_animator_test_controller.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/event_processor.h"
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/events/event_utils.h"
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/event_generator.h"
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/gfx/frame_time.h"
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace content {
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DispatchEventDuringScrollCallback(ui::EventProcessor* dispatcher,
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       ui::Event* event,
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       ui::EventType type,
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       const gfx::Vector2dF& delta) {
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (type != ui::ET_GESTURE_SCROLL_UPDATE)
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::EventDispatchDetails details = dispatcher->OnEventFromSource(event);
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(!details.dispatcher_destroyed);
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ChangeSliderOwnerDuringScrollCallback(scoped_ptr<aura::Window>* window,
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                           WindowSlider* slider,
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                           ui::EventType type,
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                           const gfx::Vector2dF& delta) {
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (type != ui::ET_GESTURE_SCROLL_UPDATE)
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  aura::Window* new_window = new aura::Window(NULL);
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  new_window->Init(aura::WINDOW_LAYER_TEXTURED);
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  new_window->Show();
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  slider->ChangeOwner(new_window);
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  (*window)->parent()->AddChild(new_window);
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  window->reset(new_window);
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ConfirmSlideDuringScrollCallback(WindowSlider* slider,
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                      ui::EventType type,
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                      const gfx::Vector2dF& delta) {
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  static float total_delta_x = 0;
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (type == ui::ET_GESTURE_SCROLL_BEGIN)
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    total_delta_x = 0;
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (type == ui::ET_GESTURE_SCROLL_UPDATE) {
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    total_delta_x += delta.x();
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (total_delta_x >= 70)
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      EXPECT_TRUE(slider->IsSlideInProgress());
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  } else {
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_FALSE(slider->IsSlideInProgress());
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ConfirmNoSlideDuringScrollCallback(WindowSlider* slider,
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                        ui::EventType type,
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                        const gfx::Vector2dF& delta) {
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider->IsSlideInProgress());
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// The window delegate does not receive any events.
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class NoEventWindowDelegate : public aura::test::TestWindowDelegate {
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  NoEventWindowDelegate() {
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~NoEventWindowDelegate() {}
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Overridden from aura::WindowDelegate:
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual bool HasHitTestMask() const OVERRIDE { return true; }
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NoEventWindowDelegate);
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class WindowSliderDelegateTest : public WindowSlider::Delegate {
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  WindowSliderDelegateTest()
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      : can_create_layer_(true),
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        created_back_layer_(false),
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        created_front_layer_(false),
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        slide_completing_(false),
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        slide_completed_(false),
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        slide_aborted_(false),
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        slider_destroyed_(false) {
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~WindowSliderDelegateTest() {
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // Make sure slide_completed() gets called if slide_completing() was called.
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    CHECK(!slide_completing_ || slide_completed_);
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void Reset() {
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    can_create_layer_ = true;
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    created_back_layer_ = false;
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    created_front_layer_ = false;
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    slide_completing_ = false;
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    slide_completed_ = false;
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    slide_aborted_ = false;
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    slider_destroyed_ = false;
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetCanCreateLayer(bool can_create_layer) {
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    can_create_layer_ = can_create_layer;
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool created_back_layer() const { return created_back_layer_; }
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool created_front_layer() const { return created_front_layer_; }
116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool slide_completing() const { return slide_completing_; }
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool slide_completed() const { return slide_completed_; }
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool slide_aborted() const { return slide_aborted_; }
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool slider_destroyed() const { return slider_destroyed_; }
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected:
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ui::Layer* CreateLayerForTest() {
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CHECK(can_create_layer_);
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ui::Layer* layer = new ui::Layer(ui::LAYER_SOLID_COLOR);
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    layer->SetColor(SK_ColorRED);
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return layer;
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Overridden from WindowSlider::Delegate:
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ui::Layer* CreateBackLayer() OVERRIDE {
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!can_create_layer_)
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return NULL;
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    created_back_layer_ = true;
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return CreateLayerForTest();
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ui::Layer* CreateFrontLayer() OVERRIDE {
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!can_create_layer_)
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return NULL;
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    created_front_layer_ = true;
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return CreateLayerForTest();
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void OnWindowSlideCompleted(scoped_ptr<ui::Layer> layer) OVERRIDE {
1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    slide_completed_ = true;
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void OnWindowSlideCompleting() OVERRIDE {
149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    slide_completing_ = true;
150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void OnWindowSlideAborted() OVERRIDE {
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    slide_aborted_ = true;
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void OnWindowSliderDestroyed() OVERRIDE {
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    slider_destroyed_ = true;
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool can_create_layer_;
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool created_back_layer_;
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool created_front_layer_;
164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool slide_completing_;
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool slide_completed_;
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool slide_aborted_;
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool slider_destroyed_;
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WindowSliderDelegateTest);
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This delegate destroys the owner window when the slider is destroyed.
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass WindowSliderDeleteOwnerOnDestroy : public WindowSliderDelegateTest {
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  explicit WindowSliderDeleteOwnerOnDestroy(aura::Window* owner)
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      : owner_(owner) {
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~WindowSliderDeleteOwnerOnDestroy() {}
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Overridden from WindowSlider::Delegate:
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnWindowSliderDestroyed() OVERRIDE {
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    WindowSliderDelegateTest::OnWindowSliderDestroyed();
184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    delete owner_;
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  aura::Window* owner_;
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(WindowSliderDeleteOwnerOnDestroy);
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This delegate destroyes the owner window when a slide is completed.
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass WindowSliderDeleteOwnerOnComplete : public WindowSliderDelegateTest {
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  explicit WindowSliderDeleteOwnerOnComplete(aura::Window* owner)
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      : owner_(owner) {
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~WindowSliderDeleteOwnerOnComplete() {}
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Overridden from WindowSlider::Delegate:
20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void OnWindowSlideCompleted(scoped_ptr<ui::Layer> layer) OVERRIDE {
20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    WindowSliderDelegateTest::OnWindowSlideCompleted(layer.Pass());
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    delete owner_;
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  aura::Window* owner_;
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(WindowSliderDeleteOwnerOnComplete);
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef aura::test::AuraTestBase WindowSliderTest;
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WindowSliderTest, WindowSlideUsingGesture) {
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL));
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  window->SetBounds(gfx::Rect(0, 0, 400, 400));
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  WindowSliderDelegateTest slider_delegate;
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(root_window());
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Generate a horizontal overscroll.
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  WindowSlider* slider =
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      new WindowSlider(&slider_delegate, root_window(), window.get());
222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  generator.GestureScrollSequenceWithCallback(
223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gfx::Point(10, 10),
224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gfx::Point(180, 10),
225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::TimeDelta::FromMilliseconds(10),
226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      10,
227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(&ConfirmSlideDuringScrollCallback, slider));
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(slider_delegate.created_back_layer());
229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.slide_completing());
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(slider_delegate.slide_completed());
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(slider_delegate.created_front_layer());
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(slider_delegate.slide_aborted());
233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider_delegate.slider_destroyed());
234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider->IsSlideInProgress());
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  slider_delegate.Reset();
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  window->SetTransform(gfx::Transform());
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Generate a horizontal overscroll in the reverse direction.
239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  generator.GestureScrollSequenceWithCallback(
240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gfx::Point(180, 10),
241effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gfx::Point(10, 10),
242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::TimeDelta::FromMilliseconds(10),
243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      10,
244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(&ConfirmSlideDuringScrollCallback, slider));
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(slider_delegate.created_front_layer());
246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.slide_completing());
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(slider_delegate.slide_completed());
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(slider_delegate.created_back_layer());
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(slider_delegate.slide_aborted());
250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider_delegate.slider_destroyed());
251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider->IsSlideInProgress());
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  slider_delegate.Reset();
2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Generate a vertical overscroll.
255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  generator.GestureScrollSequenceWithCallback(
256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gfx::Point(10, 10),
257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gfx::Point(10, 80),
258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::TimeDelta::FromMilliseconds(10),
259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      10,
260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(&ConfirmNoSlideDuringScrollCallback, slider));
2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(slider_delegate.created_back_layer());
262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.slide_completing());
2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(slider_delegate.slide_completed());
2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(slider_delegate.created_front_layer());
2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(slider_delegate.slide_aborted());
266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider->IsSlideInProgress());
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  slider_delegate.Reset();
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Generate a horizontal scroll that starts overscroll, but doesn't scroll
2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // enough to complete it.
271effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  generator.GestureScrollSequenceWithCallback(
272effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gfx::Point(10, 10),
273effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gfx::Point(80, 10),
274effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::TimeDelta::FromMilliseconds(10),
275effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      10,
276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(&ConfirmSlideDuringScrollCallback, slider));
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(slider_delegate.created_back_layer());
2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(slider_delegate.slide_aborted());
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(slider_delegate.created_front_layer());
280effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.slide_completing());
2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(slider_delegate.slide_completed());
2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(slider_delegate.slider_destroyed());
283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider->IsSlideInProgress());
2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  slider_delegate.Reset();
2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Destroy the window. This should destroy the slider.
2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  window.reset();
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(slider_delegate.slider_destroyed());
2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
291effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Tests that the window slide is interrupted when a different type of event
2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// happens.
2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WindowSliderTest, WindowSlideIsCancelledOnEvent) {
2947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL));
295effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  window->SetBounds(gfx::Rect(0, 0, 400, 400));
2967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  WindowSliderDelegateTest slider_delegate;
2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ui::Event* events[] = {
2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    new ui::MouseEvent(ui::ET_MOUSE_MOVED,
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       gfx::Point(55, 10),
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       gfx::Point(55, 10),
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       0, 0),
3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new ui::KeyEvent('a', ui::VKEY_A, ui::EF_NONE),
3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    NULL
3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  };
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  new WindowSlider(&slider_delegate, root_window(), window.get());
3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  for (int i = 0; events[i]; ++i) {
3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Generate a horizontal overscroll.
3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::test::EventGenerator generator(root_window());
3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    generator.GestureScrollSequenceWithCallback(
3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        gfx::Point(10, 10),
3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        gfx::Point(80, 10),
3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(10),
3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        1,
3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::Bind(&DispatchEventDuringScrollCallback,
317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   root_window()->GetHost()->event_processor(),
3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                   base::Owned(events[i])));
3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_TRUE(slider_delegate.created_back_layer());
3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_TRUE(slider_delegate.slide_aborted());
3217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_FALSE(slider_delegate.created_front_layer());
322effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_FALSE(slider_delegate.slide_completing());
3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_FALSE(slider_delegate.slide_completed());
3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_FALSE(slider_delegate.slider_destroyed());
3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    slider_delegate.Reset();
3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  window.reset();
3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(slider_delegate.slider_destroyed());
3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
331effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Tests that the window slide can continue after it is interrupted by another
332effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// event if the user continues scrolling.
333effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(WindowSliderTest, WindowSlideInterruptedThenContinues) {
334effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL));
335effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  window->SetBounds(gfx::Rect(0, 0, 400, 400));
336effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  WindowSliderDelegateTest slider_delegate;
337effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
338effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ui::ScopedAnimationDurationScaleMode normal_duration_(
339effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION);
340effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ui::LayerAnimator* animator = window->layer()->GetAnimator();
341effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  animator->set_disable_timer_for_test(true);
342effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ui::LayerAnimatorTestController test_controller(animator);
343effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
344effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  WindowSlider* slider =
345effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      new WindowSlider(&slider_delegate, root_window(), window.get());
346effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
347effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ui::MouseEvent interrupt_event(ui::ET_MOUSE_MOVED,
348effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                 gfx::Point(55, 10),
349effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                 gfx::Point(55, 10),
350effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                 0, 0);
351effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(root_window());
353effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
354effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Start the scroll sequence. Scroll forward so that |window|'s layer is the
355effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // one animating.
356effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const int kTouchId = 5;
357effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ui::TouchEvent press(ui::ET_TOUCH_PRESSED,
358effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       gfx::Point(10, 10),
359effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       kTouchId,
360effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       ui::EventTimeForNow());
361effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  generator.Dispatch(&press);
362effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
363effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // First scroll event of the sequence.
364effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ui::TouchEvent move1(ui::ET_TOUCH_MOVED,
365effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       gfx::Point(100, 10),
366effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       kTouchId,
367effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       ui::EventTimeForNow());
368effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  generator.Dispatch(&move1);
369effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider->IsSlideInProgress());
370effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(animator->is_animating());
371effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Dispatch the event after the first scroll and confirm it interrupts the
372effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // scroll and starts  the "reset slide" animation.
373effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  generator.Dispatch(&interrupt_event);
374effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider->IsSlideInProgress());
375effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(animator->is_animating());
376effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.created_back_layer());
377effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // slide_aborted() should be false because the 'reset slide' animation
378effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // hasn't completed yet.
379effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.slide_aborted());
380effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.created_front_layer());
381effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.slide_completing());
382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.slide_completed());
383effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.slider_destroyed());
384effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  slider_delegate.Reset();
385effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
386effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Second scroll event of the sequence.
387effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ui::TouchEvent move2(ui::ET_TOUCH_MOVED,
388effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       gfx::Point(200, 10),
389effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       kTouchId,
390effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       ui::EventTimeForNow());
391effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  generator.Dispatch(&move2);
392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The second scroll should instantly cause the animation to complete.
393effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(animator->is_animating());
394effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.created_back_layer());
395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The ResetScroll() animation was completed, so now slide_aborted()
396effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // should be true.
397effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.slide_aborted());
398effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
399effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Third scroll event of the sequence.
400effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ui::TouchEvent move3(ui::ET_TOUCH_MOVED,
401effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       gfx::Point(300, 10),
402effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       kTouchId,
403effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       ui::EventTimeForNow());
404effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  generator.Dispatch(&move3);
405effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The third scroll should re-start the sliding.
406effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider->IsSlideInProgress());
407effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.created_back_layer());
408effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
409effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Generate the release event, finishing the scroll sequence.
410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ui::TouchEvent release(ui::ET_TOUCH_RELEASED,
411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                         gfx::Point(300, 10),
412effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                         kTouchId,
413effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                         ui::EventTimeForNow());
414effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  generator.Dispatch(&release);
415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // When the scroll gesture ends, the slide animation should start.
416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider->IsSlideInProgress());
417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(animator->is_animating());
418effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.slide_completing());
419effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.created_front_layer());
420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.slide_completed());
421effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.slider_destroyed());
422effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Progress the animator to complete the slide animation.
424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ui::ScopedLayerAnimationSettings settings(animator);
425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::TimeDelta duration = settings.GetTransitionDuration();
426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  test_controller.StartThreadedAnimationsIfNeeded();
42746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  animator->Step(gfx::FrameTime::Now() + duration);
428effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.slide_completed());
430effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.slider_destroyed());
431effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
432effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  window.reset();
433effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.slider_destroyed());
434effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
435effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Tests that the slide works correctly when the owner of the window changes
4377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// during the duration of the slide.
4387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WindowSliderTest, OwnerWindowChangesDuringWindowSlide) {
4397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<aura::Window> parent(CreateNormalWindow(0, root_window(), NULL));
4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  NoEventWindowDelegate window_delegate;
4427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  window_delegate.set_window_component(HTNOWHERE);
4437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<aura::Window> window(CreateNormalWindow(1, parent.get(),
4447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                                     &window_delegate));
4457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  WindowSliderDelegateTest slider_delegate;
447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<WindowSlider> slider(
448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      new WindowSlider(&slider_delegate, parent.get(), window.get()));
4497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Generate a horizontal scroll, and change the owner in the middle of the
4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // scroll.
4525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(root_window());
4537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  aura::Window* old_window = window.get();
4547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.GestureScrollSequenceWithCallback(
4557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      gfx::Point(10, 10),
4567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      gfx::Point(80, 10),
4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(10),
4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      1,
4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&ChangeSliderOwnerDuringScrollCallback,
4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 base::Unretained(&window),
461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 slider.get()));
4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  aura::Window* new_window = window.get();
4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_NE(old_window, new_window);
4647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(slider_delegate.created_back_layer());
466effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.slide_completing());
4677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(slider_delegate.slide_completed());
4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(slider_delegate.created_front_layer());
4697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(slider_delegate.slide_aborted());
470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider_delegate.slider_destroyed());
471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
473effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// If the delegate doesn't create the layer to show while sliding, WindowSlider
474effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// shouldn't start the slide or change delegate's state in any way in response
475effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// to user input.
476eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(WindowSliderTest, NoSlideWhenLayerCantBeCreated) {
477eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL));
478eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  window->SetBounds(gfx::Rect(0, 0, 400, 400));
479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  WindowSliderDelegateTest slider_delegate;
480eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  slider_delegate.SetCanCreateLayer(false);
481effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  WindowSlider* slider =
482effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      new WindowSlider(&slider_delegate, root_window(), window.get());
483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(root_window());
485eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
486effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // No slide in progress should be reported during scroll since the layer
487effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // wasn't created.
488effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  generator.GestureScrollSequenceWithCallback(
489effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gfx::Point(10, 10),
490effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gfx::Point(180, 10),
491effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::TimeDelta::FromMilliseconds(10),
492effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      1,
493effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(&ConfirmNoSlideDuringScrollCallback, slider));
494effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
495eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider_delegate.created_back_layer());
496effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.slide_completing());
497eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider_delegate.slide_completed());
498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider_delegate.created_front_layer());
499eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider_delegate.slide_aborted());
500eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider_delegate.slider_destroyed());
501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  window->SetTransform(gfx::Transform());
502eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
503eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  slider_delegate.SetCanCreateLayer(true);
504effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  generator.GestureScrollSequenceWithCallback(
505effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gfx::Point(10, 10),
506effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gfx::Point(180, 10),
507effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::TimeDelta::FromMilliseconds(10),
508effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      10,
509effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(&ConfirmSlideDuringScrollCallback, slider));
510eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(slider_delegate.created_back_layer());
511effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.slide_completing());
512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(slider_delegate.slide_completed());
513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider_delegate.created_front_layer());
514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider_delegate.slide_aborted());
515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider_delegate.slider_destroyed());
516effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
517effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  window.reset();
518effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.slider_destroyed());
519eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
521eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Tests that the owner window can be destroyed from |OnWindowSliderDestroyed()|
522eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// delegate callback without causing a crash.
523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(WindowSliderTest, OwnerIsDestroyedOnSliderDestroy) {
524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  size_t child_windows = root_window()->children().size();
525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  aura::Window* window = CreateNormalWindow(0, root_window(), NULL);
526eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  window->SetBounds(gfx::Rect(0, 0, 400, 400));
527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(child_windows + 1, root_window()->children().size());
528eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
529eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  WindowSliderDeleteOwnerOnDestroy slider_delegate(window);
5305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(root_window());
531eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Generate a horizontal overscroll.
533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<WindowSlider> slider(
534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      new WindowSlider(&slider_delegate, root_window(), window));
535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  generator.GestureScrollSequence(gfx::Point(10, 10),
5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  gfx::Point(180, 10),
537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  base::TimeDelta::FromMilliseconds(10),
538eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  10);
539eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(slider_delegate.created_back_layer());
540effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.slide_completing());
541eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(slider_delegate.slide_completed());
542eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider_delegate.created_front_layer());
543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider_delegate.slide_aborted());
544eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider_delegate.slider_destroyed());
545eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  slider.reset();
547eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Destroying the slider would have destroyed |window| too. So |window| should
548eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // not need to be destroyed here.
549eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(child_windows, root_window()->children().size());
550eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Tests that the owner window can be destroyed from |OnWindowSlideComplete()|
553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// delegate callback without causing a crash.
554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(WindowSliderTest, OwnerIsDestroyedOnSlideComplete) {
555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  size_t child_windows = root_window()->children().size();
556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  aura::Window* window = CreateNormalWindow(0, root_window(), NULL);
557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  window->SetBounds(gfx::Rect(0, 0, 400, 400));
558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(child_windows + 1, root_window()->children().size());
559eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  WindowSliderDeleteOwnerOnComplete slider_delegate(window);
5615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(root_window());
562eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
563eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Generate a horizontal overscroll.
564eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  new WindowSlider(&slider_delegate, root_window(), window);
565eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  generator.GestureScrollSequence(gfx::Point(10, 10),
5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  gfx::Point(180, 10),
567eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  base::TimeDelta::FromMilliseconds(10),
568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  10);
569eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(slider_delegate.created_back_layer());
570effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.slide_completing());
571eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(slider_delegate.slide_completed());
572eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider_delegate.created_front_layer());
573eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(slider_delegate.slide_aborted());
5747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(slider_delegate.slider_destroyed());
575eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
576eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Destroying the slider would have destroyed |window| too. So |window| should
577eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // not need to be destroyed here.
578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(child_windows, root_window()->children().size());
5797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
581effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Test the scenario when two swipe gesture occur quickly one after another so
582effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// that the second swipe occurs while the transition animation triggered by the
583effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// first swipe is in progress.
584effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// The second swipe is supposed to instantly complete the animation caused by
585effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// the first swipe, ask the delegate to create a new layer, and animate it.
586effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(WindowSliderTest, SwipeDuringSwipeAnimation) {
587effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL));
588effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  window->SetBounds(gfx::Rect(0, 0, 400, 400));
589effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  WindowSliderDelegateTest slider_delegate;
590effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  new WindowSlider(&slider_delegate, root_window(), window.get());
591effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // This test uses explicit durations so needs a normal duration.
5935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::ScopedAnimationDurationScaleMode normal_duration(
594effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION);
595effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ui::LayerAnimator* animator = window->layer()->GetAnimator();
596effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  animator->set_disable_timer_for_test(true);
597effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ui::LayerAnimatorTestController test_controller(animator);
598effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(root_window());
600effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
601effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Swipe forward so that |window|'s layer is the one animating.
602effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  generator.GestureScrollSequence(
603effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gfx::Point(10, 10),
604effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gfx::Point(180, 10),
605effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::TimeDelta::FromMilliseconds(10),
606effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      2);
607effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.created_back_layer());
608effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.slide_aborted());
609effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.created_front_layer());
610effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.slide_completing());
611effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.slide_completed());
612effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.slider_destroyed());
613effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ui::ScopedLayerAnimationSettings settings(animator);
614effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::TimeDelta duration = settings.GetTransitionDuration();
615effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  test_controller.StartThreadedAnimationsIfNeeded();
616effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::TimeTicks start_time1 =  gfx::FrameTime::Now();
617effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
61846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  animator->Step(start_time1 + duration / 2);
619effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.slide_completed());
620effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  slider_delegate.Reset();
621effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Generate another horizontal swipe while the animation from the previous
622effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // swipe is in progress.
623effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  generator.GestureScrollSequence(
624effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gfx::Point(10, 10),
625effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gfx::Point(180, 10),
626effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::TimeDelta::FromMilliseconds(10),
627effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      2);
628effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Performing the second swipe should instantly complete the slide started
629effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // by the first swipe and create a new layer.
630effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.created_back_layer());
631effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.slide_aborted());
632effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.created_front_layer());
633effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.slide_completing());
634effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.slide_completed());
635effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(slider_delegate.slider_destroyed());
636effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  test_controller.StartThreadedAnimationsIfNeeded();
637effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::TimeTicks start_time2 =  gfx::FrameTime::Now();
638effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  slider_delegate.Reset();
63946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  animator->Step(start_time2 + duration);
640effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The animation for the second slide should now be completed.
641effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.slide_completed());
642effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  slider_delegate.Reset();
643effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
644effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  window.reset();
645effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(slider_delegate.slider_destroyed());
646effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
647effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
6487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace content
649