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 "chrome/browser/ui/window_sizer/window_sizer_common_unittest.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 "chrome/browser/ui/browser.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/render_view_test.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/activation_client.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_windows.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef ash::test::AshTestBase WindowSizerTest;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A browser window proxy which is able to associate an aura native window with
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestBrowserWindowAura : public TestBrowserWindow {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |native_window| will still be owned by the caller after the constructor
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // was called.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestBrowserWindowAura(aura::Window* native_window);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestBrowserWindowAura();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TestBrowserWindow overrides:
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Show() OVERRIDE;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Activate() OVERRIDE;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::NativeWindow GetNativeWindow() OVERRIDE;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Rect GetBounds() const OVERRIDE;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The |native_window_| is still owned by the creator of this class.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* native_window_;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestBrowserWindowAura);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestBrowserWindowAura::TestBrowserWindowAura(aura::Window *native_window)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : native_window_(native_window) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestBrowserWindowAura::~TestBrowserWindowAura() {}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestBrowserWindowAura::Show() {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  native_window_->Show();
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Activate();
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestBrowserWindowAura::Activate() {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetActivationClient(
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      native_window_->GetRootWindow())->ActivateWindow(native_window_);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow TestBrowserWindowAura::GetNativeWindow() {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return native_window_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect TestBrowserWindowAura::GetBounds() const {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_window_->bounds();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlignToGridRoundDown(int location, int grid_size) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (grid_size <= 1 || location % grid_size == 0)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return location;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return location / grid_size * grid_size;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace
80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the window is sized appropriately for the first run experience
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// where the default window bounds calculation is invoked.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowSizerTest, DefaultSizeCase) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int grid = WindowSizer::kDesktopBorderSize;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // 4:3 monitor case, 1024x768, no taskbar
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, gfx::Rect(), gfx::Rect(),
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), DEFAULT, NULL, gfx::Rect(), &window_bounds);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect(WindowSizer::kDesktopBorderSize,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WindowSizer::kDesktopBorderSize,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        1024 - WindowSizer::kDesktopBorderSize * 2,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        768 - WindowSizer::kDesktopBorderSize),
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // 4:3 monitor case, 1024x768, taskbar on bottom
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, taskbar_bottom_work_area, gfx::Rect(),
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), gfx::Rect(), DEFAULT, NULL, gfx::Rect(),
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &window_bounds);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect(WindowSizer::kDesktopBorderSize,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WindowSizer::kDesktopBorderSize,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        1024 - WindowSizer::kDesktopBorderSize * 2,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        AlignToGridRoundDown(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            taskbar_bottom_work_area.height() -
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            WindowSizer::kDesktopBorderSize, grid)),
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        window_bounds);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // 4:3 monitor case, 1024x768, taskbar on right
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, taskbar_right_work_area, gfx::Rect(),
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), gfx::Rect(), DEFAULT, NULL, gfx::Rect(),
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &window_bounds);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect(WindowSizer::kDesktopBorderSize,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WindowSizer::kDesktopBorderSize,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        AlignToGridRoundDown(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            taskbar_right_work_area.width() -
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            WindowSizer::kDesktopBorderSize * 2, grid),
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        768 - WindowSizer::kDesktopBorderSize),
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // 4:3 monitor case, 1024x768, taskbar on left
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, taskbar_left_work_area, gfx::Rect(),
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), gfx::Rect(), DEFAULT, NULL, gfx::Rect(),
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &window_bounds);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect(taskbar_left_work_area.x() +
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          WindowSizer::kDesktopBorderSize,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WindowSizer::kDesktopBorderSize,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        AlignToGridRoundDown(
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            taskbar_left_work_area.width() -
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WindowSizer::kDesktopBorderSize * 2, grid),
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            AlignToGridRoundDown(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            taskbar_left_work_area.height() -
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            WindowSizer::kDesktopBorderSize, grid)),
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // 4:3 monitor case, 1024x768, taskbar on top
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, taskbar_top_work_area, gfx::Rect(),
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), gfx::Rect(), DEFAULT, NULL, gfx::Rect(),
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &window_bounds);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect(WindowSizer::kDesktopBorderSize,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        taskbar_top_work_area.y() +
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          WindowSizer::kDesktopBorderSize,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        1024 - WindowSizer::kDesktopBorderSize * 2,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        AlignToGridRoundDown(
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            taskbar_top_work_area.height() -
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            WindowSizer::kDesktopBorderSize, grid)),
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // 4:3 monitor case, 1280x1024
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1280x1024, p1280x1024, gfx::Rect(), gfx::Rect(),
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), DEFAULT, NULL, gfx::Rect(), &window_bounds);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect((1280 - WindowSizer::kMaximumWindowWidth) / 2,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WindowSizer::kDesktopBorderSize,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WindowSizer::kMaximumWindowWidth,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        1024 - WindowSizer::kDesktopBorderSize),
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // 4:3 monitor case, 1600x1200
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1600x1200, p1600x1200, gfx::Rect(), gfx::Rect(),
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), DEFAULT, NULL, gfx::Rect(), &window_bounds);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect((1600 - WindowSizer::kMaximumWindowWidth) / 2,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WindowSizer::kDesktopBorderSize,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WindowSizer::kMaximumWindowWidth,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        1200 - WindowSizer::kDesktopBorderSize),
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // 16:10 monitor case, 1680x1050
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1680x1050, p1680x1050, gfx::Rect(), gfx::Rect(),
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), DEFAULT, NULL, gfx::Rect(), &window_bounds);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect((1680 - WindowSizer::kMaximumWindowWidth) / 2,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WindowSizer::kDesktopBorderSize,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WindowSizer::kMaximumWindowWidth,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        AlignToGridRoundDown(
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            1050 - WindowSizer::kDesktopBorderSize,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            grid)),
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // 16:10 monitor case, 1920x1200
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1920x1200, p1920x1200, gfx::Rect(), gfx::Rect(),
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), DEFAULT, NULL, gfx::Rect(), &window_bounds);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect((1920 - WindowSizer::kMaximumWindowWidth) / 2,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WindowSizer::kDesktopBorderSize,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WindowSizer::kMaximumWindowWidth,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        1200 - WindowSizer::kDesktopBorderSize),
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the next opened window is positioned appropriately given the
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bounds of an existing window of the same type.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowSizerTest, LastWindowBoundsCase) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // normal, in the middle of the screen somewhere.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, gfx::Rect(),
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(WindowSizer::kDesktopBorderSize,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              WindowSizer::kDesktopBorderSize, 500, 400),
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), LAST_ACTIVE, NULL, gfx::Rect(),
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &window_bounds);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect(kWindowTilePixels + WindowSizer::kDesktopBorderSize,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        kWindowTilePixels + WindowSizer::kDesktopBorderSize,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        500, 400).ToString(),
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds.ToString());
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // taskbar on top.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, taskbar_top_work_area, gfx::Rect(),
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(WindowSizer::kDesktopBorderSize,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              WindowSizer::kDesktopBorderSize, 500, 400),
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), LAST_ACTIVE, NULL, gfx::Rect(),
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &window_bounds);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect(kWindowTilePixels + WindowSizer::kDesktopBorderSize,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        std::max(kWindowTilePixels +
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 WindowSizer::kDesktopBorderSize,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 34 /* toolbar height */),
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        500, 400).ToString(), window_bounds.ToString());
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Too small to satisify the minimum visibility condition.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, gfx::Rect(),
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(WindowSizer::kDesktopBorderSize,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              WindowSizer::kDesktopBorderSize, 29, 29),
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), LAST_ACTIVE, NULL, gfx::Rect(),
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &window_bounds);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect(kWindowTilePixels + WindowSizer::kDesktopBorderSize,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        kWindowTilePixels + WindowSizer::kDesktopBorderSize,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        30 /* not 29 */,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        30 /* not 29 */).ToString(),
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds.ToString());
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Normal.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, gfx::Rect(),
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(WindowSizer::kDesktopBorderSize,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              WindowSizer::kDesktopBorderSize, 500, 400),
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), LAST_ACTIVE, NULL, gfx::Rect(),
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &window_bounds);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect(kWindowTilePixels + WindowSizer::kDesktopBorderSize,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        kWindowTilePixels + WindowSizer::kDesktopBorderSize,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        500, 400).ToString(),
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds.ToString());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the window opened is sized appropriately given persisted sizes.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowSizerTest, PersistedBoundsCase) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // normal, in the middle of the screen somewhere.
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect initial_bounds(WindowSizer::kDesktopBorderSize,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             WindowSizer::kDesktopBorderSize, 500, 400);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, gfx::Rect(), initial_bounds,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), PERSISTED, NULL, gfx::Rect(), &window_bounds);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(initial_bounds.ToString(), window_bounds.ToString());
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Normal.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect initial_bounds(0, 0, 1024, 768);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, gfx::Rect(), initial_bounds,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), PERSISTED, NULL, gfx::Rect(), &window_bounds);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(initial_bounds.ToString(), window_bounds.ToString());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // normal, on non-primary monitor in negative coords.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect initial_bounds(-600, 10, 500, 400);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, left_s1024x768,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    initial_bounds, gfx::Rect(), PERSISTED, NULL, gfx::Rect(),
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &window_bounds);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(initial_bounds.ToString(), window_bounds.ToString());
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // normal, on non-primary monitor in negative coords.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect initial_bounds(-1024, 0, 1024, 768);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, left_s1024x768,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    initial_bounds, gfx::Rect(), PERSISTED, NULL, gfx::Rect(),
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &window_bounds);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(initial_bounds.ToString(), window_bounds.ToString());
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Non-primary monitor resoultion has changed, but the monitor still
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // completely contains the window.
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect initial_bounds(1074, 50, 600, 500);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, gfx::Rect(1024, 0, 800, 600),
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    initial_bounds, right_s1024x768, PERSISTED, NULL,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), &window_bounds);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(initial_bounds.ToString(), window_bounds.ToString());
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Non-primary monitor resoultion has changed, and the window is partially
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // off-screen.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect initial_bounds(1274, 50, 600, 500);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, gfx::Rect(1024, 0, 800, 600),
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    initial_bounds, right_s1024x768, PERSISTED,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    NULL, gfx::Rect(), &window_bounds);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("1224,50 600x500", window_bounds.ToString());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Non-primary monitor resoultion has changed, and the window is now too
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // large for the monitor.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect initial_bounds(1274, 50, 900, 700);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, gfx::Rect(1024, 0, 800, 600),
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    initial_bounds, right_s1024x768, PERSISTED,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    NULL, gfx::Rect(), &window_bounds);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("1024,0 800x600", window_bounds.ToString());
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // width and height too small
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, gfx::Rect(),
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(WindowSizer::kDesktopBorderSize,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              WindowSizer::kDesktopBorderSize, 29, 29),
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), PERSISTED, NULL, gfx::Rect(), &window_bounds);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect(WindowSizer::kDesktopBorderSize,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WindowSizer::kDesktopBorderSize,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        30 /* not 29 */, 30 /* not 29 */).ToString(),
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds.ToString());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following unittests have different results on Mac/non-Mac because we
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reposition windows aggressively on Mac.  The *WithAggressiveReposition tests
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are run on Mac, and the *WithNonAggressiveRepositioning tests are run on
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// other platforms.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowSizerTest, LastWindowOffscreenWithNonAggressiveRepositioning) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // taskbar on left.
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, taskbar_left_work_area, gfx::Rect(),
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(WindowSizer::kDesktopBorderSize,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              WindowSizer::kDesktopBorderSize, 500, 400),
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), LAST_ACTIVE, NULL, gfx::Rect(),
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &window_bounds);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect(kWindowTilePixels + WindowSizer::kDesktopBorderSize,
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        kWindowTilePixels + WindowSizer::kDesktopBorderSize,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        500, 400).ToString(),
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds.ToString());
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // offset would put the new window offscreen at the bottom but the minimum
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // visibility condition is barely satisfied without relocation.
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, gfx::Rect(),
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(10, 728, 500, 400), gfx::Rect(), LAST_ACTIVE,
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    NULL, gfx::Rect(), &window_bounds);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect(10 + kWindowTilePixels, 738, 500, 400).ToString(),
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds.ToString());
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // offset would put the new window offscreen at the bottom and the minimum
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // visibility condition is satisified by relocation.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, gfx::Rect(),
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(10, 729, 500, 400), gfx::Rect(), LAST_ACTIVE,
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    NULL, gfx::Rect(), &window_bounds);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect(10 + kWindowTilePixels,
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        738 /* not 739 */,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        500,
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        400).ToString(),
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds.ToString());
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // offset would put the new window offscreen at the right but the minimum
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // visibility condition is barely satisfied without relocation.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, gfx::Rect(),
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(984, 10, 500, 400), gfx::Rect(), LAST_ACTIVE,
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    NULL, gfx::Rect(), &window_bounds);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect(994, 10 + kWindowTilePixels, 500, 400).ToString(),
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds.ToString());
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // offset would put the new window offscreen at the right and the minimum
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // visibility condition is satisified by relocation.
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, gfx::Rect(),
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(985, 10, 500, 400), gfx::Rect(), LAST_ACTIVE,
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    NULL, gfx::Rect(), &window_bounds);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect(994 /* not 995 */,
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        10 + kWindowTilePixels,
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        500,
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        400).ToString(),
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds.ToString());
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // offset would put the new window offscreen at the bottom right and the
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // minimum visibility condition is satisified by relocation.
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1024x768, p1024x768, gfx::Rect(),
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(985, 729, 500, 400), gfx::Rect(), LAST_ACTIVE,
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    NULL, gfx::Rect(), &window_bounds);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Rect(994 /* not 995 */,
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        738 /* not 739 */,
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        500,
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        400).ToString(),
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds.ToString());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the placement of newly created windows.
433a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(WindowSizerTest, PlaceNewWindows) {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a dummy window.
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(0));
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->SetBounds(gfx::Rect(16, 32, 640, 320));
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> popup(CreateTestWindowInShellWithId(1));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup->SetBounds(gfx::Rect(16, 32, 128, 256));
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> panel(CreateTestWindowInShellWithId(2));
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  panel->SetBounds(gfx::Rect(32, 48, 256, 512));
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a browser which we can use to pass into the GetWindowBounds
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // function.
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile(new TestingProfile());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creating a popup handler here to make sure it does not interfere with the
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // existing windows.
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams native_params(profile.get(),
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      chrome::HOST_DESKTOP_TYPE_ASH);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> browser(
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::CreateBrowserWithTestWindowForParams(&native_params));
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creating a popup handler here to make sure it does not interfere with the
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // existing windows.
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BrowserWindow> browser_window(
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new TestBrowserWindowAura(window.get()));
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams window_params(profile.get(),
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      chrome::HOST_DESKTOP_TYPE_ASH);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_params.window = browser_window.get();
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> window_owning_browser(new Browser(window_params));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creating a popup to make sure it does not interfere with the positioning.
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BrowserWindow> browser_popup(
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new TestBrowserWindowAura(popup.get()));
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams popup_params(Browser::TYPE_POPUP, profile.get(),
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     chrome::HOST_DESKTOP_TYPE_ASH);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_params.window = browser_popup.get();
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> popup_owning_browser(new Browser(popup_params));
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creating a panel to make sure it does not interfere with the positioning.
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BrowserWindow> browser_panel(
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new TestBrowserWindowAura(panel.get()));
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams panel_params(Browser::TYPE_POPUP, profile.get(),
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     chrome::HOST_DESKTOP_TYPE_ASH);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  panel_params.window = browser_panel.get();
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> panel_owning_browser(new Browser(panel_params));
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->Show();
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // With a shown window it's size should get returned.
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1600x1200, p1600x1200, gfx::Rect(),
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    gfx::Rect(50, 100, 300, 150), bottom_s1600x1200,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    PERSISTED, browser.get(), gfx::Rect(), &window_bounds);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The position should be right flush.
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ("960,32 640x320", window_bounds.ToString());
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // With the window shown - but more on the right side then on the left
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // side (and partially out of the screen), it should default to the other
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // side and inside the screen.
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window->SetBounds(gfx::Rect(1000, 600, 640, 320));
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1600x1200, p1600x1200, gfx::Rect(),
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    gfx::Rect(50, 100, 300, 150), bottom_s1600x1200,
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    PERSISTED, browser.get(), gfx::Rect(), &window_bounds);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The position should be left & bottom flush.
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ("0,600 640x320", window_bounds.ToString());
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // If the second windows right side is already over the right side of the
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // screen, it will not move back into the screen.
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window->SetBounds(gfx::Rect(1000, 600, 640, 320));
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1600x1200, p1600x1200, gfx::Rect(),
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    gfx::Rect(50, 100, 300, 150), bottom_s1600x1200,
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    PERSISTED, browser.get(), gfx::Rect(), &window_bounds);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The position should be left & bottom flush.
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ("0,600 640x320", window_bounds.ToString());
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the other window was already beyond the point to get right flush
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // it will remain where it is.
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("1000,600 640x320", window->bounds().ToString());
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Make sure that popups do not get changed.
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1600x1200, p1600x1200, gfx::Rect(),
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    gfx::Rect(50, 100, 300, 150), bottom_s1600x1200,
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    PERSISTED, popup_owning_browser.get(),
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    gfx::Rect(), &window_bounds);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("50,100 300x150", window_bounds.ToString());
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->Hide();
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // If a window is there but not shown the persisted default should be used.
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1600x1200, p1600x1200, gfx::Rect(),
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    gfx::Rect(50, 100, 300, 150), bottom_s1600x1200,
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    PERSISTED, browser.get(), gfx::Rect(), &window_bounds);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("50,100 300x150", window_bounds.ToString());
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // If a window is there but not shown the default should be returned.
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect window_bounds;
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1600x1200, p1600x1200, gfx::Rect(),
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    gfx::Rect(), bottom_s1600x1200,
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    DEFAULT, browser.get(), gfx::Rect(), &window_bounds);
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Note: We need to also take the defaults maximum width into account here
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // since that might get used if the resolution is too big.
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(gfx::Rect(std::max(WindowSizer::kDesktopBorderSize,
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 (1600 - WindowSizer::kMaximumWindowWidth) / 2),
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WindowSizer::kDesktopBorderSize,
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        std::min(WindowSizer::kMaximumWindowWidth,
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 1600 - 2 * WindowSizer::kDesktopBorderSize),
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        1200 - WindowSizer::kDesktopBorderSize).ToString(),
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window_bounds.ToString());
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test the placement of newly created windows on an empty desktop.
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test supplements "PlaceNewWindows" by testing the creation of a newly
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// created browser window on an empty desktop.
553a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(WindowSizerTest, PlaceNewBrowserWindowOnEmptyDesktop) {
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Create a browser which we can use to pass into the GetWindowBounds
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // function.
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<TestingProfile> profile(new TestingProfile());
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Browser::CreateParams native_params(profile.get(),
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      chrome::HOST_DESKTOP_TYPE_ASH);
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<Browser> browser(
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      chrome::CreateBrowserWithTestWindowForParams(&native_params));
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
562ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // A common screen size for Chrome OS devices where this behavior is
563ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // desirable.
564ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const gfx::Rect p1366x768(0, 0, 1366, 768);
565ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If there is no previous state the window should get maximized if the
567ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // screen is less than or equal to our limit (1366 pixels width).
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect window_bounds;
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui::WindowShowState out_show_state1 = ui::SHOW_STATE_DEFAULT;
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetWindowBoundsAndShowState(
571ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      p1366x768,                    // The screen resolution.
572ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      p1366x768,                    // The monitor work area.
573ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      gfx::Rect(),                  // The second monitor.
574ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      gfx::Rect(),                  // The (persisted) bounds.
575ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      p1366x768,                    // The overall work area.
576ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ui::SHOW_STATE_NORMAL,        // The persisted show state.
577ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ui::SHOW_STATE_DEFAULT,       // The last show state.
578ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      DEFAULT,                      // No persisted values.
579ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      browser.get(),                // Use this browser.
580ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      gfx::Rect(),                  // Don't request valid bounds.
581ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      &window_bounds,
582ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      &out_show_state1);
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(ui::SHOW_STATE_MAXIMIZED, out_show_state1);
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If there is a stored coordinate however, that should be taken instead.
586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui::WindowShowState out_show_state2 = ui::SHOW_STATE_DEFAULT;
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetWindowBoundsAndShowState(
588ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      p1366x768,                    // The screen resolution.
589ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      p1366x768,                    // The monitor work area.
590ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      gfx::Rect(),                  // The second monitor.
591ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      gfx::Rect(50, 100, 300, 150), // The (persisted) bounds.
592ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      p1366x768,                    // The overall work area.
593ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ui::SHOW_STATE_NORMAL,        // The persisted show state.
594ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ui::SHOW_STATE_DEFAULT,       // The last show state.
595ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      PERSISTED,                    // Set the persisted values.
596ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      browser.get(),                // Use this browser.
597ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      gfx::Rect(),                  // Don't request valid bounds.
598ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      &window_bounds,
599ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      &out_show_state2);
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(ui::SHOW_STATE_NORMAL, out_show_state2);
601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("50,100 300x150", window_bounds.ToString());
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
603ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // A larger monitor should not trigger auto-maximize.
604ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ui::WindowShowState out_show_state3 = ui::SHOW_STATE_DEFAULT;
605ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  GetWindowBoundsAndShowState(
606ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      p1600x1200,                   // The screen resolution.
607ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      p1600x1200,                   // The monitor work area.
608ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      gfx::Rect(),                  // The second monitor.
609ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      gfx::Rect(),                  // The (persisted) bounds.
610ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      p1600x1200,                   // The overall work area.
611ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ui::SHOW_STATE_NORMAL,        // The persisted show state.
612ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ui::SHOW_STATE_DEFAULT,       // The last show state.
613ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      DEFAULT,                      // No persisted values.
614ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      browser.get(),                // Use this browser.
615ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      gfx::Rect(),                  // Don't request valid bounds.
616ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      &window_bounds,
617ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      &out_show_state3);
618ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(ui::SHOW_STATE_DEFAULT, out_show_state3);
619ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_PlaceNewWindowsOnMultipleDisplays PlaceNewWindowsOnMultipleDisplays
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// No multiple displays on windows ash.
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_PlaceNewWindowsOnMultipleDisplays DISABLED_PlaceNewWindowsOnMultipleDisplays
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test the placement of newly created windows on multiple dislays.
629a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(WindowSizerTest, MAYBE_PlaceNewWindowsOnMultipleDisplays) {
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("1600x1200,1600x1200");
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Rect secondary(1600, 0, 1600, 1200);
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::Shell::GetInstance()->set_active_root_window(
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::Shell::GetPrimaryRootWindow());
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TestingProfile> profile(new TestingProfile());
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create browser windows that are used as reference.
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(0));
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window->SetBounds(gfx::Rect(10, 10, 200, 200));
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<BrowserWindow> browser_window(
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new TestBrowserWindowAura(window.get()));
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams window_params(profile.get(),
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      chrome::HOST_DESKTOP_TYPE_ASH);
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_params.window = browser_window.get();
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Browser> window_owning_browser(new Browser(window_params));
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_window->Show();
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(window->GetRootWindow(), ash::Shell::GetActiveRootWindow());
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> another_window(CreateTestWindowInShellWithId(1));
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  another_window->SetBounds(gfx::Rect(1600 - 200, 10, 300, 300));
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<BrowserWindow> another_browser_window(
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new TestBrowserWindowAura(another_window.get()));
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams another_window_params(profile.get(),
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              chrome::HOST_DESKTOP_TYPE_ASH);
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  another_window_params.window = another_browser_window.get();
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Browser> another_window_owning_browser(
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new Browser(another_window_params));
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  another_browser_window->Show();
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creating a new window to verify the new placement.
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> new_window(CreateTestWindowInShellWithId(0));
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<BrowserWindow> new_browser_window(
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new TestBrowserWindowAura(new_window.get()));
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams new_window_params(profile.get(),
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          chrome::HOST_DESKTOP_TYPE_ASH);
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new_window_params.window = new_browser_window.get();
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Browser> new_browser(new Browser(new_window_params));
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the primary root is active.
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(ash::Shell::GetPrimaryRootWindow(),
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ash::Shell::GetActiveRootWindow());
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // First new window should be in the primary.
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect window_bounds;
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1600x1200, p1600x1200, secondary,
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    gfx::Rect(), secondary,
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    PERSISTED, new_browser.get(), gfx::Rect(), &window_bounds);
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ("0,10 300x300", window_bounds.ToString());
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move the window to the right side of the secondary display and create a new
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // window. It should be opened then on the left side on the secondary display.
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Display second_display = gfx::Screen::GetScreenFor(window.get())->
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetDisplayNearestPoint(gfx::Point(1600 + 100,10));
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window->SetBoundsInScreen(
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       gfx::Rect(secondary.CenterPoint().x() + 300, 10, 200, 200),
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        second_display);
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    browser_window->Activate();
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(ash::Shell::GetPrimaryRootWindow(),
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              ash::Shell::GetActiveRootWindow());
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect window_bounds;
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1600x1200, p1600x1200, secondary,
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    gfx::Rect(), secondary,
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    PERSISTED, new_browser.get(), gfx::Rect(), &window_bounds);
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ("1600,10 200x200", window_bounds.ToString());
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Activate another window in the primary display and create a new window.
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // It should be created in the primary display.
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    another_browser_window->Activate();
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ash::Shell::GetPrimaryRootWindow(),
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              ash::Shell::GetActiveRootWindow());
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect window_bounds;
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBounds(p1600x1200, p1600x1200, secondary,
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    gfx::Rect(), secondary,
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    PERSISTED, new_browser.get(), gfx::Rect(), &window_bounds);
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ("0,10 300x300", window_bounds.ToString());
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the show state is properly returned for non default cases.
718a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(WindowSizerTest, TestShowState) {
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creating a browser & window to play with.
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(0));
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->SetBounds(gfx::Rect(16, 32, 640, 320));
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile(new TestingProfile());
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BrowserWindow> browser_window(
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new TestBrowserWindowAura(window.get()));
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams window_params(Browser::TYPE_TABBED, profile.get(),
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      chrome::HOST_DESKTOP_TYPE_ASH);
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_params.window = browser_window.get();
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> browser(new Browser(window_params));
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create also a popup browser since that behaves different.
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> popup(CreateTestWindowInShellWithId(1));
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup->SetBounds(gfx::Rect(16, 32, 128, 256));
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BrowserWindow> browser_popup(
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new TestBrowserWindowAura(popup.get()));
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams popup_params(Browser::TYPE_POPUP, profile.get(),
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     chrome::HOST_DESKTOP_TYPE_ASH);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_params.window = browser_window.get();
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> popup_browser(new Browser(popup_params));
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tabbed windows should retrieve the saved window state - since there is a
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // top window.
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::SHOW_STATE_MAXIMIZED,
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetWindowShowState(ui::SHOW_STATE_MAXIMIZED,
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::SHOW_STATE_NORMAL,
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BOTH,
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               browser.get(),
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               p1600x1200));
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::SHOW_STATE_DEFAULT,
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetWindowShowState(ui::SHOW_STATE_DEFAULT,
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::SHOW_STATE_NORMAL,
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BOTH,
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               browser.get(),
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               p1600x1200));
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Non tabbed windows should always follow the window saved visibility state.
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::SHOW_STATE_MAXIMIZED,
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetWindowShowState(ui::SHOW_STATE_MAXIMIZED,
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::SHOW_STATE_NORMAL,
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BOTH,
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               popup_browser.get(),
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               p1600x1200));
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The non tabbed window will take the status of the last active of its kind.
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::SHOW_STATE_NORMAL,
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetWindowShowState(ui::SHOW_STATE_DEFAULT,
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::SHOW_STATE_NORMAL,
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BOTH,
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               popup_browser.get(),
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               p1600x1200));
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now create a top level window and check again for both. Only the tabbed
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // window should follow the top level window's state.
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creating a browser & window to play with.
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> window2(CreateTestWindowInShellWithId(0));
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->SetBounds(gfx::Rect(16, 32, 640, 320));
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BrowserWindow> browser_window2(
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new TestBrowserWindowAura(window2.get()));
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams window2_params(Browser::TYPE_TABBED, profile.get(),
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       chrome::HOST_DESKTOP_TYPE_ASH);
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window2_params.window = browser_window2.get();
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> browser2(new Browser(window2_params));
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A tabbed window should now take the top level window state.
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::SHOW_STATE_DEFAULT,
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetWindowShowState(ui::SHOW_STATE_MAXIMIZED,
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::SHOW_STATE_DEFAULT,
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BOTH,
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               browser2.get(),
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               p1600x1200));
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Non tabbed windows should always follow the window saved visibility state.
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::SHOW_STATE_MAXIMIZED,
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetWindowShowState(ui::SHOW_STATE_MAXIMIZED,
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::SHOW_STATE_MINIMIZED,
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BOTH,
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               popup_browser.get(),
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               p1600x1200));
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In smaller screen resolutions we default to maximized if there is no other
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // window visible.
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int min_size = WindowSizer::GetForceMaximizedWidthLimit() / 2;
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (min_size > 0) {
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Rect tiny_screen(0, 0, min_size, min_size);
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ui::SHOW_STATE_DEFAULT,
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GetWindowShowState(ui::SHOW_STATE_MAXIMIZED,
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 ui::SHOW_STATE_DEFAULT,
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 BOTH,
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 browser2.get(),
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 tiny_screen));
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window->Hide();
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ui::SHOW_STATE_MAXIMIZED,
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GetWindowShowState(ui::SHOW_STATE_MAXIMIZED,
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 ui::SHOW_STATE_DEFAULT,
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 BOTH,
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 browser2.get(),
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 tiny_screen));
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the default show state override behavior is properly handled.
823a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(WindowSizerTest, TestShowStateDefaults) {
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creating a browser & window to play with.
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(0));
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->SetBounds(gfx::Rect(16, 32, 640, 320));
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile(new TestingProfile());
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BrowserWindow> browser_window(
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new TestBrowserWindowAura(window.get()));
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams window_params(Browser::TYPE_TABBED, profile.get(),
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      chrome::HOST_DESKTOP_TYPE_ASH);
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_params.window = browser_window.get();
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> browser(new Browser(window_params));
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create also a popup browser since that behaves slightly different for
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // defaults.
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> popup(CreateTestWindowInShellWithId(1));
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup->SetBounds(gfx::Rect(16, 32, 128, 256));
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BrowserWindow> browser_popup(
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new TestBrowserWindowAura(popup.get()));
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams popup_params(Browser::TYPE_POPUP, profile.get(),
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     chrome::HOST_DESKTOP_TYPE_ASH);
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_params.window = browser_window.get();
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> popup_browser(new Browser(popup_params));
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that a browser creation state always get used if not given as
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SHOW_STATE_DEFAULT.
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetWindowShowState(ui::SHOW_STATE_MAXIMIZED,
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::SHOW_STATE_MAXIMIZED,
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               DEFAULT,
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               browser.get(),
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               p1600x1200), ui::SHOW_STATE_DEFAULT);
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser->set_initial_show_state(ui::SHOW_STATE_MINIMIZED);
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetWindowShowState(ui::SHOW_STATE_MAXIMIZED,
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::SHOW_STATE_MAXIMIZED,
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BOTH,
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               browser.get(),
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               p1600x1200), ui::SHOW_STATE_MINIMIZED);
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser->set_initial_show_state(ui::SHOW_STATE_NORMAL);
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetWindowShowState(ui::SHOW_STATE_MAXIMIZED,
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::SHOW_STATE_MAXIMIZED,
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BOTH,
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               browser.get(),
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               p1600x1200), ui::SHOW_STATE_NORMAL);
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser->set_initial_show_state(ui::SHOW_STATE_MAXIMIZED);
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetWindowShowState(ui::SHOW_STATE_NORMAL,
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::SHOW_STATE_NORMAL,
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BOTH,
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               browser.get(),
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               p1600x1200), ui::SHOW_STATE_MAXIMIZED);
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that setting the maximized command line option is forcing the
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // maximized state.
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitch(switches::kStartMaximized);
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser->set_initial_show_state(ui::SHOW_STATE_NORMAL);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetWindowShowState(ui::SHOW_STATE_NORMAL,
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::SHOW_STATE_NORMAL,
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BOTH,
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               browser.get(),
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               p1600x1200), ui::SHOW_STATE_MAXIMIZED);
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The popup should favor the initial show state over the command line.
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetWindowShowState(ui::SHOW_STATE_NORMAL,
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::SHOW_STATE_NORMAL,
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BOTH,
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               popup_browser.get(),
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               p1600x1200), ui::SHOW_STATE_NORMAL);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
893