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" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h" 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h" 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/events/gestures/gesture_configuration.h" 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/event_generator.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(); 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci workspace_resizer_ = WorkspaceWindowResizer::GetInstanceForTest(); 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(); 5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::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)); 5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci window_->SetProperty(aura::client::kCanMaximizeKey, true); 56068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) wm::WindowState* window_state = wm::GetWindowState(window_.get()); 56168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect expected_bounds_in_parent( 564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) wm::GetDefaultLeftSnappedWindowBoundsInParent(window_.get())); 565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 10), 0); 5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(expected_bounds_in_parent.ToString(), 573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window_->bounds().ToString()); 57468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(window_state->HasRestoreBounds()); 575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("20,30 400x60", 57668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->GetRestoreBoundsInScreen().ToString()); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try the same with the right side. 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect expected_bounds_in_parent( 581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) wm::GetDefaultRightSnappedWindowBoundsInParent(window_.get())); 582f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800, 10), 0); 5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(expected_bounds_in_parent.ToString(), 589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window_->bounds().ToString()); 59068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(window_state->HasRestoreBounds()); 591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("20,30 400x60", 59268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->GetRestoreBoundsInScreen().ToString()); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test if the restore bounds is correct in multiple displays. 5967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 5977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 5987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Restore the window to clear snapped state. 600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) window_state->Restore(); 601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UpdateDisplay("800x600,500x600"); 603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window::Windows root_windows = Shell::GetAllRootWindows(); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[0], window_->GetRootWindow()); 605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Window is wide enough not to get docked right away. 606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_->SetBoundsInScreen(gfx::Rect(800, 10, 400, 60), 6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScreenUtil::GetSecondaryDisplay()); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[1], window_->GetRootWindow()); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("800,10 400x60", window_->GetBoundsInScreen().ToString()); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 499, 0), 0); 616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int bottom = 6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_.get()).bottom(); 6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // With the resolution of 500x600 we will hit in this case the 50% screen 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // size setting. 621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(varkha): Insets are updated because of http://crbug.com/292238 622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("250,0 250x" + base::IntToString(bottom), 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->bounds().ToString()); 624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("800,10 400x60", 62568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->GetRestoreBoundsInScreen().ToString()); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that non resizable windows will not get resized. 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, NonResizableWindows) { 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect(20, 30, 50, 60)); 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetProperty(aura::client::kCanResizeKey, false); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 634f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 635f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -20, 0), 0); 6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("0,30 50x60", window_->bounds().ToString()); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CancelSnapPhantom) { 6437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 6447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("800x600,800x600"); 647f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window::Windows root_windows = Shell::GetAllRootWindows(); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, root_windows.size()); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBoundsInScreen(gfx::Rect(0, 0, 50, 60), 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetPrimaryDisplay()); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[0], window_->GetRootWindow()); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(1.0f, window_->layer()->opacity()); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(snap_phantom_window_controller()); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The pointer is on the edge but not shared. The snap phantom window 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // controller should be non-NULL. 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 799, 0), 0); 663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(snap_phantom_window_controller()); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move the cursor across the edge. Now the snap phantom window controller 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be canceled. 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800, 0), 0); 668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(snap_phantom_window_controller()); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies that dragging a snapped window unsnaps it. 6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DragSnapped) { 674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) wm::WindowState* window_state = ash::wm::GetWindowState(window_.get()); 6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect kInitialBounds(100, 100, 100, 100); 6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->SetBounds(kInitialBounds); 6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->Show(); 679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const wm::WMEvent snap_event(wm::WM_EVENT_SNAP_LEFT); 680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window_state->OnWMEvent(&snap_event); 681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType()); 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect snapped_bounds = window_->bounds(); 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(snapped_bounds.ToString(), kInitialBounds.ToString()); 6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(window_state->GetRestoreBoundsInParent().ToString(), 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kInitialBounds.ToString()); 6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Dragging a side snapped window should unsnap it. 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 0), 0); 6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 692a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(wm::WINDOW_STATE_TYPE_NORMAL, window_state->GetStateType()); 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("10,0 100x100", window_->bounds().ToString()); 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(window_state->HasRestoreBounds()); 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies the behavior of resizing a side snapped window. 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeSnapped) { 699a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) wm::WindowState* window_state = ash::wm::GetWindowState(window_.get()); 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect kInitialBounds(100, 100, 100, 100); 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->SetBounds(kInitialBounds); 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->Show(); 7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 705a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const wm::WMEvent snap_event(wm::WM_EVENT_SNAP_LEFT); 706a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window_state->OnWMEvent(&snap_event); 707a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType()); 7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect snapped_bounds = window_->bounds(); 7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(snapped_bounds.ToString(), kInitialBounds.ToString()); 7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(window_state->GetRestoreBoundsInParent().ToString(), 7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kInitialBounds.ToString()); 7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 1) Resizing a side snapped window to make it wider should not unsnap the 7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // window. 7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT)); 7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 0), 0); 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 720a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType()); 7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) snapped_bounds.Inset(0, 0, -10, 0); 7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(snapped_bounds.ToString(), window_->bounds().ToString()); 7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(window_state->GetRestoreBoundsInParent().ToString(), 7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kInitialBounds.ToString()); 7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 2) Resizing a side snapped window vertically and then undoing the change 7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // should not unsnap. 7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 7315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM)); 7325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, -30), 0); 7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType()); 7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(snapped_bounds.ToString(), window_->bounds().ToString()); 7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(window_state->GetRestoreBoundsInParent().ToString(), 7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kInitialBounds.ToString()); 7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 3) Resizing a side snapped window vertically and then not undoing the 7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // change should unsnap. 7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM)); 7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, -10), 0); 7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(wm::WINDOW_STATE_TYPE_NORMAL, window_state->GetStateType()); 7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect expected_bounds(snapped_bounds); 7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_bounds.Inset(0, 0, 0, 10); 7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_bounds.ToString(), window_->bounds().ToString()); 7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(window_state->HasRestoreBounds()); 7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies windows are correctly restacked when reordering multiple windows. 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RestackAttached) { 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 0, 0, 200, 300)); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 0, 100, 200)); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 0, 100, 100)); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window2_.get()); 7655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 7667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 7677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the right, which should expand w1 and push w2 and w3. 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2 should be topmost since it's initially the highest in the stack. 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("2 1 3", WindowOrderAsString(window_->parent())); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows; 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows.push_back(window3_.get()); 7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 7807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window2_.get(), gfx::Point(), HTRIGHT, 7817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the right, which should expand w1 and push w2 and w3. 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 100, -10), 0); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2 should be topmost since it's initially the highest in the stack. 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("2 3 1", WindowOrderAsString(window_->parent())); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging below the work area. 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontDragOffBottom) { 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 10, 0)); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 400)); 799f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 800f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 600), 0); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_y = 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kRootHeight - WorkspaceWindowResizer::kMinOnscreenHeight - 10; 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100," + base::IntToString(expected_y) + " 300x400", 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->bounds().ToString()); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging on the work area with multidisplay. 8107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontDragOffBottomWithMultiDisplay) { 8117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 8127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 8137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("800x600,800x600"); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 10, 0)); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Positions the secondary display at the bottom the primary display. 8218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays( 822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::DisplayLayout(ash::DisplayLayout::BOTTOM, 0)); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 20)); 8264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_LT(window_->bounds().height(), 8274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WorkspaceWindowResizer::kMinOnscreenHeight); 828a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Drag down avoiding dragging along the edge as that would side-snap. 829f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 830a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) window_.get(), gfx::Point(10, 0), HTCAPTION)); 8314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 8324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 400), 0); 8334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int expected_y = kRootHeight - window_->bounds().height() - 10; 8344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // When the mouse cursor is in the primary display, the window cannot move 8354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // on non-work area but can get all the way towards the bottom, 8364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // restricted only by the window height. 8374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("100," + base::IntToString(expected_y) + " 300x20", 8384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_->bounds().ToString()); 839f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Revert the drag in order to not remember the restore bounds. 840f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resizer->RevertDrag(); 8414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 8424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 843f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 844f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 10, 0)); 8454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 400)); 847f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 848a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) window_.get(), gfx::Point(10, 0), HTCAPTION)); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 850a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Drag down avoiding dragging along the edge as that would side-snap. 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 400), 0); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_y = 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kRootHeight - WorkspaceWindowResizer::kMinOnscreenHeight - 10; 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the mouse cursor is in the primary display, the window cannot move 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on non-work area with kMinOnscreenHeight margin. 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100," + base::IntToString(expected_y) + " 300x400", 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->bounds().ToString()); 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 400)); 863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 864f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), window_->bounds().origin(), HTCAPTION)); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 866f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Drag down avoiding getting stuck against the shelf on the bottom screen. 867f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 500), 0); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The window can move to the secondary display beyond non-work area of 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the primary display. 870f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("100,700 300x400", window_->bounds().ToString()); 8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't allow dragging off the top of the work area. 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontDragOffTop) { 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(10, 0, 0, 0)); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 400)); 881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 882f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, -600), 0); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,10 300x400", window_->bounds().ToString()); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeBottomOutsideWorkArea) { 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 300, 380)); 893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 894f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTTOP)); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 8, 0), 0); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,200 300x380", window_->bounds().ToString()); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideLeftWorkArea) { 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int left = ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_.get()).x(); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pixels_to_left_border = 50; 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_width = 300; 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_x = left - window_width + pixels_to_left_border; 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380)); 908f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 909f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(pixels_to_left_border, 0), HTRIGHT)); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -window_width, 0), 0); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::IntToString(window_x) + ",100 " + 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(kMinimumOnScreenArea - window_x) + 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "x380", window_->bounds().ToString()); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideRightWorkArea) { 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 9205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int right = ScreenUtil::GetDisplayWorkAreaBoundsInParent( 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get()).right(); 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pixels_to_right_border = 50; 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_width = 300; 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_x = right - pixels_to_right_border; 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380)); 926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 927f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(window_x, 0), HTLEFT)); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::IntToString(right - kMinimumOnScreenArea) + 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ",100 " + 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(window_width - pixels_to_right_border + 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMinimumOnScreenArea) + 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "x380", window_->bounds().ToString()); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, ResizeWindowOutsideBottomWorkArea) { 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 9405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int bottom = ScreenUtil::GetDisplayWorkAreaBoundsInParent( 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get()).bottom(); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int delta_to_bottom = 50; 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height = 380; 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, bottom - delta_to_bottom, 300, height)); 945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(0, bottom - delta_to_bottom), HTTOP)); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, bottom), 0); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100," + 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(bottom - kMinimumOnScreenArea) + 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " 300x" + 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(height - (delta_to_bottom - 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMinimumOnScreenArea)), 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->bounds().ToString()); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that 'outside' check of the resizer take into account the extended 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// desktop in case of repositions. 9597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DragWindowOutsideRightToSecondaryDisplay) { 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only primary display. Changes the window position to fit within the 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // display. 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int right = ScreenUtil::GetDisplayWorkAreaBoundsInParent( 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get()).right(); 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pixels_to_right_border = 50; 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_width = 300; 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_x = right - pixels_to_right_border; 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380)); 970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 971f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(window_x, 0), HTCAPTION)); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0); 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::IntToString(right - kMinimumOnScreenArea) + 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ",100 " + 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(window_width) + 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "x380", window_->bounds().ToString()); 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 9807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 9817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // With secondary display. Operation itself is same but doesn't change 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the position because the window is still within the secondary display. 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("1000x600,600x400"); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets( 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow(), gfx::Insets(0, 0, 50, 0)); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(window_x, 100, window_width, 380)); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, window_width, 0), 0); 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::IntToString(window_x + window_width) + 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ",100 " + 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(window_width) + 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "x380", window_->bounds().ToString()); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies snapping to edges works. 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToEdge) { 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager()-> 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS); 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(96, 112, 320, 160)); 10003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Click 50px to the right so that the mouse pointer does not leave the 10013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // workspace ensuring sticky behavior. 1002f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 10033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_.get(), 10043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->bounds().origin() + gfx::Vector2d(50, 0), 1005f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) HTCAPTION)); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to an x-coordinate of 15, which should not snap. 1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 15 - 96, 0), 0); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An x-coordinate of 7 should snap. 1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 7 - 96, 0), 0); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,112 320x160", window_->bounds().ToString()); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to -15, should still snap to 0. 1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -15 - 96, 0), 0); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,112 320x160", window_->bounds().ToString()); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // At -32 should move past snap points. 1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -32 - 96, 0), 0); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("-32,112 320x160", window_->bounds().ToString()); 1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -33 - 96, 0), 0); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("-33,112 320x160", window_->bounds().ToString()); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Right side should similarly snap. 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 - 15, 0), 0); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("465,112 320x160", window_->bounds().ToString()); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 - 7, 0), 0); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("480,112 320x160", window_->bounds().ToString()); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 15, 0), 0); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("480,112 320x160", window_->bounds().ToString()); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 32, 0), 0); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("512,112 320x160", window_->bounds().ToString()); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 800 - 320 - 96 + 33, 0), 0); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("513,112 320x160", window_->bounds().ToString()); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And the bottom should snap too. 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 3 - 7), 0); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,437 320x160", window_->bounds().ToString()); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 3 + 15), 0); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,437 320x160", window_->bounds().ToString()); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 2 + 32), 0); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,470 320x160", window_->bounds().ToString()); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 600 - 160 - 112 - 2 + 33), 0); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,471 320x160", window_->bounds().ToString()); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And the top should snap too. 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, -112 + 20), 0); 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,20 320x160", window_->bounds().ToString()); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, -112 + 7), 0); 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,0 320x160", window_->bounds().ToString()); 10481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 10491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // And bottom/left should snap too. 10501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) resizer->Drag( 10511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CalculateDragPoint(*resizer, 7 - 96, 600 - 160 - 112 - 3 - 7), 0); 10521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("0,437 320x160", window_->bounds().ToString()); 10531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) resizer->Drag( 10541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CalculateDragPoint(*resizer, -15 - 96, 600 - 160 - 112 - 3 + 15), 0); 10551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("0,437 320x160", window_->bounds().ToString()); 10561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // should move past snap points. 10571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) resizer->Drag( 10581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CalculateDragPoint(*resizer, -32 - 96, 600 - 160 - 112 - 2 + 32), 0); 10591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("-32,470 320x160", window_->bounds().ToString()); 10601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) resizer->Drag( 10611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CalculateDragPoint(*resizer, -33 - 96, 600 - 160 - 112 - 2 + 33), 0); 10621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("-33,471 320x160", window_->bounds().ToString()); 10631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No need to test dragging < 0 as we force that to 0. 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging TOPLEFT. 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_TOPLEFT) { 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 1070f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1071f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTTOPLEFT)); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -98, -199), 0); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 120x230", window_->bounds().ToString()); 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging TOPRIGHT. 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_TOPRIGHT) { 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 10805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect work_area(ScreenUtil::GetDisplayWorkAreaBoundsInParent( 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get())); 1082f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1083f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTTOPRIGHT)); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag( 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CalculateDragPoint(*resizer, work_area.right() - 120 - 1, -199), 0); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, window_->bounds().x()); 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.y(), window_->bounds().y()); 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.right() - 100, window_->bounds().width()); 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(230, window_->bounds().height()); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging BOTTOMRIGHT. 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_BOTTOMRIGHT) { 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 10965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect work_area(ScreenUtil::GetDisplayWorkAreaBoundsInParent( 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get())); 1098f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1099f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT)); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag( 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CalculateDragPoint(*resizer, work_area.right() - 120 - 1, 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.bottom() - 220 - 2), 0); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, window_->bounds().x()); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, window_->bounds().y()); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.right() - 100, window_->bounds().width()); 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.bottom() - 200, window_->bounds().height()); 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a resize snap when dragging BOTTOMLEFT. 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, SnapToWorkArea_BOTTOMLEFT) { 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 11135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect work_area(ScreenUtil::GetDisplayWorkAreaBoundsInParent( 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.get())); 1115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMLEFT)); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag( 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CalculateDragPoint(*resizer, -98, work_area.bottom() - 220 - 2), 0); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, window_->bounds().x()); 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, window_->bounds().y()); 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(120, window_->bounds().width()); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.bottom() - 200, window_->bounds().height()); 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies window sticks to both window and work area. 11275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, StickToBothEdgeAndWindow) { 11285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->SetBounds(gfx::Rect(10, 10, 20, 50)); 11295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->Show(); 11305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window2_->SetBounds(gfx::Rect(150, 160, 25, 1000)); 11315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window2_->Show(); 11325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 11345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_.get(), gfx::Point(10, 10), HTCAPTION)); 11355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Move |window| one pixel to the left of |window2|. Should snap to right. 11385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 119, 145), 0); 11395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect expected(130, 160, 20, 50); 11405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected.ToString(), window_->bounds().ToString()); 11415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect work_area(ScreenUtil::GetDisplayWorkAreaBoundsInParent( 11435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_.get())); 11445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The initial y position of |window_|. 11465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int initial_y = 10; 11475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The drag position where the window is exactly attached to the bottom. 11485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int attach_y = work_area.bottom() - window_->bounds().height() - initial_y; 11495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Dragging 10px above should not attach to the bottom. 11515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y - 10), 0); 11525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.set_y(attach_y + initial_y - 10); 11535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected.ToString(), window_->bounds().ToString()); 11545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Stick to the work area. 11565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y - 1), 0); 11575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.set_y(attach_y + initial_y); 11585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected.ToString(), window_->bounds().ToString()); 11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y), 0); 11615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.set_y(attach_y + initial_y); 11625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected.ToString(), window_->bounds().ToString()); 11635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y + 1), 0); 11655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.set_y(attach_y + initial_y); 11665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected.ToString(), window_->bounds().ToString()); 11675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Moving down further should move the window. 11695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 119, attach_y + 18), 0); 11705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.set_y(attach_y + initial_y + 18); 11715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected.ToString(), window_->bounds().ToString()); 11725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CtrlDragResizeToExactPosition) { 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(96, 112, 320, 160)); 1176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT)); 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resize the right bottom to add 10 in width, 12 in height. 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 12), ui::EF_CONTROL_DOWN); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Both bottom and right sides to resize to exact size requested. 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,112 330x172", window_->bounds().ToString()); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies that a dragged, non-snapped window will clear restore bounds. 11861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WorkspaceWindowResizerTest, RestoreClearedOnResize) { 11871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci window_->SetBounds(gfx::Rect(10, 10, 100, 100)); 11881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci wm::WindowState* window_state = wm::GetWindowState(window_.get()); 11891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci window_state->SetRestoreBoundsInScreen(gfx::Rect(50, 50, 50, 50)); 11901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 11911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci window_.get(), gfx::Point(), HTBOTTOMRIGHT)); 11921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(resizer.get()); 11931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Drag the window to new position by adding (20, 30) to original point, 11941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the original restore bound should be cleared. 11951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resizer->Drag(CalculateDragPoint(*resizer, 20, 30), 0); 11961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resizer->CompleteDrag(); 11971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("10,10 120x130", window_->bounds().ToString()); 11981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(window_state->HasRestoreBounds()); 11991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 12001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that a dragged window will restore to its pre-maximized size. 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RestoreToPreMaximizeCoordinates) { 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 1000, 1000)); 120468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) wm::WindowState* window_state = wm::GetWindowState(window_.get()); 120568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->SetRestoreBoundsInScreen(gfx::Rect(96, 112, 320, 160)); 1206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag the window to new position by adding (10, 10) to original point, 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the window should get restored. 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 10, 10), 0); 12125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,10 320x160", window_->bounds().ToString()); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The restore rectangle should get cleared as well. 121568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(window_state->HasRestoreBounds()); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that a dragged window will restore to its pre-maximized size. 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, RevertResizeOperation) { 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect initial_bounds(0, 0, 200, 400); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(initial_bounds); 122268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 122368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) wm::WindowState* window_state = wm::GetWindowState(window_.get()); 122468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->SetRestoreBoundsInScreen(gfx::Rect(96, 112, 320, 160)); 1225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag the window to new poistion by adding (180, 16) to original point, 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the window should get restored. 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 180, 16), 0); 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(initial_bounds.ToString(), window_->bounds().ToString()); 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("96,112 320x160", 123468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->GetRestoreBoundsInScreen().ToString()); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that only usable sizes get returned by the resizer. 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyAttach) { 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(10, 10, 20, 30)); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(150, 160, 25, 20)); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |window| one pixel to the left of |window2|. Should snap to right and 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // top. 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 119, 145), 0); 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("130,160 20x30", window_->bounds().ToString()); 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |window| one pixel to the right of |window2|. Should snap to left and 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // top. 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 164, 145), 0); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("175,160 20x30", window_->bounds().ToString()); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |window| one pixel above |window2|. Should snap to top and left. 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 142, 119), 0); 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("150,130 20x30", window_->bounds().ToString()); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |window| one pixel above the bottom of |window2|. Should snap to 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bottom and left. 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 142, 169), 0); 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("150,180 20x30", window_->bounds().ToString()); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following variants verify magnetic snapping during resize when dragging a 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particular edge. 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOP) { 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(99, 179, 10, 20)); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTTOP)); 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,199 20x31", window_->bounds().ToString()); 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOPLEFT) { 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(99, 179, 10, 20)); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTTOPLEFT)); 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("99,199 21x31", window_->bounds().ToString()); 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(88, 201, 10, 20)); 1296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTTOPLEFT)); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("98,201 22x29", window_->bounds().ToString()); 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_TOPRIGHT) { 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(111, 179, 10, 20)); 1311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTTOPRIGHT)); 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,199 21x31", window_->bounds().ToString()); 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(121, 199, 10, 20)); 1321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTTOPRIGHT)); 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,199 21x31", window_->bounds().ToString()); 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_RIGHT) { 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(121, 199, 10, 20)); 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT)); 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,200 21x30", window_->bounds().ToString()); 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOMRIGHT) { 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(122, 212, 10, 20)); 1348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT)); 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,200 22x32", window_->bounds().ToString()); 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(111, 233, 10, 20)); 1358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT)); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,200 21x33", window_->bounds().ToString()); 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOM) { 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(111, 233, 10, 20)); 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM)); 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,200 20x33", window_->bounds().ToString()); 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_BOTTOMLEFT) { 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(99, 231, 10, 20)); 1385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMLEFT)); 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("99,200 21x31", window_->bounds().ToString()); 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(89, 209, 10, 20)); 1395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMLEFT)); 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("99,200 21x29", window_->bounds().ToString()); 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MagneticallyResize_LEFT) { 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->SetBounds(gfx::Rect(89, 209, 10, 20)); 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(100, 200, 20, 30)); 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2_->Show(); 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTLEFT)); 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 0), 0); 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("99,200 21x30", window_->bounds().ToString()); 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the user user moved window flag is getting properly set. 1417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, CheckUserWindowManagedFlags) { 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect( 0, 50, 400, 200)); 14191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci window_->SetProperty(aura::client::kCanMaximizeKey, true); 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> no_attached_windows; 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that an abort doesn't change anything. 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the bottom. 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 100), 0); 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,150 400x200", window_->bounds().ToString()); 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->RevertDrag(); 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 143268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(wm::GetWindowState(window_.get())->bounds_changed_by_user()); 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that a completed move / size does change the user coordinates. 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resizer.get()); 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it 100 to the bottom. 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 100), 0); 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,150 400x200", window_->bounds().ToString()); 14435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resizer->CompleteDrag(); 144468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(wm::GetWindowState(window_.get())->bounds_changed_by_user()); 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max size doesn't exceed it when dragged. 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TestMaxSizeEnforced) { 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 400, 300)); 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.set_max_size(gfx::Size(401, 301)); 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT)); 14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 2, 2), 0); 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(401, window_->bounds().width()); 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(301, window_->bounds().height()); 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max width doesn't restrict its height. 14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TestPartialMaxSizeEnforced) { 14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 400, 300)); 14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.set_max_size(gfx::Size(401, 0)); 14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOMRIGHT)); 14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 2, 2), 0); 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(401, window_->bounds().width()); 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(302, window_->bounds().height()); 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a window with a specified max size can't be snapped. 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, PhantomSnapMaxSize) { 14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // With max size not set we get a phantom window controller for dragging off 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the right hand side. 1477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Make the window wider than maximum docked width. 1478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 400, 200)); 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 1482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(snap_phantom_window_controller()); 14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 801, 0), 0); 1484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(snap_phantom_window_controller()); 1485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resizer->RevertDrag(); 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // With max size defined, we get no phantom window for snapping but we still 1489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // get a phantom window (docking guide). 1490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 400, 200)); 1491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate_.set_max_size(gfx::Size(400, 200)); 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 801, 0), 0); 1496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(snap_phantom_window_controller()); 1497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resizer->RevertDrag(); 1498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 1500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // With max size defined, we get no phantom window for snapping. 1501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_->SetBounds(gfx::Rect(0, 0, 400, 200)); 1502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate_.set_max_size(gfx::Size(400, 200)); 1503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // With min size defined, we get no phantom window for docking. 1504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate_.set_min_size(gfx::Size(400, 200)); 1505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WindowResizer> resizer(CreateResizerForTest( 1507f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_.get(), gfx::Point(), HTCAPTION)); 1508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 801, 0), 0); 1509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(snap_phantom_window_controller()); 1510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resizer->RevertDrag(); 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontRewardRightmostWindowForOverflows) { 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 15161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Four 100x100 windows flush against eachother, starting at 100,100. 15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_->SetBounds(gfx::Rect(400, 100, 100, 100)); 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate2_.set_max_size(gfx::Size(101, 0)); 15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 15305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 15317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 15327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 51 to the left, which should contract w1 and expand w2-4. 15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // w2 will hit its max size straight away, and in doing so will leave extra 15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // pixels that a naive implementation may award to the rightmost window. A 15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // fair implementation will give 25 pixels to each of the other windows. 15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -51, 0), 0); 15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 49x100", window_->bounds().ToString()); 15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("149,100 101x100", window2_->bounds().ToString()); 15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("250,100 125x100", window3_->bounds().ToString()); 15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("375,100 125x100", window4_->bounds().ToString()); 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExceedMaxWidth) { 15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 15471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Four 100x100 windows flush against eachother, starting at 100,100. 15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_->SetBounds(gfx::Rect(400, 100, 100, 100)); 15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate2_.set_max_size(gfx::Size(101, 0)); 15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate3_.set_max_size(gfx::Size(101, 0)); 15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 15625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 15637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 15647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 52 to the left, which should contract w1 and expand w2-4. 15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -52, 0), 0); 15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 48x100", window_->bounds().ToString()); 15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("148,100 101x100", window2_->bounds().ToString()); 15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("249,100 101x100", window3_->bounds().ToString()); 15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("350,100 150x100", window4_->bounds().ToString()); 15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExceedMaxHeight) { 15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 15761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Four 100x100 windows flush against eachother, starting at 100,100. 15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(100, 200, 100, 100)); 15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(100, 300, 100, 100)); 15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_->SetBounds(gfx::Rect(100, 400, 100, 100)); 15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate2_.set_max_size(gfx::Size(0, 101)); 15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate3_.set_max_size(gfx::Size(0, 101)); 15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 15915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 15927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM, 15937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 52 up, which should contract w1 and expand w2-4. 15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, -52), 0); 15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 100x48", window_->bounds().ToString()); 15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,148 100x101", window2_->bounds().ToString()); 15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,249 100x101", window3_->bounds().ToString()); 16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,350 100x150", window4_->bounds().ToString()); 16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962 16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontExceedMinHeight DISABLED_DontExceedMinHeight 16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontExceedMinHeight DontExceedMinHeight 16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_DontExceedMinHeight) { 16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x500"); 16121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Four 100x100 windows flush against eachother, starting at 100,100. 16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(100, 200, 100, 100)); 16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(100, 300, 100, 100)); 16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window4_->SetBounds(gfx::Rect(100, 400, 100, 100)); 16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate2_.set_min_size(gfx::Size(0, 99)); 16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate3_.set_min_size(gfx::Size(0, 99)); 16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 16275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 16287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTBOTTOM, 16297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 52 down, which should expand w1 and contract w2-4. 16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 0, 52), 0); 16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 100x152", window_->bounds().ToString()); 16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,252 100x99", window2_->bounds().ToString()); 16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,351 100x99", window3_->bounds().ToString()); 16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,450 100x50", window4_->bounds().ToString()); 16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, DontExpandRightmostPastMaxWidth) { 16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 16411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Three 100x100 windows flush against eachother, starting at 100,100. 16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate3_.set_max_size(gfx::Size(101, 0)); 16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 16545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 16557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 16567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 51 to the left, which should contract w1 and expand w2-3. 16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -51, 0), 0); 16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 49x100", window_->bounds().ToString()); 16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("149,100 150x100", window2_->bounds().ToString()); 16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("299,100 101x100", window3_->bounds().ToString()); 16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MoveAttachedWhenGrownToMaxSize) { 16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x800"); 16671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Three 100x100 windows flush against eachother, starting at 100,100. 16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate2_.set_max_size(gfx::Size(101, 0)); 16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate3_.set_max_size(gfx::Size(101, 0)); 16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 16815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 16827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 16837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 52 to the left, which should contract w1 and expand and move w2-3. 16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -52, 0), 0); 16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 48x100", window_->bounds().ToString()); 16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("148,100 101x100", window2_->bounds().ToString()); 16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("249,100 101x100", window3_->bounds().ToString()); 16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962 16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MainWindowHonoursMaxWidth DISABLED_MainWindowHonoursMaxWidth 16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MainWindowHonoursMaxWidth MainWindowHonoursMaxWidth 16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MAYBE_MainWindowHonoursMaxWidth) { 17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("400x800"); 17011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Three 100x100 windows flush against eachother, starting at 100,100. 17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.set_max_size(gfx::Size(102, 0)); 17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window4_.get()); 17145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 17157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 17167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 50 to the right, which should expand w1 and contract w2-3, as they 17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // won't fit in the root window in their original sizes. 17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, 50, 0), 0); 17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 102x100", window_->bounds().ToString()); 17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("202,100 99x100", window2_->bounds().ToString()); 17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("301,100 99x100", window3_->bounds().ToString()); 17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, MainWindowHonoursMinWidth) { 17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("400x800"); 17281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->SetDisplayWorkAreaInsets(root, gfx::Insets()); 17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Three 100x100 windows flush against eachother, starting at 100,100. 17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetBounds(gfx::Rect( 100, 100, 100, 100)); 17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window2_->SetBounds(gfx::Rect(200, 100, 100, 100)); 17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window3_->SetBounds(gfx::Rect(300, 100, 100, 100)); 17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.set_min_size(gfx::Size(98, 0)); 17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<aura::Window*> windows; 17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window2_.get()); 17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) windows.push_back(window3_.get()); 17405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<WorkspaceWindowResizer> resizer(CreateWorkspaceResizerForTest( 17417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_.get(), gfx::Point(), HTRIGHT, 17427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE, windows)); 17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(resizer.get()); 17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move it 50 to the left, which should contract w1 and expand w2-3. 17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resizer->Drag(CalculateDragPoint(*resizer, -50, 0), 0); 17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("100,100 98x100", window_->bounds().ToString()); 17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("198,100 101x100", window2_->bounds().ToString()); 17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("299,100 101x100", window3_->bounds().ToString()); 17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// The following variants test that windows are resized correctly to the edges 17527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// of the screen using touch, when touch point is off of the window border. 17537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_RIGHT) { 17547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) shelf_layout_manager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN); 17557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 17567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) InitTouchResizeWindow(gfx::Rect(100, 100, 600, kRootHeight - 200), HTRIGHT); 17577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 200).ToString(), 17587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 17597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 17605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 17615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) touch_resize_window_.get()); 17627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 17637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag out of the right border a bit and check if the border is aligned with 17647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the touch point. 17657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(715, kRootHeight / 2), 17667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(725, kRootHeight / 2), 176758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 176858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 17697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 625, kRootHeight - 200).ToString(), 17707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 17717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag more, but stop before being snapped to the edge. 17727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(725, kRootHeight / 2), 17737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(760, kRootHeight / 2), 177458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 177558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 17767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 660, kRootHeight - 200).ToString(), 17777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 17787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag even more to snap to the edge. 17797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(760, kRootHeight / 2), 17807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(775, kRootHeight / 2), 178158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 178258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 17837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 700, kRootHeight - 200).ToString(), 17847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 17857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 17867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 17877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_LEFT) { 17887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) shelf_layout_manager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN); 17897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 17907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) InitTouchResizeWindow(gfx::Rect(100, 100, 600, kRootHeight - 200), HTLEFT); 17917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 200).ToString(), 17927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 17937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 17945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 17955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) touch_resize_window_.get()); 17967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 17977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag out of the left border a bit and check if the border is aligned with 17987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the touch point. 17997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(85, kRootHeight / 2), 18007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(75, kRootHeight / 2), 180158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 180258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 18037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(75, 100, 625, kRootHeight - 200).ToString(), 18047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag more, but stop before being snapped to the edge. 18067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(75, kRootHeight / 2), 18077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(40, kRootHeight / 2), 180858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 180958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 18107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(40, 100, 660, kRootHeight - 200).ToString(), 18117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag even more to snap to the edge. 18137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(40, kRootHeight / 2), 18147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(25, kRootHeight / 2), 181558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 181658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 18177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(0, 100, 700, kRootHeight - 200).ToString(), 18187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 18207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_TOP) { 18227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) shelf_layout_manager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN); 18237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) InitTouchResizeWindow(gfx::Rect(100, 100, 600, kRootHeight - 200), HTTOP); 18257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 200).ToString(), 18267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 18295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) touch_resize_window_.get()); 18307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag out of the top border a bit and check if the border is aligned with 18327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the touch point. 18337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(400, 85), 18347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(400, 75), 183558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 183658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 18377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 75, 600, kRootHeight - 175).ToString(), 18387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag more, but stop before being snapped to the edge. 18407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(400, 75), 18417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(400, 40), 184258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 184358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 18447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 40, 600, kRootHeight - 140).ToString(), 18457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag even more to snap to the edge. 18477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(400, 40), 18487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(400, 25), 184958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 185058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 18517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 0, 600, kRootHeight - 100).ToString(), 18527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 18547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_BOTTOM) { 18567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) shelf_layout_manager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN); 18577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) InitTouchResizeWindow(gfx::Rect(100, 100, 600, kRootHeight - 200), HTBOTTOM); 18597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 200).ToString(), 18607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 18635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) touch_resize_window_.get()); 18647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag out of the bottom border a bit and check if the border is aligned with 18667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the touch point. 18677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(400, kRootHeight - 85), 18687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(400, kRootHeight - 75), 186958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 187058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 18717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 175).ToString(), 18727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag more, but stop before being snapped to the edge. 18747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(400, kRootHeight - 75), 18757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(400, kRootHeight - 40), 187658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 187758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 18787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 140).ToString(), 18797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Drag even more to snap to the edge. 18817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) generator.GestureScrollSequence(gfx::Point(400, kRootHeight - 40), 18827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point(400, kRootHeight - 25), 188358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 188458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5); 18857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 100).ToString(), 18867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_resize_window_->bounds().ToString()); 18877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 18883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 1890