workspace_window_resizer_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/workspace/workspace_window_resizer.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/display_controller.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/root_window_controller.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/screen_ash.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/property_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace/phantom_window_controller.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/workspace/snap_sizer.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/workspace_controller.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_number_conversions.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stringprintf.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/aura_constants.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/insets.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kRootHeight = 600; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple window delegate that returns the specified min size. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestWindowDelegate : public aura::test::TestWindowDelegate { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate() { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestWindowDelegate() {} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_min_size(const gfx::Size& size) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) min_size_ = size; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_max_size(const gfx::Size& size) { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_size_ = size; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from aura::Test::TestWindowDelegate: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Size GetMinimumSize() const OVERRIDE { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return min_size_; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Size GetMaximumSize() const OVERRIDE { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return max_size_; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size min_size_; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size max_size_; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestWindowDelegate); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WorkspaceWindowResizerTest : public test::AshTestBase { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkspaceWindowResizerTest() : window_(NULL) {} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WorkspaceWindowResizerTest() {} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AshTestBase::SetUp(); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay(base::StringPrintf("800x%d", kRootHeight)); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::RootWindow* root = Shell::GetPrimaryRootWindow(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect root_bounds(root->bounds()); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // RootWindow and Display can't resize on Windows Ash. 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // http://crbug.com/165962 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kRootHeight, root_bounds.height()); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(800, root_bounds.width()); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.reset(new aura::Window(&delegate_)); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetType(aura::client::WINDOW_TYPE_NORMAL); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->Init(ui::LAYER_NOT_DRAWN); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetDefaultParentByPrimaryRootWindow(window_.get()); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->set_id(1); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_.reset(new aura::Window(&delegate2_)); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetType(aura::client::WINDOW_TYPE_NORMAL); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Init(ui::LAYER_NOT_DRAWN); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetDefaultParentByPrimaryRootWindow(window2_.get()); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->set_id(2); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_.reset(new aura::Window(&delegate3_)); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_->SetType(aura::client::WINDOW_TYPE_NORMAL); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_->Init(ui::LAYER_NOT_DRAWN); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetDefaultParentByPrimaryRootWindow(window3_.get()); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_->set_id(3); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_.reset(new aura::Window(&delegate4_)); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_->SetType(aura::client::WINDOW_TYPE_NORMAL); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_->Init(ui::LAYER_NOT_DRAWN); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetDefaultParentByPrimaryRootWindow(window4_.get()); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_->set_id(4); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.reset(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_.reset(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_.reset(); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_.reset(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AshTestBase::TearDown(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a string identifying the z-order of each of the known child windows 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of |parent|. The returned string constains the id of the known windows and 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is ordered from topmost to bottomost windows. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string WindowOrderAsString(aura::Window* parent) const { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const aura::Window::Windows& windows = parent->children(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (aura::Window::Windows::const_reverse_iterator i = windows.rbegin(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != windows.rend(); ++i) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*i == window_.get() || *i == window2_.get() || *i == window3_.get()) { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result.empty()) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += " "; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += base::IntToString((*i)->id()); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point CalculateDragPoint(const WorkspaceWindowResizer& resizer, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int delta_x, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int delta_y) const { 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point location = resizer.GetInitialLocationInParentForTest(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location.set_x(location.x() + delta_x); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location.set_y(location.y() + delta_y); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return location; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> empty_windows() const { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::vector<aura::Window*>(); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::ShelfLayoutManager* shelf_layout_manager() { 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate delegate_; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate delegate2_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate delegate3_; 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestWindowDelegate delegate4_; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> window_; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> window2_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> window3_; 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> window4_; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WorkspaceWindowResizerTest); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resize dragging from the right with 2 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// windows. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_RIGHT_2) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(0, 300, 400, 300)); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(400, 200, 100, 200)); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, windows)); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the right, which should expand w1 and push w2. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, 10), 0); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,300 500x300", window_->bounds().ToString()); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("500,200 100x200", window2_->bounds().ToString()); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Push off the screen, w2 should be resized to its min. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate2_.set_min_size(gfx::Size(20, 20)); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800, 20), 0); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,300 780x300", window_->bounds().ToString()); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("780,200 20x200", window2_->bounds().ToString()); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move back to 100 and verify w2 gets its original size. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, 10), 0); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,300 500x300", window_->bounds().ToString()); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("500,200 100x200", window2_->bounds().ToString()); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Revert and make sure everything moves back. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800, 20), 0); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,300 400x300", window_->bounds().ToString()); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("400,200 100x200", window2_->bounds().ToString()); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around collapsing and expanding. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_RIGHT_Compress) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 0, 300, 400, 300)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(400, 200, 100, 200)); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, windows)); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the left, which should expand w2 and collapse w1. 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -100, 10), 0); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,300 300x300", window_->bounds().ToString()); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,200 200x200", window2_->bounds().ToString()); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Collapse all the way to w1's min. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_.set_min_size(gfx::Size(20, 20)); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -800, 20), 0); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,300 20x300", window_->bounds().ToString()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("20,200 480x200", window2_->bounds().ToString()); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move 100 to the left. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, 10), 0); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,300 500x300", window_->bounds().ToString()); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("500,200 100x200", window2_->bounds().ToString()); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Back to -100. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -100, 20), 0); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,300 300x300", window_->bounds().ToString()); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,200 200x200", window2_->bounds().ToString()); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resize dragging from the right with 3 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// windows. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_RIGHT_3) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 300, 200, 300)); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(300, 300, 150, 200)); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_->SetBounds(gfx::Rect(450, 300, 100, 200)); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate2_.set_min_size(gfx::Size(52, 50)); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate3_.set_min_size(gfx::Size(38, 50)); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window3_.get()); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, windows)); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the right, which should expand w1 and push w2 and w3. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,300 300x300", window_->bounds().ToString()); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("400,300 150x200", window2_->bounds().ToString()); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("550,300 100x200", window3_->bounds().ToString()); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 300, things should compress. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 300, -10), 0); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,300 500x300", window_->bounds().ToString()); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("600,300 120x200", window2_->bounds().ToString()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("720,300 80x200", window3_->bounds().ToString()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it so much the last two end up at their min. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800, 50), 0); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,300 610x300", window_->bounds().ToString()); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("710,300 52x200", window2_->bounds().ToString()); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("762,300 38x200", window3_->bounds().ToString()); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Revert and make sure everything moves back. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,300 200x300", window_->bounds().ToString()); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,300 150x200", window2_->bounds().ToString()); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("450,300 100x200", window3_->bounds().ToString()); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resizing (collapsing and expanding) with 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3 windows. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_RIGHT_3_Compress) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 300, 200, 300)); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(300, 300, 200, 200)); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_->SetBounds(gfx::Rect(450, 300, 100, 200)); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate2_.set_min_size(gfx::Size(52, 50)); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate3_.set_min_size(gfx::Size(38, 50)); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window3_.get()); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, windows)); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it -100 to the right, which should collapse w1 and expand w2 and w3. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -100, -10), 0); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,300 100x300", window_->bounds().ToString()); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("200,300 266x200", window2_->bounds().ToString()); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("466,300 134x200", window3_->bounds().ToString()); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the right. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,300 300x300", window_->bounds().ToString()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("400,300 200x200", window2_->bounds().ToString()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("600,300 100x200", window3_->bounds().ToString()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 100 to the left again. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -100, -10), 0); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,300 100x300", window_->bounds().ToString()); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("200,300 266x200", window2_->bounds().ToString()); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("466,300 134x200", window3_->bounds().ToString()); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around collapsing and expanding from the bottom. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_BOTTOM_Compress) { 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 0, 100, 400, 300)); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(400, 400, 100, 200)); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM, windows)); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it up 100, which should expand w2 and collapse w1. 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, -100), 0); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,100 400x200", window_->bounds().ToString()); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("400,300 100x300", window2_->bounds().ToString()); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Collapse all the way to w1's min. 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_.set_min_size(gfx::Size(20, 20)); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 20, -800), 0); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,100 400x20", window_->bounds().ToString()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("400,120 100x480", window2_->bounds().ToString()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move 100 down. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 100), 0); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,100 400x400", window_->bounds().ToString()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("400,500 100x100", window2_->bounds().ToString()); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Back to -100. 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 20, -100), 0); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,100 400x200", window_->bounds().ToString()); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("400,300 100x300", window2_->bounds().ToString()); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resize dragging from the bottom with 2 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// windows. 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_BOTTOM_2) { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 0, 50, 400, 200)); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(0, 250, 200, 100)); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM, windows)); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the bottom, which should expand w1 and push w2. 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 100), 0); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,50 400x300", window_->bounds().ToString()); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,350 200x100", window2_->bounds().ToString()); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Push off the screen, w2 should be resized to its min. 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate2_.set_min_size(gfx::Size(20, 20)); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 50, 820), 0); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,50 400x530", window_->bounds().ToString()); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,580 200x20", window2_->bounds().ToString()); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move back to 100 and verify w2 gets its original size. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 100), 0); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,50 400x300", window_->bounds().ToString()); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,350 200x100", window2_->bounds().ToString()); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Revert and make sure everything moves back. 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800, 20), 0); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,50 400x200", window_->bounds().ToString()); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,250 200x100", window2_->bounds().ToString()); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AttachedResize_BOTTOM_3 DISABLED_AttachedResize_BOTTOM_3 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AttachedResize_BOTTOM_3 AttachedResize_BOTTOM_3 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Assertions around attached window resize dragging from the bottom with 3 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// windows. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_AttachedResize_BOTTOM_3) { 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::RootWindow* root = Shell::GetPrimaryRootWindow(); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 300, 100, 300, 200)); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(300, 300, 200, 150)); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 450, 200, 100)); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate2_.set_min_size(gfx::Size(50, 52)); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate3_.set_min_size(gfx::Size(50, 38)); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window3_.get()); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM, windows)); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 100 down, which should expand w1 and push w2 and w3. 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -10, 100), 0); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,100 300x300", window_->bounds().ToString()); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,400 200x150", window2_->bounds().ToString()); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,550 200x100", window3_->bounds().ToString()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 296 things should compress. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -10, 296), 0); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,100 300x496", window_->bounds().ToString()); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("300,596 200x123", window2_->bounds().ToString()); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("300,719 200x81", window3_->bounds().ToString()); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it so much everything ends up at its min. 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 50, 798), 0); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,100 300x610", window_->bounds().ToString()); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,710 200x52", window2_->bounds().ToString()); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,762 200x38", window3_->bounds().ToString()); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Revert and make sure everything moves back. 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,100 300x200", window_->bounds().ToString()); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,300 200x150", window2_->bounds().ToString()); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,450 200x100", window3_->bounds().ToString()); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resizing (collapsing and expanding) with 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3 windows. 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_BOTTOM_3_Compress) { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 0, 0, 200, 200)); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(10, 200, 200, 200)); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_->SetBounds(gfx::Rect(20, 400, 100, 100)); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate2_.set_min_size(gfx::Size(52, 50)); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate3_.set_min_size(gfx::Size(38, 50)); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window3_.get()); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM, windows)); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 up, which should collapse w1 and expand w2 and w3. 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -10, -100), 0); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 200x100", window_->bounds().ToString()); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,100 200x266", window2_->bounds().ToString()); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("20,366 100x134", window3_->bounds().ToString()); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 down. 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 100), 0); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 200x300", window_->bounds().ToString()); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,300 200x200", window2_->bounds().ToString()); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("20,500 100x100", window3_->bounds().ToString()); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 100 up again. 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -10, -100), 0); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 200x100", window_->bounds().ToString()); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,100 200x266", window2_->bounds().ToString()); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("20,366 100x134", window3_->bounds().ToString()); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Multiple displays are not supported on Windows Ash. http://crbug.com/165962 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_Edge DISABLED_Edge 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_Edge Edge 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around dragging to the left/right edge of the screen. 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_Edge) { 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bottom = 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenAsh::GetDisplayWorkAreaBoundsInParent(window_.get()).bottom(); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(20, 30, 50, 60)); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, empty_windows())); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 10), 0); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->CompleteDrag(0); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 720x" + base::IntToString(bottom), 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->bounds().ToString()); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GetRestoreBoundsInScreen(window_.get())); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("20,30 50x60", 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRestoreBoundsInScreen(window_.get())->ToString()); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try the same with the right side. 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, empty_windows())); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800, 10), 0); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->CompleteDrag(0); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("80,0 720x" + base::IntToString(bottom), 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->bounds().ToString()); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GetRestoreBoundsInScreen(window_.get())); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("20,30 50x60", 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRestoreBoundsInScreen(window_.get())->ToString()); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test if the restore bounds is correct in multiple displays. 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearRestoreBounds(window_.get()); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("800x600,200x600"); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[0], window_->GetRootWindow()); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBoundsInScreen(gfx::Rect(800, 10, 50, 60), 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenAsh::GetSecondaryDisplay()); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[1], window_->GetRootWindow()); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bottom = 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenAsh::GetDisplayWorkAreaBoundsInParent(window_.get()).bottom(); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("800,10 50x60", window_->GetBoundsInScreen().ToString()); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, empty_windows())); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 199, 00), 0); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->CompleteDrag(0); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // With the resolution of 200x600 we will hit in this case the 50% screen 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // size setting. 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,0 100x" + base::IntToString(bottom), 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->bounds().ToString()); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("800,10 50x60", 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRestoreBoundsInScreen(window_.get())->ToString()); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that non resizable windows will not get resized. 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, NonResizableWindows) { 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect(20, 30, 50, 60)); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetProperty(aura::client::kCanResizeKey, false); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, empty_windows())); 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -20, 0), 0); 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->CompleteDrag(0); 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("0,30 50x60", window_->bounds().ToString()); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Multiple displays are not supported on Windows Ash. http://crbug.com/165962 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_CancelSnapPhantom DISABLED_CancelSnapPhantom 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_CancelSnapPhantom CancelSnapPhantom 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_CancelSnapPhantom) { 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("800x600,800x600"); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, root_windows.size()); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBoundsInScreen(gfx::Rect(0, 0, 50, 60), 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetPrimaryDisplay()); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[0], window_->GetRootWindow()); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(1.0f, window_->layer()->opacity()); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, empty_windows())); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(resizer->snap_phantom_window_controller_.get()); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The pointer is on the edge but not shared. The snap phantom window 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // controller should be non-NULL. 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 799, 0), 0); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(resizer->snap_phantom_window_controller_.get()); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move the cursor across the edge. Now the snap phantom window controller 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be canceled. 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800, 0), 0); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(resizer->snap_phantom_window_controller_.get()); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies windows are correctly restacked when reordering multiple windows. 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RestackAttached) { 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 0, 0, 200, 300)); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 0, 100, 200)); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 0, 100, 100)); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, windows)); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the right, which should expand w1 and push w2 and w3. 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2 should be topmost since it's initially the highest in the stack. 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("2 1 3", WindowOrderAsString(window_->parent())); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window3_.get()); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_.get(), gfx::Point(), HTRIGHT, windows)); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the right, which should expand w1 and push w2 and w3. 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2 should be topmost since it's initially the highest in the stack. 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("2 3 1", WindowOrderAsString(window_->parent())); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging below the work area. 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontDragOffBottom) { 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 10, 0)); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 400)); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, empty_windows())); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 600), 0); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_y = 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kRootHeight - WorkspaceWindowResizer::kMinOnscreenHeight - 10; 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100," + base::IntToString(expected_y) + " 300x400", 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->bounds().ToString()); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Multiple displays are not supported on Windows Ash. http://crbug.com/165962 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontDragOffBottomWithMultiDisplay \ 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISABLED_DontDragOffBottomWithMultiDisplay 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontDragOffBottomWithMultiDisplay \ 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DontDragOffBottomWithMultiDisplay 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging on the work area with multidisplay. 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_DontDragOffBottomWithMultiDisplay) { 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("800x600,800x600"); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 10, 0)); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Positions the secondary display at the bottom the primary display. 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::DisplayLayout display_layout(ash::DisplayLayout::BOTTOM, 0); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->display_controller()->SetDefaultDisplayLayout( 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_layout); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 400)); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, empty_windows())); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 400), 0); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_y = 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kRootHeight - WorkspaceWindowResizer::kMinOnscreenHeight - 10; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the mouse cursor is in the primary display, the window cannot move 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on non-work area with kMinOnscreenHeight margin. 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100," + base::IntToString(expected_y) + " 300x400", 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->bounds().ToString()); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 400)); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, empty_windows())); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 600), 0); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The window can move to the secondary display beyond non-work area of 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the primary display. 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,800 300x400", window_->bounds().ToString()); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging off the top of the work area. 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontDragOffTop) { 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(10, 0, 0, 0)); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 400)); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, empty_windows())); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, -600), 0); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,10 300x400", window_->bounds().ToString()); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeBottomOutsideWorkArea) { 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 380)); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTTOP, empty_windows())); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 8, 0), 0); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,200 300x380", window_->bounds().ToString()); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideLeftWorkArea) { 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int left = ScreenAsh::GetDisplayWorkAreaBoundsInParent(window_.get()).x(); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pixels_to_left_border = 50; 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_width = 300; 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_x = left - window_width + pixels_to_left_border; 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380)); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(pixels_to_left_border, 0), HTRIGHT, 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) empty_windows())); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -window_width, 0), 0); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::IntToString(window_x) + ",100 " + 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(kMinimumOnScreenArea - window_x) + 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "x380", window_->bounds().ToString()); 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideRightWorkArea) { 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int right = ScreenAsh::GetDisplayWorkAreaBoundsInParent( 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get()).right(); 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pixels_to_right_border = 50; 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_width = 300; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_x = right - pixels_to_right_border; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380)); 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(window_x, 0), HTLEFT, 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) empty_windows())); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::IntToString(right - kMinimumOnScreenArea) + 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ",100 " + 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(window_width - pixels_to_right_border + 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMinimumOnScreenArea) + 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "x380", window_->bounds().ToString()); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideBottomWorkArea) { 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bottom = ScreenAsh::GetDisplayWorkAreaBoundsInParent( 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get()).bottom(); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int delta_to_bottom = 50; 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height = 380; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, bottom - delta_to_bottom, 300, height)); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(0, bottom - delta_to_bottom), HTTOP, 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) empty_windows())); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, bottom), 0); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100," + 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(bottom - kMinimumOnScreenArea) + 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " 300x" + 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(height - (delta_to_bottom - 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMinimumOnScreenArea)), 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->bounds().ToString()); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Multiple displays are not supported on Windows Ash. http://crbug.com/165962 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DragWindowOutsideRightToSecondaryDisplay \ 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISABLED_DragWindowOutsideRightToSecondaryDisplay 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DragWindowOutsideRightToSecondaryDisplay \ 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DragWindowOutsideRightToSecondaryDisplay 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that 'outside' check of the resizer take into account the extended 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// desktop in case of repositions. 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MAYBE_DragWindowOutsideRightToSecondaryDisplay) { 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only primary display. Changes the window position to fit within the 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // display. 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int right = ScreenAsh::GetDisplayWorkAreaBoundsInParent( 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get()).right(); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pixels_to_right_border = 50; 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_width = 300; 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_x = right - pixels_to_right_border; 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380)); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(window_x, 0), HTCAPTION, 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) empty_windows())); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::IntToString(right - kMinimumOnScreenArea) + 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ",100 " + 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(window_width) + 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "x380", window_->bounds().ToString()); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // With secondary display. Operation itself is same but doesn't change 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the position because the window is still within the secondary display. 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("1000x600,600x400"); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380)); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::IntToString(window_x + window_width) + 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ",100 " + 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(window_width) + 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "x380", window_->bounds().ToString()); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies snapping to edges works. 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToEdge) { 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager()-> 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(96, 112, 320, 160)); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, empty_windows())); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to an x-coordinate of 15, which should not snap. 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -81, 0), 0); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An x-coordinate of 7 should snap. 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -89, 0), 0); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,112 320x160", window_->bounds().ToString()); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to -15, should still snap to 0. 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -111, 0), 0); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,112 320x160", window_->bounds().ToString()); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // At -32 should move past snap points. 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -128, 0), 0); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("-32,112 320x160", window_->bounds().ToString()); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -129, 0), 0); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("-33,112 320x160", window_->bounds().ToString()); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Right side should similarly snap. 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 - 15, 0), 0); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("465,112 320x160", window_->bounds().ToString()); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 - 7, 0), 0); 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("480,112 320x160", window_->bounds().ToString()); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 15, 0), 0); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("480,112 320x160", window_->bounds().ToString()); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 32, 0), 0); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("512,112 320x160", window_->bounds().ToString()); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 33, 0), 0); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("513,112 320x160", window_->bounds().ToString()); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And the bottom should snap too. 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 3 - 7), 0); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,437 320x160", window_->bounds().ToString()); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 3 + 15), 0); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,437 320x160", window_->bounds().ToString()); 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 2 + 32), 0); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,470 320x160", window_->bounds().ToString()); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 2 + 33), 0); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,471 320x160", window_->bounds().ToString()); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And the top should snap too. 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, -112 + 20), 0); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,20 320x160", window_->bounds().ToString()); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, -112 + 7), 0); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,0 320x160", window_->bounds().ToString()); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No need to test dragging < 0 as we force that to 0. 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging TOPLEFT. 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_TOPLEFT) { 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTTOPLEFT, empty_windows())); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -98, -199), 0); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 120x230", window_->bounds().ToString()); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging TOPRIGHT. 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_TOPRIGHT) { 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area(ScreenAsh::GetDisplayWorkAreaBoundsInParent( 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get())); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTTOPRIGHT, empty_windows())); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag( 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CalculateDragPoint(*resizer, work_area.right() - 120 - 1, -199), 0); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, window_->bounds().x()); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.y(), window_->bounds().y()); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.right() - 100, window_->bounds().width()); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(230, window_->bounds().height()); 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging BOTTOMRIGHT. 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_BOTTOMRIGHT) { 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area(ScreenAsh::GetDisplayWorkAreaBoundsInParent( 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get())); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT, empty_windows())); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag( 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CalculateDragPoint(*resizer, work_area.right() - 120 - 1, 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.bottom() - 220 - 2), 0); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, window_->bounds().x()); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, window_->bounds().y()); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.right() - 100, window_->bounds().width()); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.bottom() - 200, window_->bounds().height()); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging BOTTOMLEFT. 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_BOTTOMLEFT) { 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area(ScreenAsh::GetDisplayWorkAreaBoundsInParent( 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get())); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMLEFT, empty_windows())); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag( 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CalculateDragPoint(*resizer, -98, work_area.bottom() - 220 - 2), 0); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, window_->bounds().x()); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, window_->bounds().y()); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(120, window_->bounds().width()); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.bottom() - 200, window_->bounds().height()); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CtrlDragResizeToExactPosition) { 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(96, 112, 320, 160)); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT, empty_windows())); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resize the right bottom to add 10 in width, 12 in height. 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 12), ui::EF_CONTROL_DOWN); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Both bottom and right sides to resize to exact size requested. 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,112 330x172", window_->bounds().ToString()); 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CtrlCompleteDragMoveToExactPosition) { 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(96, 112, 320, 160)); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, empty_windows())); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ctrl + drag the window to new poistion by adding (10, 12) to its origin, 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the window should move to the exact position. 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 12), 0); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->CompleteDrag(ui::EF_CONTROL_DOWN); 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("106,124 320x160", window_->bounds().ToString()); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that only usable sizes get returned by the resizer. 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TestProperSizerResolutions) { 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that we have the correct work area resolution which fits our 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expected test result. 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area(ScreenAsh::GetDisplayWorkAreaBoundsInParent( 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get())); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(800, work_area.width()); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(96, 112, 320, 160)); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SnapSizer> resizer(new SnapSizer( 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(), 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SnapSizer::LEFT_EDGE, 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SnapSizer::OTHER_INPUT)); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shelf_layout_manager()->SetAutoHideBehavior( 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the list is declining and contains elements of the 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ideal size list [1280, 1024, 768, 640] as well as 50% and 90% the work 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // area. 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect rect = resizer->GetTargetBoundsForSize(0); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 720x597", rect.ToString()); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rect = resizer->GetTargetBoundsForSize(1); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 640x597", rect.ToString()); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rect = resizer->GetTargetBoundsForSize(2); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 400x597", rect.ToString()); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shelf_layout_manager()->SetAutoHideBehavior( 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SHELF_AUTO_HIDE_BEHAVIOR_NEVER); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rect = resizer->GetTargetBoundsForSize(0); 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 720x552", rect.ToString()); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rect = resizer->GetTargetBoundsForSize(1); 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 640x552", rect.ToString()); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rect = resizer->GetTargetBoundsForSize(2); 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 400x552", rect.ToString()); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that a dragged window will restore to its pre-maximized size. 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RestoreToPreMaximizeCoordinates) { 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 1000, 1000)); 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRestoreBoundsInScreen(window_.get(), gfx::Rect(96, 112, 320, 160)); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, empty_windows())); 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag the window to new position by adding (10, 10) to original point, 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the window should get restored. 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 10), 0); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->CompleteDrag(0); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,10 320x160", window_->bounds().ToString()); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The restore rectangle should get cleared as well. 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, GetRestoreBoundsInScreen(window_.get())); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that a dragged window will restore to its pre-maximized size. 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RevertResizeOperation) { 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect initial_bounds(0, 0, 200, 400); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(initial_bounds); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRestoreBoundsInScreen(window_.get(), gfx::Rect(96, 112, 320, 160)); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, empty_windows())); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag the window to new poistion by adding (180, 16) to original point, 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the window should get restored. 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 180, 16), 0); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(initial_bounds.ToString(), window_->bounds().ToString()); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,112 320x160", 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRestoreBoundsInScreen(window_.get())->ToString()); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that only usable sizes get returned by the resizer. 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyAttach) { 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(10, 10, 20, 30)); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(150, 160, 25, 20)); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, empty_windows())); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |window| one pixel to the left of |window2|. Should snap to right and 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // top. 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 119, 145), 0); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("130,160 20x30", window_->bounds().ToString()); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |window| one pixel to the right of |window2|. Should snap to left and 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // top. 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 164, 145), 0); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("175,160 20x30", window_->bounds().ToString()); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |window| one pixel above |window2|. Should snap to top and left. 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 142, 119), 0); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("150,130 20x30", window_->bounds().ToString()); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |window| one pixel above the bottom of |window2|. Should snap to 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bottom and left. 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 142, 169), 0); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("150,180 20x30", window_->bounds().ToString()); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following variants verify magnetic snapping during resize when dragging a 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particular edge. 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOP) { 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(99, 179, 10, 20)); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTTOP, empty_windows())); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,199 20x31", window_->bounds().ToString()); 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOPLEFT) { 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(99, 179, 10, 20)); 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTTOPLEFT, empty_windows())); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("99,199 21x31", window_->bounds().ToString()); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(88, 201, 10, 20)); 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTTOPLEFT, empty_windows())); 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("98,201 22x29", window_->bounds().ToString()); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOPRIGHT) { 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(111, 179, 10, 20)); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTTOPRIGHT, empty_windows())); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,199 21x31", window_->bounds().ToString()); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(121, 199, 10, 20)); 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTTOPRIGHT, empty_windows())); 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,199 21x31", window_->bounds().ToString()); 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_RIGHT) { 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(121, 199, 10, 20)); 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, empty_windows())); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,200 21x30", window_->bounds().ToString()); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOMRIGHT) { 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(122, 212, 10, 20)); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT, empty_windows())); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,200 22x32", window_->bounds().ToString()); 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(111, 233, 10, 20)); 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT, empty_windows())); 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,200 21x33", window_->bounds().ToString()); 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOM) { 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(111, 233, 10, 20)); 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM, empty_windows())); 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,200 20x33", window_->bounds().ToString()); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOMLEFT) { 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(99, 231, 10, 20)); 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMLEFT, empty_windows())); 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("99,200 21x31", window_->bounds().ToString()); 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(89, 209, 10, 20)); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMLEFT, empty_windows())); 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("99,200 21x29", window_->bounds().ToString()); 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_LEFT) { 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(89, 209, 10, 20)); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTLEFT, empty_windows())); 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("99,200 21x30", window_->bounds().ToString()); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the user user moved window flag is getting properly set. 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CheckUserWindowMangedFlags) { 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 0, 50, 400, 200)); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> no_attached_windows; 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that an abort doesn't change anything. 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, no_attached_windows)); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the bottom. 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 100), 0); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,150 400x200", window_->bounds().ToString()); 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ash::wm::HasUserChangedWindowPositionOrSize(window_.get())); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that a completed move / size does change the user coordinates. 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, no_attached_windows)); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the bottom. 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 100), 0); 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,150 400x200", window_->bounds().ToString()); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->CompleteDrag(0); 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ash::wm::HasUserChangedWindowPositionOrSize(window_.get())); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max size doesn't exceed it when dragged. 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TestMaxSizeEnforced) { 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 400, 300)); 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.set_max_size(gfx::Size(401, 301)); 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT, empty_windows())); 12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 2, 2), 0); 12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(401, window_->bounds().width()); 12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(301, window_->bounds().height()); 12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max width doesn't restrict its height. 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TestPartialMaxSizeEnforced) { 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 400, 300)); 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.set_max_size(gfx::Size(401, 0)); 12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT, empty_windows())); 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 2, 2), 0); 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(401, window_->bounds().width()); 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(302, window_->bounds().height()); 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max size can't be snapped. 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, PhantomSnapMaxSize) { 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // With max size not set we get a phantom window controller for dragging off 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the right hand side. 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 300, 200)); 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, empty_windows())); 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(resizer->snap_phantom_window_controller_.get()); 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 801, 0), 0); 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(resizer->snap_phantom_window_controller_.get()); 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // With max size defined, we get no phantom window. 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 300, 200)); 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.set_max_size(gfx::Size(300, 200)); 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION, empty_windows())); 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 801, 0), 0); 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(resizer->snap_phantom_window_controller_.get()); 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontRewardRightmostWindowForOverflows) { 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::RootWindow* root = Shell::GetPrimaryRootWindow(); 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Four 100x100 windows flush against eachother, starting at 100,100. 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_->SetBounds(gfx::Rect(400, 100, 100, 100)); 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate2_.set_max_size(gfx::Size(101, 0)); 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, windows)); 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 51 to the left, which should contract w1 and expand w2-4. 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // w2 will hit its max size straight away, and in doing so will leave extra 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // pixels that a naive implementation may award to the rightmost window. A 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // fair implementation will give 25 pixels to each of the other windows. 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -51, 0), 0); 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 49x100", window_->bounds().ToString()); 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("149,100 101x100", window2_->bounds().ToString()); 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("250,100 125x100", window3_->bounds().ToString()); 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("375,100 125x100", window4_->bounds().ToString()); 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExceedMaxWidth) { 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::RootWindow* root = Shell::GetPrimaryRootWindow(); 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Four 100x100 windows flush against eachother, starting at 100,100. 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_->SetBounds(gfx::Rect(400, 100, 100, 100)); 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate2_.set_max_size(gfx::Size(101, 0)); 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate3_.set_max_size(gfx::Size(101, 0)); 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, windows)); 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 52 to the left, which should contract w1 and expand w2-4. 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -52, 0), 0); 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 48x100", window_->bounds().ToString()); 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("148,100 101x100", window2_->bounds().ToString()); 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("249,100 101x100", window3_->bounds().ToString()); 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("350,100 150x100", window4_->bounds().ToString()); 13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExceedMaxHeight) { 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::RootWindow* root = Shell::GetPrimaryRootWindow(); 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Four 100x100 windows flush against eachother, starting at 100,100. 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(100, 200, 100, 100)); 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(100, 300, 100, 100)); 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_->SetBounds(gfx::Rect(100, 400, 100, 100)); 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate2_.set_max_size(gfx::Size(0, 101)); 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate3_.set_max_size(gfx::Size(0, 101)); 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM, windows)); 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 52 up, which should contract w1 and expand w2-4. 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, -52), 0); 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 100x48", window_->bounds().ToString()); 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,148 100x101", window2_->bounds().ToString()); 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,249 100x101", window3_->bounds().ToString()); 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,350 100x150", window4_->bounds().ToString()); 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontExceedMinHeight DISABLED_DontExceedMinHeight 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontExceedMinHeight DontExceedMinHeight 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_DontExceedMinHeight) { 13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x500"); 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::RootWindow* root = Shell::GetPrimaryRootWindow(); 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Four 100x100 windows flush against eachother, starting at 100,100. 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(100, 200, 100, 100)); 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(100, 300, 100, 100)); 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_->SetBounds(gfx::Rect(100, 400, 100, 100)); 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate2_.set_min_size(gfx::Size(0, 99)); 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate3_.set_min_size(gfx::Size(0, 99)); 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM, windows)); 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 52 down, which should expand w1 and contract w2-4. 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 52), 0); 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 100x152", window_->bounds().ToString()); 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,252 100x99", window2_->bounds().ToString()); 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,351 100x99", window3_->bounds().ToString()); 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,450 100x50", window4_->bounds().ToString()); 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExpandRightmostPastMaxWidth) { 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::RootWindow* root = Shell::GetPrimaryRootWindow(); 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Three 100x100 windows flush against eachother, starting at 100,100. 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate3_.set_max_size(gfx::Size(101, 0)); 13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, windows)); 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 51 to the left, which should contract w1 and expand w2-3. 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -51, 0), 0); 14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 49x100", window_->bounds().ToString()); 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("149,100 150x100", window2_->bounds().ToString()); 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("299,100 101x100", window3_->bounds().ToString()); 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MoveAttachedWhenGrownToMaxSize) { 14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::RootWindow* root = Shell::GetPrimaryRootWindow(); 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Three 100x100 windows flush against eachother, starting at 100,100. 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate2_.set_max_size(gfx::Size(101, 0)); 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate3_.set_max_size(gfx::Size(101, 0)); 14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, windows)); 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 52 to the left, which should contract w1 and expand and move w2-3. 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -52, 0), 0); 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 48x100", window_->bounds().ToString()); 14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("148,100 101x100", window2_->bounds().ToString()); 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("249,100 101x100", window3_->bounds().ToString()); 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962 14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MainWindowHonoursMaxWidth DISABLED_MainWindowHonoursMaxWidth 14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MainWindowHonoursMaxWidth MainWindowHonoursMaxWidth 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_MainWindowHonoursMaxWidth) { 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("400x800"); 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::RootWindow* root = Shell::GetPrimaryRootWindow(); 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Three 100x100 windows flush against eachother, starting at 100,100. 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.set_max_size(gfx::Size(102, 0)); 14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, windows)); 14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 50 to the right, which should expand w1 and contract w2-3, as they 14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // won't fit in the root window in their original sizes. 14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 50, 0), 0); 14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 102x100", window_->bounds().ToString()); 14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("202,100 99x100", window2_->bounds().ToString()); 14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("301,100 99x100", window3_->bounds().ToString()); 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MainWindowHonoursMinWidth) { 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("400x800"); 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::RootWindow* root = Shell::GetPrimaryRootWindow(); 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Three 100x100 windows flush against eachother, starting at 100,100. 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.set_min_size(gfx::Size(98, 0)); 14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create( 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, windows)); 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 50 to the left, which should contract w1 and expand w2-3. 14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -50, 0), 0); 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 98x100", window_->bounds().ToString()); 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("198,100 101x100", window2_->bounds().ToString()); 14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("299,100 101x100", window3_->bounds().ToString()); 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 1496