1 // Copyright (c) 2012 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.
5 #include "ui/aura/test/test_screen.h"
7 #include "base/logging.h"
8 #include "ui/aura/env.h"
9 #include "ui/aura/window.h"
10 #include "ui/aura/window_event_dispatcher.h"
11 #include "ui/aura/window_tree_host.h"
12 #include "ui/base/ime/input_method.h"
13 #include "ui/gfx/geometry/rect_conversions.h"
14 #include "ui/gfx/geometry/size_conversions.h"
15 #include "ui/gfx/native_widget_types.h"
16 #include "ui/gfx/screen.h"
22 bool IsRotationPortrait(gfx::Display::Rotation rotation
) {
23 return rotation
== gfx::Display::ROTATE_90
||
24 rotation
== gfx::Display::ROTATE_270
;
30 TestScreen
* TestScreen::Create(const gfx::Size
& size
) {
31 const gfx::Size
kDefaultSize(800, 600);
32 // Use (0,0) because the desktop aura tests are executed in
33 // native environment where the display's origin is (0,0).
34 return new TestScreen(gfx::Rect(size
.IsEmpty() ? kDefaultSize
: size
));
38 TestScreen
* TestScreen::CreateFullscreen() {
39 return new TestScreen(gfx::Rect(WindowTreeHost::GetNativeScreenSize()));
42 TestScreen::~TestScreen() {
45 WindowTreeHost
* TestScreen::CreateHostForPrimaryDisplay() {
47 host_
= WindowTreeHost::Create(gfx::Rect(display_
.GetSizeInPixel()));
48 // Some tests don't correctly manage window focus/activation states.
49 // Makes sure InputMethod is default focused so that IME basics can work.
50 host_
->GetInputMethod()->OnFocus();
51 host_
->window()->AddObserver(this);
56 void TestScreen::SetDeviceScaleFactor(float device_scale_factor
) {
57 gfx::Rect
bounds_in_pixel(display_
.GetSizeInPixel());
58 display_
.SetScaleAndBounds(device_scale_factor
, bounds_in_pixel
);
59 host_
->OnHostResized(bounds_in_pixel
.size());
62 void TestScreen::SetDisplayRotation(gfx::Display::Rotation rotation
) {
63 gfx::Rect
bounds_in_pixel(display_
.GetSizeInPixel());
64 gfx::Rect
new_bounds(bounds_in_pixel
);
65 if (IsRotationPortrait(rotation
) != IsRotationPortrait(display_
.rotation())) {
66 new_bounds
.set_width(bounds_in_pixel
.height());
67 new_bounds
.set_height(bounds_in_pixel
.width());
69 display_
.set_rotation(rotation
);
70 display_
.SetScaleAndBounds(display_
.device_scale_factor(), new_bounds
);
71 host_
->SetRootTransform(GetRotationTransform() * GetUIScaleTransform());
74 void TestScreen::SetUIScale(float ui_scale
) {
76 gfx::Rect
bounds_in_pixel(display_
.GetSizeInPixel());
77 gfx::Rect new_bounds
= gfx::ToNearestRect(
78 gfx::ScaleRect(gfx::RectF(bounds_in_pixel
), 1.0f
/ ui_scale
));
79 display_
.SetScaleAndBounds(display_
.device_scale_factor(), new_bounds
);
80 host_
->SetRootTransform(GetRotationTransform() * GetUIScaleTransform());
83 void TestScreen::SetWorkAreaInsets(const gfx::Insets
& insets
) {
84 display_
.UpdateWorkAreaFromInsets(insets
);
87 gfx::Transform
TestScreen::GetRotationTransform() const {
88 gfx::Transform rotate
;
89 switch (display_
.rotation()) {
90 case gfx::Display::ROTATE_0
:
92 case gfx::Display::ROTATE_90
:
93 rotate
.Translate(display_
.bounds().height(), 0);
96 case gfx::Display::ROTATE_270
:
97 rotate
.Translate(0, display_
.bounds().width());
100 case gfx::Display::ROTATE_180
:
101 rotate
.Translate(display_
.bounds().width(),
102 display_
.bounds().height());
110 gfx::Transform
TestScreen::GetUIScaleTransform() const {
111 gfx::Transform ui_scale
;
112 ui_scale
.Scale(1.0f
/ ui_scale_
, 1.0f
/ ui_scale_
);
116 void TestScreen::OnWindowBoundsChanged(
117 Window
* window
, const gfx::Rect
& old_bounds
, const gfx::Rect
& new_bounds
) {
118 DCHECK_EQ(host_
->window(), window
);
119 display_
.SetSize(gfx::ToFlooredSize(
120 gfx::ScaleSize(new_bounds
.size(), display_
.device_scale_factor())));
123 void TestScreen::OnWindowDestroying(Window
* window
) {
124 if (host_
->window() == window
)
128 gfx::Point
TestScreen::GetCursorScreenPoint() {
129 return Env::GetInstance()->last_mouse_location();
132 gfx::NativeWindow
TestScreen::GetWindowUnderCursor() {
133 return GetWindowAtScreenPoint(GetCursorScreenPoint());
136 gfx::NativeWindow
TestScreen::GetWindowAtScreenPoint(const gfx::Point
& point
) {
137 return host_
->window()->GetTopWindowContainingPoint(point
);
140 int TestScreen::GetNumDisplays() const {
144 std::vector
<gfx::Display
> TestScreen::GetAllDisplays() const {
145 return std::vector
<gfx::Display
>(1, display_
);
148 gfx::Display
TestScreen::GetDisplayNearestWindow(
149 gfx::NativeWindow window
) const {
153 gfx::Display
TestScreen::GetDisplayNearestPoint(const gfx::Point
& point
) const {
157 gfx::Display
TestScreen::GetDisplayMatching(const gfx::Rect
& match_rect
) const {
161 gfx::Display
TestScreen::GetPrimaryDisplay() const {
165 void TestScreen::AddObserver(gfx::DisplayObserver
* observer
) {
168 void TestScreen::RemoveObserver(gfx::DisplayObserver
* observer
) {
171 TestScreen::TestScreen(const gfx::Rect
& screen_bounds
)
174 static int64 synthesized_display_id
= 2000;
175 display_
.set_id(synthesized_display_id
++);
176 display_
.SetScaleAndBounds(1.0f
, screen_bounds
);