OLD | NEW |
| (Empty) |
1 // Copyright 2013 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 "chrome/browser/extensions/api/system_display/display_info_provider.h" | |
6 | |
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 "ui/gfx/display.h" | |
16 #include "ui/gfx/rect.h" | |
17 | |
18 namespace extensions { | |
19 namespace { | |
20 | |
21 class DisplayInfoProviderChromeosTest : public ash::test::AshTestBase { | |
22 public: | |
23 DisplayInfoProviderChromeosTest() {} | |
24 | |
25 virtual ~DisplayInfoProviderChromeosTest() {} | |
26 | |
27 protected: | |
28 void CallSetDisplayUnitInfo( | |
29 const std::string& display_id, | |
30 const api::system_display::DisplayProperties& info, | |
31 bool* success, | |
32 std::string* error) { | |
33 // Reset error messsage. | |
34 (*error).clear(); | |
35 *success = DisplayInfoProvider::Get()->SetInfo(display_id, info, error); | |
36 } | |
37 | |
38 bool DisplayExists(int64 display_id) const { | |
39 const gfx::Display& display = | |
40 GetDisplayManager()->GetDisplayForId(display_id); | |
41 return display.id() != gfx::Display::kInvalidDisplayID; | |
42 } | |
43 | |
44 ash::DisplayManager* GetDisplayManager() const { | |
45 return ash::Shell::GetInstance()->display_manager(); | |
46 } | |
47 | |
48 ash::DisplayController* GetDisplayController() const { | |
49 return ash::Shell::GetInstance()->display_controller(); | |
50 } | |
51 | |
52 std::string SystemInfoDisplayInsetsToString( | |
53 const api::system_display::Insets& insets) const { | |
54 // Order to match gfx::Insets::ToString(). | |
55 return base::StringPrintf("%d,%d,%d,%d", | |
56 insets.top, insets.left, insets.bottom, insets.right); | |
57 } | |
58 | |
59 std::string SystemInfoDisplayBoundsToString( | |
60 const api::system_display::Bounds& bounds) const { | |
61 // Order to match gfx::Rect::ToString(). | |
62 return base::StringPrintf("%d,%d %dx%d", | |
63 bounds.left, bounds.top, bounds.width, bounds.height); | |
64 } | |
65 | |
66 DISALLOW_COPY_AND_ASSIGN(DisplayInfoProviderChromeosTest); | |
67 }; | |
68 | |
69 TEST_F(DisplayInfoProviderChromeosTest, GetBasic) { | |
70 UpdateDisplay("500x600,400x520"); | |
71 DisplayInfo result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
72 | |
73 ASSERT_EQ(2u, result.size()); | |
74 | |
75 int64 display_id; | |
76 ASSERT_TRUE(base::StringToInt64(result[0]->id, &display_id)) | |
77 << "Display id must be convertable to integer: " << result[0]->id; | |
78 | |
79 ASSERT_TRUE(DisplayExists(display_id)) << display_id << " not found"; | |
80 EXPECT_EQ("0,0 500x600", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
81 EXPECT_EQ("0,0,0,0", SystemInfoDisplayInsetsToString(result[0]->overscan)); | |
82 EXPECT_EQ(0, result[0]->rotation); | |
83 EXPECT_TRUE(result[0]->is_primary); | |
84 EXPECT_EQ(96, result[0]->dpi_x); | |
85 EXPECT_EQ(96, result[0]->dpi_y); | |
86 EXPECT_TRUE(result[0]->mirroring_source_id.empty()); | |
87 EXPECT_TRUE(result[0]->is_enabled); | |
88 | |
89 ASSERT_TRUE(base::StringToInt64(result[1]->id, &display_id)) | |
90 << "Display id must be convertable to integer: " << result[0]->id; | |
91 | |
92 ASSERT_TRUE(DisplayExists(display_id)) << display_id << " not found"; | |
93 EXPECT_EQ(GetDisplayManager()->GetDisplayNameForId(display_id), | |
94 result[1]->name); | |
95 // The second display is positioned left of the primary display, whose width | |
96 // is 500. | |
97 EXPECT_EQ("500,0 400x520", | |
98 SystemInfoDisplayBoundsToString(result[1]->bounds)); | |
99 EXPECT_EQ("0,0,0,0", SystemInfoDisplayInsetsToString(result[1]->overscan)); | |
100 EXPECT_EQ(0, result[1]->rotation); | |
101 EXPECT_FALSE(result[1]->is_primary); | |
102 EXPECT_EQ(96, result[1]->dpi_x); | |
103 EXPECT_EQ(96, result[1]->dpi_y); | |
104 EXPECT_TRUE(result[1]->mirroring_source_id.empty()); | |
105 EXPECT_TRUE(result[1]->is_enabled); | |
106 } | |
107 | |
108 TEST_F(DisplayInfoProviderChromeosTest, GetRotation) { | |
109 UpdateDisplay("500x600/r"); | |
110 DisplayInfo result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
111 | |
112 ASSERT_EQ(1u, result.size()); | |
113 | |
114 int64 display_id; | |
115 ASSERT_TRUE(base::StringToInt64(result[0]->id, &display_id)) | |
116 << "Display id must be convertable to integer: " << result[0]->id; | |
117 | |
118 ASSERT_TRUE(DisplayExists(display_id)) << display_id << " not found"; | |
119 EXPECT_EQ("0,0 600x500", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
120 EXPECT_EQ(90, result[0]->rotation); | |
121 | |
122 GetDisplayManager()->SetDisplayRotation(display_id, gfx::Display::ROTATE_270); | |
123 | |
124 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
125 | |
126 ASSERT_EQ(1u, result.size()); | |
127 | |
128 EXPECT_EQ(base::Int64ToString(display_id), result[0]->id); | |
129 EXPECT_EQ("0,0 600x500", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
130 EXPECT_EQ(270, result[0]->rotation); | |
131 | |
132 GetDisplayManager()->SetDisplayRotation(display_id, gfx::Display::ROTATE_180); | |
133 | |
134 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
135 | |
136 ASSERT_EQ(1u, result.size()); | |
137 | |
138 EXPECT_EQ(base::Int64ToString(display_id), result[0]->id); | |
139 EXPECT_EQ("0,0 500x600", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
140 EXPECT_EQ(180, result[0]->rotation); | |
141 | |
142 GetDisplayManager()->SetDisplayRotation(display_id, gfx::Display::ROTATE_0); | |
143 | |
144 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
145 | |
146 ASSERT_EQ(1u, result.size()); | |
147 | |
148 EXPECT_EQ(base::Int64ToString(display_id), result[0]->id); | |
149 EXPECT_EQ("0,0 500x600", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
150 EXPECT_EQ(0, result[0]->rotation); | |
151 } | |
152 | |
153 TEST_F(DisplayInfoProviderChromeosTest, GetHiDPI) { | |
154 UpdateDisplay("500x600,400x520*2"); | |
155 DisplayInfo result; | |
156 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
157 | |
158 ASSERT_EQ(2u, result.size()); | |
159 | |
160 EXPECT_EQ("0,0 500x600", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
161 EXPECT_EQ(96, result[0]->dpi_x); | |
162 EXPECT_EQ(96, result[0]->dpi_y); | |
163 | |
164 EXPECT_EQ("500,0 200x260", | |
165 SystemInfoDisplayBoundsToString(result[1]->bounds)); | |
166 EXPECT_EQ(2 * 96, result[1]->dpi_x); | |
167 EXPECT_EQ(2 * 96, result[1]->dpi_y); | |
168 | |
169 GetDisplayController()->SwapPrimaryDisplay(); | |
170 | |
171 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
172 | |
173 ASSERT_EQ(2u, result.size()); | |
174 | |
175 EXPECT_EQ("-500,0 500x600", | |
176 SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
177 EXPECT_EQ(96, result[0]->dpi_x); | |
178 EXPECT_EQ(96, result[0]->dpi_y); | |
179 | |
180 EXPECT_EQ("0,0 200x260", SystemInfoDisplayBoundsToString(result[1]->bounds)); | |
181 EXPECT_EQ(2 * 96, result[1]->dpi_x); | |
182 EXPECT_EQ(2 * 96, result[1]->dpi_y); | |
183 } | |
184 | |
185 TEST_F(DisplayInfoProviderChromeosTest, GetVisibleArea) { | |
186 UpdateDisplay("640x720*2/o, 400x520/o"); | |
187 DisplayInfo result; | |
188 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
189 | |
190 ASSERT_EQ(2u, result.size()); | |
191 | |
192 int64 display_id; | |
193 ASSERT_TRUE(base::StringToInt64(result[1]->id, &display_id)) | |
194 << "Display id must be convertable to integer: " << result[1]->id; | |
195 ASSERT_TRUE(DisplayExists(display_id)) << display_id << " not found"; | |
196 | |
197 // Default overscan is 5%. | |
198 EXPECT_EQ("304,0 380x494", | |
199 SystemInfoDisplayBoundsToString(result[1]->bounds)); | |
200 EXPECT_EQ("13,10,13,10", | |
201 SystemInfoDisplayInsetsToString(result[1]->overscan)); | |
202 | |
203 GetDisplayManager()->SetOverscanInsets(display_id, | |
204 gfx::Insets(20, 30, 50, 60)); | |
205 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
206 | |
207 ASSERT_EQ(2u, result.size()); | |
208 | |
209 EXPECT_EQ(base::Int64ToString(display_id), result[1]->id); | |
210 EXPECT_EQ("304,0 310x450", | |
211 SystemInfoDisplayBoundsToString(result[1]->bounds)); | |
212 EXPECT_EQ("20,30,50,60", | |
213 SystemInfoDisplayInsetsToString(result[1]->overscan)); | |
214 | |
215 // Set insets for the primary screen. Note that it has 2x scale. | |
216 ASSERT_TRUE(base::StringToInt64(result[0]->id, &display_id)) | |
217 << "Display id must be convertable to integer: " << result[0]->id; | |
218 ASSERT_TRUE(DisplayExists(display_id)) << display_id << " not found"; | |
219 | |
220 EXPECT_EQ("0,0 304x342", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
221 EXPECT_EQ("9,8,9,8", SystemInfoDisplayInsetsToString(result[0]->overscan)); | |
222 | |
223 GetDisplayManager()->SetOverscanInsets(display_id, | |
224 gfx::Insets(10, 20, 30, 40)); | |
225 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
226 | |
227 ASSERT_EQ(2u, result.size()); | |
228 | |
229 EXPECT_EQ(base::Int64ToString(display_id), result[0]->id); | |
230 EXPECT_EQ("0,0 260x320", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
231 EXPECT_EQ("10,20,30,40", | |
232 SystemInfoDisplayInsetsToString(result[0]->overscan)); | |
233 } | |
234 | |
235 TEST_F(DisplayInfoProviderChromeosTest, GetMirroring) { | |
236 UpdateDisplay("600x600, 400x520/o"); | |
237 DisplayInfo result; | |
238 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
239 | |
240 ASSERT_EQ(2u, result.size()); | |
241 | |
242 int64 display_id_primary; | |
243 ASSERT_TRUE(base::StringToInt64(result[0]->id, &display_id_primary)) | |
244 << "Display id must be convertable to integer: " << result[0]->id; | |
245 ASSERT_TRUE(DisplayExists(display_id_primary)) | |
246 << display_id_primary << " not found"; | |
247 | |
248 int64 display_id_secondary; | |
249 ASSERT_TRUE(base::StringToInt64(result[1]->id, &display_id_secondary)) | |
250 << "Display id must be convertable to integer: " << result[1]->id; | |
251 ASSERT_TRUE(DisplayExists(display_id_secondary)) | |
252 << display_id_secondary << " not found"; | |
253 | |
254 ASSERT_FALSE(GetDisplayManager()->IsMirrored()); | |
255 EXPECT_TRUE(result[0]->mirroring_source_id.empty()); | |
256 EXPECT_TRUE(result[1]->mirroring_source_id.empty()); | |
257 | |
258 GetDisplayManager()->SetMirrorMode(true); | |
259 ASSERT_TRUE(GetDisplayManager()->IsMirrored()); | |
260 | |
261 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
262 | |
263 ASSERT_EQ(1u, result.size()); | |
264 EXPECT_EQ(base::Int64ToString(display_id_primary), result[0]->id); | |
265 EXPECT_EQ(base::Int64ToString(display_id_secondary), | |
266 result[0]->mirroring_source_id); | |
267 | |
268 GetDisplayManager()->SetMirrorMode(false); | |
269 ASSERT_FALSE(GetDisplayManager()->IsMirrored()); | |
270 | |
271 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
272 | |
273 ASSERT_EQ(2u, result.size()); | |
274 EXPECT_EQ(base::Int64ToString(display_id_primary), result[0]->id); | |
275 EXPECT_TRUE(result[0]->mirroring_source_id.empty()); | |
276 EXPECT_EQ(base::Int64ToString(display_id_secondary), result[1]->id); | |
277 EXPECT_TRUE(result[1]->mirroring_source_id.empty()); | |
278 } | |
279 | |
280 TEST_F(DisplayInfoProviderChromeosTest, GetBounds) { | |
281 UpdateDisplay("600x600, 400x520"); | |
282 GetDisplayManager()->SetLayoutForCurrentDisplays( | |
283 ash::DisplayLayout::FromInts(ash::DisplayLayout::LEFT, -40)); | |
284 | |
285 DisplayInfo result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
286 | |
287 ASSERT_EQ(2u, result.size()); | |
288 EXPECT_EQ("0,0 600x600", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
289 EXPECT_EQ("-400,-40 400x520", | |
290 SystemInfoDisplayBoundsToString(result[1]->bounds)); | |
291 | |
292 GetDisplayManager()->SetLayoutForCurrentDisplays( | |
293 ash::DisplayLayout::FromInts(ash::DisplayLayout::TOP, 40)); | |
294 | |
295 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
296 | |
297 ASSERT_EQ(2u, result.size()); | |
298 EXPECT_EQ("0,0 600x600", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
299 EXPECT_EQ("40,-520 400x520", | |
300 SystemInfoDisplayBoundsToString(result[1]->bounds)); | |
301 | |
302 GetDisplayManager()->SetLayoutForCurrentDisplays( | |
303 ash::DisplayLayout::FromInts(ash::DisplayLayout::BOTTOM, 80)); | |
304 | |
305 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
306 ASSERT_EQ(2u, result.size()); | |
307 EXPECT_EQ("0,0 600x600", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
308 EXPECT_EQ("80,600 400x520", | |
309 SystemInfoDisplayBoundsToString(result[1]->bounds)); | |
310 } | |
311 | |
312 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginLeftExact) { | |
313 UpdateDisplay("1200x600,520x400"); | |
314 | |
315 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
316 api::system_display::DisplayProperties info; | |
317 info.bounds_origin_x.reset(new int(-520)); | |
318 info.bounds_origin_y.reset(new int(50)); | |
319 | |
320 bool success = false; | |
321 std::string error; | |
322 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
323 &success, &error); | |
324 | |
325 ASSERT_TRUE(success); | |
326 ASSERT_TRUE(error.empty()); | |
327 | |
328 EXPECT_EQ("-520,50 520x400", secondary.bounds().ToString()); | |
329 } | |
330 | |
331 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginRightExact) { | |
332 UpdateDisplay("1200x600,520x400"); | |
333 | |
334 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
335 api::system_display::DisplayProperties info; | |
336 info.bounds_origin_x.reset(new int(1200)); | |
337 info.bounds_origin_y.reset(new int(100)); | |
338 | |
339 bool success = false; | |
340 std::string error; | |
341 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
342 &success, &error); | |
343 | |
344 ASSERT_TRUE(success); | |
345 ASSERT_TRUE(error.empty()); | |
346 | |
347 EXPECT_EQ("1200,100 520x400", secondary.bounds().ToString()); | |
348 } | |
349 | |
350 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginTopExact) { | |
351 UpdateDisplay("1200x600,520x400"); | |
352 | |
353 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
354 api::system_display::DisplayProperties info; | |
355 info.bounds_origin_x.reset(new int(1100)); | |
356 info.bounds_origin_y.reset(new int(-400)); | |
357 | |
358 bool success = false; | |
359 std::string error; | |
360 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
361 &success, &error); | |
362 | |
363 ASSERT_TRUE(success); | |
364 ASSERT_TRUE(error.empty()); | |
365 | |
366 EXPECT_EQ("1100,-400 520x400", secondary.bounds().ToString()); | |
367 } | |
368 | |
369 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginBottomExact) { | |
370 UpdateDisplay("1200x600,520x400"); | |
371 | |
372 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
373 api::system_display::DisplayProperties info; | |
374 info.bounds_origin_x.reset(new int(-350)); | |
375 info.bounds_origin_y.reset(new int(600)); | |
376 | |
377 bool success = false; | |
378 std::string error; | |
379 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
380 &success, &error); | |
381 | |
382 ASSERT_TRUE(success); | |
383 ASSERT_TRUE(error.empty()); | |
384 | |
385 EXPECT_EQ("-350,600 520x400", secondary.bounds().ToString()); | |
386 } | |
387 | |
388 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginSameCenter) { | |
389 UpdateDisplay("1200x600,520x400"); | |
390 | |
391 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
392 api::system_display::DisplayProperties info; | |
393 info.bounds_origin_x.reset(new int(340)); | |
394 info.bounds_origin_y.reset(new int(100)); | |
395 | |
396 bool success = false; | |
397 std::string error; | |
398 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
399 &success, &error); | |
400 | |
401 ASSERT_TRUE(success); | |
402 ASSERT_TRUE(error.empty()); | |
403 | |
404 EXPECT_EQ("1200,100 520x400", secondary.bounds().ToString()); | |
405 } | |
406 | |
407 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginLeftOutside) { | |
408 UpdateDisplay("1200x600,520x400"); | |
409 | |
410 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
411 api::system_display::DisplayProperties info; | |
412 info.bounds_origin_x.reset(new int(-1040)); | |
413 info.bounds_origin_y.reset(new int(100)); | |
414 | |
415 bool success = false; | |
416 std::string error; | |
417 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
418 &success, &error); | |
419 | |
420 ASSERT_TRUE(success); | |
421 ASSERT_TRUE(error.empty()); | |
422 | |
423 EXPECT_EQ("-520,100 520x400", secondary.bounds().ToString()); | |
424 } | |
425 | |
426 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginTopOutside) { | |
427 UpdateDisplay("1200x600,520x400"); | |
428 | |
429 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
430 api::system_display::DisplayProperties info; | |
431 info.bounds_origin_x.reset(new int(-360)); | |
432 info.bounds_origin_y.reset(new int(-301)); | |
433 | |
434 bool success = false; | |
435 std::string error; | |
436 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
437 &success, &error); | |
438 | |
439 ASSERT_TRUE(success); | |
440 ASSERT_TRUE(error.empty()); | |
441 | |
442 EXPECT_EQ("-360,-400 520x400", secondary.bounds().ToString()); | |
443 } | |
444 | |
445 TEST_F(DisplayInfoProviderChromeosTest, | |
446 SetBoundsOriginLeftButSharesBottomSide) { | |
447 UpdateDisplay("1200x600,1000x100"); | |
448 | |
449 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
450 api::system_display::DisplayProperties info; | |
451 info.bounds_origin_x.reset(new int(-650)); | |
452 info.bounds_origin_y.reset(new int(700)); | |
453 | |
454 bool success = false; | |
455 std::string error; | |
456 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
457 &success, &error); | |
458 | |
459 ASSERT_TRUE(success); | |
460 ASSERT_TRUE(error.empty()); | |
461 | |
462 EXPECT_EQ("-650,600 1000x100", secondary.bounds().ToString()); | |
463 } | |
464 | |
465 TEST_F(DisplayInfoProviderChromeosTest, | |
466 SetBoundsOriginRightButSharesTopSide) { | |
467 UpdateDisplay("1200x600,1000x100"); | |
468 | |
469 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
470 api::system_display::DisplayProperties info; | |
471 info.bounds_origin_x.reset(new int(850)); | |
472 info.bounds_origin_y.reset(new int(-150)); | |
473 | |
474 bool success = false; | |
475 std::string error; | |
476 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
477 &success, &error); | |
478 | |
479 ASSERT_TRUE(success); | |
480 ASSERT_TRUE(error.empty()); | |
481 | |
482 EXPECT_EQ("850,-100 1000x100", secondary.bounds().ToString()); | |
483 } | |
484 | |
485 TEST_F(DisplayInfoProviderChromeosTest, | |
486 SetBoundsOriginTopButSharesLeftSide) { | |
487 UpdateDisplay("1200x600,1000x100/l"); | |
488 | |
489 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
490 api::system_display::DisplayProperties info; | |
491 info.bounds_origin_x.reset(new int(-150)); | |
492 info.bounds_origin_y.reset(new int(-650)); | |
493 | |
494 bool success = false; | |
495 std::string error; | |
496 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
497 &success, &error); | |
498 | |
499 ASSERT_TRUE(success); | |
500 ASSERT_TRUE(error.empty()); | |
501 | |
502 EXPECT_EQ("-100,-650 100x1000", secondary.bounds().ToString()); | |
503 } | |
504 | |
505 TEST_F(DisplayInfoProviderChromeosTest, | |
506 SetBoundsOriginBottomButSharesRightSide) { | |
507 UpdateDisplay("1200x600,1000x100/l"); | |
508 | |
509 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
510 api::system_display::DisplayProperties info; | |
511 info.bounds_origin_x.reset(new int(1350)); | |
512 info.bounds_origin_y.reset(new int(450)); | |
513 | |
514 bool success = false; | |
515 std::string error; | |
516 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
517 &success, &error); | |
518 | |
519 ASSERT_TRUE(success); | |
520 ASSERT_TRUE(error.empty()); | |
521 | |
522 EXPECT_EQ("1200,450 100x1000", secondary.bounds().ToString()); | |
523 } | |
524 | |
525 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginPrimaryHiDPI) { | |
526 UpdateDisplay("1200x600*2,500x500"); | |
527 | |
528 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
529 api::system_display::DisplayProperties info; | |
530 info.bounds_origin_x.reset(new int(250)); | |
531 info.bounds_origin_y.reset(new int(-100)); | |
532 | |
533 bool success = false; | |
534 std::string error; | |
535 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
536 &success, &error); | |
537 | |
538 ASSERT_TRUE(success); | |
539 ASSERT_TRUE(error.empty()); | |
540 | |
541 EXPECT_EQ("600,-100 500x500", secondary.bounds().ToString()); | |
542 } | |
543 | |
544 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginSecondaryHiDPI) { | |
545 UpdateDisplay("1200x600,600x1000*2"); | |
546 | |
547 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
548 api::system_display::DisplayProperties info; | |
549 info.bounds_origin_x.reset(new int(450)); | |
550 info.bounds_origin_y.reset(new int(-100)); | |
551 | |
552 bool success = false; | |
553 std::string error; | |
554 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
555 &success, &error); | |
556 | |
557 ASSERT_TRUE(success); | |
558 ASSERT_TRUE(error.empty()); | |
559 | |
560 EXPECT_EQ("450,-500 300x500", secondary.bounds().ToString()); | |
561 } | |
562 | |
563 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginOutOfBounds) { | |
564 UpdateDisplay("1200x600,600x1000*2"); | |
565 | |
566 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
567 api::system_display::DisplayProperties info; | |
568 info.bounds_origin_x.reset(new int(0x200001)); | |
569 info.bounds_origin_y.reset(new int(-100)); | |
570 | |
571 bool success = false; | |
572 std::string error; | |
573 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
574 &success, &error); | |
575 | |
576 ASSERT_FALSE(success); | |
577 ASSERT_EQ("Bounds origin x out of bounds.", error); | |
578 | |
579 EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString()); | |
580 } | |
581 | |
582 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginOutOfBoundsNegative) { | |
583 UpdateDisplay("1200x600,600x1000*2"); | |
584 | |
585 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
586 api::system_display::DisplayProperties info; | |
587 info.bounds_origin_x.reset(new int(300)); | |
588 info.bounds_origin_y.reset(new int(-0x200001)); | |
589 | |
590 bool success = false; | |
591 std::string error; | |
592 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
593 &success, &error); | |
594 | |
595 ASSERT_FALSE(success); | |
596 ASSERT_EQ("Bounds origin y out of bounds.", error); | |
597 | |
598 EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString()); | |
599 } | |
600 | |
601 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginMaxValues) { | |
602 UpdateDisplay("1200x4600,600x1000*2"); | |
603 | |
604 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
605 api::system_display::DisplayProperties info; | |
606 info.bounds_origin_x.reset(new int(200000)); | |
607 info.bounds_origin_y.reset(new int(10)); | |
608 | |
609 bool success = false; | |
610 std::string error; | |
611 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
612 &success, &error); | |
613 | |
614 ASSERT_TRUE(success); | |
615 EXPECT_TRUE(error.empty()); | |
616 | |
617 EXPECT_EQ("1200,10 300x500", secondary.bounds().ToString()); | |
618 } | |
619 | |
620 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginOnPrimary) { | |
621 UpdateDisplay("1200x600,600x1000*2"); | |
622 | |
623 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
624 api::system_display::DisplayProperties info; | |
625 info.bounds_origin_x.reset(new int(300)); | |
626 info.is_primary.reset(new bool(true)); | |
627 | |
628 bool success = false; | |
629 std::string error; | |
630 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
631 &success, &error); | |
632 | |
633 ASSERT_FALSE(success); | |
634 ASSERT_EQ("Bounds origin not allowed for the primary display.", error); | |
635 | |
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()); | |
640 } | |
641 | |
642 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginWithMirroring) { | |
643 UpdateDisplay("1200x600,600x1000*2"); | |
644 | |
645 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
646 const gfx::Display& primary = ash::Shell::GetScreen()->GetPrimaryDisplay(); | |
647 | |
648 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()))); | |
652 | |
653 bool success = false; | |
654 std::string error; | |
655 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
656 &success, &error); | |
657 | |
658 ASSERT_FALSE(success); | |
659 ASSERT_EQ("No other parameter should be set alongside mirroringSourceId.", | |
660 error); | |
661 } | |
662 | |
663 TEST_F(DisplayInfoProviderChromeosTest, SetRotation) { | |
664 UpdateDisplay("1200x600,600x1000*2"); | |
665 | |
666 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
667 api::system_display::DisplayProperties info; | |
668 info.rotation.reset(new int(90)); | |
669 | |
670 bool success = false; | |
671 std::string error; | |
672 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
673 &success, &error); | |
674 | |
675 ASSERT_TRUE(success); | |
676 EXPECT_TRUE(error.empty()); | |
677 | |
678 EXPECT_EQ("1200,0 500x300", secondary.bounds().ToString()); | |
679 EXPECT_EQ(gfx::Display::ROTATE_90, secondary.rotation()); | |
680 | |
681 info.rotation.reset(new int(270)); | |
682 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
683 &success, &error); | |
684 | |
685 ASSERT_TRUE(success); | |
686 EXPECT_TRUE(error.empty()); | |
687 | |
688 EXPECT_EQ("1200,0 500x300", secondary.bounds().ToString()); | |
689 EXPECT_EQ(gfx::Display::ROTATE_270, secondary.rotation()); | |
690 | |
691 info.rotation.reset(new int(180)); | |
692 // Switch primary display. | |
693 info.is_primary.reset(new bool(true)); | |
694 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
695 &success, &error); | |
696 | |
697 ASSERT_TRUE(success); | |
698 EXPECT_TRUE(error.empty()); | |
699 | |
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()); | |
703 | |
704 info.rotation.reset(new int(0)); | |
705 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
706 &success, &error); | |
707 | |
708 ASSERT_TRUE(success); | |
709 EXPECT_TRUE(error.empty()); | |
710 | |
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()); | |
714 } | |
715 | |
716 TEST_F(DisplayInfoProviderChromeosTest, SetInvalidRotation) { | |
717 UpdateDisplay("1200x600,600x1000*2"); | |
718 | |
719 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
720 api::system_display::DisplayProperties info; | |
721 info.rotation.reset(new int(91)); | |
722 | |
723 bool success = false; | |
724 std::string error; | |
725 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
726 &success, &error); | |
727 | |
728 ASSERT_FALSE(success); | |
729 EXPECT_EQ("Invalid rotation.", error); | |
730 } | |
731 | |
732 TEST_F(DisplayInfoProviderChromeosTest, SetNegativeOverscan) { | |
733 UpdateDisplay("1200x600,600x1000*2"); | |
734 | |
735 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
736 api::system_display::DisplayProperties info; | |
737 info.overscan.reset(new api::system_display::Insets); | |
738 info.overscan->left= -10; | |
739 | |
740 bool success = false; | |
741 std::string error; | |
742 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
743 &success, &error); | |
744 | |
745 ASSERT_FALSE(success); | |
746 EXPECT_EQ("Negative overscan not allowed.", error); | |
747 | |
748 EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString()); | |
749 | |
750 info.overscan->left= 0; | |
751 info.overscan->right = -200; | |
752 | |
753 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
754 &success, &error); | |
755 | |
756 ASSERT_FALSE(success); | |
757 EXPECT_EQ("Negative overscan not allowed.", error); | |
758 | |
759 EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString()); | |
760 | |
761 info.overscan->right= 0; | |
762 info.overscan->top = -300; | |
763 | |
764 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
765 &success, &error); | |
766 | |
767 ASSERT_FALSE(success); | |
768 EXPECT_EQ("Negative overscan not allowed.", error); | |
769 | |
770 EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString()); | |
771 | |
772 info.overscan->right= 0; | |
773 info.overscan->top = -1000; | |
774 | |
775 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
776 &success, &error); | |
777 | |
778 ASSERT_FALSE(success); | |
779 EXPECT_EQ("Negative overscan not allowed.", error); | |
780 | |
781 EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString()); | |
782 | |
783 info.overscan->right= 0; | |
784 info.overscan->top = 0; | |
785 | |
786 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
787 &success, &error); | |
788 | |
789 ASSERT_TRUE(success); | |
790 EXPECT_TRUE(error.empty()); | |
791 | |
792 EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString()); | |
793 } | |
794 | |
795 TEST_F(DisplayInfoProviderChromeosTest, SetOverscanLargerThanHorizontalBounds) { | |
796 UpdateDisplay("1200x600,600x1000*2"); | |
797 | |
798 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
799 api::system_display::DisplayProperties info; | |
800 info.overscan.reset(new 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; | |
806 | |
807 bool success = false; | |
808 std::string error; | |
809 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
810 &success, &error); | |
811 | |
812 ASSERT_FALSE(success); | |
813 EXPECT_EQ("Horizontal overscan is more than half of the screen width.", | |
814 error); | |
815 } | |
816 | |
817 TEST_F(DisplayInfoProviderChromeosTest, SetOverscanLargerThanVerticalBounds) { | |
818 UpdateDisplay("1200x600,600x1000"); | |
819 | |
820 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
821 api::system_display::DisplayProperties info; | |
822 info.overscan.reset(new 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; | |
828 | |
829 bool success = false; | |
830 std::string error; | |
831 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
832 &success, &error); | |
833 | |
834 ASSERT_FALSE(success); | |
835 EXPECT_EQ("Vertical overscan is more than half of the screen height.", | |
836 error); | |
837 } | |
838 | |
839 TEST_F(DisplayInfoProviderChromeosTest, SetOverscan) { | |
840 UpdateDisplay("1200x600,600x1000*2"); | |
841 | |
842 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
843 api::system_display::DisplayProperties info; | |
844 info.overscan.reset(new api::system_display::Insets); | |
845 info.overscan->left= 20; | |
846 info.overscan->top = 199; | |
847 info.overscan->right = 130; | |
848 info.overscan->bottom = 51; | |
849 | |
850 bool success = false; | |
851 std::string error; | |
852 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
853 &success, &error); | |
854 | |
855 ASSERT_TRUE(success); | |
856 EXPECT_TRUE(error.empty()); | |
857 | |
858 EXPECT_EQ("1200,0 150x250", secondary.bounds().ToString()); | |
859 const gfx::Insets overscan = | |
860 GetDisplayManager()->GetOverscanInsets(secondary.id()); | |
861 | |
862 EXPECT_EQ(20, overscan.left()); | |
863 EXPECT_EQ(199, overscan.top()); | |
864 EXPECT_EQ(130, overscan.right()); | |
865 EXPECT_EQ(51, overscan.bottom()); | |
866 } | |
867 | |
868 TEST_F(DisplayInfoProviderChromeosTest, SetOverscanForInternal) { | |
869 UpdateDisplay("1200x600,600x1000*2"); | |
870 const int64 internal_display_id = | |
871 ash::test::DisplayManagerTestApi(GetDisplayManager()). | |
872 SetFirstDisplayAsInternalDisplay(); | |
873 | |
874 api::system_display::DisplayProperties info; | |
875 info.overscan.reset(new api::system_display::Insets); | |
876 // Vertical overscan is 501, which would make the bounds height 499. | |
877 info.overscan->left= 20; | |
878 info.overscan->top = 20; | |
879 info.overscan->right = 20; | |
880 info.overscan->bottom = 20; | |
881 | |
882 bool success = false; | |
883 std::string error; | |
884 CallSetDisplayUnitInfo(base::Int64ToString(internal_display_id), info, | |
885 &success, &error); | |
886 | |
887 ASSERT_FALSE(success); | |
888 EXPECT_EQ("Overscan changes not allowed for the internal monitor.", | |
889 error); | |
890 } | |
891 | |
892 } // namespace | |
893 } // namespace extensions | |
OLD | NEW |