1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ash/screen_util.h"
6
7#include "ash/root_window_controller.h"
8#include "ash/shelf/shelf_layout_manager.h"
9#include "ash/shelf/shelf_widget.h"
10#include "ash/shell.h"
11#include "ash/test/ash_test_base.h"
12#include "ash/wm/window_util.h"
13#include "ui/aura/env.h"
14#include "ui/aura/window.h"
15#include "ui/aura/window_event_dispatcher.h"
16#include "ui/views/widget/widget.h"
17#include "ui/views/widget/widget_delegate.h"
18
19namespace ash {
20namespace test {
21
22typedef test::AshTestBase ScreenUtilTest;
23
24TEST_F(ScreenUtilTest, Bounds) {
25  if (!SupportsMultipleDisplays())
26    return;
27
28  UpdateDisplay("600x600,500x500");
29  Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager()->
30      SetAutoHideBehavior(ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
31
32  views::Widget* primary = views::Widget::CreateWindowWithContextAndBounds(
33      NULL, CurrentContext(), gfx::Rect(10, 10, 100, 100));
34  primary->Show();
35  views::Widget* secondary = views::Widget::CreateWindowWithContextAndBounds(
36      NULL, CurrentContext(), gfx::Rect(610, 10, 100, 100));
37  secondary->Show();
38
39  // Maximized bounds
40  EXPECT_EQ("0,0 600x597",
41            ScreenUtil::GetMaximizedWindowBoundsInParent(
42                primary->GetNativeView()).ToString());
43  EXPECT_EQ("0,0 500x453",
44            ScreenUtil::GetMaximizedWindowBoundsInParent(
45                secondary->GetNativeView()).ToString());
46
47  // Display bounds
48  EXPECT_EQ("0,0 600x600",
49            ScreenUtil::GetDisplayBoundsInParent(
50                primary->GetNativeView()).ToString());
51  EXPECT_EQ("0,0 500x500",
52            ScreenUtil::GetDisplayBoundsInParent(
53                secondary->GetNativeView()).ToString());
54
55  // Work area bounds
56  EXPECT_EQ("0,0 600x597",
57            ScreenUtil::GetDisplayWorkAreaBoundsInParent(
58                primary->GetNativeView()).ToString());
59  EXPECT_EQ("0,0 500x453",
60            ScreenUtil::GetDisplayWorkAreaBoundsInParent(
61                secondary->GetNativeView()).ToString());
62}
63
64// Test verifies a stable handling of secondary screen widget changes
65// (crbug.com/226132).
66TEST_F(ScreenUtilTest, StabilityTest) {
67  if (!SupportsMultipleDisplays())
68    return;
69
70  UpdateDisplay("600x600,500x500");
71  views::Widget* secondary = views::Widget::CreateWindowWithContextAndBounds(
72      NULL, CurrentContext(), gfx::Rect(610, 10, 100, 100));
73  EXPECT_EQ(Shell::GetAllRootWindows()[1],
74      secondary->GetNativeView()->GetRootWindow());
75  secondary->Show();
76  secondary->Maximize();
77  secondary->Show();
78  secondary->SetFullscreen(true);
79  secondary->Hide();
80  secondary->Close();
81}
82
83TEST_F(ScreenUtilTest, ConvertRect) {
84  if (!SupportsMultipleDisplays())
85    return;
86
87  UpdateDisplay("600x600,500x500");
88
89  views::Widget* primary = views::Widget::CreateWindowWithContextAndBounds(
90      NULL, CurrentContext(), gfx::Rect(10, 10, 100, 100));
91  primary->Show();
92  views::Widget* secondary = views::Widget::CreateWindowWithContextAndBounds(
93      NULL, CurrentContext(), gfx::Rect(610, 10, 100, 100));
94  secondary->Show();
95
96  EXPECT_EQ(
97      "0,0 100x100",
98      ScreenUtil::ConvertRectFromScreen(
99          primary->GetNativeView(), gfx::Rect(10, 10, 100, 100)).ToString());
100  EXPECT_EQ(
101      "10,10 100x100",
102      ScreenUtil::ConvertRectFromScreen(
103          secondary->GetNativeView(), gfx::Rect(620, 20, 100, 100)).ToString());
104
105  EXPECT_EQ(
106      "40,40 100x100",
107      ScreenUtil::ConvertRectToScreen(
108          primary->GetNativeView(), gfx::Rect(30, 30, 100, 100)).ToString());
109  EXPECT_EQ(
110      "650,50 100x100",
111      ScreenUtil::ConvertRectToScreen(
112          secondary->GetNativeView(), gfx::Rect(40, 40, 100, 100)).ToString());
113}
114
115}  // namespace test
116}  // namespace ash
117