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