toplevel_window_event_handler_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/property_util.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/session_state_controller_impl.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace/snap_sizer.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace_controller.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/aura_constants.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/aura_test_base.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/event_generator.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_activation_client.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Windows headers define macros for these function names which screw with us.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(CreateWindow)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef CreateWindow
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple window delegate that returns the specified hit-test code when
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// requested and applies a minimum size constraint if there is one.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestWindowDelegate : public aura::test::TestWindowDelegate {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestWindowDelegate(int hittest_code)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : hittest_code_(hittest_code) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestWindowDelegate() {}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_min_size(const gfx::Size& size) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    min_size_ = size;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from aura::Test::TestWindowDelegate:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Size GetMinimumSize() const OVERRIDE {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return min_size_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return hittest_code_;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWindowDestroyed() OVERRIDE {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete this;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int hittest_code_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size min_size_;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestWindowDelegate);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ToplevelWindowEventHandlerTest : public AshTestBase {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ToplevelWindowEventHandlerTest() {}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ToplevelWindowEventHandlerTest() {}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* CreateWindow(int hittest_code) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestWindowDelegate* d1 = new TestWindowDelegate(hittest_code);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* w1 = new aura::Window(d1);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    w1->SetType(aura::client::WINDOW_TYPE_NORMAL);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    w1->set_id(1);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    w1->Init(ui::LAYER_TEXTURED);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* parent =
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetContainer(Shell::GetPrimaryRootWindow(),
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          internal::kShellWindowId_AlwaysOnTopContainer);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent->AddChild(w1);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    w1->SetBounds(gfx::Rect(0, 0, 100, 100));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    w1->Show();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return w1;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DragFromCenterBy(aura::Window* window, int dx, int dy) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), window);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.DragMouseBy(dx, dy);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TouchDragFromCenterBy(aura::Window* window, int dx, int dy) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), window);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.PressMoveAndReleaseTouchBy(dx, dy);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ToplevelWindowEventHandler> handler_;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ToplevelWindowEventHandlerTest);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Caption) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTCAPTION));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size size = w1->bounds().size();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 100, 100);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 100,100.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,100", w1->bounds().origin().ToString());
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should not have.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(size.ToString(), w1->bounds().size().ToString());
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TouchDragFromCenterBy(w1.get(), 100, 100);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 100,100.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("200,200", w1->bounds().origin().ToString());
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should not have.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(size.ToString(), w1->bounds().size().ToString());
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRight) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMRIGHT));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 100, 100);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, w1->bounds().origin());
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 100,100.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(200, 200), w1->bounds().size());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GrowBox) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTGROWBOX));
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static_cast<TestWindowDelegate*>(w1->delegate());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_delegate->set_min_size(gfx::Size(40, 40));
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseToCenterOf(w1.get());
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.DragMouseBy(100, 100);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, w1->bounds().origin());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 100,100.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(200, 200), w1->bounds().size());
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shrink the wnidow by (-100, -100).
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.DragMouseBy(-100, -100);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, w1->bounds().origin());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 100,100.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(100, 100), w1->bounds().size());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enforce minimum size.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.DragMouseBy(-60, -60);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, w1->bounds().origin());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size());
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Right) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTRIGHT));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 100, 100);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, w1->bounds().origin());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 100,0.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(200, 100), w1->bounds().size());
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Bottom) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOM));
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 100, 100);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, w1->bounds().origin());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 0,100.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(100, 200), w1->bounds().size());
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopRight) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTTOPRIGHT));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), -50, 50);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 0,50.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(0, 50), w1->bounds().origin());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 50,50.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(50, 50), w1->bounds().size());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Top) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTTOP));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 50, 50);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 0,50.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(0, 50), w1->bounds().origin());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 0,50.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(100, 50), w1->bounds().size());
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Left) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTLEFT));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 50, 50);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 50,0.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(50, 0), w1->bounds().origin());
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 50,0.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(50, 100), w1->bounds().size());
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeft) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMLEFT));
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 50, -50);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 50,0.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(50, 0), w1->bounds().origin());
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 50,50.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(50, 50), w1->bounds().size());
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopLeft) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTTOPLEFT));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 50, 50);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 50,50.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(50, 50), w1->bounds().origin());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 50,50.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(50, 50), w1->bounds().size());
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Client) {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTCLIENT));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds = w1->bounds();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 100, 100);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Neither position nor size should have changed.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(bounds, w1->bounds());
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, LeftPastMinimum) {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTLEFT));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_delegate->set_min_size(gfx::Size(40, 40));
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large left-to-right drag.  Window width should be clamped to
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // minimum and position change should be limited as well.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 333, 0);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(60, 0), w1->bounds().origin());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 100), w1->bounds().size());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, RightPastMinimum) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTRIGHT));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_delegate->set_min_size(gfx::Size(40, 40));
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large right-to-left drag.  Window width should be clamped to
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // minimum and position should not change.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), -333, 0);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, w1->bounds().origin());
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 100), w1->bounds().size());
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopLeftPastMinimum) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTTOPLEFT));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_delegate->set_min_size(gfx::Size(40, 40));
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large top-left to bottom-right drag.  Window width should be
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clamped to minimum and position should be limited.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 333, 444);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(60, 60), w1->bounds().origin());
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size());
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopRightPastMinimum) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTTOPRIGHT));
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_delegate->set_min_size(gfx::Size(40, 40));
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large top-right to bottom-left drag.  Window size should be
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clamped to minimum, x position should not change, and y position should
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be clamped.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), -333, 444);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(0, 60), w1->bounds().origin());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeftPastMinimum) {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMLEFT));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_delegate->set_min_size(gfx::Size(40, 40));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large bottom-left to top-right drag.  Window size should be
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clamped to minimum, x position should be clamped, and y position should
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not change.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 333, -444);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(60, 0), w1->bounds().origin());
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size());
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRightPastMinimum) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMRIGHT));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_delegate->set_min_size(gfx::Size(40, 40));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large bottom-right to top-left drag.  Window size should be
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clamped to minimum and position should not change.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), -333, -444);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, w1->bounds().origin());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRightWorkArea) {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMRIGHT));
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow(
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target.get()).work_area();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = target->bounds().origin();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag further than work_area bottom.
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(target.get(), 100, work_area.height());
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, target->bounds().origin());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 100, work_area.height() - target->bounds.y()
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(200, work_area.height() - target->bounds().y()),
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            target->bounds().size());
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeftWorkArea) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMLEFT));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow(
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target.get()).work_area();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = target->bounds().origin();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag further than work_area bottom.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(target.get(), -30, work_area.height());
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // origin is now at 70, 100.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position.x() - 30, target->bounds().x());
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position.y(), target->bounds().y());
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 30, work_area.height() - target->bounds.y()
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(130, work_area.height() - target->bounds().y()),
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            target->bounds().size());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomWorkArea) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOM));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow(
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target.get()).work_area();
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = target->bounds().origin();
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag further than work_area bottom.
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(target.get(), 0, work_area.height());
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, target->bounds().origin());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 0, work_area.height() - target->bounds.y()
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(100, work_area.height() - target->bounds().y()),
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            target->bounds().size());
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies we don't let windows drag to a -y location.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, DontDragToNegativeY) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTTOP));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       target.get());
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseTo(0, 5);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.DragMouseBy(0, -5);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The y location and height should not have changed.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, target->bounds().y());
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(100, target->bounds().height());
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies we don't let windows go bigger than the display width.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, DontGotWiderThanScreen) {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTRIGHT));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow(
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target.get()).bounds();
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(target.get(), work_area.width() * 2, 0);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The y location and height should not have changed.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.width(), target->bounds().width());
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that touch-gestures drag the window correctly.
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDrag) {
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> target(
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new TestWindowDelegate(HTCAPTION),
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          0,
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Rect(0, 0, 100, 100)));
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       target.get());
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect old_bounds = target->bounds();
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point location(5, 5);
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target->SetProperty(aura::client::kCanMaximizeKey, true);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point end = location;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Snap right;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Get the expected snapped bounds before snapping.
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internal::SnapSizer sizer(target.get(), location,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        internal::SnapSizer::RIGHT_EDGE,
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        internal::SnapSizer::OTHER_INPUT);
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect snapped_bounds = sizer.GetSnapBounds(target->bounds());
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    end.Offset(100, 0);
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator.GestureScrollSequence(location, end,
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::TimeDelta::FromMilliseconds(5),
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        10);
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RunAllPendingInMessageLoop();
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Verify that the window has moved after the gesture.
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(old_bounds.ToString(), target->bounds().ToString());
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(snapped_bounds.ToString(), target->bounds().ToString());
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  old_bounds = target->bounds();
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Snap left.
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Get the expected snapped bounds before snapping.
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internal::SnapSizer sizer(target.get(), location,
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        internal::SnapSizer::LEFT_EDGE,
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        internal::SnapSizer::OTHER_INPUT);
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect snapped_bounds = sizer.GetSnapBounds(target->bounds());
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    end = location = target->GetBoundsInRootWindow().CenterPoint();
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    end.Offset(-100, 0);
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator.GestureScrollSequence(location, end,
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::TimeDelta::FromMilliseconds(5),
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        10);
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RunAllPendingInMessageLoop();
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(old_bounds.ToString(), target->bounds().ToString());
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(snapped_bounds.ToString(), target->bounds().ToString());
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect bounds_before_maximization = target->bounds();
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bounds_before_maximization.Offset(0, 100);
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target->SetBounds(bounds_before_maximization);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  old_bounds = target->bounds();
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maximize.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  end = location = target->GetBoundsInRootWindow().CenterPoint();
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  end.Offset(0, -100);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.GestureScrollSequence(location, end,
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(5),
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      10);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(old_bounds.ToString(), target->bounds().ToString());
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsWindowMaximized(target.get()));
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(old_bounds.ToString(),
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetRestoreBoundsInScreen(target.get())->ToString());
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::RestoreWindow(target.get());
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target->SetBounds(old_bounds);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Minimize.
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  end = location = target->GetBoundsInRootWindow().CenterPoint();
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  end.Offset(0, 100);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.GestureScrollSequence(location, end,
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(5),
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      10);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(old_bounds.ToString(), target->bounds().ToString());
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsWindowMinimized(target.get()));
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetWindowAlwaysRestoresToRestoreBounds(target.get()));
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(old_bounds.ToString(),
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetRestoreBoundsInScreen(target.get())->ToString());
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that a gesture cannot minimize a window in login/lock screen.
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDragMinimizeLoginScreen) {
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SessionStateControllerImpl* state_controller =
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<SessionStateControllerImpl*>
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (Shell::GetInstance()->session_state_controller());
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_controller->OnLoginStateChanged(user::LOGGED_IN_NONE);
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_controller->OnLockStateChanged(false);
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUserLoggedIn(false);
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION));
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* lock = internal::RootWindowController::ForWindow(target.get())->
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetContainer(internal::kShellWindowId_LockSystemModalContainer);
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lock->AddChild(target.get());
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       target.get());
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect old_bounds = target->bounds();
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point location(5, 5);
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target->SetProperty(aura::client::kCanMaximizeKey, true);
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point end = location;
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  end.Offset(0, 100);
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator.GestureScrollSequence(location, end,
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(5),
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      10);
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunAllPendingInMessageLoop();
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wm::IsWindowMinimized(target.get()));
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDragToRestore) {
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> window(
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new TestWindowDelegate(HTCAPTION),
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          0,
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Rect(10, 20, 30, 40)));
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window->Show();
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::wm::ActivateWindow(window.get());
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       window.get());
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect old_bounds = window->bounds();
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point location, end;
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  end = location = window->GetBoundsInRootWindow().CenterPoint();
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  end.Offset(0, 100);
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator.GestureScrollSequence(location, end,
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(5),
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      10);
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunAllPendingInMessageLoop();
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(old_bounds.ToString(), window->bounds().ToString());
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wm::IsWindowMinimized(window.get()));
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetWindowAlwaysRestoresToRestoreBounds(window.get()));
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(old_bounds.ToString(),
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetRestoreBoundsInScreen(window.get())->ToString());
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that an unresizable window cannot be dragged or snapped using gestures.
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDragForUnresizableWindow) {
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION));
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (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.
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Get the expected snapped bounds before the gesture.
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    internal::SnapSizer sizer(target.get(), location,
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        internal::SnapSizer::RIGHT_EDGE,
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        internal::SnapSizer::OTHER_INPUT);
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect snapped_bounds = sizer.GetSnapBounds(target->bounds());
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    end.Offset(100, 0);
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator.GestureScrollSequence(location, end,
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::TimeDelta::FromMilliseconds(5),
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        10);
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RunAllPendingInMessageLoop();
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Verify that the window has moved after the gesture.
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect expected_bounds(old_bounds);
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    expected_bounds.Offset(gfx::Vector2d(100, 0));
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_bounds.ToString(), target->bounds().ToString());
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Verify that the window did not snap left.
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(snapped_bounds.ToString(), target->bounds().ToString());
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  old_bounds = target->bounds();
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Try to snap left. It should not snap.
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Get the expected snapped bounds before the gesture.
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    internal::SnapSizer sizer(target.get(), location,
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        internal::SnapSizer::LEFT_EDGE,
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        internal::SnapSizer::OTHER_INPUT);
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect snapped_bounds = sizer.GetSnapBounds(target->bounds());
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    end = location = target->GetBoundsInRootWindow().CenterPoint();
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    end.Offset(-100, 0);
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator.GestureScrollSequence(location, end,
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::TimeDelta::FromMilliseconds(5),
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        10);
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RunAllPendingInMessageLoop();
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Verify that the window has moved after the gesture.
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect expected_bounds(old_bounds);
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    expected_bounds.Offset(gfx::Vector2d(-100, 0));
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_bounds.ToString(), target->bounds().ToString());
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Verify that the window did not snap left.
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(snapped_bounds.ToString(), target->bounds().ToString());
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that dragging multiple windows at the same time is not allowed.
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDragMultipleWindows) {
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> target(
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new TestWindowDelegate(HTCAPTION),
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          0,
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Rect(0, 0, 100, 100)));
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> notmoved(
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new TestWindowDelegate(HTCAPTION),
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          1, gfx::Rect(100, 0, 100, 100)));
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       target.get());
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect old_bounds = target->bounds();
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point location(5, 5);
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target->SetProperty(aura::client::kCanMaximizeKey, true);
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send some touch events to start dragging |target|.
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator.MoveTouch(location);
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator.PressTouch();
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  location.Offset(40, 5);
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator.MoveTouch(location);
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Try to drag |notmoved| window. This should not move the window.
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect bounds = notmoved->bounds();
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::EventGenerator gen(Shell::GetPrimaryRootWindow(),
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   notmoved.get());
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Point start = notmoved->bounds().origin() + gfx::Vector2d(10, 10);
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Point end = start + gfx::Vector2d(100, 10);
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gen.GestureScrollSequence(start, end,
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::TimeDelta::FromMilliseconds(10),
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        10);
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(bounds.ToString(), notmoved->bounds().ToString());
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies pressing escape resets the bounds to the original bounds.
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled crbug.com/166219.
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EscapeReverts DISABLED_EscapeReverts
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EscapeReverts EscapeReverts
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, MAYBE_EscapeReverts) {
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMRIGHT));
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       target.get());
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.PressLeftButton();
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseBy(10, 11);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Execute any scheduled draws so that pending mouse events are processed.
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 110x111", target->bounds().ToString());
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.PressKey(ui::VKEY_ESCAPE, 0);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.ReleaseKey(ui::VKEY_ESCAPE, 0);
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 100x100", target->bounds().ToString());
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies window minimization/maximization completes drag.
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled crbug.com/166219.
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MinimizeMaximizeCompletes DISABLED_MinimizeMaximizeCompletes
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MinimizeMaximizeCompletes MinimizeMaximizeCompletes
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, MAYBE_MinimizeMaximizeCompletes) {
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once window is minimized, window dragging completes.
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION));
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target->Focus();
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         target.get());
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.PressLeftButton();
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.MoveMouseBy(10, 11);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunAllPendingInMessageLoop();
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("10,11 100x100", target->bounds().ToString());
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wm::MinimizeWindow(target.get());
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wm::RestoreWindow(target.get());
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.PressLeftButton();
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.MoveMouseBy(10, 11);
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunAllPendingInMessageLoop();
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("10,11 100x100", target->bounds().ToString());
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once window is maximized, window dragging completes.
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION));
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target->Focus();
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         target.get());
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.PressLeftButton();
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.MoveMouseBy(10, 11);
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunAllPendingInMessageLoop();
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("10,11 100x100", target->bounds().ToString());
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wm::MaximizeWindow(target.get());
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wm::RestoreWindow(target.get());
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.PressLeftButton();
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.MoveMouseBy(10, 11);
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunAllPendingInMessageLoop();
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("10,11 100x100", target->bounds().ToString());
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace test
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
701