toplevel_window_event_handler_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace/snap_sizer.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace_controller.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/aura_test_base.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/event_generator.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_activation_client.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Windows headers define macros for these function names which screw with us.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(CreateWindow)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef CreateWindow
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple window delegate that returns the specified hit-test code when
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// requested and applies a minimum size constraint if there is one.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestWindowDelegate : public aura::test::TestWindowDelegate {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestWindowDelegate(int hittest_code)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : hittest_code_(hittest_code) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestWindowDelegate() {}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_min_size(const gfx::Size& size) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    min_size_ = size;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from aura::Test::TestWindowDelegate:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Size GetMinimumSize() const OVERRIDE {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return min_size_;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return hittest_code_;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWindowDestroyed() OVERRIDE {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete this;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int hittest_code_;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size min_size_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestWindowDelegate);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ToplevelWindowEventHandlerTest : public AshTestBase {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ToplevelWindowEventHandlerTest() : parent_(NULL) {}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ToplevelWindowEventHandlerTest() {}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::SetUp();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parent_ = new aura::Window(NULL);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parent_->Init(ui::LAYER_NOT_DRAWN);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parent_->Show();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Shell::GetPrimaryRootWindow()->AddChild(parent_);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parent_->SetBounds(Shell::GetPrimaryRootWindow()->bounds());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handler_.reset(new ToplevelWindowEventHandler(parent_));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parent_->AddPreTargetHandler(handler_.get());
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parent_->RemovePreTargetHandler(handler_.get());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handler_.reset();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parent_ = NULL;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::TearDown();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* CreateWindow(int hittest_code) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestWindowDelegate* d1 = new TestWindowDelegate(hittest_code);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* w1 = new aura::Window(d1);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    w1->set_id(1);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    w1->Init(ui::LAYER_TEXTURED);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    w1->SetParent(parent_);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    w1->SetBounds(gfx::Rect(0, 0, 100, 100));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    w1->Show();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return w1;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DragFromCenterBy(aura::Window* window, int dx, int dy) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), window);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.DragMouseBy(dx, dy);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TouchDragFromCenterBy(aura::Window* window, int dx, int dy) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), window);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.PressMoveAndReleaseTouchBy(dx, dy);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ToplevelWindowEventHandler> handler_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Window |handler_| is installed on. Owned by RootWindow.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* parent_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ToplevelWindowEventHandlerTest);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Caption) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTCAPTION));
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size size = w1->bounds().size();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 100, 100);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 100,100.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,100", w1->bounds().origin().ToString());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should not have.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(size.ToString(), w1->bounds().size().ToString());
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TouchDragFromCenterBy(w1.get(), 100, 100);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 100,100.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("200,200", w1->bounds().origin().ToString());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should not have.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(size.ToString(), w1->bounds().size().ToString());
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRight) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMRIGHT));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 100, 100);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, w1->bounds().origin());
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 100,100.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(200, 200), w1->bounds().size());
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GrowBox) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTGROWBOX));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static_cast<TestWindowDelegate*>(w1->delegate());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_delegate->set_min_size(gfx::Size(40, 40));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseToCenterOf(w1.get());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.DragMouseBy(100, 100);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, w1->bounds().origin());
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 100,100.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(200, 200), w1->bounds().size());
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shrink the wnidow by (-100, -100).
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.DragMouseBy(-100, -100);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, w1->bounds().origin());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 100,100.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(100, 100), w1->bounds().size());
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enforce minimum size.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.DragMouseBy(-60, -60);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, w1->bounds().origin());
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Right) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTRIGHT));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 100, 100);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, w1->bounds().origin());
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 100,0.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(200, 100), w1->bounds().size());
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Bottom) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOM));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 100, 100);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, w1->bounds().origin());
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 0,100.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(100, 200), w1->bounds().size());
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopRight) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTTOPRIGHT));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), -50, 50);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 0,50.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(0, 50), w1->bounds().origin());
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 50,50.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(50, 50), w1->bounds().size());
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Top) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTTOP));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 50, 50);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 0,50.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(0, 50), w1->bounds().origin());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 0,50.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(100, 50), w1->bounds().size());
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Left) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTLEFT));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 50, 50);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 50,0.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(50, 0), w1->bounds().origin());
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 50,0.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(50, 100), w1->bounds().size());
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeft) {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMLEFT));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 50, -50);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 50,0.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(50, 0), w1->bounds().origin());
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 50,50.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(50, 50), w1->bounds().size());
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopLeft) {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTTOPLEFT));
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 50, 50);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should have been offset by 50,50.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(50, 50), w1->bounds().origin());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have decreased by 50,50.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(50, 50), w1->bounds().size());
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Client) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTCLIENT));
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds = w1->bounds();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 100, 100);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Neither position nor size should have changed.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(bounds, w1->bounds());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, LeftPastMinimum) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTLEFT));
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_delegate->set_min_size(gfx::Size(40, 40));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large left-to-right drag.  Window width should be clamped to
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // minimum and position change should be limited as well.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 333, 0);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(60, 0), w1->bounds().origin());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 100), w1->bounds().size());
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, RightPastMinimum) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTRIGHT));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_delegate->set_min_size(gfx::Size(40, 40));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large right-to-left drag.  Window width should be clamped to
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // minimum and position should not change.
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), -333, 0);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, w1->bounds().origin());
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 100), w1->bounds().size());
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopLeftPastMinimum) {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTTOPLEFT));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_delegate->set_min_size(gfx::Size(40, 40));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large top-left to bottom-right drag.  Window width should be
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clamped to minimum and position should be limited.
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 333, 444);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(60, 60), w1->bounds().origin());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopRightPastMinimum) {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTTOPRIGHT));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_delegate->set_min_size(gfx::Size(40, 40));
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large top-right to bottom-left drag.  Window size should be
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clamped to minimum, x position should not change, and y position should
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be clamped.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), -333, 444);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(0, 60), w1->bounds().origin());
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size());
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeftPastMinimum) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMLEFT));
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_delegate->set_min_size(gfx::Size(40, 40));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large bottom-left to top-right drag.  Window size should be
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clamped to minimum, x position should be clamped, and y position should
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not change.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), 333, -444);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Point(60, 0), w1->bounds().origin());
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRightPastMinimum) {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMRIGHT));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWindowDelegate* window_delegate =
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<TestWindowDelegate*>(w1->delegate());
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_delegate->set_min_size(gfx::Size(40, 40));
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = w1->bounds().origin();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a large bottom-right to top-left drag.  Window size should be
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clamped to minimum and position should not change.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(w1.get(), -333, -444);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, w1->bounds().origin());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size());
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRightWorkArea) {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMRIGHT));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow(
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target.get()).work_area();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = target->bounds().origin();
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag further than work_area bottom.
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(target.get(), 100, work_area.height());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, target->bounds().origin());
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 100, work_area.height() - target->bounds.y()
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(200, work_area.height() - target->bounds().y()),
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            target->bounds().size());
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeftWorkArea) {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMLEFT));
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow(
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target.get()).work_area();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = target->bounds().origin();
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag further than work_area bottom.
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(target.get(), -30, work_area.height());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // origin is now at 70, 100.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position.x() - 30, target->bounds().x());
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position.y(), target->bounds().y());
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 30, work_area.height() - target->bounds.y()
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(130, work_area.height() - target->bounds().y()),
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            target->bounds().size());
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomWorkArea) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOM));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow(
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target.get()).work_area();
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point position = target->bounds().origin();
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag further than work_area bottom.
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(target.get(), 0, work_area.height());
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Position should not have changed.
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(position, target->bounds().origin());
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size should have increased by 0, work_area.height() - target->bounds.y()
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(100, work_area.height() - target->bounds().y()),
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            target->bounds().size());
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies we don't let windows drag to a -y location.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, DontDragToNegativeY) {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTTOP));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       target.get());
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseTo(0, 5);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.DragMouseBy(0, -5);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The y location and height should not have changed.
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, target->bounds().y());
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(100, target->bounds().height());
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies we don't let windows go bigger than the display width.
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, DontGotWiderThanScreen) {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTRIGHT));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow(
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target.get()).bounds();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DragFromCenterBy(target.get(), work_area.width() * 2, 0);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The y location and height should not have changed.
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_area.width(), target->bounds().width());
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that touch-gestures drag the window correctly.
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDrag) {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION));
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       target.get());
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect old_bounds = target->bounds();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point location(5, 5);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Snap right;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point end = location;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  end.Offset(100, 0);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.GestureScrollSequence(location, end,
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(5),
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      10);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the window has moved after the gesture.
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(old_bounds.ToString(), target->bounds().ToString());
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internal::SnapSizer sizer(target.get(), location,
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        internal::SnapSizer::RIGHT_EDGE,
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        internal::SnapSizer::OTHER_INPUT);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(sizer.target_bounds().ToString(), target->bounds().ToString());
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  old_bounds = target->bounds();
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Snap left.
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  end = location = target->GetBoundsInRootWindow().CenterPoint();
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  end.Offset(-100, 0);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.GestureScrollSequence(location, end,
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(5),
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      10);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(old_bounds.ToString(), target->bounds().ToString());
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internal::SnapSizer sizer(target.get(), location,
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        internal::SnapSizer::LEFT_EDGE,
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        internal::SnapSizer::OTHER_INPUT);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(sizer.target_bounds().ToString(), target->bounds().ToString());
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  old_bounds = target->bounds();
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();
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(old_bounds.ToString(), target->bounds().ToString());
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsWindowMaximized(target.get()));
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::RestoreWindow(target.get());
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target->SetBounds(old_bounds);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Minimize.
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  end = location = target->GetBoundsInRootWindow().CenterPoint();
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  end.Offset(0, 100);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.GestureScrollSequence(location, end,
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(5),
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      10);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(old_bounds.ToString(), target->bounds().ToString());
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsWindowMinimized(target.get()));
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies pressing escape resets the bounds to the original bounds.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EscapeReverts DISABLED_EscapeReverts
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EscapeReverts EscapeReverts
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, MAYBE_EscapeReverts) {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::RootWindow* root = Shell::GetPrimaryRootWindow();
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::ActivationClient* original_client =
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aura::client::GetActivationClient(root);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::TestActivationClient activation_client(root);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMRIGHT));
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target->Focus();
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       target.get());
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.PressLeftButton();
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseBy(10, 11);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Execute any scheduled draws so that pending mouse events are processed.
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 110x111", target->bounds().ToString());
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.PressKey(ui::VKEY_ESCAPE, 0);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.ReleaseKey(ui::VKEY_ESCAPE, 0);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 100x100", target->bounds().ToString());
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::SetActivationClient(root, original_client);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies window minimization/maximization completes drag.
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, MinimizeMaximizeCompletes) {
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once window is minimized, window dragging completes.
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION));
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target->Focus();
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         target.get());
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.PressLeftButton();
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.MoveMouseBy(10, 11);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunAllPendingInMessageLoop();
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("10,11 100x100", target->bounds().ToString());
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wm::MinimizeWindow(target.get());
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wm::RestoreWindow(target.get());
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.PressLeftButton();
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.MoveMouseBy(10, 11);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunAllPendingInMessageLoop();
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("10,11 100x100", target->bounds().ToString());
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once window is maximized, window dragging completes.
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION));
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target->Focus();
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         target.get());
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.PressLeftButton();
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.MoveMouseBy(10, 11);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunAllPendingInMessageLoop();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("10,11 100x100", target->bounds().ToString());
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wm::MaximizeWindow(target.get());
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wm::RestoreWindow(target.get());
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.PressLeftButton();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.MoveMouseBy(10, 11);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunAllPendingInMessageLoop();
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("10,11 100x100", target->bounds().ToString());
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace test
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
538