15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/toplevel_window_event_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/root_window_controller.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_window_ids.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h"
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/wm/lock_state_controller.h"
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/wm/resize_shadow.h"
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/wm/resize_shadow_controller.h"
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/wm/window_state.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace_controller.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/message_loop/message_loop.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/aura_constants.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/aura_test_base.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h"
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/event_generator.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/window_util.h"
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/window_move_client.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Windows headers define macros for these function names which screw with us.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(CreateWindow)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef CreateWindow
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple window delegate that returns the specified hit-test code when
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// requested and applies a minimum size constraint if there is one.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestWindowDelegate : public aura::test::TestWindowDelegate {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  explicit TestWindowDelegate(int hittest_code) {
49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    set_window_component(hittest_code);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestWindowDelegate() {}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from aura::Test::TestWindowDelegate:
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete this;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestWindowDelegate);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ToplevelWindowEventHandlerTest : public AshTestBase {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ToplevelWindowEventHandlerTest() {}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ToplevelWindowEventHandlerTest() {}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* CreateWindow(int hittest_code) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestWindowDelegate* d1 = new TestWindowDelegate(hittest_code);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* w1 = new aura::Window(d1);
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    w1->SetType(ui::wm::WINDOW_TYPE_NORMAL);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    w1->set_id(1);
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    w1->Init(aura::WINDOW_LAYER_TEXTURED);
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    aura::Window* parent = Shell::GetContainer(
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        Shell::GetPrimaryRootWindow(), kShellWindowId_AlwaysOnTopContainer);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent->AddChild(w1);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    w1->SetBounds(gfx::Rect(0, 0, 100, 100));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    w1->Show();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return w1;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DragFromCenterBy(aura::Window* window, int dx, int dy) {
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), window);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.DragMouseBy(dx, dy);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TouchDragFromCenterBy(aura::Window* window, int dx, int dy) {
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), window);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.PressMoveAndReleaseTouchBy(dx, dy);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ToplevelWindowEventHandler> handler_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ToplevelWindowEventHandlerTest);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Caption) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTCAPTION));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size size = w1->bounds().size();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 100, 100);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 100,100.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,100", w1->bounds().origin().ToString());
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should not have.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(size.ToString(), w1->bounds().size().ToString());
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TouchDragFromCenterBy(w1.get(), 100, 100);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 100,100.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("200,200", w1->bounds().origin().ToString());
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should not have.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(size.ToString(), w1->bounds().size().ToString());
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRight) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMRIGHT));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 100, 100);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 100,100.
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(200, 200).ToString(), w1->bounds().size().ToString());
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GrowBox) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTGROWBOX));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      static_cast<TestWindowDelegate*>(w1->delegate());
130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  window_delegate->set_minimum_size(gfx::Size(40, 40));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseToCenterOf(w1.get());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.DragMouseBy(100, 100);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 100,100.
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(200, 200).ToString(), w1->bounds().size().ToString());
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shrink the wnidow by (-100, -100).
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.DragMouseBy(-100, -100);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString());
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 100,100.
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(100, 100).ToString(), w1->bounds().size().ToString());
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enforce minimum size.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.DragMouseBy(-60, -60);
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString());
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40).ToString(), w1->bounds().size().ToString());
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Right) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTRIGHT));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 100, 100);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 100,0.
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(200, 100).ToString(), w1->bounds().size().ToString());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Bottom) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOM));
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 100, 100);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString());
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 0,100.
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(100, 200).ToString(), w1->bounds().size().ToString());
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopRight) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTTOPRIGHT));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), -50, 50);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 0,50.
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Point(0, 50).ToString(), w1->bounds().origin().ToString());
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 50,50.
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(50, 50).ToString(), w1->bounds().size().ToString());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Top) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTTOP));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 50, 50);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 0,50.
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Point(0, 50).ToString(), w1->bounds().origin().ToString());
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 0,50.
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(100, 50).ToString(), w1->bounds().size().ToString());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Left) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTLEFT));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 50, 50);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 50,0.
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Point(50, 0).ToString(), w1->bounds().origin().ToString());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 50,0.
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(50, 100).ToString(), w1->bounds().size().ToString());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeft) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMLEFT));
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 50, -50);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 50,0.
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Point(50, 0).ToString(), w1->bounds().origin().ToString());
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 50,50.
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(50, 50).ToString(), w1->bounds().size().ToString());
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopLeft) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTTOPLEFT));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 50, 50);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 50,50.
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Point(50, 50).ToString(), w1->bounds().origin().ToString());
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 50,50.
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(50, 50).ToString(), w1->bounds().size().ToString());
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Client) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTCLIENT));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds = w1->bounds();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 100, 100);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Neither position nor size should have changed.
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(bounds.ToString(), w1->bounds().ToString());
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, LeftPastMinimum) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTLEFT));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  window_delegate->set_minimum_size(gfx::Size(40, 40));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large left-to-right drag.  Window width should be clamped to
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // minimum and position change should be limited as well.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 333, 0);
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Point(60, 0).ToString(), w1->bounds().origin().ToString());
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 100).ToString(), w1->bounds().size().ToString());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, RightPastMinimum) {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTRIGHT));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
244ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  window_delegate->set_minimum_size(gfx::Size(40, 40));
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large right-to-left drag.  Window width should be clamped to
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // minimum and position should not change.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), -333, 0);
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString());
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 100).ToString(), w1->bounds().size().ToString());
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopLeftPastMinimum) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTTOPLEFT));
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
258ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  window_delegate->set_minimum_size(gfx::Size(40, 40));
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large top-left to bottom-right drag.  Window width should be
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clamped to minimum and position should be limited.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 333, 444);
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Point(60, 60).ToString(), w1->bounds().origin().ToString());
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40).ToString(), w1->bounds().size().ToString());
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopRightPastMinimum) {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTTOPRIGHT));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  window_delegate->set_minimum_size(gfx::Size(40, 40));
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large top-right to bottom-left drag.  Window size should be
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clamped to minimum, x position should not change, and y position should
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be clamped.
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), -333, 444);
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Point(0, 60).ToString(), w1->bounds().origin().ToString());
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40).ToString(), w1->bounds().size().ToString());
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeftPastMinimum) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMLEFT));
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
285ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  window_delegate->set_minimum_size(gfx::Size(40, 40));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large bottom-left to top-right drag.  Window size should be
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clamped to minimum, x position should be clamped, and y position should
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not change.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 333, -444);
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Point(60, 0).ToString(), w1->bounds().origin().ToString());
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40).ToString(), w1->bounds().size().ToString());
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRightPastMinimum) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMRIGHT));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  window_delegate->set_minimum_size(gfx::Size(40, 40));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large bottom-right to top-left drag.  Window size should be
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clamped to minimum and position should not change.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), -333, -444);
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString());
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40).ToString(), w1->bounds().size().ToString());
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRightWorkArea) {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMRIGHT));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow(
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target.get()).work_area();
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = target->bounds().origin();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag further than work_area bottom.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(target.get(), 100, work_area.height());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(position.ToString(), target->bounds().origin().ToString());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 100, work_area.height() - target->bounds.y()
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Size(200, work_area.height() - target->bounds().y()).ToString(),
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      target->bounds().size().ToString());
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeftWorkArea) {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMLEFT));
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow(
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target.get()).work_area();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = target->bounds().origin();
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag further than work_area bottom.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(target.get(), -30, work_area.height());
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // origin is now at 70, 100.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position.x() - 30, target->bounds().x());
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position.y(), target->bounds().y());
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 30, work_area.height() - target->bounds.y()
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Size(130, work_area.height() - target->bounds().y()).ToString(),
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      target->bounds().size().ToString());
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomWorkArea) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOM));
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow(
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target.get()).work_area();
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = target->bounds().origin();
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag further than work_area bottom.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(target.get(), 0, work_area.height());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(position.ToString(), target->bounds().origin().ToString());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 0, work_area.height() - target->bounds.y()
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Size(100, work_area.height() - target->bounds().y()).ToString(),
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      target->bounds().size().ToString());
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, DontDragIfModalChild) {
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTCAPTION));
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<aura::Window> w2(CreateWindow(HTCAPTION));
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  w2->SetBounds(gfx::Rect(100, 0, 100, 100));
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  w2->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW);
360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::wm::AddTransientChild(w1.get(), w2.get());
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Size size = w1->bounds().size();
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Attempt to drag w1, position and size should not change because w1 has a
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // modal child.
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DragFromCenterBy(w1.get(), 100, 100);
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("0,0", w1->bounds().origin().ToString());
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(size.ToString(), w1->bounds().size().ToString());
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TouchDragFromCenterBy(w1.get(), 100, 100);
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("0,0", w1->bounds().origin().ToString());
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(size.ToString(), w1->bounds().size().ToString());
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies we don't let windows drag to a -y location.
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, DontDragToNegativeY) {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTTOP));
3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     target.get());
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseTo(0, 5);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.DragMouseBy(0, -5);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The y location and height should not have changed.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, target->bounds().y());
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(100, target->bounds().height());
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies we don't let windows go bigger than the display width.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, DontGotWiderThanScreen) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTRIGHT));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow(
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target.get()).bounds();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(target.get(), work_area.width() * 2, 0);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The y location and height should not have changed.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.width(), target->bounds().width());
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that touch-gestures drag the window correctly.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDrag) {
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> target(
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new TestWindowDelegate(HTCAPTION),
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          0,
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Rect(0, 0, 100, 100)));
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wm::WindowState* window_state = wm::GetWindowState(target.get());
4045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
4055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     target.get());
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect old_bounds = target->bounds();
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point location(5, 5);
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target->SetProperty(aura::client::kCanMaximizeKey, true);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point end = location;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Snap right;
413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  end.Offset(100, 0);
414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  generator.GestureScrollSequence(location, end,
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(5),
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      10);
417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunAllPendingInMessageLoop();
418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Verify that the window has moved after the gesture.
420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_NE(old_bounds.ToString(), target->bounds().ToString());
421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED, window_state->GetStateType());
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  old_bounds = target->bounds();
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Snap left.
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  end = location = target->GetBoundsInRootWindow().CenterPoint();
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  end.Offset(-100, 0);
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  generator.GestureScrollSequence(location, end,
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(5),
430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      10);
431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunAllPendingInMessageLoop();
432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_NE(old_bounds.ToString(), target->bounds().ToString());
434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType());
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect bounds_before_maximization = target->bounds();
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bounds_before_maximization.Offset(0, 100);
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target->SetBounds(bounds_before_maximization);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  old_bounds = target->bounds();
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maximize.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  end = location = target->GetBoundsInRootWindow().CenterPoint();
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  end.Offset(0, -100);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.GestureScrollSequence(location, end,
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(5),
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      10);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
44868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(old_bounds.ToString(), target->bounds().ToString());
45068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(window_state->IsMaximized());
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(old_bounds.ToString(),
45268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            window_state->GetRestoreBoundsInScreen().ToString());
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  window_state->Restore();
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target->SetBounds(old_bounds);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Minimize.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  end = location = target->GetBoundsInRootWindow().CenterPoint();
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  end.Offset(0, 100);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.GestureScrollSequence(location, end,
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(5),
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      10);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(old_bounds.ToString(), target->bounds().ToString());
46568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(window_state->IsMinimized());
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(window_state->unminimize_to_restore_bounds());
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(old_bounds.ToString(),
46868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            window_state->GetRestoreBoundsInScreen().ToString());
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that a gesture cannot minimize a window in login/lock screen.
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDragMinimizeLoginScreen) {
4734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LockStateController* state_controller =
4744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Shell::GetInstance()->lock_state_controller();
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_controller->OnLoginStateChanged(user::LOGGED_IN_NONE);
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_controller->OnLockStateChanged(false);
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUserLoggedIn(false);
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION));
480c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  aura::Window* lock =
481c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      RootWindowController::ForWindow(target.get())
482c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          ->GetContainer(kShellWindowId_LockSystemModalContainer);
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lock->AddChild(target.get());
4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     target.get());
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect old_bounds = target->bounds();
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point location(5, 5);
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target->SetProperty(aura::client::kCanMaximizeKey, true);
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point end = location;
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  end.Offset(0, 100);
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator.GestureScrollSequence(location, end,
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(5),
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      10);
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunAllPendingInMessageLoop();
49668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(wm::GetWindowState(target.get())->IsMinimized());
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDragToRestore) {
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> window(
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new TestWindowDelegate(HTCAPTION),
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          0,
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Rect(10, 20, 30, 40)));
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window->Show();
50668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  wm::WindowState* window_state = wm::GetWindowState(window.get());
50768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  window_state->Activate();
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
5105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     window.get());
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect old_bounds = window->bounds();
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point location, end;
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  end = location = window->GetBoundsInRootWindow().CenterPoint();
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  end.Offset(0, 100);
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator.GestureScrollSequence(location, end,
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(5),
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      10);
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunAllPendingInMessageLoop();
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(old_bounds.ToString(), window->bounds().ToString());
52068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(window_state->IsMinimized());
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(window_state->unminimize_to_restore_bounds());
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(old_bounds.ToString(),
52368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            window_state->GetRestoreBoundsInScreen().ToString());
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that an unresizable window cannot be dragged or snapped using gestures.
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDragForUnresizableWindow) {
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION));
5294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wm::WindowState* window_state = wm::GetWindowState(target.get());
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
5325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     target.get());
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect old_bounds = target->bounds();
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point location(5, 5);
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target->SetProperty(aura::client::kCanResizeKey, false);
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point end = location;
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Try to snap right. The window is not resizable. So it should not snap.
541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  end.Offset(100, 0);
542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  generator.GestureScrollSequence(location, end,
543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(5),
544a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      10);
545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunAllPendingInMessageLoop();
546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Verify that the window has moved after the gesture.
548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Rect expected_bounds(old_bounds);
549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  expected_bounds.Offset(gfx::Vector2d(100, 0));
550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(expected_bounds.ToString(), target->bounds().ToString());
551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
552a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Verify that the window did not snap left.
553a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(window_state->IsNormalStateType());
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  old_bounds = target->bounds();
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Try to snap left. It should not snap.
558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  end = location = target->GetBoundsInRootWindow().CenterPoint();
559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  end.Offset(-100, 0);
560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  generator.GestureScrollSequence(location, end,
561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(5),
562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      10);
563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RunAllPendingInMessageLoop();
564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Verify that the window has moved after the gesture.
566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  expected_bounds = old_bounds;
567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  expected_bounds.Offset(gfx::Vector2d(-100, 0));
568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(expected_bounds.ToString(), target->bounds().ToString());
569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Verify that the window did not snap left.
571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(window_state->IsNormalStateType());
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that dragging multiple windows at the same time is not allowed.
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDragMultipleWindows) {
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> target(
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new TestWindowDelegate(HTCAPTION),
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          0,
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Rect(0, 0, 100, 100)));
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> notmoved(
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new TestWindowDelegate(HTCAPTION),
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          1, gfx::Rect(100, 0, 100, 100)));
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
5875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     target.get());
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect old_bounds = target->bounds();
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point location(5, 5);
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target->SetProperty(aura::client::kCanMaximizeKey, true);
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send some touch events to start dragging |target|.
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator.MoveTouch(location);
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator.PressTouch();
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  location.Offset(40, 5);
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator.MoveTouch(location);
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Try to drag |notmoved| window. This should not move the window.
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect bounds = notmoved->bounds();
6015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::test::EventGenerator gen(Shell::GetPrimaryRootWindow(), notmoved.get());
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Point start = notmoved->bounds().origin() + gfx::Vector2d(10, 10);
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Point end = start + gfx::Vector2d(100, 10);
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gen.GestureScrollSequence(start, end,
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::TimeDelta::FromMilliseconds(10),
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        10);
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(bounds.ToString(), notmoved->bounds().ToString());
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies pressing escape resets the bounds to the original bounds.
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled crbug.com/166219.
613d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_WIN)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EscapeReverts DISABLED_EscapeReverts
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EscapeReverts EscapeReverts
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, MAYBE_EscapeReverts) {
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMRIGHT));
6205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
6215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     target.get());
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.PressLeftButton();
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseBy(10, 11);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Execute any scheduled draws so that pending mouse events are processed.
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 110x111", target->bounds().ToString());
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.PressKey(ui::VKEY_ESCAPE, 0);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.ReleaseKey(ui::VKEY_ESCAPE, 0);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 100x100", target->bounds().ToString());
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies window minimization/maximization completes drag.
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled crbug.com/166219.
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MinimizeMaximizeCompletes DISABLED_MinimizeMaximizeCompletes
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MinimizeMaximizeCompletes MinimizeMaximizeCompletes
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, MAYBE_MinimizeMaximizeCompletes) {
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once window is minimized, window dragging completes.
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION));
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target->Focus();
6465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
6475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       target.get());
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.PressLeftButton();
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.MoveMouseBy(10, 11);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunAllPendingInMessageLoop();
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("10,11 100x100", target->bounds().ToString());
65268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    wm::WindowState* window_state = wm::GetWindowState(target.get());
65368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    window_state->Minimize();
65468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    window_state->Restore();
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.PressLeftButton();
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.MoveMouseBy(10, 11);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunAllPendingInMessageLoop();
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("10,11 100x100", target->bounds().ToString());
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once window is maximized, window dragging completes.
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION));
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target->Focus();
6665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
6675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       target.get());
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.PressLeftButton();
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.MoveMouseBy(10, 11);
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunAllPendingInMessageLoop();
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("10,11 100x100", target->bounds().ToString());
67268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    wm::WindowState* window_state = wm::GetWindowState(target.get());
67368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    window_state->Maximize();
67468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    window_state->Restore();
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.PressLeftButton();
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.MoveMouseBy(10, 11);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunAllPendingInMessageLoop();
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("10,11 100x100", target->bounds().ToString());
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies that a drag cannot be started via
6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// aura::client::WindowMoveClient::RunMoveLoop() while another drag is already
6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// in progress.
6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, RunMoveLoopFailsDuringInProgressDrag) {
6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<aura::Window> window1(CreateWindow(HTCAPTION));
6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("0,0 100x100", window1->bounds().ToString());
6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<aura::Window> window2(CreateWindow(HTCAPTION));
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
6925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     window1.get());
6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window1->Focus();
6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  generator.PressLeftButton();
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  generator.MoveMouseBy(10, 11);
6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("10,11 100x100", window1->bounds().ToString());
6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::client::WindowMoveClient* move_client =
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      aura::client::GetWindowMoveClient(window2->GetRootWindow());
7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(aura::client::MOVE_CANCELED,
7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            move_client->RunMoveLoop(window2.get(), gfx::Vector2d(),
7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                aura::client::WINDOW_MOVE_SOURCE_MOUSE));
7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  generator.ReleaseLeftButton();
7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("10,11 100x100", window1->bounds().ToString());
7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
708116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
709116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SendMouseReleaseAndReleaseCapture(ui::test::EventGenerator* generator,
711116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       aura::Window* window) {
712116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  generator->ReleaseLeftButton();
713116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  window->ReleaseCapture();
714116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
715116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
716116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
717116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
718116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Test that a drag is successful even if ET_MOUSE_CAPTURE_CHANGED is sent
719116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// immediately after the mouse release. views::Widget has this behavior.
720116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ToplevelWindowEventHandlerTest, CaptureLossAfterMouseRelease) {
721116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<aura::Window> window(CreateWindow(HTNOWHERE));
7225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
7235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     window.get());
724116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  generator.PressLeftButton();
725116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  window->SetCapture();
726116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
727116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  aura::client::WindowMoveClient* move_client =
728116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      aura::client::GetWindowMoveClient(window->GetRootWindow());
729116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::MessageLoopForUI::current()->PostTask(
730116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FROM_HERE,
731116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&SendMouseReleaseAndReleaseCapture,
732116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Unretained(&generator),
733116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Unretained(window.get())));
734116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(aura::client::MOVE_SUCCESSFUL,
735116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            move_client->RunMoveLoop(window.get(), gfx::Vector2d(),
736116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                aura::client::WINDOW_MOVE_SOURCE_MOUSE));
737116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
738116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Showing the resize shadows when the mouse is over the window edges is tested
7408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// in resize_shadow_and_cursor_test.cc
741ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace test
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
744