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) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/wm/window_positioner.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/test_shell_delegate.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_resizer.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/test_browser_window.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/render_view_test.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_windows.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A browser window proxy which is able to associate an aura native window with 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestBrowserWindowAura : public TestBrowserWindow { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) explicit TestBrowserWindowAura(aura::Window* native_window); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestBrowserWindowAura(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::NativeWindow GetNativeWindow() OVERRIDE { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_window_; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow native_window_; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestBrowserWindowAura); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestBrowserWindowAura::TestBrowserWindowAura(aura::Window *native_window) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : native_window_(native_window) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestBrowserWindowAura::~TestBrowserWindowAura() {} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A test class for preparing window positioner tests - it creates a testing 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// base by adding a window and a popup which can be independently 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// positioned to see where the positioner will place the window. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WindowPositionerTest : public AshTestBase { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowPositionerTest(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window() { return window_.get(); } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* popup() { return popup_.get(); } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* window_browser() { return window_owning_browser_.get(); } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* popup_browser() { return popup_owning_browser_.get(); } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowPositioner* window_positioner() { return window_positioner_; } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The positioner & desktop's used grid alignment size. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int grid_size_; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowPositioner* window_positioner_; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These two need to be deleted after everything else is gone. 80a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestingProfile profile_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These get created for each session. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> window_; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> popup_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrowserWindow> browser_window_; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrowserWindow> browser_popup_; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> window_owning_browser_; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Browser> popup_owning_browser_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WindowPositionerTest); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WindowPositionerTest::WindowPositionerTest() 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : grid_size_(WindowPositioner::kMinimumWindowOffset), 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_positioner_(NULL) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowPositionerTest::SetUp() { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AshTestBase::SetUp(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create some default dummy windows. 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.reset(CreateTestWindowInShellWithId(0)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(gfx::Rect(16, 32, 640, 320)); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_.reset(CreateTestWindowInShellWithId(1)); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_->SetBounds(gfx::Rect(16, 32, 128, 256)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a browser for the window. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_window_.reset(new TestBrowserWindowAura(window_.get())); 110a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch Browser::CreateParams window_params(&profile_, 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::HOST_DESKTOP_TYPE_ASH); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_params.window = browser_window_.get(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_owning_browser_.reset(new Browser(window_params)); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creating a browser for the popup. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_popup_.reset(new TestBrowserWindowAura(popup_.get())); 117a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch Browser::CreateParams popup_params(Browser::TYPE_POPUP, &profile_, 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::HOST_DESKTOP_TYPE_ASH); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_params.window = browser_popup_.get(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_owning_browser_.reset(new Browser(popup_params)); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We hide all windows upon start - each user is required to set it up 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as he needs it. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->Hide(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup()->Hide(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_positioner_ = new WindowPositioner(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowPositionerTest::TearDown() { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since the AuraTestBase is needed to create our assets, we have to 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // also delete them before we tear it down. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_owning_browser_.reset(NULL); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_owning_browser_.reset(NULL); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_window_.reset(NULL); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_popup_.reset(NULL); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.reset(NULL); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_.reset(NULL); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AshTestBase::TearDown(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete window_positioner_; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_positioner_ = NULL; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlignToGridRoundDown(int location, int grid_size) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (grid_size <= 1 || location % grid_size == 0) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return location; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return location / grid_size * grid_size; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowPositionerTest, cascading) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect work_area = 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetPrimaryDisplay().work_area(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First see that the window will cascade down when there is no space. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->SetBounds(work_area); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->Show(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect popup_position(0, 0, 200, 200); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that it gets cascaded. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect cascade_1 = window_positioner()->GetPopupPosition(popup_position); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(work_area.x() + grid_size_, work_area.y() + grid_size_, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_position.width(), popup_position.height()), 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cascade_1); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect cascade_2 = window_positioner()->GetPopupPosition(popup_position); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(work_area.x() + 2 * grid_size_, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.y() + 2 * grid_size_, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_position.width(), popup_position.height()), 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cascade_2); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that if there is even only a pixel missing it will cascade. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->SetBounds(gfx::Rect(work_area.x() + popup_position.width() - 1, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.y() + popup_position.height() - 1, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.width() - 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2 * (popup_position.width() - 1), 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.height() - 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2 * (popup_position.height() - 1))); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect cascade_3 = window_positioner()->GetPopupPosition(popup_position); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(work_area.x() + 3 * grid_size_, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.y() + 3 * grid_size_, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_position.width(), popup_position.height()), 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cascade_3); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that we overflow into the next line when we do not fit anymore in Y. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect popup_position_4(0, 0, 200, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.height() - 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cascade_3.y() - work_area.y())); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect cascade_4 = 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_positioner()->GetPopupPosition(popup_position_4); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(work_area.x() + 2 * grid_size_, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.y() + grid_size_, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_position_4.width(), popup_position_4.height()), 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cascade_4); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that we overflow back to the first possible location if we overflow 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the end. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect popup_position_5(0, 0, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.width() + 1 - 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cascade_4.x() - work_area.x()), 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.height() - 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (2 * grid_size_ - work_area.y())); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect cascade_5 = 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_positioner()->GetPopupPosition(popup_position_5); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(work_area.x() + grid_size_, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.y() + grid_size_, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_position_5.width(), popup_position_5.height()), 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cascade_5); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowPositionerTest, filling) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect work_area = 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetPrimaryDisplay().work_area(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect popup_position(0, 0, 256, 128); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Leave space on the left and the right and see if we fill top to bottom. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->SetBounds(gfx::Rect(work_area.x() + popup_position.width(), 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.y(), 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.width() - 2 * popup_position.width(), 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.height())); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->Show(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that we are positioned in the top left corner. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect top_left = window_positioner()->GetPopupPosition(popup_position); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(work_area.x(), work_area.y(), 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_position.width(), popup_position.height()), 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_left); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now block the found location. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup()->SetBounds(top_left); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup()->Show(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect mid_left = window_positioner()->GetPopupPosition(popup_position); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(work_area.x(), 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AlignToGridRoundDown( 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.y() + top_left.height(), grid_size_), 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_position.width(), popup_position.height()), 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mid_left); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Block now everything so that we can only put the popup on the bottom 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of the left side. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: We need to keep one "grid spacing free" if the window does not 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // fit into the grid (which is true for 200 height).` 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup()->SetBounds(gfx::Rect(work_area.x(), work_area.y(), 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_position.width(), 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.height() - popup_position.height() - 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) grid_size_ + 1)); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bottom_left = window_positioner()->GetPopupPosition( 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_position); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(work_area.x(), 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.bottom() - popup_position.height(), 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_position.width(), popup_position.height()), 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bottom_left); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Block now enough to force the right side. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup()->SetBounds(gfx::Rect(work_area.x(), work_area.y(), 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_position.width(), 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.height() - popup_position.height() + 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1)); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect top_right = window_positioner()->GetPopupPosition( 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_position); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(AlignToGridRoundDown(work_area.right() - 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_position.width(), grid_size_), 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.y(), 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_position.width(), popup_position.height()), 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_right); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowPositionerTest, biggerThenBorder) { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect work_area = 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetPrimaryDisplay().work_area(); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect pop_position(0, 0, work_area.width(), work_area.height()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the popup is placed full screen. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect full = window_positioner()->GetPopupPosition(pop_position); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(work_area.x(), work_area.y(), 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pop_position.width(), pop_position.height()), 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) full); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 283