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.
5 #include "extensions/browser/api/system_display/display_info_provider.h"
7 #include "ash/display/display_controller.h"
8 #include "ash/display/display_manager.h"
9 #include "ash/screen_util.h"
10 #include "ash/shell.h"
11 #include "ash/test/ash_test_base.h"
12 #include "ash/test/display_manager_test_api.h"
13 #include "base/strings/string_number_conversions.h"
14 #include "base/strings/stringprintf.h"
15 #include "extensions/common/api/system_display.h"
16 #include "ui/gfx/display.h"
17 #include "ui/gfx/geometry/rect.h"
19 namespace extensions
{
22 class DisplayInfoProviderChromeosTest
: public ash::test::AshTestBase
{
24 DisplayInfoProviderChromeosTest() {}
26 ~DisplayInfoProviderChromeosTest() override
{}
29 void CallSetDisplayUnitInfo(
30 const std::string
& display_id
,
31 const core_api::system_display::DisplayProperties
& info
,
34 // Reset error messsage.
36 *success
= DisplayInfoProvider::Get()->SetInfo(display_id
, info
, error
);
39 bool DisplayExists(int64 display_id
) const {
40 const gfx::Display
& display
=
41 GetDisplayManager()->GetDisplayForId(display_id
);
42 return display
.id() != gfx::Display::kInvalidDisplayID
;
45 ash::DisplayManager
* GetDisplayManager() const {
46 return ash::Shell::GetInstance()->display_manager();
49 ash::DisplayController
* GetDisplayController() const {
50 return ash::Shell::GetInstance()->display_controller();
53 std::string
SystemInfoDisplayInsetsToString(
54 const core_api::system_display::Insets
& insets
) const {
55 // Order to match gfx::Insets::ToString().
56 return base::StringPrintf(
57 "%d,%d,%d,%d", insets
.top
, insets
.left
, insets
.bottom
, insets
.right
);
60 std::string
SystemInfoDisplayBoundsToString(
61 const core_api::system_display::Bounds
& bounds
) const {
62 // Order to match gfx::Rect::ToString().
63 return base::StringPrintf(
64 "%d,%d %dx%d", bounds
.left
, bounds
.top
, bounds
.width
, bounds
.height
);
68 DISALLOW_COPY_AND_ASSIGN(DisplayInfoProviderChromeosTest
);
71 TEST_F(DisplayInfoProviderChromeosTest
, GetBasic
) {
72 UpdateDisplay("500x600,400x520");
73 DisplayInfo result
= DisplayInfoProvider::Get()->GetAllDisplaysInfo();
75 ASSERT_EQ(2u, result
.size());
78 ASSERT_TRUE(base::StringToInt64(result
[0]->id
, &display_id
))
79 << "Display id must be convertable to integer: " << result
[0]->id
;
81 ASSERT_TRUE(DisplayExists(display_id
)) << display_id
<< " not found";
82 EXPECT_EQ("0,0 500x600", SystemInfoDisplayBoundsToString(result
[0]->bounds
));
83 EXPECT_EQ("0,0,0,0", SystemInfoDisplayInsetsToString(result
[0]->overscan
));
84 EXPECT_EQ(0, result
[0]->rotation
);
85 EXPECT_TRUE(result
[0]->is_primary
);
86 EXPECT_EQ(96, result
[0]->dpi_x
);
87 EXPECT_EQ(96, result
[0]->dpi_y
);
88 EXPECT_TRUE(result
[0]->mirroring_source_id
.empty());
89 EXPECT_TRUE(result
[0]->is_enabled
);
91 ASSERT_TRUE(base::StringToInt64(result
[1]->id
, &display_id
))
92 << "Display id must be convertable to integer: " << result
[0]->id
;
94 ASSERT_TRUE(DisplayExists(display_id
)) << display_id
<< " not found";
95 EXPECT_EQ(GetDisplayManager()->GetDisplayNameForId(display_id
),
97 // The second display is positioned left of the primary display, whose width
99 EXPECT_EQ("500,0 400x520",
100 SystemInfoDisplayBoundsToString(result
[1]->bounds
));
101 EXPECT_EQ("0,0,0,0", SystemInfoDisplayInsetsToString(result
[1]->overscan
));
102 EXPECT_EQ(0, result
[1]->rotation
);
103 EXPECT_FALSE(result
[1]->is_primary
);
104 EXPECT_EQ(96, result
[1]->dpi_x
);
105 EXPECT_EQ(96, result
[1]->dpi_y
);
106 EXPECT_TRUE(result
[1]->mirroring_source_id
.empty());
107 EXPECT_TRUE(result
[1]->is_enabled
);
110 TEST_F(DisplayInfoProviderChromeosTest
, GetRotation
) {
111 UpdateDisplay("500x600/r");
112 DisplayInfo result
= DisplayInfoProvider::Get()->GetAllDisplaysInfo();
114 ASSERT_EQ(1u, result
.size());
117 ASSERT_TRUE(base::StringToInt64(result
[0]->id
, &display_id
))
118 << "Display id must be convertable to integer: " << result
[0]->id
;
120 ASSERT_TRUE(DisplayExists(display_id
)) << display_id
<< " not found";
121 EXPECT_EQ("0,0 600x500", SystemInfoDisplayBoundsToString(result
[0]->bounds
));
122 EXPECT_EQ(90, result
[0]->rotation
);
124 GetDisplayManager()->SetDisplayRotation(display_id
, gfx::Display::ROTATE_270
);
126 result
= DisplayInfoProvider::Get()->GetAllDisplaysInfo();
128 ASSERT_EQ(1u, result
.size());
130 EXPECT_EQ(base::Int64ToString(display_id
), result
[0]->id
);
131 EXPECT_EQ("0,0 600x500", SystemInfoDisplayBoundsToString(result
[0]->bounds
));
132 EXPECT_EQ(270, result
[0]->rotation
);
134 GetDisplayManager()->SetDisplayRotation(display_id
, gfx::Display::ROTATE_180
);
136 result
= DisplayInfoProvider::Get()->GetAllDisplaysInfo();
138 ASSERT_EQ(1u, result
.size());
140 EXPECT_EQ(base::Int64ToString(display_id
), result
[0]->id
);
141 EXPECT_EQ("0,0 500x600", SystemInfoDisplayBoundsToString(result
[0]->bounds
));
142 EXPECT_EQ(180, result
[0]->rotation
);
144 GetDisplayManager()->SetDisplayRotation(display_id
, gfx::Display::ROTATE_0
);
146 result
= DisplayInfoProvider::Get()->GetAllDisplaysInfo();
148 ASSERT_EQ(1u, result
.size());
150 EXPECT_EQ(base::Int64ToString(display_id
), result
[0]->id
);
151 EXPECT_EQ("0,0 500x600", SystemInfoDisplayBoundsToString(result
[0]->bounds
));
152 EXPECT_EQ(0, result
[0]->rotation
);
155 TEST_F(DisplayInfoProviderChromeosTest
, GetHiDPI
) {
156 UpdateDisplay("500x600,400x520*2");
158 result
= DisplayInfoProvider::Get()->GetAllDisplaysInfo();
160 ASSERT_EQ(2u, result
.size());
162 EXPECT_EQ("0,0 500x600", SystemInfoDisplayBoundsToString(result
[0]->bounds
));
163 EXPECT_EQ(96, result
[0]->dpi_x
);
164 EXPECT_EQ(96, result
[0]->dpi_y
);
166 EXPECT_EQ("500,0 200x260",
167 SystemInfoDisplayBoundsToString(result
[1]->bounds
));
168 EXPECT_EQ(2 * 96, result
[1]->dpi_x
);
169 EXPECT_EQ(2 * 96, result
[1]->dpi_y
);
171 GetDisplayController()->SwapPrimaryDisplay();
173 result
= DisplayInfoProvider::Get()->GetAllDisplaysInfo();
175 ASSERT_EQ(2u, result
.size());
177 EXPECT_EQ("-500,0 500x600",
178 SystemInfoDisplayBoundsToString(result
[0]->bounds
));
179 EXPECT_EQ(96, result
[0]->dpi_x
);
180 EXPECT_EQ(96, result
[0]->dpi_y
);
182 EXPECT_EQ("0,0 200x260", SystemInfoDisplayBoundsToString(result
[1]->bounds
));
183 EXPECT_EQ(2 * 96, result
[1]->dpi_x
);
184 EXPECT_EQ(2 * 96, result
[1]->dpi_y
);
187 TEST_F(DisplayInfoProviderChromeosTest
, GetVisibleArea
) {
188 UpdateDisplay("640x720*2/o, 400x520/o");
190 result
= DisplayInfoProvider::Get()->GetAllDisplaysInfo();
192 ASSERT_EQ(2u, result
.size());
195 ASSERT_TRUE(base::StringToInt64(result
[1]->id
, &display_id
))
196 << "Display id must be convertable to integer: " << result
[1]->id
;
197 ASSERT_TRUE(DisplayExists(display_id
)) << display_id
<< " not found";
199 // Default overscan is 5%.
200 EXPECT_EQ("304,0 380x494",
201 SystemInfoDisplayBoundsToString(result
[1]->bounds
));
202 EXPECT_EQ("13,10,13,10",
203 SystemInfoDisplayInsetsToString(result
[1]->overscan
));
205 GetDisplayManager()->SetOverscanInsets(display_id
,
206 gfx::Insets(20, 30, 50, 60));
207 result
= DisplayInfoProvider::Get()->GetAllDisplaysInfo();
209 ASSERT_EQ(2u, result
.size());
211 EXPECT_EQ(base::Int64ToString(display_id
), result
[1]->id
);
212 EXPECT_EQ("304,0 310x450",
213 SystemInfoDisplayBoundsToString(result
[1]->bounds
));
214 EXPECT_EQ("20,30,50,60",
215 SystemInfoDisplayInsetsToString(result
[1]->overscan
));
217 // Set insets for the primary screen. Note that it has 2x scale.
218 ASSERT_TRUE(base::StringToInt64(result
[0]->id
, &display_id
))
219 << "Display id must be convertable to integer: " << result
[0]->id
;
220 ASSERT_TRUE(DisplayExists(display_id
)) << display_id
<< " not found";
222 EXPECT_EQ("0,0 304x342", SystemInfoDisplayBoundsToString(result
[0]->bounds
));
223 EXPECT_EQ("9,8,9,8", SystemInfoDisplayInsetsToString(result
[0]->overscan
));
225 GetDisplayManager()->SetOverscanInsets(display_id
,
226 gfx::Insets(10, 20, 30, 40));
227 result
= DisplayInfoProvider::Get()->GetAllDisplaysInfo();
229 ASSERT_EQ(2u, result
.size());
231 EXPECT_EQ(base::Int64ToString(display_id
), result
[0]->id
);
232 EXPECT_EQ("0,0 260x320", SystemInfoDisplayBoundsToString(result
[0]->bounds
));
233 EXPECT_EQ("10,20,30,40",
234 SystemInfoDisplayInsetsToString(result
[0]->overscan
));
237 TEST_F(DisplayInfoProviderChromeosTest
, GetMirroring
) {
238 UpdateDisplay("600x600, 400x520/o");
240 result
= DisplayInfoProvider::Get()->GetAllDisplaysInfo();
242 ASSERT_EQ(2u, result
.size());
244 int64 display_id_primary
;
245 ASSERT_TRUE(base::StringToInt64(result
[0]->id
, &display_id_primary
))
246 << "Display id must be convertable to integer: " << result
[0]->id
;
247 ASSERT_TRUE(DisplayExists(display_id_primary
)) << display_id_primary
250 int64 display_id_secondary
;
251 ASSERT_TRUE(base::StringToInt64(result
[1]->id
, &display_id_secondary
))
252 << "Display id must be convertable to integer: " << result
[1]->id
;
253 ASSERT_TRUE(DisplayExists(display_id_secondary
)) << display_id_secondary
256 ASSERT_FALSE(GetDisplayManager()->IsMirrored());
257 EXPECT_TRUE(result
[0]->mirroring_source_id
.empty());
258 EXPECT_TRUE(result
[1]->mirroring_source_id
.empty());
260 GetDisplayManager()->SetMirrorMode(true);
261 ASSERT_TRUE(GetDisplayManager()->IsMirrored());
263 result
= DisplayInfoProvider::Get()->GetAllDisplaysInfo();
265 ASSERT_EQ(1u, result
.size());
266 EXPECT_EQ(base::Int64ToString(display_id_primary
), result
[0]->id
);
267 EXPECT_EQ(base::Int64ToString(display_id_secondary
),
268 result
[0]->mirroring_source_id
);
270 GetDisplayManager()->SetMirrorMode(false);
271 ASSERT_FALSE(GetDisplayManager()->IsMirrored());
273 result
= DisplayInfoProvider::Get()->GetAllDisplaysInfo();
275 ASSERT_EQ(2u, result
.size());
276 EXPECT_EQ(base::Int64ToString(display_id_primary
), result
[0]->id
);
277 EXPECT_TRUE(result
[0]->mirroring_source_id
.empty());
278 EXPECT_EQ(base::Int64ToString(display_id_secondary
), result
[1]->id
);
279 EXPECT_TRUE(result
[1]->mirroring_source_id
.empty());
282 TEST_F(DisplayInfoProviderChromeosTest
, GetBounds
) {
283 UpdateDisplay("600x600, 400x520");
284 GetDisplayManager()->SetLayoutForCurrentDisplays(
285 ash::DisplayLayout::FromInts(ash::DisplayLayout::LEFT
, -40));
287 DisplayInfo result
= DisplayInfoProvider::Get()->GetAllDisplaysInfo();
289 ASSERT_EQ(2u, result
.size());
290 EXPECT_EQ("0,0 600x600", SystemInfoDisplayBoundsToString(result
[0]->bounds
));
291 EXPECT_EQ("-400,-40 400x520",
292 SystemInfoDisplayBoundsToString(result
[1]->bounds
));
294 GetDisplayManager()->SetLayoutForCurrentDisplays(
295 ash::DisplayLayout::FromInts(ash::DisplayLayout::TOP
, 40));
297 result
= DisplayInfoProvider::Get()->GetAllDisplaysInfo();
299 ASSERT_EQ(2u, result
.size());
300 EXPECT_EQ("0,0 600x600", SystemInfoDisplayBoundsToString(result
[0]->bounds
));
301 EXPECT_EQ("40,-520 400x520",
302 SystemInfoDisplayBoundsToString(result
[1]->bounds
));
304 GetDisplayManager()->SetLayoutForCurrentDisplays(
305 ash::DisplayLayout::FromInts(ash::DisplayLayout::BOTTOM
, 80));
307 result
= DisplayInfoProvider::Get()->GetAllDisplaysInfo();
308 ASSERT_EQ(2u, result
.size());
309 EXPECT_EQ("0,0 600x600", SystemInfoDisplayBoundsToString(result
[0]->bounds
));
310 EXPECT_EQ("80,600 400x520",
311 SystemInfoDisplayBoundsToString(result
[1]->bounds
));
314 TEST_F(DisplayInfoProviderChromeosTest
, SetBoundsOriginLeftExact
) {
315 UpdateDisplay("1200x600,520x400");
317 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
318 core_api::system_display::DisplayProperties info
;
319 info
.bounds_origin_x
.reset(new int(-520));
320 info
.bounds_origin_y
.reset(new int(50));
322 bool success
= false;
324 CallSetDisplayUnitInfo(
325 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
327 ASSERT_TRUE(success
);
328 ASSERT_TRUE(error
.empty());
330 EXPECT_EQ("-520,50 520x400", secondary
.bounds().ToString());
333 TEST_F(DisplayInfoProviderChromeosTest
, SetBoundsOriginRightExact
) {
334 UpdateDisplay("1200x600,520x400");
336 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
337 core_api::system_display::DisplayProperties info
;
338 info
.bounds_origin_x
.reset(new int(1200));
339 info
.bounds_origin_y
.reset(new int(100));
341 bool success
= false;
343 CallSetDisplayUnitInfo(
344 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
346 ASSERT_TRUE(success
);
347 ASSERT_TRUE(error
.empty());
349 EXPECT_EQ("1200,100 520x400", secondary
.bounds().ToString());
352 TEST_F(DisplayInfoProviderChromeosTest
, SetBoundsOriginTopExact
) {
353 UpdateDisplay("1200x600,520x400");
355 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
356 core_api::system_display::DisplayProperties info
;
357 info
.bounds_origin_x
.reset(new int(1100));
358 info
.bounds_origin_y
.reset(new int(-400));
360 bool success
= false;
362 CallSetDisplayUnitInfo(
363 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
365 ASSERT_TRUE(success
);
366 ASSERT_TRUE(error
.empty());
368 EXPECT_EQ("1100,-400 520x400", secondary
.bounds().ToString());
371 TEST_F(DisplayInfoProviderChromeosTest
, SetBoundsOriginBottomExact
) {
372 UpdateDisplay("1200x600,520x400");
374 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
375 core_api::system_display::DisplayProperties info
;
376 info
.bounds_origin_x
.reset(new int(-350));
377 info
.bounds_origin_y
.reset(new int(600));
379 bool success
= false;
381 CallSetDisplayUnitInfo(
382 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
384 ASSERT_TRUE(success
);
385 ASSERT_TRUE(error
.empty());
387 EXPECT_EQ("-350,600 520x400", secondary
.bounds().ToString());
390 TEST_F(DisplayInfoProviderChromeosTest
, SetBoundsOriginSameCenter
) {
391 UpdateDisplay("1200x600,520x400");
393 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
394 core_api::system_display::DisplayProperties info
;
395 info
.bounds_origin_x
.reset(new int(340));
396 info
.bounds_origin_y
.reset(new int(100));
398 bool success
= false;
400 CallSetDisplayUnitInfo(
401 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
403 ASSERT_TRUE(success
);
404 ASSERT_TRUE(error
.empty());
406 EXPECT_EQ("1200,100 520x400", secondary
.bounds().ToString());
409 TEST_F(DisplayInfoProviderChromeosTest
, SetBoundsOriginLeftOutside
) {
410 UpdateDisplay("1200x600,520x400");
412 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
413 core_api::system_display::DisplayProperties info
;
414 info
.bounds_origin_x
.reset(new int(-1040));
415 info
.bounds_origin_y
.reset(new int(100));
417 bool success
= false;
419 CallSetDisplayUnitInfo(
420 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
422 ASSERT_TRUE(success
);
423 ASSERT_TRUE(error
.empty());
425 EXPECT_EQ("-520,100 520x400", secondary
.bounds().ToString());
428 TEST_F(DisplayInfoProviderChromeosTest
, SetBoundsOriginTopOutside
) {
429 UpdateDisplay("1200x600,520x400");
431 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
432 core_api::system_display::DisplayProperties info
;
433 info
.bounds_origin_x
.reset(new int(-360));
434 info
.bounds_origin_y
.reset(new int(-301));
436 bool success
= false;
438 CallSetDisplayUnitInfo(
439 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
441 ASSERT_TRUE(success
);
442 ASSERT_TRUE(error
.empty());
444 EXPECT_EQ("-360,-400 520x400", secondary
.bounds().ToString());
447 TEST_F(DisplayInfoProviderChromeosTest
,
448 SetBoundsOriginLeftButSharesBottomSide
) {
449 UpdateDisplay("1200x600,1000x100");
451 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
452 core_api::system_display::DisplayProperties info
;
453 info
.bounds_origin_x
.reset(new int(-650));
454 info
.bounds_origin_y
.reset(new int(700));
456 bool success
= false;
458 CallSetDisplayUnitInfo(
459 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
461 ASSERT_TRUE(success
);
462 ASSERT_TRUE(error
.empty());
464 EXPECT_EQ("-650,600 1000x100", secondary
.bounds().ToString());
467 TEST_F(DisplayInfoProviderChromeosTest
, SetBoundsOriginRightButSharesTopSide
) {
468 UpdateDisplay("1200x600,1000x100");
470 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
471 core_api::system_display::DisplayProperties info
;
472 info
.bounds_origin_x
.reset(new int(850));
473 info
.bounds_origin_y
.reset(new int(-150));
475 bool success
= false;
477 CallSetDisplayUnitInfo(
478 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
480 ASSERT_TRUE(success
);
481 ASSERT_TRUE(error
.empty());
483 EXPECT_EQ("850,-100 1000x100", secondary
.bounds().ToString());
486 TEST_F(DisplayInfoProviderChromeosTest
, SetBoundsOriginTopButSharesLeftSide
) {
487 UpdateDisplay("1200x600,1000x100/l");
489 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
490 core_api::system_display::DisplayProperties info
;
491 info
.bounds_origin_x
.reset(new int(-150));
492 info
.bounds_origin_y
.reset(new int(-650));
494 bool success
= false;
496 CallSetDisplayUnitInfo(
497 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
499 ASSERT_TRUE(success
);
500 ASSERT_TRUE(error
.empty());
502 EXPECT_EQ("-100,-650 100x1000", secondary
.bounds().ToString());
505 TEST_F(DisplayInfoProviderChromeosTest
,
506 SetBoundsOriginBottomButSharesRightSide
) {
507 UpdateDisplay("1200x600,1000x100/l");
509 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
510 core_api::system_display::DisplayProperties info
;
511 info
.bounds_origin_x
.reset(new int(1350));
512 info
.bounds_origin_y
.reset(new int(450));
514 bool success
= false;
516 CallSetDisplayUnitInfo(
517 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
519 ASSERT_TRUE(success
);
520 ASSERT_TRUE(error
.empty());
522 EXPECT_EQ("1200,450 100x1000", secondary
.bounds().ToString());
525 TEST_F(DisplayInfoProviderChromeosTest
, SetBoundsOriginPrimaryHiDPI
) {
526 UpdateDisplay("1200x600*2,500x500");
528 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
529 core_api::system_display::DisplayProperties info
;
530 info
.bounds_origin_x
.reset(new int(250));
531 info
.bounds_origin_y
.reset(new int(-100));
533 bool success
= false;
535 CallSetDisplayUnitInfo(
536 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
538 ASSERT_TRUE(success
);
539 ASSERT_TRUE(error
.empty());
541 EXPECT_EQ("600,-100 500x500", secondary
.bounds().ToString());
544 TEST_F(DisplayInfoProviderChromeosTest
, SetBoundsOriginSecondaryHiDPI
) {
545 UpdateDisplay("1200x600,600x1000*2");
547 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
548 core_api::system_display::DisplayProperties info
;
549 info
.bounds_origin_x
.reset(new int(450));
550 info
.bounds_origin_y
.reset(new int(-100));
552 bool success
= false;
554 CallSetDisplayUnitInfo(
555 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
557 ASSERT_TRUE(success
);
558 ASSERT_TRUE(error
.empty());
560 EXPECT_EQ("450,-500 300x500", secondary
.bounds().ToString());
563 TEST_F(DisplayInfoProviderChromeosTest
, SetBoundsOriginOutOfBounds
) {
564 UpdateDisplay("1200x600,600x1000*2");
566 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
567 core_api::system_display::DisplayProperties info
;
568 info
.bounds_origin_x
.reset(new int(0x200001));
569 info
.bounds_origin_y
.reset(new int(-100));
571 bool success
= false;
573 CallSetDisplayUnitInfo(
574 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
576 ASSERT_FALSE(success
);
577 ASSERT_EQ("Bounds origin x out of bounds.", error
);
579 EXPECT_EQ("1200,0 300x500", secondary
.bounds().ToString());
582 TEST_F(DisplayInfoProviderChromeosTest
, SetBoundsOriginOutOfBoundsNegative
) {
583 UpdateDisplay("1200x600,600x1000*2");
585 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
586 core_api::system_display::DisplayProperties info
;
587 info
.bounds_origin_x
.reset(new int(300));
588 info
.bounds_origin_y
.reset(new int(-0x200001));
590 bool success
= false;
592 CallSetDisplayUnitInfo(
593 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
595 ASSERT_FALSE(success
);
596 ASSERT_EQ("Bounds origin y out of bounds.", error
);
598 EXPECT_EQ("1200,0 300x500", secondary
.bounds().ToString());
601 TEST_F(DisplayInfoProviderChromeosTest
, SetBoundsOriginMaxValues
) {
602 UpdateDisplay("1200x4600,600x1000*2");
604 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
605 core_api::system_display::DisplayProperties info
;
606 info
.bounds_origin_x
.reset(new int(200000));
607 info
.bounds_origin_y
.reset(new int(10));
609 bool success
= false;
611 CallSetDisplayUnitInfo(
612 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
614 ASSERT_TRUE(success
);
615 EXPECT_TRUE(error
.empty());
617 EXPECT_EQ("1200,10 300x500", secondary
.bounds().ToString());
620 TEST_F(DisplayInfoProviderChromeosTest
, SetBoundsOriginOnPrimary
) {
621 UpdateDisplay("1200x600,600x1000*2");
623 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
624 core_api::system_display::DisplayProperties info
;
625 info
.bounds_origin_x
.reset(new int(300));
626 info
.is_primary
.reset(new bool(true));
628 bool success
= false;
630 CallSetDisplayUnitInfo(
631 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
633 ASSERT_FALSE(success
);
634 ASSERT_EQ("Bounds origin not allowed for the primary display.", error
);
636 EXPECT_EQ("1200,0 300x500", secondary
.bounds().ToString());
637 // The operation failed because the primary property would be set before
638 // setting bounds. The primary display shouldn't have been changed, though.
639 EXPECT_NE(ash::Shell::GetScreen()->GetPrimaryDisplay().id(), secondary
.id());
642 TEST_F(DisplayInfoProviderChromeosTest
, SetBoundsOriginWithMirroring
) {
643 UpdateDisplay("1200x600,600x1000*2");
645 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
646 const gfx::Display
& primary
= ash::Shell::GetScreen()->GetPrimaryDisplay();
648 core_api::system_display::DisplayProperties info
;
649 info
.bounds_origin_x
.reset(new int(300));
650 info
.mirroring_source_id
.reset(
651 new std::string(base::Int64ToString(primary
.id())));
653 bool success
= false;
655 CallSetDisplayUnitInfo(
656 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
658 ASSERT_FALSE(success
);
659 ASSERT_EQ("No other parameter should be set alongside mirroringSourceId.",
663 TEST_F(DisplayInfoProviderChromeosTest
, SetRotation
) {
664 UpdateDisplay("1200x600,600x1000*2");
666 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
667 core_api::system_display::DisplayProperties info
;
668 info
.rotation
.reset(new int(90));
670 bool success
= false;
672 CallSetDisplayUnitInfo(
673 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
675 ASSERT_TRUE(success
);
676 EXPECT_TRUE(error
.empty());
678 EXPECT_EQ("1200,0 500x300", secondary
.bounds().ToString());
679 EXPECT_EQ(gfx::Display::ROTATE_90
, secondary
.rotation());
681 info
.rotation
.reset(new int(270));
682 CallSetDisplayUnitInfo(
683 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
685 ASSERT_TRUE(success
);
686 EXPECT_TRUE(error
.empty());
688 EXPECT_EQ("1200,0 500x300", secondary
.bounds().ToString());
689 EXPECT_EQ(gfx::Display::ROTATE_270
, secondary
.rotation());
691 info
.rotation
.reset(new int(180));
692 // Switch primary display.
693 info
.is_primary
.reset(new bool(true));
694 CallSetDisplayUnitInfo(
695 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
697 ASSERT_TRUE(success
);
698 EXPECT_TRUE(error
.empty());
700 EXPECT_EQ("0,0 300x500", secondary
.bounds().ToString());
701 EXPECT_EQ(gfx::Display::ROTATE_180
, secondary
.rotation());
702 EXPECT_EQ(ash::Shell::GetScreen()->GetPrimaryDisplay().id(), secondary
.id());
704 info
.rotation
.reset(new int(0));
705 CallSetDisplayUnitInfo(
706 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
708 ASSERT_TRUE(success
);
709 EXPECT_TRUE(error
.empty());
711 EXPECT_EQ("0,0 300x500", secondary
.bounds().ToString());
712 EXPECT_EQ(gfx::Display::ROTATE_0
, secondary
.rotation());
713 EXPECT_EQ(ash::Shell::GetScreen()->GetPrimaryDisplay().id(), secondary
.id());
716 TEST_F(DisplayInfoProviderChromeosTest
, SetInvalidRotation
) {
717 UpdateDisplay("1200x600,600x1000*2");
719 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
720 core_api::system_display::DisplayProperties info
;
721 info
.rotation
.reset(new int(91));
723 bool success
= false;
725 CallSetDisplayUnitInfo(
726 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
728 ASSERT_FALSE(success
);
729 EXPECT_EQ("Invalid rotation.", error
);
732 TEST_F(DisplayInfoProviderChromeosTest
, SetNegativeOverscan
) {
733 UpdateDisplay("1200x600,600x1000*2");
735 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
736 core_api::system_display::DisplayProperties info
;
737 info
.overscan
.reset(new core_api::system_display::Insets
);
738 info
.overscan
->left
= -10;
740 bool success
= false;
742 CallSetDisplayUnitInfo(
743 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
745 ASSERT_FALSE(success
);
746 EXPECT_EQ("Negative overscan not allowed.", error
);
748 EXPECT_EQ("1200,0 300x500", secondary
.bounds().ToString());
750 info
.overscan
->left
= 0;
751 info
.overscan
->right
= -200;
753 CallSetDisplayUnitInfo(
754 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
756 ASSERT_FALSE(success
);
757 EXPECT_EQ("Negative overscan not allowed.", error
);
759 EXPECT_EQ("1200,0 300x500", secondary
.bounds().ToString());
761 info
.overscan
->right
= 0;
762 info
.overscan
->top
= -300;
764 CallSetDisplayUnitInfo(
765 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
767 ASSERT_FALSE(success
);
768 EXPECT_EQ("Negative overscan not allowed.", error
);
770 EXPECT_EQ("1200,0 300x500", secondary
.bounds().ToString());
772 info
.overscan
->right
= 0;
773 info
.overscan
->top
= -1000;
775 CallSetDisplayUnitInfo(
776 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
778 ASSERT_FALSE(success
);
779 EXPECT_EQ("Negative overscan not allowed.", error
);
781 EXPECT_EQ("1200,0 300x500", secondary
.bounds().ToString());
783 info
.overscan
->right
= 0;
784 info
.overscan
->top
= 0;
786 CallSetDisplayUnitInfo(
787 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
789 ASSERT_TRUE(success
);
790 EXPECT_TRUE(error
.empty());
792 EXPECT_EQ("1200,0 300x500", secondary
.bounds().ToString());
795 TEST_F(DisplayInfoProviderChromeosTest
, SetOverscanLargerThanHorizontalBounds
) {
796 UpdateDisplay("1200x600,600x1000*2");
798 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
799 core_api::system_display::DisplayProperties info
;
800 info
.overscan
.reset(new core_api::system_display::Insets
);
801 // Horizontal overscan is 151, which would make the bounds width 149.
802 info
.overscan
->left
= 50;
803 info
.overscan
->top
= 10;
804 info
.overscan
->right
= 101;
805 info
.overscan
->bottom
= 20;
807 bool success
= false;
809 CallSetDisplayUnitInfo(
810 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
812 ASSERT_FALSE(success
);
813 EXPECT_EQ("Horizontal overscan is more than half of the screen width.",
817 TEST_F(DisplayInfoProviderChromeosTest
, SetOverscanLargerThanVerticalBounds
) {
818 UpdateDisplay("1200x600,600x1000");
820 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
821 core_api::system_display::DisplayProperties info
;
822 info
.overscan
.reset(new core_api::system_display::Insets
);
823 // Vertical overscan is 501, which would make the bounds height 499.
824 info
.overscan
->left
= 20;
825 info
.overscan
->top
= 250;
826 info
.overscan
->right
= 101;
827 info
.overscan
->bottom
= 251;
829 bool success
= false;
831 CallSetDisplayUnitInfo(
832 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
834 ASSERT_FALSE(success
);
835 EXPECT_EQ("Vertical overscan is more than half of the screen height.", error
);
838 TEST_F(DisplayInfoProviderChromeosTest
, SetOverscan
) {
839 UpdateDisplay("1200x600,600x1000*2");
841 const gfx::Display
& secondary
= ash::ScreenUtil::GetSecondaryDisplay();
842 core_api::system_display::DisplayProperties info
;
843 info
.overscan
.reset(new core_api::system_display::Insets
);
844 info
.overscan
->left
= 20;
845 info
.overscan
->top
= 199;
846 info
.overscan
->right
= 130;
847 info
.overscan
->bottom
= 51;
849 bool success
= false;
851 CallSetDisplayUnitInfo(
852 base::Int64ToString(secondary
.id()), info
, &success
, &error
);
854 ASSERT_TRUE(success
);
855 EXPECT_TRUE(error
.empty());
857 EXPECT_EQ("1200,0 150x250", secondary
.bounds().ToString());
858 const gfx::Insets overscan
=
859 GetDisplayManager()->GetOverscanInsets(secondary
.id());
861 EXPECT_EQ(20, overscan
.left());
862 EXPECT_EQ(199, overscan
.top());
863 EXPECT_EQ(130, overscan
.right());
864 EXPECT_EQ(51, overscan
.bottom());
867 TEST_F(DisplayInfoProviderChromeosTest
, SetOverscanForInternal
) {
868 UpdateDisplay("1200x600,600x1000*2");
869 const int64 internal_display_id
=
870 ash::test::DisplayManagerTestApi(GetDisplayManager())
871 .SetFirstDisplayAsInternalDisplay();
873 core_api::system_display::DisplayProperties info
;
874 info
.overscan
.reset(new core_api::system_display::Insets
);
875 // Vertical overscan is 501, which would make the bounds height 499.
876 info
.overscan
->left
= 20;
877 info
.overscan
->top
= 20;
878 info
.overscan
->right
= 20;
879 info
.overscan
->bottom
= 20;
881 bool success
= false;
883 CallSetDisplayUnitInfo(
884 base::Int64ToString(internal_display_id
), info
, &success
, &error
);
886 ASSERT_FALSE(success
);
887 EXPECT_EQ("Overscan changes not allowed for the internal monitor.", error
);
891 } // namespace extensions