15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 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)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/screen_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/root_window_controller.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef test::AshTestBase ScreenUtilTest;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ScreenUtilTest, Bounds) {
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("600x600,500x500");
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager()->
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetAutoHideBehavior(ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* primary = views::Widget::CreateWindowWithContextAndBounds(
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL, CurrentContext(), gfx::Rect(10, 10, 100, 100));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  primary->Show();
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* secondary = views::Widget::CreateWindowWithContextAndBounds(
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL, CurrentContext(), gfx::Rect(610, 10, 100, 100));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  secondary->Show();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maximized bounds
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 600x597",
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ScreenUtil::GetMaximizedWindowBoundsInParent(
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                primary->GetNativeView()).ToString());
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("0,0 500x453",
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ScreenUtil::GetMaximizedWindowBoundsInParent(
45b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                secondary->GetNativeView()).ToString());
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Display bounds
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 600x600",
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ScreenUtil::GetDisplayBoundsInParent(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                primary->GetNativeView()).ToString());
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500",
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ScreenUtil::GetDisplayBoundsInParent(
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                secondary->GetNativeView()).ToString());
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Work area bounds
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 600x597",
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ScreenUtil::GetDisplayWorkAreaBoundsInParent(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                primary->GetNativeView()).ToString());
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("0,0 500x453",
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ScreenUtil::GetDisplayWorkAreaBoundsInParent(
61b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                secondary->GetNativeView()).ToString());
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test verifies a stable handling of secondary screen widget changes
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// (crbug.com/226132).
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ScreenUtilTest, StabilityTest) {
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("600x600,500x500");
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  views::Widget* secondary = views::Widget::CreateWindowWithContextAndBounds(
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NULL, CurrentContext(), gfx::Rect(610, 10, 100, 100));
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(Shell::GetAllRootWindows()[1],
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      secondary->GetNativeView()->GetRootWindow());
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  secondary->Show();
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  secondary->Maximize();
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  secondary->Show();
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  secondary->SetFullscreen(true);
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  secondary->Hide();
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  secondary->Close();
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ScreenUtilTest, ConvertRect) {
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("600x600,500x500");
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* primary = views::Widget::CreateWindowWithContextAndBounds(
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL, CurrentContext(), gfx::Rect(10, 10, 100, 100));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  primary->Show();
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* secondary = views::Widget::CreateWindowWithContextAndBounds(
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL, CurrentContext(), gfx::Rect(610, 10, 100, 100));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  secondary->Show();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "0,0 100x100",
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScreenUtil::ConvertRectFromScreen(
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          primary->GetNativeView(), gfx::Rect(10, 10, 100, 100)).ToString());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "10,10 100x100",
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScreenUtil::ConvertRectFromScreen(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          secondary->GetNativeView(), gfx::Rect(620, 20, 100, 100)).ToString());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "40,40 100x100",
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScreenUtil::ConvertRectToScreen(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          primary->GetNativeView(), gfx::Rect(30, 30, 100, 100)).ToString());
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "650,50 100x100",
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScreenUtil::ConvertRectToScreen(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          secondary->GetNativeView(), gfx::Rect(40, 40, 100, 100)).ToString());
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace test
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
117