workspace_window_resizer_unittest.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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) 78bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ash/display/display_manager.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/root_window_controller.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/screen_util.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" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/wm/window_state.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/wm/wm_event.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace/phantom_window_controller.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/workspace_controller.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/command_line.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/aura_constants.h" 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/aura/test/event_generator.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h" 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h" 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/events/gestures/gesture_configuration.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/insets.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kRootHeight = 600; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple window delegate that returns the specified min size. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestWindowDelegate : public aura::test::TestWindowDelegate { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate() { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestWindowDelegate() {} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_min_size(const gfx::Size& size) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) min_size_ = size; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_max_size(const gfx::Size& size) { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_size_ = size; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from aura::Test::TestWindowDelegate: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Size GetMinimumSize() const OVERRIDE { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return min_size_; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Size GetMaximumSize() const OVERRIDE { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return max_size_; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size min_size_; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size max_size_; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestWindowDelegate); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WorkspaceWindowResizerTest : public test::AshTestBase { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WorkspaceWindowResizerTest() : workspace_resizer_(NULL) {} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WorkspaceWindowResizerTest() {} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AshTestBase::SetUp(); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay(base::StringPrintf("800x%d", kRootHeight)); 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Ignore the touch slop region. 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::GestureConfiguration::set_max_touch_move_in_pixels_for_click(0); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect root_bounds(root->bounds()); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // RootWindow and Display can't resize on Windows Ash. 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // http://crbug.com/165962 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kRootHeight, root_bounds.height()); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(800, root_bounds.width()); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.reset(new aura::Window(&delegate_)); 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->SetType(ui::wm::WINDOW_TYPE_NORMAL); 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->Init(aura::WINDOW_LAYER_NOT_DRAWN); 931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ParentWindowInPrimaryRootWindow(window_.get()); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->set_id(1); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_.reset(new aura::Window(&delegate2_)); 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window2_->SetType(ui::wm::WINDOW_TYPE_NORMAL); 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window2_->Init(aura::WINDOW_LAYER_NOT_DRAWN); 991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ParentWindowInPrimaryRootWindow(window2_.get()); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->set_id(2); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_.reset(new aura::Window(&delegate3_)); 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window3_->SetType(ui::wm::WINDOW_TYPE_NORMAL); 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window3_->Init(aura::WINDOW_LAYER_NOT_DRAWN); 1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ParentWindowInPrimaryRootWindow(window3_.get()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_->set_id(3); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_.reset(new aura::Window(&delegate4_)); 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window4_->SetType(ui::wm::WINDOW_TYPE_NORMAL); 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window4_->Init(aura::WINDOW_LAYER_NOT_DRAWN); 1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ParentWindowInPrimaryRootWindow(window4_.get()); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_->set_id(4); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.reset(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_.reset(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_.reset(); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_.reset(); 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_.reset(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AshTestBase::TearDown(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a string identifying the z-order of each of the known child windows 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of |parent|. The returned string constains the id of the known windows and 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is ordered from topmost to bottomost windows. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string WindowOrderAsString(aura::Window* parent) const { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const aura::Window::Windows& windows = parent->children(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (aura::Window::Windows::const_reverse_iterator i = windows.rbegin(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != windows.rend(); ++i) { 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (*i == window_ || *i == window2_ || *i == window3_) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result.empty()) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += " "; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += base::IntToString((*i)->id()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WindowResizer* CreateResizerForTest( 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window* window, 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Point& point_in_parent, 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int window_component) { 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WindowResizer* resizer = CreateWindowResizer( 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window, 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) point_in_parent, 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_component, 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE).release(); 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) workspace_resizer_ = WorkspaceWindowResizer::instance_; 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return resizer; 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WorkspaceWindowResizer* CreateWorkspaceResizerForTest( 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::Window* window, 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Point& point_in_parent, 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int window_component, 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::client::WindowMoveSource source, 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<aura::Window*>& attached_windows) { 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) wm::WindowState* window_state = wm::GetWindowState(window); 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_state->CreateDragDetails( 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window, point_in_parent, window_component, source); 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return WorkspaceWindowResizer::Create(window_state, attached_windows); 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PhantomWindowController* snap_phantom_window_controller() const { 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return workspace_resizer_->snap_phantom_window_controller_.get(); 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Point CalculateDragPoint(const WindowResizer& resizer, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int delta_x, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int delta_y) const { 1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point location = resizer.GetInitialLocation(); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location.set_x(location.x() + delta_x); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location.set_y(location.y() + delta_y); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return location; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> empty_windows() const { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::vector<aura::Window*>(); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ShelfLayoutManager* shelf_layout_manager() { 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void InitTouchResizeWindow(const gfx::Rect& bounds, int window_component) { 1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_delegate_.set_window_component(window_component); 1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_.reset( 1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CreateTestWindowInShellWithDelegate(&touch_resize_delegate_, 0, 1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bounds)); 1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate delegate_; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate delegate2_; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate delegate3_; 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestWindowDelegate delegate4_; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> window_; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> window2_; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> window3_; 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> window4_; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TestWindowDelegate touch_resize_delegate_; 2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<aura::Window> touch_resize_window_; 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WorkspaceWindowResizer* workspace_resizer_; 2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WorkspaceWindowResizerTest); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resize dragging from the right with 2 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// windows. 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_RIGHT_2) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(0, 300, 400, 300)); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(400, 200, 100, 200)); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the right, which should expand w1 and push w2. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, 10), 0); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,300 500x300", window_->bounds().ToString()); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("500,200 100x200", window2_->bounds().ToString()); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Push off the screen, w2 should be resized to its min. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate2_.set_min_size(gfx::Size(20, 20)); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800, 20), 0); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,300 780x300", window_->bounds().ToString()); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("780,200 20x200", window2_->bounds().ToString()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move back to 100 and verify w2 gets its original size. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, 10), 0); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,300 500x300", window_->bounds().ToString()); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("500,200 100x200", window2_->bounds().ToString()); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Revert and make sure everything moves back. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800, 20), 0); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,300 400x300", window_->bounds().ToString()); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("400,200 100x200", window2_->bounds().ToString()); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around collapsing and expanding. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_RIGHT_Compress) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 0, 300, 400, 300)); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(400, 200, 100, 200)); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the left, which should expand w2 and collapse w1. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -100, 10), 0); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,300 300x300", window_->bounds().ToString()); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,200 200x200", window2_->bounds().ToString()); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Collapse all the way to w1's min. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_.set_min_size(gfx::Size(20, 20)); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -800, 20), 0); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,300 20x300", window_->bounds().ToString()); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("20,200 480x200", window2_->bounds().ToString()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move 100 to the left. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, 10), 0); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,300 500x300", window_->bounds().ToString()); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("500,200 100x200", window2_->bounds().ToString()); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Back to -100. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -100, 20), 0); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,300 300x300", window_->bounds().ToString()); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,200 200x200", window2_->bounds().ToString()); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resize dragging from the right with 3 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// windows. 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_RIGHT_3) { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 300, 200, 300)); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(300, 300, 150, 200)); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_->SetBounds(gfx::Rect(450, 300, 100, 200)); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate2_.set_min_size(gfx::Size(52, 50)); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate3_.set_min_size(gfx::Size(38, 50)); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window3_.get()); 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the right, which should expand w1 and push w2 and w3. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,300 300x300", window_->bounds().ToString()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("400,300 150x200", window2_->bounds().ToString()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("550,300 100x200", window3_->bounds().ToString()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 300, things should compress. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 300, -10), 0); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,300 500x300", window_->bounds().ToString()); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("600,300 120x200", window2_->bounds().ToString()); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("720,300 80x200", window3_->bounds().ToString()); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it so much the last two end up at their min. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800, 50), 0); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,300 610x300", window_->bounds().ToString()); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("710,300 52x200", window2_->bounds().ToString()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("762,300 38x200", window3_->bounds().ToString()); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Revert and make sure everything moves back. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,300 200x300", window_->bounds().ToString()); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,300 150x200", window2_->bounds().ToString()); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("450,300 100x200", window3_->bounds().ToString()); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resizing (collapsing and expanding) with 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3 windows. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_RIGHT_3_Compress) { 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 300, 200, 300)); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(300, 300, 200, 200)); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_->SetBounds(gfx::Rect(450, 300, 100, 200)); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate2_.set_min_size(gfx::Size(52, 50)); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate3_.set_min_size(gfx::Size(38, 50)); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window3_.get()); 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it -100 to the right, which should collapse w1 and expand w2 and w3. 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -100, -10), 0); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,300 100x300", window_->bounds().ToString()); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("200,300 266x200", window2_->bounds().ToString()); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("466,300 134x200", window3_->bounds().ToString()); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the right. 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,300 300x300", window_->bounds().ToString()); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("400,300 200x200", window2_->bounds().ToString()); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("600,300 100x200", window3_->bounds().ToString()); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 100 to the left again. 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -100, -10), 0); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,300 100x300", window_->bounds().ToString()); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("200,300 266x200", window2_->bounds().ToString()); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("466,300 134x200", window3_->bounds().ToString()); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around collapsing and expanding from the bottom. 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_BOTTOM_Compress) { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 0, 100, 400, 300)); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(400, 400, 100, 200)); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM, 3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it up 100, which should expand w2 and collapse w1. 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, -100), 0); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,100 400x200", window_->bounds().ToString()); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("400,300 100x300", window2_->bounds().ToString()); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Collapse all the way to w1's min. 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_.set_min_size(gfx::Size(20, 20)); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 20, -800), 0); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,100 400x20", window_->bounds().ToString()); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("400,120 100x480", window2_->bounds().ToString()); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move 100 down. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 100), 0); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,100 400x400", window_->bounds().ToString()); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("400,500 100x100", window2_->bounds().ToString()); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Back to -100. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 20, -100), 0); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,100 400x200", window_->bounds().ToString()); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("400,300 100x300", window2_->bounds().ToString()); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resize dragging from the bottom with 2 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// windows. 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_BOTTOM_2) { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 0, 50, 400, 200)); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(0, 250, 200, 100)); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM, 3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the bottom, which should expand w1 and push w2. 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 100), 0); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,50 400x300", window_->bounds().ToString()); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,350 200x100", window2_->bounds().ToString()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Push off the screen, w2 should be resized to its min. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate2_.set_min_size(gfx::Size(20, 20)); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 50, 820), 0); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,50 400x530", window_->bounds().ToString()); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,580 200x20", window2_->bounds().ToString()); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move back to 100 and verify w2 gets its original size. 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 100), 0); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,50 400x300", window_->bounds().ToString()); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,350 200x100", window2_->bounds().ToString()); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Revert and make sure everything moves back. 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800, 20), 0); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,50 400x200", window_->bounds().ToString()); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,250 200x100", window2_->bounds().ToString()); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AttachedResize_BOTTOM_3 DISABLED_AttachedResize_BOTTOM_3 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AttachedResize_BOTTOM_3 AttachedResize_BOTTOM_3 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Assertions around attached window resize dragging from the bottom with 3 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// windows. 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_AttachedResize_BOTTOM_3) { 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 4341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 300, 100, 300, 200)); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(300, 300, 200, 150)); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 450, 200, 100)); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate2_.set_min_size(gfx::Size(50, 52)); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate3_.set_min_size(gfx::Size(50, 38)); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window3_.get()); 4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM, 4487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 100 down, which should expand w1 and push w2 and w3. 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -10, 100), 0); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,100 300x300", window_->bounds().ToString()); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,400 200x150", window2_->bounds().ToString()); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,550 200x100", window3_->bounds().ToString()); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 296 things should compress. 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -10, 296), 0); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,100 300x496", window_->bounds().ToString()); 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("300,596 200x123", window2_->bounds().ToString()); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("300,719 200x81", window3_->bounds().ToString()); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it so much everything ends up at its min. 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 50, 798), 0); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,100 300x610", window_->bounds().ToString()); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,710 200x52", window2_->bounds().ToString()); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,762 200x38", window3_->bounds().ToString()); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Revert and make sure everything moves back. 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,100 300x200", window_->bounds().ToString()); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,300 200x150", window2_->bounds().ToString()); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("300,450 200x100", window3_->bounds().ToString()); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around attached window resizing (collapsing and expanding) with 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3 windows. 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, AttachedResize_BOTTOM_3_Compress) { 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 0, 0, 200, 200)); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(10, 200, 200, 200)); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_->SetBounds(gfx::Rect(20, 400, 100, 100)); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate2_.set_min_size(gfx::Size(52, 50)); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate3_.set_min_size(gfx::Size(38, 50)); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window3_.get()); 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 4887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM, 4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 up, which should collapse w1 and expand w2 and w3. 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -10, -100), 0); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 200x100", window_->bounds().ToString()); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,100 200x266", window2_->bounds().ToString()); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("20,366 100x134", window3_->bounds().ToString()); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 down. 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 100), 0); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 200x300", window_->bounds().ToString()); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,300 200x200", window2_->bounds().ToString()); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("20,500 100x100", window3_->bounds().ToString()); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 100 up again. 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -10, -100), 0); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 200x100", window_->bounds().ToString()); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,100 200x266", window2_->bounds().ToString()); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("20,366 100x134", window3_->bounds().ToString()); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that touch-dragging a window does not lock the mouse cursor 511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// and therefore shows the cursor on a mousemove. 512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MouseMoveWithTouchDrag) { 513f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_->SetBounds(gfx::Rect(0, 300, 400, 300)); 514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window2_->SetBounds(gfx::Rect(400, 200, 100, 200)); 515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Shell* shell = Shell::GetInstance(); 517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::test::EventGenerator generator(window_->GetRootWindow()); 518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The cursor should not be locked initially. 520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(shell->cursor_manager()->IsCursorLocked()); 521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<aura::Window*> windows; 523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) windows.push_back(window2_.get()); 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_TOUCH, windows)); 527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Creating a WorkspaceWindowResizer should not lock the cursor. 530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(shell->cursor_manager()->IsCursorLocked()); 531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The cursor should be hidden after touching the screen and 533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // starting a drag. 534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(shell->cursor_manager()->IsCursorVisible()); 535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) generator.PressTouch(); 536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, 10), 0); 537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(shell->cursor_manager()->IsCursorVisible()); 538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(shell->cursor_manager()->IsCursorLocked()); 539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Moving the mouse should show the cursor. 541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) generator.MoveMouseBy(1, 1); 542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(shell->cursor_manager()->IsCursorVisible()); 543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(shell->cursor_manager()->IsCursorLocked()); 544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resizer->RevertDrag(); 546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around dragging to the left/right edge of the screen. 5497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, Edge) { 550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!SupportsHostWindowResize()) 551a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 552a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Resize host window to force insets update. 554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UpdateDisplay("800x700"); 555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(varkha): Insets are reset after every drag because of 556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // http://crbug.com/292238. 557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Window is wide enough not to get docked right away. 558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_->SetBounds(gfx::Rect(20, 30, 400, 60)); 55968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) wm::WindowState* window_state = wm::GetWindowState(window_.get()); 56068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect expected_bounds_in_parent( 563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) wm::GetDefaultLeftSnappedWindowBoundsInParent(window_.get())); 564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 10), 0); 5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(expected_bounds_in_parent.ToString(), 572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window_->bounds().ToString()); 57368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(window_state->HasRestoreBounds()); 574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("20,30 400x60", 57568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->GetRestoreBoundsInScreen().ToString()); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try the same with the right side. 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect expected_bounds_in_parent( 580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) wm::GetDefaultRightSnappedWindowBoundsInParent(window_.get())); 581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 582f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800, 10), 0); 5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(expected_bounds_in_parent.ToString(), 588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window_->bounds().ToString()); 58968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(window_state->HasRestoreBounds()); 590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("20,30 400x60", 59168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->GetRestoreBoundsInScreen().ToString()); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test if the restore bounds is correct in multiple displays. 5957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 5967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 5977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Restore the window to clear snapped state. 599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) window_state->Restore(); 600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UpdateDisplay("800x600,500x600"); 602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window::Windows root_windows = Shell::GetAllRootWindows(); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[0], window_->GetRootWindow()); 604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Window is wide enough not to get docked right away. 605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_->SetBoundsInScreen(gfx::Rect(800, 10, 400, 60), 6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScreenUtil::GetSecondaryDisplay()); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[1], window_->GetRootWindow()); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 609f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("800,10 400x60", window_->GetBoundsInScreen().ToString()); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 611f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 499, 0), 0); 615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int bottom = 6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_.get()).bottom(); 6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // With the resolution of 500x600 we will hit in this case the 50% screen 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // size setting. 620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(varkha): Insets are updated because of http://crbug.com/292238 621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("250,0 250x" + base::IntToString(bottom), 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->bounds().ToString()); 623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("800,10 400x60", 62468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->GetRestoreBoundsInScreen().ToString()); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that non resizable windows will not get resized. 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, NonResizableWindows) { 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect(20, 30, 50, 60)); 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetProperty(aura::client::kCanResizeKey, false); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 633f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 634f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -20, 0), 0); 6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("0,30 50x60", window_->bounds().ToString()); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CancelSnapPhantom) { 6427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 6437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("800x600,800x600"); 646f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window::Windows root_windows = Shell::GetAllRootWindows(); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, root_windows.size()); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBoundsInScreen(gfx::Rect(0, 0, 50, 60), 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetPrimaryDisplay()); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[0], window_->GetRootWindow()); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(1.0f, window_->layer()->opacity()); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 654f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(snap_phantom_window_controller()); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The pointer is on the edge but not shared. The snap phantom window 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // controller should be non-NULL. 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 799, 0), 0); 662f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(snap_phantom_window_controller()); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move the cursor across the edge. Now the snap phantom window controller 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be canceled. 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800, 0), 0); 667f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(snap_phantom_window_controller()); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies that dragging a snapped window unsnaps it. 6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DragSnapped) { 673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) wm::WindowState* window_state = ash::wm::GetWindowState(window_.get()); 6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect kInitialBounds(100, 100, 100, 100); 6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->SetBounds(kInitialBounds); 6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->Show(); 678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const wm::WMEvent snap_event(wm::WM_EVENT_SNAP_LEFT); 679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window_state->OnWMEvent(&snap_event); 680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType()); 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect snapped_bounds = window_->bounds(); 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(snapped_bounds.ToString(), kInitialBounds.ToString()); 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(window_state->GetRestoreBoundsInParent().ToString(), 6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kInitialBounds.ToString()); 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Dragging a side snapped window should unsnap it. 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 0), 0); 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 691a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(wm::WINDOW_STATE_TYPE_NORMAL, window_state->GetStateType()); 6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("10,0 100x100", window_->bounds().ToString()); 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(window_state->HasRestoreBounds()); 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies the behavior of resizing a side snapped window. 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeSnapped) { 698a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) wm::WindowState* window_state = ash::wm::GetWindowState(window_.get()); 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect kInitialBounds(100, 100, 100, 100); 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->SetBounds(kInitialBounds); 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->Show(); 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 704a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const wm::WMEvent snap_event(wm::WM_EVENT_SNAP_LEFT); 705a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window_state->OnWMEvent(&snap_event); 706a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType()); 7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect snapped_bounds = window_->bounds(); 7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(snapped_bounds.ToString(), kInitialBounds.ToString()); 7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(window_state->GetRestoreBoundsInParent().ToString(), 7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kInitialBounds.ToString()); 7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 1) Resizing a side snapped window to make it wider should not unsnap the 7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // window. 7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT)); 7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 0), 0); 7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 719a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType()); 7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) snapped_bounds.Inset(0, 0, -10, 0); 7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(snapped_bounds.ToString(), window_->bounds().ToString()); 7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(window_state->GetRestoreBoundsInParent().ToString(), 7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kInitialBounds.ToString()); 7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 2) Resizing a side snapped window vertically and then undoing the change 7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // should not unsnap. 7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM)); 7315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, -30), 0); 7325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 734a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType()); 7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(snapped_bounds.ToString(), window_->bounds().ToString()); 7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(window_state->GetRestoreBoundsInParent().ToString(), 7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kInitialBounds.ToString()); 7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 3) Resizing a side snapped window vertically and then not undoing the 7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // change should unsnap. 7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM)); 7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, -10), 0); 7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 747a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(wm::WINDOW_STATE_TYPE_NORMAL, window_state->GetStateType()); 7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect expected_bounds(snapped_bounds); 7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_bounds.Inset(0, 0, 0, 10); 7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_bounds.ToString(), window_->bounds().ToString()); 7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(window_state->HasRestoreBounds()); 7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies windows are correctly restacked when reordering multiple windows. 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RestackAttached) { 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 0, 0, 200, 300)); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 0, 100, 200)); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 0, 100, 100)); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 7645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 7657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 7667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the right, which should expand w1 and push w2 and w3. 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2 should be topmost since it's initially the highest in the stack. 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("2 1 3", WindowOrderAsString(window_->parent())); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window3_.get()); 7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 7797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window2_.get(), gfx::Point(), HTRIGHT, 7807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the right, which should expand w1 and push w2 and w3. 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2 should be topmost since it's initially the highest in the stack. 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("2 3 1", WindowOrderAsString(window_->parent())); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging below the work area. 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontDragOffBottom) { 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 10, 0)); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 400)); 798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 799f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 600), 0); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_y = 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kRootHeight - WorkspaceWindowResizer::kMinOnscreenHeight - 10; 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100," + base::IntToString(expected_y) + " 300x400", 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->bounds().ToString()); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging on the work area with multidisplay. 8097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontDragOffBottomWithMultiDisplay) { 8107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 8117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 8127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("800x600,800x600"); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 10, 0)); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Positions the secondary display at the bottom the primary display. 8208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays( 821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::DisplayLayout(ash::DisplayLayout::BOTTOM, 0)); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 20)); 8254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_LT(window_->bounds().height(), 8264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WorkspaceWindowResizer::kMinOnscreenHeight); 827a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Drag down avoiding dragging along the edge as that would side-snap. 828f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 829a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) window_.get(), gfx::Point(10, 0), HTCAPTION)); 8304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 8314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 400), 0); 8324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int expected_y = kRootHeight - window_->bounds().height() - 10; 8334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // When the mouse cursor is in the primary display, the window cannot move 8344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // on non-work area but can get all the way towards the bottom, 8354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // restricted only by the window height. 8364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("100," + base::IntToString(expected_y) + " 300x20", 8374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_->bounds().ToString()); 838f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Revert the drag in order to not remember the restore bounds. 839f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resizer->RevertDrag(); 8404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 8414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 842f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 843f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 10, 0)); 8444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 400)); 846f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 847a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) window_.get(), gfx::Point(10, 0), HTCAPTION)); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 849a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Drag down avoiding dragging along the edge as that would side-snap. 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 400), 0); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_y = 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kRootHeight - WorkspaceWindowResizer::kMinOnscreenHeight - 10; 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the mouse cursor is in the primary display, the window cannot move 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on non-work area with kMinOnscreenHeight margin. 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100," + base::IntToString(expected_y) + " 300x400", 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->bounds().ToString()); 8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 400)); 862f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), window_->bounds().origin(), HTCAPTION)); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 865f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Drag down avoiding getting stuck against the shelf on the bottom screen. 866f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 500), 0); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The window can move to the secondary display beyond non-work area of 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the primary display. 869f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("100,700 300x400", window_->bounds().ToString()); 8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging off the top of the work area. 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontDragOffTop) { 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(10, 0, 0, 0)); 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 400)); 880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, -600), 0); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,10 300x400", window_->bounds().ToString()); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeBottomOutsideWorkArea) { 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 380)); 892f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTTOP)); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 8, 0), 0); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,200 300x380", window_->bounds().ToString()); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideLeftWorkArea) { 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 9025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int left = ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_.get()).x(); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pixels_to_left_border = 50; 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_width = 300; 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_x = left - window_width + pixels_to_left_border; 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380)); 907f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 908f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(pixels_to_left_border, 0), HTRIGHT)); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -window_width, 0), 0); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::IntToString(window_x) + ",100 " + 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(kMinimumOnScreenArea - window_x) + 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "x380", window_->bounds().ToString()); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideRightWorkArea) { 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int right = ScreenUtil::GetDisplayWorkAreaBoundsInParent( 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get()).right(); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pixels_to_right_border = 50; 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_width = 300; 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_x = right - pixels_to_right_border; 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380)); 925f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(window_x, 0), HTLEFT)); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::IntToString(right - kMinimumOnScreenArea) + 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ",100 " + 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(window_width - pixels_to_right_border + 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMinimumOnScreenArea) + 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "x380", window_->bounds().ToString()); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideBottomWorkArea) { 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int bottom = ScreenUtil::GetDisplayWorkAreaBoundsInParent( 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get()).bottom(); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int delta_to_bottom = 50; 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height = 380; 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, bottom - delta_to_bottom, 300, height)); 944f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(0, bottom - delta_to_bottom), HTTOP)); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, bottom), 0); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100," + 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(bottom - kMinimumOnScreenArea) + 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " 300x" + 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(height - (delta_to_bottom - 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMinimumOnScreenArea)), 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->bounds().ToString()); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that 'outside' check of the resizer take into account the extended 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// desktop in case of repositions. 9587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DragWindowOutsideRightToSecondaryDisplay) { 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only primary display. Changes the window position to fit within the 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // display. 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int right = ScreenUtil::GetDisplayWorkAreaBoundsInParent( 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get()).right(); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pixels_to_right_border = 50; 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_width = 300; 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_x = right - pixels_to_right_border; 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380)); 969f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(window_x, 0), HTCAPTION)); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::IntToString(right - kMinimumOnScreenArea) + 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ",100 " + 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(window_width) + 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "x380", window_->bounds().ToString()); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 9797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 9807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // With secondary display. Operation itself is same but doesn't change 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the position because the window is still within the secondary display. 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("1000x600,600x400"); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380)); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::IntToString(window_x + window_width) + 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ",100 " + 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(window_width) + 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "x380", window_->bounds().ToString()); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies snapping to edges works. 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToEdge) { 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager()-> 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS); 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(96, 112, 320, 160)); 9993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Click 50px to the right so that the mouse pointer does not leave the 10003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // workspace ensuring sticky behavior. 1001f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 10023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_.get(), 10033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->bounds().origin() + gfx::Vector2d(50, 0), 1004f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) HTCAPTION)); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to an x-coordinate of 15, which should not snap. 1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 15 - 96, 0), 0); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An x-coordinate of 7 should snap. 1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 7 - 96, 0), 0); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,112 320x160", window_->bounds().ToString()); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to -15, should still snap to 0. 1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -15 - 96, 0), 0); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,112 320x160", window_->bounds().ToString()); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // At -32 should move past snap points. 1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -32 - 96, 0), 0); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("-32,112 320x160", window_->bounds().ToString()); 1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -33 - 96, 0), 0); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("-33,112 320x160", window_->bounds().ToString()); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Right side should similarly snap. 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 - 15, 0), 0); 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("465,112 320x160", window_->bounds().ToString()); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 - 7, 0), 0); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("480,112 320x160", window_->bounds().ToString()); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 15, 0), 0); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("480,112 320x160", window_->bounds().ToString()); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 32, 0), 0); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("512,112 320x160", window_->bounds().ToString()); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 33, 0), 0); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("513,112 320x160", window_->bounds().ToString()); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And the bottom should snap too. 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 3 - 7), 0); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,437 320x160", window_->bounds().ToString()); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 3 + 15), 0); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,437 320x160", window_->bounds().ToString()); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 2 + 32), 0); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,470 320x160", window_->bounds().ToString()); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 2 + 33), 0); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,471 320x160", window_->bounds().ToString()); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And the top should snap too. 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, -112 + 20), 0); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,20 320x160", window_->bounds().ToString()); 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, -112 + 7), 0); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,0 320x160", window_->bounds().ToString()); 10471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 10481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // And bottom/left should snap too. 10491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) resizer->Drag( 10501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CalculateDragPoint(*resizer, 7 - 96, 600 - 160 - 112 - 3 - 7), 0); 10511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("0,437 320x160", window_->bounds().ToString()); 10521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) resizer->Drag( 10531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CalculateDragPoint(*resizer, -15 - 96, 600 - 160 - 112 - 3 + 15), 0); 10541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("0,437 320x160", window_->bounds().ToString()); 10551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // should move past snap points. 10561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) resizer->Drag( 10571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CalculateDragPoint(*resizer, -32 - 96, 600 - 160 - 112 - 2 + 32), 0); 10581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("-32,470 320x160", window_->bounds().ToString()); 10591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) resizer->Drag( 10601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CalculateDragPoint(*resizer, -33 - 96, 600 - 160 - 112 - 2 + 33), 0); 10611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("-33,471 320x160", window_->bounds().ToString()); 10621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No need to test dragging < 0 as we force that to 0. 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging TOPLEFT. 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_TOPLEFT) { 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 1069f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1070f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTTOPLEFT)); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -98, -199), 0); 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 120x230", window_->bounds().ToString()); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging TOPRIGHT. 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_TOPRIGHT) { 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 10795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect work_area(ScreenUtil::GetDisplayWorkAreaBoundsInParent( 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get())); 1081f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1082f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTTOPRIGHT)); 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag( 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CalculateDragPoint(*resizer, work_area.right() - 120 - 1, -199), 0); 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, window_->bounds().x()); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.y(), window_->bounds().y()); 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.right() - 100, window_->bounds().width()); 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(230, window_->bounds().height()); 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging BOTTOMRIGHT. 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_BOTTOMRIGHT) { 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 10955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect work_area(ScreenUtil::GetDisplayWorkAreaBoundsInParent( 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get())); 1097f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1098f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT)); 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag( 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CalculateDragPoint(*resizer, work_area.right() - 120 - 1, 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.bottom() - 220 - 2), 0); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, window_->bounds().x()); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, window_->bounds().y()); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.right() - 100, window_->bounds().width()); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.bottom() - 200, window_->bounds().height()); 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging BOTTOMLEFT. 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_BOTTOMLEFT) { 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 11125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect work_area(ScreenUtil::GetDisplayWorkAreaBoundsInParent( 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get())); 1114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMLEFT)); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag( 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CalculateDragPoint(*resizer, -98, work_area.bottom() - 220 - 2), 0); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, window_->bounds().x()); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, window_->bounds().y()); 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(120, window_->bounds().width()); 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.bottom() - 200, window_->bounds().height()); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies window sticks to both window and work area. 11265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, StickToBothEdgeAndWindow) { 11275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->SetBounds(gfx::Rect(10, 10, 20, 50)); 11285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->Show(); 11295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window2_->SetBounds(gfx::Rect(150, 160, 25, 1000)); 11305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window2_->Show(); 11315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 11335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_.get(), gfx::Point(10, 10), HTCAPTION)); 11345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Move |window| one pixel to the left of |window2|. Should snap to right. 11375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 119, 145), 0); 11385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect expected(130, 160, 20, 50); 11395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected.ToString(), window_->bounds().ToString()); 11405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect work_area(ScreenUtil::GetDisplayWorkAreaBoundsInParent( 11425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_.get())); 11435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The initial y position of |window_|. 11455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int initial_y = 10; 11465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The drag position where the window is exactly attached to the bottom. 11475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int attach_y = work_area.bottom() - window_->bounds().height() - initial_y; 11485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Dragging 10px above should not attach to the bottom. 11505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y - 10), 0); 11515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.set_y(attach_y + initial_y - 10); 11525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected.ToString(), window_->bounds().ToString()); 11535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Stick to the work area. 11555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y - 1), 0); 11565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.set_y(attach_y + initial_y); 11575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected.ToString(), window_->bounds().ToString()); 11585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y), 0); 11605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.set_y(attach_y + initial_y); 11615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected.ToString(), window_->bounds().ToString()); 11625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y + 1), 0); 11645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.set_y(attach_y + initial_y); 11655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected.ToString(), window_->bounds().ToString()); 11665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Moving down further should move the window. 11685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y + 18), 0); 11695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.set_y(attach_y + initial_y + 18); 11705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected.ToString(), window_->bounds().ToString()); 11715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CtrlDragResizeToExactPosition) { 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(96, 112, 320, 160)); 1175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT)); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resize the right bottom to add 10 in width, 12 in height. 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 12), ui::EF_CONTROL_DOWN); 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Both bottom and right sides to resize to exact size requested. 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,112 330x172", window_->bounds().ToString()); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that a dragged window will restore to its pre-maximized size. 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RestoreToPreMaximizeCoordinates) { 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 1000, 1000)); 118768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) wm::WindowState* window_state = wm::GetWindowState(window_.get()); 118868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->SetRestoreBoundsInScreen(gfx::Rect(96, 112, 320, 160)); 1189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag the window to new position by adding (10, 10) to original point, 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the window should get restored. 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 10), 0); 11955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,10 320x160", window_->bounds().ToString()); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The restore rectangle should get cleared as well. 119868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(window_state->HasRestoreBounds()); 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that a dragged window will restore to its pre-maximized size. 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RevertResizeOperation) { 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect initial_bounds(0, 0, 200, 400); 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(initial_bounds); 120568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 120668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) wm::WindowState* window_state = wm::GetWindowState(window_.get()); 120768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->SetRestoreBoundsInScreen(gfx::Rect(96, 112, 320, 160)); 1208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag the window to new poistion by adding (180, 16) to original point, 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the window should get restored. 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 180, 16), 0); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(initial_bounds.ToString(), window_->bounds().ToString()); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,112 320x160", 121768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->GetRestoreBoundsInScreen().ToString()); 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that only usable sizes get returned by the resizer. 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyAttach) { 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(10, 10, 20, 30)); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(150, 160, 25, 20)); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |window| one pixel to the left of |window2|. Should snap to right and 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // top. 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 119, 145), 0); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("130,160 20x30", window_->bounds().ToString()); 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |window| one pixel to the right of |window2|. Should snap to left and 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // top. 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 164, 145), 0); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("175,160 20x30", window_->bounds().ToString()); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |window| one pixel above |window2|. Should snap to top and left. 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 142, 119), 0); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("150,130 20x30", window_->bounds().ToString()); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |window| one pixel above the bottom of |window2|. Should snap to 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bottom and left. 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 142, 169), 0); 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("150,180 20x30", window_->bounds().ToString()); 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following variants verify magnetic snapping during resize when dragging a 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particular edge. 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOP) { 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(99, 179, 10, 20)); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTTOP)); 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,199 20x31", window_->bounds().ToString()); 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOPLEFT) { 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(99, 179, 10, 20)); 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTTOPLEFT)); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("99,199 21x31", window_->bounds().ToString()); 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(88, 201, 10, 20)); 1279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTTOPLEFT)); 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("98,201 22x29", window_->bounds().ToString()); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOPRIGHT) { 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(111, 179, 10, 20)); 1294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTTOPRIGHT)); 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,199 21x31", window_->bounds().ToString()); 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(121, 199, 10, 20)); 1304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTTOPRIGHT)); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,199 21x31", window_->bounds().ToString()); 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_RIGHT) { 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(121, 199, 10, 20)); 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT)); 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,200 21x30", window_->bounds().ToString()); 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOMRIGHT) { 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(122, 212, 10, 20)); 1331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT)); 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,200 22x32", window_->bounds().ToString()); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(111, 233, 10, 20)); 1341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT)); 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,200 21x33", window_->bounds().ToString()); 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOM) { 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(111, 233, 10, 20)); 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM)); 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,200 20x33", window_->bounds().ToString()); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOMLEFT) { 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(99, 231, 10, 20)); 1368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMLEFT)); 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("99,200 21x31", window_->bounds().ToString()); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(89, 209, 10, 20)); 1378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMLEFT)); 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("99,200 21x29", window_->bounds().ToString()); 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_LEFT) { 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(89, 209, 10, 20)); 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTLEFT)); 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("99,200 21x30", window_->bounds().ToString()); 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the user user moved window flag is getting properly set. 1400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CheckUserWindowManagedFlags) { 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 0, 50, 400, 200)); 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> no_attached_windows; 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that an abort doesn't change anything. 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the bottom. 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 100), 0); 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,150 400x200", window_->bounds().ToString()); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 141468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(wm::GetWindowState(window_.get())->bounds_changed_by_user()); 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that a completed move / size does change the user coordinates. 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the bottom. 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 100), 0); 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,150 400x200", window_->bounds().ToString()); 14255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 142668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(wm::GetWindowState(window_.get())->bounds_changed_by_user()); 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max size doesn't exceed it when dragged. 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TestMaxSizeEnforced) { 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 400, 300)); 14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.set_max_size(gfx::Size(401, 301)); 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT)); 14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 2, 2), 0); 14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(401, window_->bounds().width()); 14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(301, window_->bounds().height()); 14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max width doesn't restrict its height. 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TestPartialMaxSizeEnforced) { 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 400, 300)); 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.set_max_size(gfx::Size(401, 0)); 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT)); 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 2, 2), 0); 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(401, window_->bounds().width()); 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(302, window_->bounds().height()); 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max size can't be snapped. 14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, PhantomSnapMaxSize) { 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // With max size not set we get a phantom window controller for dragging off 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the right hand side. 1459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Make the window wider than maximum docked width. 1460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 400, 200)); 14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 1464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(snap_phantom_window_controller()); 14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 801, 0), 0); 1466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(snap_phantom_window_controller()); 1467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resizer->RevertDrag(); 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // With max size defined, we get no phantom window for snapping but we still 1471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // get a phantom window (docking guide). 1472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 400, 200)); 1473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate_.set_max_size(gfx::Size(400, 200)); 14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 801, 0), 0); 1478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(snap_phantom_window_controller()); 1479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resizer->RevertDrag(); 1480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 1482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // With max size defined, we get no phantom window for snapping. 1483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 400, 200)); 1484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate_.set_max_size(gfx::Size(400, 200)); 1485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // With min size defined, we get no phantom window for docking. 1486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate_.set_min_size(gfx::Size(400, 200)); 1487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 1490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 801, 0), 0); 1491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(snap_phantom_window_controller()); 1492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resizer->RevertDrag(); 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontRewardRightmostWindowForOverflows) { 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 14981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Four 100x100 windows flush against eachother, starting at 100,100. 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_->SetBounds(gfx::Rect(400, 100, 100, 100)); 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate2_.set_max_size(gfx::Size(101, 0)); 15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 15125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 15137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 15147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 51 to the left, which should contract w1 and expand w2-4. 15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // w2 will hit its max size straight away, and in doing so will leave extra 15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // pixels that a naive implementation may award to the rightmost window. A 15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // fair implementation will give 25 pixels to each of the other windows. 15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -51, 0), 0); 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 49x100", window_->bounds().ToString()); 15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("149,100 101x100", window2_->bounds().ToString()); 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("250,100 125x100", window3_->bounds().ToString()); 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("375,100 125x100", window4_->bounds().ToString()); 15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExceedMaxWidth) { 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 15291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Four 100x100 windows flush against eachother, starting at 100,100. 15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_->SetBounds(gfx::Rect(400, 100, 100, 100)); 15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate2_.set_max_size(gfx::Size(101, 0)); 15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate3_.set_max_size(gfx::Size(101, 0)); 15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 15445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 15457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 15467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 52 to the left, which should contract w1 and expand w2-4. 15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -52, 0), 0); 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 48x100", window_->bounds().ToString()); 15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("148,100 101x100", window2_->bounds().ToString()); 15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("249,100 101x100", window3_->bounds().ToString()); 15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("350,100 150x100", window4_->bounds().ToString()); 15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExceedMaxHeight) { 15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 15581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Four 100x100 windows flush against eachother, starting at 100,100. 15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(100, 200, 100, 100)); 15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(100, 300, 100, 100)); 15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_->SetBounds(gfx::Rect(100, 400, 100, 100)); 15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate2_.set_max_size(gfx::Size(0, 101)); 15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate3_.set_max_size(gfx::Size(0, 101)); 15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 15735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 15747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM, 15757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 52 up, which should contract w1 and expand w2-4. 15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, -52), 0); 15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 100x48", window_->bounds().ToString()); 15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,148 100x101", window2_->bounds().ToString()); 15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,249 100x101", window3_->bounds().ToString()); 15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,350 100x150", window4_->bounds().ToString()); 15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962 15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontExceedMinHeight DISABLED_DontExceedMinHeight 15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontExceedMinHeight DontExceedMinHeight 15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_DontExceedMinHeight) { 15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x500"); 15941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Four 100x100 windows flush against eachother, starting at 100,100. 15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(100, 200, 100, 100)); 16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(100, 300, 100, 100)); 16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_->SetBounds(gfx::Rect(100, 400, 100, 100)); 16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate2_.set_min_size(gfx::Size(0, 99)); 16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate3_.set_min_size(gfx::Size(0, 99)); 16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 16095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 16107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM, 16117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 52 down, which should expand w1 and contract w2-4. 16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 52), 0); 16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 100x152", window_->bounds().ToString()); 16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,252 100x99", window2_->bounds().ToString()); 16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,351 100x99", window3_->bounds().ToString()); 16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,450 100x50", window4_->bounds().ToString()); 16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExpandRightmostPastMaxWidth) { 16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 16231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Three 100x100 windows flush against eachother, starting at 100,100. 16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate3_.set_max_size(gfx::Size(101, 0)); 16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 16365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 16377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 16387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 51 to the left, which should contract w1 and expand w2-3. 16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -51, 0), 0); 16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 49x100", window_->bounds().ToString()); 16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("149,100 150x100", window2_->bounds().ToString()); 16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("299,100 101x100", window3_->bounds().ToString()); 16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MoveAttachedWhenGrownToMaxSize) { 16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 16491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Three 100x100 windows flush against eachother, starting at 100,100. 16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate2_.set_max_size(gfx::Size(101, 0)); 16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate3_.set_max_size(gfx::Size(101, 0)); 16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 16635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 16647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 16657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 52 to the left, which should contract w1 and expand and move w2-3. 16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -52, 0), 0); 16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 48x100", window_->bounds().ToString()); 16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("148,100 101x100", window2_->bounds().ToString()); 16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("249,100 101x100", window3_->bounds().ToString()); 16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962 16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MainWindowHonoursMaxWidth DISABLED_MainWindowHonoursMaxWidth 16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MainWindowHonoursMaxWidth MainWindowHonoursMaxWidth 16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_MainWindowHonoursMaxWidth) { 16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("400x800"); 16831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Three 100x100 windows flush against eachother, starting at 100,100. 16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.set_max_size(gfx::Size(102, 0)); 16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 16965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 16977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 16987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 50 to the right, which should expand w1 and contract w2-3, as they 17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // won't fit in the root window in their original sizes. 17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 50, 0), 0); 17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 102x100", window_->bounds().ToString()); 17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("202,100 99x100", window2_->bounds().ToString()); 17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("301,100 99x100", window3_->bounds().ToString()); 17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MainWindowHonoursMinWidth) { 17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("400x800"); 17101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Three 100x100 windows flush against eachother, starting at 100,100. 17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.set_min_size(gfx::Size(98, 0)); 17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 17225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 17237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 17247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 50 to the left, which should contract w1 and expand w2-3. 17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -50, 0), 0); 17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 98x100", window_->bounds().ToString()); 17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("198,100 101x100", window2_->bounds().ToString()); 17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("299,100 101x100", window3_->bounds().ToString()); 17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// The following variants test that windows are resized correctly to the edges 17347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// of the screen using touch, when touch point is off of the window border. 17357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_RIGHT) { 17367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) shelf_layout_manager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN); 17377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 17387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) InitTouchResizeWindow(gfx::Rect(100, 100, 600, kRootHeight - 200), HTRIGHT); 17397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 200).ToString(), 17407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 17417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 17427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 17437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_.get()); 17447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 17457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag out of the right border a bit and check if the border is aligned with 17467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the touch point. 17477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(715, kRootHeight / 2), 17487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(725, kRootHeight / 2), 174958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 175058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 17517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 625, kRootHeight - 200).ToString(), 17527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 17537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag more, but stop before being snapped to the edge. 17547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(725, kRootHeight / 2), 17557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(760, kRootHeight / 2), 175658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 175758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 17587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 660, kRootHeight - 200).ToString(), 17597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 17607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag even more to snap to the edge. 17617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(760, kRootHeight / 2), 17627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(775, kRootHeight / 2), 176358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 176458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 17657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 700, kRootHeight - 200).ToString(), 17667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 17677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 17687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 17697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_LEFT) { 17707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) shelf_layout_manager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN); 17717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 17727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) InitTouchResizeWindow(gfx::Rect(100, 100, 600, kRootHeight - 200), HTLEFT); 17737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 200).ToString(), 17747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 17757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 17767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 17777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_.get()); 17787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 17797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag out of the left border a bit and check if the border is aligned with 17807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the touch point. 17817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(85, kRootHeight / 2), 17827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(75, kRootHeight / 2), 178358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 178458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 17857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(75, 100, 625, kRootHeight - 200).ToString(), 17867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 17877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag more, but stop before being snapped to the edge. 17887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(75, kRootHeight / 2), 17897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(40, kRootHeight / 2), 179058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 179158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 17927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(40, 100, 660, kRootHeight - 200).ToString(), 17937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 17947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag even more to snap to the edge. 17957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(40, kRootHeight / 2), 17967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(25, kRootHeight / 2), 179758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 179858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 17997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(0, 100, 700, kRootHeight - 200).ToString(), 18007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 18027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_TOP) { 18047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) shelf_layout_manager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN); 18057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) InitTouchResizeWindow(gfx::Rect(100, 100, 600, kRootHeight - 200), HTTOP); 18077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 200).ToString(), 18087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 18117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_.get()); 18127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag out of the top border a bit and check if the border is aligned with 18147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the touch point. 18157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(400, 85), 18167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(400, 75), 181758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 181858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 18197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 75, 600, kRootHeight - 175).ToString(), 18207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag more, but stop before being snapped to the edge. 18227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(400, 75), 18237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(400, 40), 182458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 182558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 18267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 40, 600, kRootHeight - 140).ToString(), 18277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag even more to snap to the edge. 18297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(400, 40), 18307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(400, 25), 183158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 183258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 18337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 0, 600, kRootHeight - 100).ToString(), 18347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 18367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_BOTTOM) { 18387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) shelf_layout_manager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN); 18397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) InitTouchResizeWindow(gfx::Rect(100, 100, 600, kRootHeight - 200), HTBOTTOM); 18417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 200).ToString(), 18427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 18457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_.get()); 18467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag out of the bottom border a bit and check if the border is aligned with 18487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the touch point. 18497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(400, kRootHeight - 85), 18507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(400, kRootHeight - 75), 185158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 185258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 18537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 175).ToString(), 18547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag more, but stop before being snapped to the edge. 18567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(400, kRootHeight - 75), 18577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(400, kRootHeight - 40), 185858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 185958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 18607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 140).ToString(), 18617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag even more to snap to the edge. 18637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(400, kRootHeight - 40), 18647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(400, kRootHeight - 25), 186558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 186658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 18677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 100).ToString(), 18687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 18703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 1872