display_controller_unittest.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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.
4
5#include "ash/display/display_controller.h"
6
7#include "ash/display/display_info.h"
8#include "ash/display/display_layout_store.h"
9#include "ash/display/display_manager.h"
10#include "ash/launcher/launcher.h"
11#include "ash/screen_ash.h"
12#include "ash/shelf/shelf_widget.h"
13#include "ash/shell.h"
14#include "ash/test/ash_test_base.h"
15#include "ash/test/cursor_manager_test_api.h"
16#include "ui/aura/env.h"
17#include "ui/aura/root_window.h"
18#include "ui/aura/test/event_generator.h"
19#include "ui/aura/window_tracker.h"
20#include "ui/base/events/event_handler.h"
21#include "ui/gfx/display.h"
22#include "ui/gfx/screen.h"
23#include "ui/views/widget/widget.h"
24
25#if defined(USE_X11)
26#include "ui/base/x/x11_util.h"
27#include <X11/Xlib.h>
28#undef RootWindow
29#endif
30
31namespace ash {
32namespace test {
33namespace {
34
35const char kDesktopBackgroundView[] = "DesktopBackgroundView";
36
37class TestObserver : public DisplayController::Observer {
38 public:
39  TestObserver() : changing_count_(0), changed_count_(0) {
40    Shell::GetInstance()->display_controller()->AddObserver(this);
41  }
42
43  virtual ~TestObserver() {
44    Shell::GetInstance()->display_controller()->RemoveObserver(this);
45  }
46
47  virtual void OnDisplayConfigurationChanging() OVERRIDE {
48    ++changing_count_;
49  }
50
51  virtual void OnDisplayConfigurationChanged() OVERRIDE {
52    ++changed_count_;
53  }
54
55  int CountAndReset() {
56    EXPECT_EQ(changing_count_, changed_count_);
57    int c = changing_count_;
58    changing_count_ = changed_count_ = 0;
59    return c;
60  }
61
62 private:
63  int changing_count_;
64  int changed_count_;
65
66  DISALLOW_COPY_AND_ASSIGN(TestObserver);
67};
68
69gfx::Display GetPrimaryDisplay() {
70  return Shell::GetScreen()->GetDisplayNearestWindow(
71      Shell::GetAllRootWindows()[0]);
72}
73
74gfx::Display GetSecondaryDisplay() {
75  return Shell::GetScreen()->GetDisplayNearestWindow(
76      Shell::GetAllRootWindows()[1]);
77}
78
79void SetSecondaryDisplayLayoutAndOffset(DisplayLayout::Position position,
80                                        int offset) {
81  DisplayLayout layout(position, offset);
82  ASSERT_GT(Shell::GetScreen()->GetNumDisplays(), 1);
83  Shell::GetInstance()->display_controller()->
84      SetLayoutForCurrentDisplays(layout);
85}
86
87void SetSecondaryDisplayLayout(DisplayLayout::Position position) {
88  SetSecondaryDisplayLayoutAndOffset(position, 0);
89}
90
91void SetDefaultDisplayLayout(DisplayLayout::Position position) {
92  Shell::GetInstance()->display_manager()->layout_store()->
93      SetDefaultDisplayLayout(DisplayLayout(position, 0));
94}
95
96class DisplayControllerShutdownTest : public test::AshTestBase {
97 public:
98  virtual void TearDown() OVERRIDE {
99    test::AshTestBase::TearDown();
100    if (!SupportsMultipleDisplays())
101      return;
102
103    // Make sure that primary display is accessible after shutdown.
104    gfx::Display primary = Shell::GetScreen()->GetPrimaryDisplay();
105    EXPECT_EQ("0,0 444x333", primary.bounds().ToString());
106    EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
107  }
108};
109
110class TestEventHandler : public ui::EventHandler {
111 public:
112  TestEventHandler() : target_root_(NULL),
113                       touch_radius_x_(0.0),
114                       touch_radius_y_(0.0),
115                       scroll_x_offset_(0.0),
116                       scroll_y_offset_(0.0),
117                       scroll_x_offset_ordinal_(0.0),
118                       scroll_y_offset_ordinal_(0.0) {}
119  virtual ~TestEventHandler() {}
120
121  virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE {
122    if (event->flags() & ui::EF_IS_SYNTHESIZED &&
123        event->type() != ui::ET_MOUSE_EXITED &&
124        event->type() != ui::ET_MOUSE_ENTERED) {
125      return;
126    }
127    aura::Window* target = static_cast<aura::Window*>(event->target());
128    mouse_location_ = event->root_location();
129    target_root_ = target->GetRootWindow();
130    event->StopPropagation();
131  }
132
133  virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
134    aura::Window* target = static_cast<aura::Window*>(event->target());
135    // Only record when the target is the background which covers
136    // entire root window.
137    if (target->name() != kDesktopBackgroundView)
138      return;
139    touch_radius_x_ = event->radius_x();
140    touch_radius_y_ = event->radius_y();
141    event->StopPropagation();
142  }
143
144  virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE {
145    aura::Window* target = static_cast<aura::Window*>(event->target());
146    // Only record when the target is the background which covers
147    // entire root window.
148    if (target->name() != kDesktopBackgroundView)
149      return;
150
151    if (event->type() == ui::ET_SCROLL) {
152      scroll_x_offset_ = event->x_offset();
153      scroll_y_offset_ = event->y_offset();
154      scroll_x_offset_ordinal_ = event->x_offset_ordinal();
155      scroll_y_offset_ordinal_ = event->y_offset_ordinal();
156    }
157    event->StopPropagation();
158  }
159
160  std::string GetLocationAndReset() {
161    std::string result = mouse_location_.ToString();
162    mouse_location_.SetPoint(0, 0);
163    target_root_ = NULL;
164    return result;
165  }
166
167  float touch_radius_x() { return touch_radius_x_; }
168  float touch_radius_y() { return touch_radius_y_; }
169  float scroll_x_offset() { return scroll_x_offset_; }
170  float scroll_y_offset() { return scroll_y_offset_; }
171  float scroll_x_offset_ordinal() { return scroll_x_offset_ordinal_; }
172  float scroll_y_offset_ordinal() { return scroll_y_offset_ordinal_; }
173
174 private:
175  gfx::Point mouse_location_;
176  aura::RootWindow* target_root_;
177
178  float touch_radius_x_;
179  float touch_radius_y_;
180  float scroll_x_offset_;
181  float scroll_y_offset_;
182  float scroll_x_offset_ordinal_;
183  float scroll_y_offset_ordinal_;
184
185  DISALLOW_COPY_AND_ASSIGN(TestEventHandler);
186};
187
188gfx::Display::Rotation GetStoredRotation(int64 id) {
189  return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).rotation();
190}
191
192float GetStoredUIScale(int64 id) {
193  return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).ui_scale();
194}
195
196#if defined(USE_X11)
197void GetPrimaryAndSeconary(aura::RootWindow** primary,
198                           aura::RootWindow** secondary) {
199  *primary = Shell::GetPrimaryRootWindow();
200  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
201  *secondary = root_windows[0] == *primary ? root_windows[1] : root_windows[0];
202}
203
204std::string GetXWindowName(aura::RootWindow* window) {
205  char* name = NULL;
206  XFetchName(ui::GetXDisplay(), window->GetAcceleratedWidget(), &name);
207  return std::string(name);
208}
209#endif
210
211}  // namespace
212
213typedef test::AshTestBase DisplayControllerTest;
214
215TEST_F(DisplayControllerShutdownTest, Shutdown) {
216  if (!SupportsMultipleDisplays())
217    return;
218
219  UpdateDisplay("444x333, 200x200");
220}
221
222TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
223  if (!SupportsMultipleDisplays())
224    return;
225
226  TestObserver observer;
227  UpdateDisplay("500x500,400x400");
228  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
229  gfx::Display* secondary_display =
230      Shell::GetInstance()->display_manager()->GetDisplayAt(1);
231  gfx::Insets insets(5, 5, 5, 5);
232  secondary_display->UpdateWorkAreaFromInsets(insets);
233
234  // Default layout is RIGHT.
235  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
236  EXPECT_EQ("500,0 400x400", GetSecondaryDisplay().bounds().ToString());
237  EXPECT_EQ("505,5 390x390", GetSecondaryDisplay().work_area().ToString());
238
239  // Layout the secondary display to the bottom of the primary.
240  SetSecondaryDisplayLayout(DisplayLayout::BOTTOM);
241  EXPECT_EQ(1, observer.CountAndReset());
242  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
243  EXPECT_EQ("0,500 400x400", GetSecondaryDisplay().bounds().ToString());
244  EXPECT_EQ("5,505 390x390", GetSecondaryDisplay().work_area().ToString());
245
246  // Layout the secondary display to the left of the primary.
247  SetSecondaryDisplayLayout(DisplayLayout::LEFT);
248  EXPECT_EQ(1, observer.CountAndReset());
249  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
250  EXPECT_EQ("-400,0 400x400", GetSecondaryDisplay().bounds().ToString());
251  EXPECT_EQ("-395,5 390x390", GetSecondaryDisplay().work_area().ToString());
252
253  // Layout the secondary display to the top of the primary.
254  SetSecondaryDisplayLayout(DisplayLayout::TOP);
255  EXPECT_EQ(1, observer.CountAndReset());
256  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
257  EXPECT_EQ("0,-400 400x400", GetSecondaryDisplay().bounds().ToString());
258  EXPECT_EQ("5,-395 390x390", GetSecondaryDisplay().work_area().ToString());
259
260  // Layout to the right with an offset.
261  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 300);
262  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
263  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
264  EXPECT_EQ("500,300 400x400", GetSecondaryDisplay().bounds().ToString());
265
266  // Keep the minimum 100.
267  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 490);
268  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
269  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
270  EXPECT_EQ("500,400 400x400", GetSecondaryDisplay().bounds().ToString());
271
272  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, -400);
273  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
274  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
275  EXPECT_EQ("500,-300 400x400", GetSecondaryDisplay().bounds().ToString());
276
277  //  Layout to the bottom with an offset.
278  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -200);
279  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
280  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
281  EXPECT_EQ("-200,500 400x400", GetSecondaryDisplay().bounds().ToString());
282
283  // Keep the minimum 100.
284  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, 490);
285  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
286  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
287  EXPECT_EQ("400,500 400x400", GetSecondaryDisplay().bounds().ToString());
288
289  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -400);
290  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
291  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
292  EXPECT_EQ("-300,500 400x400", GetSecondaryDisplay().bounds().ToString());
293}
294
295TEST_F(DisplayControllerTest, BoundsUpdated) {
296  if (!SupportsMultipleDisplays())
297    return;
298
299  TestObserver observer;
300  SetDefaultDisplayLayout(DisplayLayout::BOTTOM);
301  UpdateDisplay("200x200,300x300");  // layout, resize and add.
302  EXPECT_EQ(1, observer.CountAndReset());
303
304  internal::DisplayManager* display_manager =
305      Shell::GetInstance()->display_manager();
306  gfx::Display* secondary_display = display_manager->GetDisplayAt(1);
307  gfx::Insets insets(5, 5, 5, 5);
308  secondary_display->UpdateWorkAreaFromInsets(insets);
309
310  EXPECT_EQ("0,0 200x200", GetPrimaryDisplay().bounds().ToString());
311  EXPECT_EQ("0,200 300x300", GetSecondaryDisplay().bounds().ToString());
312  EXPECT_EQ("5,205 290x290", GetSecondaryDisplay().work_area().ToString());
313
314  UpdateDisplay("400x400,200x200");
315  EXPECT_EQ(1, observer.CountAndReset());  // two resizes
316  EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString());
317  EXPECT_EQ("0,400 200x200", GetSecondaryDisplay().bounds().ToString());
318
319  UpdateDisplay("400x400,300x300");
320  EXPECT_EQ(1, observer.CountAndReset());
321  EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString());
322  EXPECT_EQ("0,400 300x300", GetSecondaryDisplay().bounds().ToString());
323
324  UpdateDisplay("400x400");
325  EXPECT_EQ(1, observer.CountAndReset());
326  EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString());
327  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
328
329  UpdateDisplay("400x500*2,300x300");
330  EXPECT_EQ(1, observer.CountAndReset());
331  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
332  EXPECT_EQ("0,0 200x250", GetPrimaryDisplay().bounds().ToString());
333  EXPECT_EQ("0,250 300x300", GetSecondaryDisplay().bounds().ToString());
334
335  // No change
336  UpdateDisplay("400x500*2,300x300");
337  EXPECT_EQ(0, observer.CountAndReset());
338
339  // Rotation
340  int64 primary_id = GetPrimaryDisplay().id();
341  display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90);
342  EXPECT_EQ(1, observer.CountAndReset());
343  display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90);
344  EXPECT_EQ(0, observer.CountAndReset());
345
346  // UI scale is eanbled only on internal display.
347  int64 secondary_id = GetSecondaryDisplay().id();
348  gfx::Display::SetInternalDisplayId(secondary_id);
349  display_manager->SetDisplayUIScale(secondary_id, 1.125f);
350  EXPECT_EQ(1, observer.CountAndReset());
351  display_manager->SetDisplayUIScale(secondary_id, 1.125f);
352  EXPECT_EQ(0, observer.CountAndReset());
353  display_manager->SetDisplayUIScale(primary_id, 1.125f);
354  EXPECT_EQ(0, observer.CountAndReset());
355  display_manager->SetDisplayUIScale(primary_id, 1.125f);
356  EXPECT_EQ(0, observer.CountAndReset());
357}
358
359TEST_F(DisplayControllerTest, MirroredLayout) {
360  if (!SupportsMultipleDisplays())
361    return;
362
363  DisplayController* display_controller =
364      Shell::GetInstance()->display_controller();
365  UpdateDisplay("500x500,400x400");
366  EXPECT_FALSE(display_controller->GetCurrentDisplayLayout().mirrored);
367  EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
368  EXPECT_EQ(
369      2U, Shell::GetInstance()->display_manager()->num_connected_displays());
370
371  UpdateDisplay("1+0-500x500,1+0-500x500");
372  EXPECT_TRUE(display_controller->GetCurrentDisplayLayout().mirrored);
373  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
374  EXPECT_EQ(
375      2U, Shell::GetInstance()->display_manager()->num_connected_displays());
376
377  UpdateDisplay("500x500,500x500");
378  EXPECT_FALSE(display_controller->GetCurrentDisplayLayout().mirrored);
379  EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
380  EXPECT_EQ(
381      2U, Shell::GetInstance()->display_manager()->num_connected_displays());
382}
383
384TEST_F(DisplayControllerTest, InvertLayout) {
385  EXPECT_EQ("left, 0",
386            DisplayLayout(DisplayLayout::RIGHT, 0).Invert().ToString());
387  EXPECT_EQ("left, -100",
388            DisplayLayout(DisplayLayout::RIGHT, 100).Invert().ToString());
389  EXPECT_EQ("left, 50",
390            DisplayLayout(DisplayLayout::RIGHT, -50).Invert().ToString());
391
392  EXPECT_EQ("right, 0",
393            DisplayLayout(DisplayLayout::LEFT, 0).Invert().ToString());
394  EXPECT_EQ("right, -90",
395            DisplayLayout(DisplayLayout::LEFT, 90).Invert().ToString());
396  EXPECT_EQ("right, 60",
397            DisplayLayout(DisplayLayout::LEFT, -60).Invert().ToString());
398
399  EXPECT_EQ("bottom, 0",
400            DisplayLayout(DisplayLayout::TOP, 0).Invert().ToString());
401  EXPECT_EQ("bottom, -80",
402            DisplayLayout(DisplayLayout::TOP, 80).Invert().ToString());
403  EXPECT_EQ("bottom, 70",
404            DisplayLayout(DisplayLayout::TOP, -70).Invert().ToString());
405
406  EXPECT_EQ("top, 0",
407            DisplayLayout(DisplayLayout::BOTTOM, 0).Invert().ToString());
408  EXPECT_EQ("top, -70",
409            DisplayLayout(DisplayLayout::BOTTOM, 70).Invert().ToString());
410  EXPECT_EQ("top, 80",
411            DisplayLayout(DisplayLayout::BOTTOM, -80).Invert().ToString());
412}
413
414TEST_F(DisplayControllerTest, SwapPrimary) {
415  if (!SupportsMultipleDisplays())
416    return;
417
418  DisplayController* display_controller =
419      Shell::GetInstance()->display_controller();
420
421  UpdateDisplay("200x200,300x300");
422  gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
423  gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay();
424
425  DisplayLayout display_layout(DisplayLayout::RIGHT, 50);
426  display_controller->SetLayoutForCurrentDisplays(display_layout);
427
428  EXPECT_NE(primary_display.id(), secondary_display.id());
429  aura::RootWindow* primary_root =
430      display_controller->GetRootWindowForDisplayId(primary_display.id());
431  aura::RootWindow* secondary_root =
432      display_controller->GetRootWindowForDisplayId(secondary_display.id());
433  EXPECT_NE(primary_root, secondary_root);
434  aura::Window* launcher_window =
435      Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView();
436  EXPECT_TRUE(primary_root->Contains(launcher_window));
437  EXPECT_FALSE(secondary_root->Contains(launcher_window));
438  EXPECT_EQ(primary_display.id(),
439            Shell::GetScreen()->GetDisplayNearestPoint(
440                gfx::Point(-100, -100)).id());
441  EXPECT_EQ(primary_display.id(),
442            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
443
444  EXPECT_EQ("0,0 200x200", primary_display.bounds().ToString());
445  EXPECT_EQ("0,0 200x152", primary_display.work_area().ToString());
446  EXPECT_EQ("200,0 300x300", secondary_display.bounds().ToString());
447  EXPECT_EQ("200,0 300x252", secondary_display.work_area().ToString());
448  EXPECT_EQ("right, 50",
449            display_controller->GetCurrentDisplayLayout().ToString());
450
451  // Switch primary and secondary
452  display_controller->SetPrimaryDisplay(secondary_display);
453  const DisplayLayout& inverted_layout =
454      display_controller->GetCurrentDisplayLayout();
455  EXPECT_EQ("left, -50", inverted_layout.ToString());
456
457  EXPECT_EQ(secondary_display.id(),
458            Shell::GetScreen()->GetPrimaryDisplay().id());
459  EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id());
460  EXPECT_EQ(secondary_display.id(),
461            Shell::GetScreen()->GetDisplayNearestPoint(
462                gfx::Point(-100, -100)).id());
463  EXPECT_EQ(secondary_display.id(),
464            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
465
466  EXPECT_EQ(
467      primary_root,
468      display_controller->GetRootWindowForDisplayId(secondary_display.id()));
469  EXPECT_EQ(
470      secondary_root,
471      display_controller->GetRootWindowForDisplayId(primary_display.id()));
472  EXPECT_TRUE(primary_root->Contains(launcher_window));
473  EXPECT_FALSE(secondary_root->Contains(launcher_window));
474
475  // Test if the bounds are correctly swapped.
476  gfx::Display swapped_primary = Shell::GetScreen()->GetPrimaryDisplay();
477  gfx::Display swapped_secondary = ScreenAsh::GetSecondaryDisplay();
478  EXPECT_EQ("0,0 300x300", swapped_primary.bounds().ToString());
479  EXPECT_EQ("0,0 300x252", swapped_primary.work_area().ToString());
480  EXPECT_EQ("-200,-50 200x200", swapped_secondary.bounds().ToString());
481
482  EXPECT_EQ("-200,-50 200x152", swapped_secondary.work_area().ToString());
483
484  aura::WindowTracker tracker;
485  tracker.Add(primary_root);
486  tracker.Add(secondary_root);
487
488  // Deleting 2nd display should move the primary to original primary display.
489  UpdateDisplay("200x200");
490  RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
491  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
492  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id());
493  EXPECT_EQ(primary_display.id(),
494            Shell::GetScreen()->GetDisplayNearestPoint(
495                gfx::Point(-100, -100)).id());
496  EXPECT_EQ(primary_display.id(),
497            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
498  EXPECT_TRUE(tracker.Contains(primary_root));
499  EXPECT_FALSE(tracker.Contains(secondary_root));
500  EXPECT_TRUE(primary_root->Contains(launcher_window));
501}
502
503TEST_F(DisplayControllerTest, SwapPrimaryById) {
504  if (!SupportsMultipleDisplays())
505    return;
506
507  DisplayController* display_controller =
508      Shell::GetInstance()->display_controller();
509
510  UpdateDisplay("200x200,300x300");
511  gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
512  gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay();
513
514  DisplayLayout display_layout(DisplayLayout::RIGHT, 50);
515  display_controller->SetLayoutForCurrentDisplays(display_layout);
516
517  EXPECT_NE(primary_display.id(), secondary_display.id());
518  aura::RootWindow* primary_root =
519      display_controller->GetRootWindowForDisplayId(primary_display.id());
520  aura::RootWindow* secondary_root =
521      display_controller->GetRootWindowForDisplayId(secondary_display.id());
522  aura::Window* launcher_window =
523      Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView();
524  EXPECT_TRUE(primary_root->Contains(launcher_window));
525  EXPECT_FALSE(secondary_root->Contains(launcher_window));
526  EXPECT_NE(primary_root, secondary_root);
527  EXPECT_EQ(primary_display.id(),
528            Shell::GetScreen()->GetDisplayNearestPoint(
529                gfx::Point(-100, -100)).id());
530  EXPECT_EQ(primary_display.id(),
531            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
532
533  // Switch primary and secondary by display ID.
534  TestObserver observer;
535  display_controller->SetPrimaryDisplayId(secondary_display.id());
536  EXPECT_EQ(secondary_display.id(),
537            Shell::GetScreen()->GetPrimaryDisplay().id());
538  EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id());
539  EXPECT_LT(0, observer.CountAndReset());
540
541  EXPECT_EQ(
542      primary_root,
543      display_controller->GetRootWindowForDisplayId(secondary_display.id()));
544  EXPECT_EQ(
545      secondary_root,
546      display_controller->GetRootWindowForDisplayId(primary_display.id()));
547  EXPECT_TRUE(primary_root->Contains(launcher_window));
548  EXPECT_FALSE(secondary_root->Contains(launcher_window));
549
550  const DisplayLayout& inverted_layout =
551      display_controller->GetCurrentDisplayLayout();
552
553  EXPECT_EQ("left, -50", inverted_layout.ToString());
554
555  // Calling the same ID don't do anything.
556  display_controller->SetPrimaryDisplayId(secondary_display.id());
557  EXPECT_EQ(0, observer.CountAndReset());
558
559  aura::WindowTracker tracker;
560  tracker.Add(primary_root);
561  tracker.Add(secondary_root);
562
563  // Deleting 2nd display should move the primary to original primary display.
564  UpdateDisplay("200x200");
565  RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
566  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
567  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id());
568  EXPECT_EQ(primary_display.id(),
569            Shell::GetScreen()->GetDisplayNearestPoint(
570                gfx::Point(-100, -100)).id());
571  EXPECT_EQ(primary_display.id(),
572            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
573  EXPECT_TRUE(tracker.Contains(primary_root));
574  EXPECT_FALSE(tracker.Contains(secondary_root));
575  EXPECT_TRUE(primary_root->Contains(launcher_window));
576
577  internal::DisplayManager* display_manager =
578      Shell::GetInstance()->display_manager();
579  // Adding 2nd display with the same ID.  The 2nd display should become primary
580  // since secondary id is still stored as desirable_primary_id.
581  std::vector<internal::DisplayInfo> display_info_list;
582  display_info_list.push_back(
583      display_manager->GetDisplayInfo(primary_display.id()));
584  display_info_list.push_back(
585      display_manager->GetDisplayInfo(secondary_display.id()));
586  display_manager->OnNativeDisplaysChanged(display_info_list);
587
588  EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
589  EXPECT_EQ(secondary_display.id(),
590            Shell::GetScreen()->GetPrimaryDisplay().id());
591  EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id());
592  EXPECT_EQ(
593      primary_root,
594      display_controller->GetRootWindowForDisplayId(secondary_display.id()));
595  EXPECT_NE(
596      primary_root,
597      display_controller->GetRootWindowForDisplayId(primary_display.id()));
598  EXPECT_TRUE(primary_root->Contains(launcher_window));
599
600  // Deleting 2nd display and adding 2nd display with a different ID.  The 2nd
601  // display shouldn't become primary.
602  UpdateDisplay("200x200");
603  internal::DisplayInfo third_display_info(
604      secondary_display.id() + 1, std::string(), false);
605  third_display_info.SetBounds(secondary_display.bounds());
606  ASSERT_NE(primary_display.id(), third_display_info.id());
607
608  const internal::DisplayInfo& primary_display_info =
609      display_manager->GetDisplayInfo(primary_display.id());
610  std::vector<internal::DisplayInfo> display_info_list2;
611  display_info_list2.push_back(primary_display_info);
612  display_info_list2.push_back(third_display_info);
613  display_manager->OnNativeDisplaysChanged(display_info_list2);
614  EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
615  EXPECT_EQ(primary_display.id(),
616            Shell::GetScreen()->GetPrimaryDisplay().id());
617  EXPECT_EQ(third_display_info.id(), ScreenAsh::GetSecondaryDisplay().id());
618  EXPECT_EQ(
619      primary_root,
620      display_controller->GetRootWindowForDisplayId(primary_display.id()));
621  EXPECT_NE(
622      primary_root,
623      display_controller->GetRootWindowForDisplayId(third_display_info.id()));
624  EXPECT_TRUE(primary_root->Contains(launcher_window));
625}
626
627TEST_F(DisplayControllerTest, CursorDeviceScaleFactorSwapPrimary) {
628  if (!SupportsMultipleDisplays())
629    return;
630
631  DisplayController* display_controller =
632      Shell::GetInstance()->display_controller();
633
634  UpdateDisplay("200x200,200x200*2");
635  gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
636  gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay();
637
638  aura::RootWindow* primary_root =
639      display_controller->GetRootWindowForDisplayId(primary_display.id());
640  aura::RootWindow* secondary_root =
641      display_controller->GetRootWindowForDisplayId(secondary_display.id());
642  EXPECT_NE(primary_root, secondary_root);
643
644  test::CursorManagerTestApi test_api(Shell::GetInstance()->cursor_manager());
645
646  EXPECT_EQ(1.0f,
647            primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
648  primary_root->MoveCursorTo(gfx::Point(50, 50));
649  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
650  EXPECT_EQ(2.0f,
651            secondary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
652  secondary_root->MoveCursorTo(gfx::Point(50, 50));
653  EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor());
654
655  // Switch primary and secondary
656  display_controller->SetPrimaryDisplay(secondary_display);
657
658  // Cursor's device scale factor should be updated accroding to the swap of
659  // primary and secondary.
660  EXPECT_EQ(1.0f,
661            secondary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
662  secondary_root->MoveCursorTo(gfx::Point(50, 50));
663  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
664  primary_root->MoveCursorTo(gfx::Point(50, 50));
665  EXPECT_EQ(2.0f,
666            primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
667  EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor());
668
669  // Deleting 2nd display.
670  UpdateDisplay("200x200");
671  RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
672
673  // Cursor's device scale factor should be updated even without moving cursor.
674  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
675
676  primary_root->MoveCursorTo(gfx::Point(50, 50));
677  EXPECT_EQ(1.0f,
678            primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
679  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
680}
681
682#if defined(OS_WIN)
683// TODO(scottmg): RootWindow doesn't get resized on Windows
684// Ash. http://crbug.com/247916.
685#define MAYBE_UpdateDisplayWithHostOrigin DISABLED_UpdateDisplayWithHostOrigin
686#else
687#define MAYBE_UpdateDisplayWithHostOrigin UpdateDisplayWithHostOrigin
688#endif
689
690TEST_F(DisplayControllerTest, MAYBE_UpdateDisplayWithHostOrigin) {
691  UpdateDisplay("100x200,300x400");
692  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
693  Shell::RootWindowList root_windows =
694      Shell::GetInstance()->GetAllRootWindows();
695  ASSERT_EQ(2U, root_windows.size());
696  EXPECT_EQ("1,1", root_windows[0]->GetHostOrigin().ToString());
697  EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString());
698  // UpdateDisplay set the origin if it's not set.
699  EXPECT_NE("1,1", root_windows[1]->GetHostOrigin().ToString());
700  EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString());
701
702  UpdateDisplay("100x200,200+300-300x400");
703  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
704  EXPECT_EQ("0,0", root_windows[0]->GetHostOrigin().ToString());
705  EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString());
706  EXPECT_EQ("200,300", root_windows[1]->GetHostOrigin().ToString());
707  EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString());
708
709  UpdateDisplay("400+500-200x300,300x400");
710  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
711  EXPECT_EQ("400,500", root_windows[0]->GetHostOrigin().ToString());
712  EXPECT_EQ("200x300", root_windows[0]->GetHostSize().ToString());
713  EXPECT_EQ("0,0", root_windows[1]->GetHostOrigin().ToString());
714  EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString());
715
716  UpdateDisplay("100+200-100x200,300+500-200x300");
717  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
718  EXPECT_EQ("100,200", root_windows[0]->GetHostOrigin().ToString());
719  EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString());
720  EXPECT_EQ("300,500", root_windows[1]->GetHostOrigin().ToString());
721  EXPECT_EQ("200x300", root_windows[1]->GetHostSize().ToString());
722}
723
724TEST_F(DisplayControllerTest, OverscanInsets) {
725  if (!SupportsMultipleDisplays())
726    return;
727
728  DisplayController* display_controller =
729      Shell::GetInstance()->display_controller();
730  TestEventHandler event_handler;
731  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
732
733  UpdateDisplay("120x200,300x400*2");
734  gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
735  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
736
737  display_controller->SetOverscanInsets(display1.id(),
738                                        gfx::Insets(10, 15, 20, 25));
739  EXPECT_EQ("0,0 80x170", root_windows[0]->bounds().ToString());
740  EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
741  EXPECT_EQ("80,0 150x200",
742            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
743
744  aura::test::EventGenerator generator(root_windows[0]);
745  generator.MoveMouseToInHost(20, 25);
746  EXPECT_EQ("5,15", event_handler.GetLocationAndReset());
747
748  display_controller->SetOverscanInsets(display1.id(), gfx::Insets());
749  EXPECT_EQ("0,0 120x200", root_windows[0]->bounds().ToString());
750  EXPECT_EQ("120,0 150x200",
751            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
752
753  generator.MoveMouseToInHost(30, 20);
754  EXPECT_EQ("30,20", event_handler.GetLocationAndReset());
755
756  // Make sure the root window transformer uses correct scale
757  // factor when swapping display. Test crbug.com/253690.
758  UpdateDisplay("400x300*2,600x400/o");
759  root_windows = Shell::GetAllRootWindows();
760  gfx::Point point;
761  Shell::GetAllRootWindows()[1]->GetRootTransform().TransformPoint(point);
762  EXPECT_EQ("15,10", point.ToString());
763
764  display_controller->SwapPrimaryDisplay();
765  point.SetPoint(0, 0);
766  Shell::GetAllRootWindows()[1]->GetRootTransform().TransformPoint(point);
767  EXPECT_EQ("15,10", point.ToString());
768
769  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
770}
771
772TEST_F(DisplayControllerTest, Rotate) {
773  if (!SupportsMultipleDisplays())
774    return;
775
776  DisplayController* display_controller =
777      Shell::GetInstance()->display_controller();
778  internal::DisplayManager* display_manager =
779      Shell::GetInstance()->display_manager();
780  TestEventHandler event_handler;
781  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
782
783  UpdateDisplay("120x200,300x400*2");
784  gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
785  int64 display2_id = ScreenAsh::GetSecondaryDisplay().id();
786  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
787  aura::test::EventGenerator generator1(root_windows[0]);
788
789  EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString());
790  EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
791  EXPECT_EQ("120,0 150x200",
792            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
793  generator1.MoveMouseToInHost(50, 40);
794  EXPECT_EQ("50,40", event_handler.GetLocationAndReset());
795  EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display1.id()));
796  EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id));
797
798  display_manager->SetDisplayRotation(display1.id(),
799                                      gfx::Display::ROTATE_90);
800  EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString());
801  EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
802  EXPECT_EQ("200,0 150x200",
803            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
804  generator1.MoveMouseToInHost(50, 40);
805  EXPECT_EQ("40,69", event_handler.GetLocationAndReset());
806  EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id()));
807  EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id));
808
809  DisplayLayout display_layout(DisplayLayout::BOTTOM, 50);
810  display_controller->SetLayoutForCurrentDisplays(display_layout);
811  EXPECT_EQ("50,120 150x200",
812            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
813
814  display_manager->SetDisplayRotation(display2_id,
815                                      gfx::Display::ROTATE_270);
816  EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString());
817  EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString());
818  EXPECT_EQ("50,120 200x150",
819            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
820  EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id()));
821  EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id));
822
823#if !defined(OS_WIN)
824  aura::test::EventGenerator generator2(root_windows[1]);
825  generator2.MoveMouseToInHost(50, 40);
826  EXPECT_EQ("179,25", event_handler.GetLocationAndReset());
827  display_manager->SetDisplayRotation(display1.id(),
828                                      gfx::Display::ROTATE_180);
829
830  EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString());
831  EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString());
832  // Dislay must share at least 100, so the x's offset becomes 20.
833  EXPECT_EQ("20,200 200x150",
834            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
835  EXPECT_EQ(gfx::Display::ROTATE_180, GetStoredRotation(display1.id()));
836  EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id));
837
838  generator1.MoveMouseToInHost(50, 40);
839  EXPECT_EQ("69,159", event_handler.GetLocationAndReset());
840#endif
841
842  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
843}
844
845TEST_F(DisplayControllerTest, ScaleRootWindow) {
846  if (!SupportsMultipleDisplays())
847    return;
848
849  TestEventHandler event_handler;
850  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
851
852  UpdateDisplay("600x400*2@1.5,500x300");
853
854  gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
855  gfx::Display::SetInternalDisplayId(display1.id());
856
857  gfx::Display display2 = ScreenAsh::GetSecondaryDisplay();
858  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
859  EXPECT_EQ("0,0 450x300", display1.bounds().ToString());
860  EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString());
861  EXPECT_EQ("450,0 500x300", display2.bounds().ToString());
862  EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
863  EXPECT_EQ(1.0f, GetStoredUIScale(display2.id()));
864
865  aura::test::EventGenerator generator(root_windows[0]);
866  generator.MoveMouseToInHost(599, 200);
867  EXPECT_EQ("449,150", event_handler.GetLocationAndReset());
868
869  internal::DisplayManager* display_manager =
870      Shell::GetInstance()->display_manager();
871  display_manager->SetDisplayUIScale(display1.id(), 1.25f);
872  display1 = Shell::GetScreen()->GetPrimaryDisplay();
873  display2 = ScreenAsh::GetSecondaryDisplay();
874  EXPECT_EQ("0,0 375x250", display1.bounds().ToString());
875  EXPECT_EQ("0,0 375x250", root_windows[0]->bounds().ToString());
876  EXPECT_EQ("375,0 500x300", display2.bounds().ToString());
877  EXPECT_EQ(1.25f, GetStoredUIScale(display1.id()));
878  EXPECT_EQ(1.0f, GetStoredUIScale(display2.id()));
879
880  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
881}
882
883TEST_F(DisplayControllerTest, TouchScale) {
884  if (!SupportsMultipleDisplays())
885    return;
886
887  TestEventHandler event_handler;
888  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
889
890  UpdateDisplay("200x200*2");
891  gfx::Display display = Shell::GetScreen()->GetPrimaryDisplay();
892  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
893  aura::RootWindow* root_window = root_windows[0];
894  aura::test::EventGenerator generator(root_window);
895
896  generator.PressMoveAndReleaseTouchTo(50, 50);
897  // Default test touches have radius_x/y = 1.0, with device scale
898  // factor = 2, the scaled radius_x/y should be 0.5.
899  EXPECT_EQ(0.5, event_handler.touch_radius_x());
900  EXPECT_EQ(0.5, event_handler.touch_radius_y());
901
902  generator.ScrollSequence(gfx::Point(0,0),
903                           base::TimeDelta::FromMilliseconds(100),
904                           10.0, 1.0, 5, 1);
905
906  // With device scale factor = 2, ordinal_offset * 2 = offset.
907  EXPECT_EQ(event_handler.scroll_x_offset(),
908            event_handler.scroll_x_offset_ordinal() * 2);
909  EXPECT_EQ(event_handler.scroll_y_offset(),
910            event_handler.scroll_y_offset_ordinal() * 2);
911
912  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
913}
914
915TEST_F(DisplayControllerTest, ConvertHostToRootCoords) {
916  if (!SupportsMultipleDisplays())
917    return;
918
919  TestEventHandler event_handler;
920  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
921
922  UpdateDisplay("600x400*2/r@1.5");
923
924  gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
925  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
926  EXPECT_EQ("0,0 300x450", display1.bounds().ToString());
927  EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString());
928  EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
929
930  aura::test::EventGenerator generator(root_windows[0]);
931  generator.MoveMouseToInHost(0, 0);
932  EXPECT_EQ("0,449", event_handler.GetLocationAndReset());
933  generator.MoveMouseToInHost(599, 0);
934  EXPECT_EQ("0,0", event_handler.GetLocationAndReset());
935  generator.MoveMouseToInHost(599, 399);
936  EXPECT_EQ("299,0", event_handler.GetLocationAndReset());
937  generator.MoveMouseToInHost(0, 399);
938  EXPECT_EQ("299,449", event_handler.GetLocationAndReset());
939
940  UpdateDisplay("600x400*2/u@1.5");
941  display1 = Shell::GetScreen()->GetPrimaryDisplay();
942  root_windows = Shell::GetAllRootWindows();
943  EXPECT_EQ("0,0 450x300", display1.bounds().ToString());
944  EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString());
945  EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
946
947  generator.MoveMouseToInHost(0, 0);
948  EXPECT_EQ("449,299", event_handler.GetLocationAndReset());
949  generator.MoveMouseToInHost(599, 0);
950  EXPECT_EQ("0,299", event_handler.GetLocationAndReset());
951  generator.MoveMouseToInHost(599, 399);
952  EXPECT_EQ("0,0", event_handler.GetLocationAndReset());
953  generator.MoveMouseToInHost(0, 399);
954  EXPECT_EQ("449,0", event_handler.GetLocationAndReset());
955
956  UpdateDisplay("600x400*2/l@1.5");
957  display1 = Shell::GetScreen()->GetPrimaryDisplay();
958  root_windows = Shell::GetAllRootWindows();
959  EXPECT_EQ("0,0 300x450", display1.bounds().ToString());
960  EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString());
961  EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
962
963  generator.MoveMouseToInHost(0, 0);
964  EXPECT_EQ("299,0", event_handler.GetLocationAndReset());
965  generator.MoveMouseToInHost(599, 0);
966  EXPECT_EQ("299,449", event_handler.GetLocationAndReset());
967  generator.MoveMouseToInHost(599, 399);
968  EXPECT_EQ("0,449", event_handler.GetLocationAndReset());
969  generator.MoveMouseToInHost(0, 399);
970  EXPECT_EQ("0,0", event_handler.GetLocationAndReset());
971
972  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
973}
974
975#if defined(USE_X11)
976TEST_F(DisplayControllerTest, XWidowNameForRootWindow) {
977  EXPECT_EQ("aura_root_0", GetXWindowName(Shell::GetPrimaryRootWindow()));
978
979  // Multiple display.
980  UpdateDisplay("200x200,300x300");
981  aura::RootWindow* primary, *secondary;
982  GetPrimaryAndSeconary(&primary, &secondary);
983  EXPECT_EQ("aura_root_0", GetXWindowName(primary));
984  EXPECT_EQ("aura_root_x", GetXWindowName(secondary));
985
986  // Swap primary.
987  primary = secondary = NULL;
988  Shell::GetInstance()->display_controller()->SwapPrimaryDisplay();
989  GetPrimaryAndSeconary(&primary, &secondary);
990  EXPECT_EQ("aura_root_0", GetXWindowName(primary));
991  EXPECT_EQ("aura_root_x", GetXWindowName(secondary));
992
993  // Switching back to single display.
994  UpdateDisplay("300x400");
995  EXPECT_EQ("aura_root_0", GetXWindowName(Shell::GetPrimaryRootWindow()));
996}
997#endif
998
999}  // namespace test
1000}  // namespace ash
1001