Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / ash / display / display_controller_unittest.cc
index a422109..bd8cf49 100644 (file)
@@ -8,29 +8,34 @@
 #include "ash/display/display_info.h"
 #include "ash/display/display_layout_store.h"
 #include "ash/display/display_manager.h"
-#include "ash/launcher/launcher.h"
-#include "ash/screen_ash.h"
+#include "ash/screen_util.h"
+#include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
+#include "ash/test/ash_test_helper.h"
 #include "ash/test/cursor_manager_test_api.h"
+#include "ash/test/display_manager_test_api.h"
+#include "ash/test/test_shell_delegate.h"
+#include "ash/wm/window_state.h"
+#include "ash/wm/wm_event.h"
 #include "base/command_line.h"
-#include "ui/aura/client/activation_change_observer.h"
-#include "ui/aura/client/activation_client.h"
 #include "ui/aura/client/focus_change_observer.h"
 #include "ui/aura/client/focus_client.h"
 #include "ui/aura/env.h"
-#include "ui/aura/root_window.h"
-#include "ui/aura/test/event_generator.h"
 #include "ui/aura/window_tracker.h"
+#include "ui/aura/window_tree_host.h"
 #include "ui/events/event_handler.h"
+#include "ui/events/test/event_generator.h"
 #include "ui/gfx/display.h"
 #include "ui/gfx/screen.h"
 #include "ui/views/widget/widget.h"
+#include "ui/wm/public/activation_change_observer.h"
+#include "ui/wm/public/activation_client.h"
 
 #if defined(USE_X11)
-#include "ui/gfx/x/x11_types.h"
 #include <X11/Xlib.h>
+#include "ui/gfx/x/x11_types.h"
 #undef RootWindow
 #endif
 
@@ -62,6 +67,8 @@ class TestObserver : public DisplayController::Observer,
       : changing_count_(0),
         changed_count_(0),
         bounds_changed_count_(0),
+        rotation_changed_count_(0),
+        workarea_changed_count_(0),
         changed_display_id_(0),
         focus_changed_count_(0),
         activation_changed_count_(0) {
@@ -91,9 +98,15 @@ class TestObserver : public DisplayController::Observer,
   }
 
   // Overrideen from gfx::DisplayObserver
-  virtual void OnDisplayBoundsChanged(const gfx::Display& display) OVERRIDE {
+  virtual void OnDisplayMetricsChanged(const gfx::Display& display,
+                                       uint32_t metrics) OVERRIDE {
     changed_display_id_ = display.id();
-    bounds_changed_count_ ++;
+    if (metrics & DISPLAY_METRIC_BOUNDS)
+      ++bounds_changed_count_;
+    if (metrics & DISPLAY_METRIC_ROTATION)
+      ++rotation_changed_count_;
+    if (metrics & DISPLAY_METRIC_WORK_AREA)
+      ++workarea_changed_count_;
   }
   virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE {
   }
@@ -126,6 +139,14 @@ class TestObserver : public DisplayController::Observer,
     return Resetter<int>(&bounds_changed_count_).value();
   }
 
+  int64 GetRotationChangedCountAndReset() {
+    return Resetter<int>(&rotation_changed_count_).value();
+  }
+
+  int64 GetWorkareaChangedCountAndReset() {
+    return Resetter<int>(&workarea_changed_count_).value();
+  }
+
   int64 GetChangedDisplayIdAndReset() {
     return Resetter<int64>(&changed_display_id_).value();
   }
@@ -143,6 +164,8 @@ class TestObserver : public DisplayController::Observer,
   int changed_count_;
 
   int bounds_changed_count_;
+  int rotation_changed_count_;
+  int workarea_changed_count_;
   int64 changed_display_id_;
 
   int focus_changed_count_;
@@ -180,6 +203,9 @@ void SetDefaultDisplayLayout(DisplayLayout::Position position) {
 
 class DisplayControllerShutdownTest : public test::AshTestBase {
  public:
+  DisplayControllerShutdownTest() {}
+  virtual ~DisplayControllerShutdownTest() {}
+
   virtual void TearDown() OVERRIDE {
     test::AshTestBase::TearDown();
     if (!SupportsMultipleDisplays())
@@ -190,6 +216,59 @@ class DisplayControllerShutdownTest : public test::AshTestBase {
     EXPECT_EQ("0,0 444x333", primary.bounds().ToString());
     EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
   }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(DisplayControllerShutdownTest);
+};
+
+class StartupHelper : public test::TestShellDelegate,
+                      public DisplayController::Observer {
+ public:
+  StartupHelper() : displays_initialized_(false) {}
+  virtual ~StartupHelper() {}
+
+  // ash::ShellSelegate:
+  virtual void PreInit() OVERRIDE {
+    Shell::GetInstance()->display_controller()->AddObserver(this);
+  }
+
+  // ash::DisplayController::Observer:
+  virtual void OnDisplaysInitialized() OVERRIDE {
+    DCHECK(!displays_initialized_);
+    displays_initialized_ = true;
+  }
+
+  const bool displays_initialized() const {
+    return displays_initialized_;
+  }
+
+ private:
+  bool displays_initialized_;
+
+  DISALLOW_COPY_AND_ASSIGN(StartupHelper);
+};
+
+class DisplayControllerStartupTest : public test::AshTestBase {
+ public:
+  DisplayControllerStartupTest() : startup_helper_(new StartupHelper) {}
+  virtual ~DisplayControllerStartupTest() {}
+
+  // ash::test::AshTestBase:
+  virtual void SetUp() OVERRIDE {
+    ash_test_helper()->set_test_shell_delegate(startup_helper_);
+    test::AshTestBase::SetUp();
+  }
+  virtual void TearDown() OVERRIDE {
+    Shell::GetInstance()->display_controller()->RemoveObserver(startup_helper_);
+    test::AshTestBase::TearDown();
+  }
+
+  const StartupHelper* startup_helper() const { return startup_helper_; }
+
+ private:
+  StartupHelper* startup_helper_;  // Owned by ash::Shell.
+
+  DISALLOW_COPY_AND_ASSIGN(DisplayControllerStartupTest);
 };
 
 class TestEventHandler : public ui::EventHandler {
@@ -275,20 +354,21 @@ gfx::Display::Rotation GetStoredRotation(int64 id) {
 }
 
 float GetStoredUIScale(int64 id) {
-  return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).ui_scale();
+  return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).
+      GetEffectiveUIScale();
 }
 
 #if defined(USE_X11)
 void GetPrimaryAndSeconary(aura::Window** primary,
                            aura::Window** secondary) {
   *primary = Shell::GetPrimaryRootWindow();
-  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
+  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
   *secondary = root_windows[0] == *primary ? root_windows[1] : root_windows[0];
 }
 
-std::string GetXWindowName(aura::RootWindow* window) {
+std::string GetXWindowName(aura::WindowTreeHost* host) {
   char* name = NULL;
-  XFetchName(gfx::GetXDisplay(), window->GetAcceleratedWidget(), &name);
+  XFetchName(gfx::GetXDisplay(), host->GetAcceleratedWidget(), &name);
   std::string ret(name);
   XFree(name);
   return ret;
@@ -306,6 +386,13 @@ TEST_F(DisplayControllerShutdownTest, Shutdown) {
   UpdateDisplay("444x333, 200x200");
 }
 
+TEST_F(DisplayControllerStartupTest, Startup) {
+  if (!SupportsMultipleDisplays())
+    return;
+
+  EXPECT_TRUE(startup_helper()->displays_initialized());
+}
+
 TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
   if (!SupportsMultipleDisplays())
     return;
@@ -318,10 +405,11 @@ TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
   UpdateDisplay("500x500,400x400");
   EXPECT_EQ(1, observer.CountAndReset());  // resize and add
   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
+  EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset());
   EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
   EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
   gfx::Insets insets(5, 5, 5, 5);
-  int64 secondary_display_id = ScreenAsh::GetSecondaryDisplay().id();
+  int64 secondary_display_id = ScreenUtil::GetSecondaryDisplay().id();
   Shell::GetInstance()->display_manager()->UpdateWorkAreaOfDisplay(
       secondary_display_id, insets);
 
@@ -336,6 +424,7 @@ TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
   SetSecondaryDisplayLayout(DisplayLayout::BOTTOM);
   EXPECT_EQ(1, observer.CountAndReset());
   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
+  EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset());
   EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
   EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
@@ -347,6 +436,7 @@ TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
   SetSecondaryDisplayLayout(DisplayLayout::LEFT);
   EXPECT_EQ(1, observer.CountAndReset());
   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
+  EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset());
   EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
   EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
@@ -358,6 +448,7 @@ TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
   SetSecondaryDisplayLayout(DisplayLayout::TOP);
   EXPECT_EQ(1, observer.CountAndReset());
   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
+  EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset());
   EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
   EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
@@ -369,6 +460,7 @@ TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
   SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 300);
   EXPECT_EQ(1, observer.CountAndReset());  // resize and add
   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
+  EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset());
   EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
   EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
@@ -379,6 +471,7 @@ TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
   SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 490);
   EXPECT_EQ(1, observer.CountAndReset());  // resize and add
   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
+  EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset());
   EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
   EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
@@ -388,6 +481,7 @@ TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
   SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, -400);
   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
+  EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset());
   EXPECT_EQ(1, observer.CountAndReset());  // resize and add
   EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
   EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
@@ -398,6 +492,7 @@ TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
   SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -200);
   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
+  EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset());
   EXPECT_EQ(1, observer.CountAndReset());  // resize and add
   EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
   EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
@@ -408,6 +503,7 @@ TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
   SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, 490);
   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
+  EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset());
   EXPECT_EQ(1, observer.CountAndReset());  // resize and add
   EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
   EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
@@ -417,6 +513,7 @@ TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
   SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -400);
   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
+  EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset());
   EXPECT_EQ(1, observer.CountAndReset());  // resize and add
   EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
   EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
@@ -427,6 +524,7 @@ TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
   SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -400);
   EXPECT_EQ(0, observer.GetChangedDisplayIdAndReset());
   EXPECT_EQ(0, observer.GetBoundsChangedCountAndReset());
+  EXPECT_EQ(0, observer.GetWorkareaChangedCountAndReset());
   EXPECT_EQ(0, observer.CountAndReset());  // resize and add
   EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
   EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
@@ -438,6 +536,70 @@ TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
   EXPECT_LE(1, observer.GetActivationChangedCountAndReset());
 }
 
+namespace {
+
+DisplayInfo CreateDisplayInfo(int64 id,
+                              const gfx::Rect& bounds,
+                              float device_scale_factor) {
+  DisplayInfo info(id, "", false);
+  info.SetBounds(bounds);
+  info.set_device_scale_factor(device_scale_factor);
+  return info;
+}
+
+}  // namespace
+
+TEST_F(DisplayControllerTest, MirrorToDockedWithFullscreen) {
+  if (!SupportsMultipleDisplays())
+    return;
+
+  // Creates windows to catch activation change event.
+  scoped_ptr<aura::Window> w1(CreateTestWindowInShellWithId(1));
+  w1->Focus();
+
+  // Docked mode.
+  DisplayManager* display_manager = Shell::GetInstance()->display_manager();
+
+  const DisplayInfo internal_display_info =
+      CreateDisplayInfo(1, gfx::Rect(0, 0, 500, 500), 2.0f);
+  const DisplayInfo external_display_info =
+      CreateDisplayInfo(2, gfx::Rect(0, 0, 500, 500), 1.0f);
+
+  std::vector<DisplayInfo> display_info_list;
+  // Mirror.
+  display_info_list.push_back(internal_display_info);
+  display_info_list.push_back(external_display_info);
+  display_manager->OnNativeDisplaysChanged(display_info_list);
+  const int64 internal_display_id =
+      test::DisplayManagerTestApi(display_manager).
+      SetFirstDisplayAsInternalDisplay();
+  EXPECT_EQ(1, internal_display_id);
+  EXPECT_EQ(2U, display_manager->num_connected_displays());
+  EXPECT_EQ(1U, display_manager->GetNumDisplays());
+
+  wm::WindowState* window_state = wm::GetWindowState(w1.get());
+  const wm::WMEvent toggle_fullscreen_event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
+  window_state->OnWMEvent(&toggle_fullscreen_event);
+  EXPECT_TRUE(window_state->IsFullscreen());
+  EXPECT_EQ("0,0 250x250", w1->bounds().ToString());
+  // Dock mode.
+  TestObserver observer;
+  display_info_list.clear();
+  display_info_list.push_back(external_display_info);
+  display_manager->OnNativeDisplaysChanged(display_info_list);
+  EXPECT_EQ(1U, display_manager->GetNumDisplays());
+  EXPECT_EQ(1U, display_manager->num_connected_displays());
+  EXPECT_EQ(0, observer.GetChangedDisplayIdAndReset());
+  EXPECT_EQ(0, observer.GetBoundsChangedCountAndReset());
+  EXPECT_EQ(0, observer.GetWorkareaChangedCountAndReset());
+  EXPECT_EQ(1, observer.CountAndReset());
+  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
+  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
+
+  EXPECT_TRUE(window_state->IsFullscreen());
+  EXPECT_EQ("0,0 500x500", w1->bounds().ToString());
+}
+
 TEST_F(DisplayControllerTest, BoundsUpdated) {
   if (!SupportsMultipleDisplays())
     return;
@@ -453,11 +615,10 @@ TEST_F(DisplayControllerTest, BoundsUpdated) {
   EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
   EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
 
-  internal::DisplayManager* display_manager =
-      Shell::GetInstance()->display_manager();
+  DisplayManager* display_manager = Shell::GetInstance()->display_manager();
   gfx::Insets insets(5, 5, 5, 5);
   display_manager->UpdateWorkAreaOfDisplay(
-      ScreenAsh::GetSecondaryDisplay().id(), insets);
+      ScreenUtil::GetSecondaryDisplay().id(), insets);
 
   EXPECT_EQ("0,0 200x200", GetPrimaryDisplay().bounds().ToString());
   EXPECT_EQ("0,200 300x300", GetSecondaryDisplay().bounds().ToString());
@@ -499,12 +660,15 @@ TEST_F(DisplayControllerTest, BoundsUpdated) {
   EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
 
   // Rotation
+  observer.GetRotationChangedCountAndReset();  // we only want to reset.
   int64 primary_id = GetPrimaryDisplay().id();
   display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90);
+  EXPECT_EQ(1, observer.GetRotationChangedCountAndReset());
   EXPECT_EQ(1, observer.CountAndReset());
   EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
   EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
   display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90);
+  EXPECT_EQ(0, observer.GetRotationChangedCountAndReset());
   EXPECT_EQ(0, observer.CountAndReset());
   EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
   EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
@@ -536,12 +700,11 @@ TEST_F(DisplayControllerTest, SwapPrimary) {
 
   DisplayController* display_controller =
       Shell::GetInstance()->display_controller();
-  internal::DisplayManager* display_manager =
-      Shell::GetInstance()->display_manager();
+  DisplayManager* display_manager = Shell::GetInstance()->display_manager();
 
   UpdateDisplay("200x200,300x300");
   gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
-  gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay();
+  gfx::Display secondary_display = ScreenUtil::GetSecondaryDisplay();
 
   DisplayLayout display_layout(DisplayLayout::RIGHT, 50);
   display_manager->SetLayoutForCurrentDisplays(display_layout);
@@ -552,10 +715,10 @@ TEST_F(DisplayControllerTest, SwapPrimary) {
   aura::Window* secondary_root =
       display_controller->GetRootWindowForDisplayId(secondary_display.id());
   EXPECT_NE(primary_root, secondary_root);
-  aura::Window* launcher_window =
-      Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView();
-  EXPECT_TRUE(primary_root->Contains(launcher_window));
-  EXPECT_FALSE(secondary_root->Contains(launcher_window));
+  aura::Window* shelf_window =
+      Shelf::ForPrimaryDisplay()->shelf_widget()->GetNativeView();
+  EXPECT_TRUE(primary_root->Contains(shelf_window));
+  EXPECT_FALSE(secondary_root->Contains(shelf_window));
   EXPECT_EQ(primary_display.id(),
             Shell::GetScreen()->GetDisplayNearestPoint(
                 gfx::Point(-100, -100)).id());
@@ -577,8 +740,8 @@ TEST_F(DisplayControllerTest, SwapPrimary) {
 
   EXPECT_EQ(secondary_display.id(),
             Shell::GetScreen()->GetPrimaryDisplay().id());
-  EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id());
-  EXPECT_EQ(secondary_display.id(),
+  EXPECT_EQ(primary_display.id(), ScreenUtil::GetSecondaryDisplay().id());
+  EXPECT_EQ(primary_display.id(),
             Shell::GetScreen()->GetDisplayNearestPoint(
                 gfx::Point(-100, -100)).id());
   EXPECT_EQ(secondary_display.id(),
@@ -590,12 +753,12 @@ TEST_F(DisplayControllerTest, SwapPrimary) {
   EXPECT_EQ(
       secondary_root,
       display_controller->GetRootWindowForDisplayId(primary_display.id()));
-  EXPECT_TRUE(primary_root->Contains(launcher_window));
-  EXPECT_FALSE(secondary_root->Contains(launcher_window));
+  EXPECT_TRUE(primary_root->Contains(shelf_window));
+  EXPECT_FALSE(secondary_root->Contains(shelf_window));
 
   // Test if the bounds are correctly swapped.
   gfx::Display swapped_primary = Shell::GetScreen()->GetPrimaryDisplay();
-  gfx::Display swapped_secondary = ScreenAsh::GetSecondaryDisplay();
+  gfx::Display swapped_secondary = ScreenUtil::GetSecondaryDisplay();
   EXPECT_EQ("0,0 300x300", swapped_primary.bounds().ToString());
   EXPECT_EQ("0,0 300x253", swapped_primary.work_area().ToString());
   EXPECT_EQ("-200,-50 200x200", swapped_secondary.bounds().ToString());
@@ -618,101 +781,49 @@ TEST_F(DisplayControllerTest, SwapPrimary) {
             Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
   EXPECT_TRUE(tracker.Contains(primary_root));
   EXPECT_FALSE(tracker.Contains(secondary_root));
-  EXPECT_TRUE(primary_root->Contains(launcher_window));
+  EXPECT_TRUE(primary_root->Contains(shelf_window));
 }
 
-TEST_F(DisplayControllerTest, SwapPrimaryForLegacyShelfLayout) {
+TEST_F(DisplayControllerTest, FindNearestDisplay) {
   if (!SupportsMultipleDisplays())
     return;
 
-  CommandLine::ForCurrentProcess()->AppendSwitch(
-      ash::switches::kAshDisableAlternateShelfLayout);
-
   DisplayController* display_controller =
       Shell::GetInstance()->display_controller();
-  internal::DisplayManager* display_manager =
-      Shell::GetInstance()->display_manager();
+  DisplayManager* display_manager = Shell::GetInstance()->display_manager();
 
   UpdateDisplay("200x200,300x300");
-  gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
-  gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay();
-
   DisplayLayout display_layout(DisplayLayout::RIGHT, 50);
   display_manager->SetLayoutForCurrentDisplays(display_layout);
 
+  gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
+  gfx::Display secondary_display = ScreenUtil::GetSecondaryDisplay();
   EXPECT_NE(primary_display.id(), secondary_display.id());
   aura::Window* primary_root =
       display_controller->GetRootWindowForDisplayId(primary_display.id());
   aura::Window* secondary_root =
       display_controller->GetRootWindowForDisplayId(secondary_display.id());
   EXPECT_NE(primary_root, secondary_root);
-  aura::Window* launcher_window =
-      Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView();
-  EXPECT_TRUE(primary_root->Contains(launcher_window));
-  EXPECT_FALSE(secondary_root->Contains(launcher_window));
-  EXPECT_EQ(primary_display.id(),
-            Shell::GetScreen()->GetDisplayNearestPoint(
-                gfx::Point(-100, -100)).id());
-  EXPECT_EQ(primary_display.id(),
-            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
-
-  EXPECT_EQ("0,0 200x200", primary_display.bounds().ToString());
-  EXPECT_EQ("0,0 200x152", primary_display.work_area().ToString());
-  EXPECT_EQ("200,0 300x300", secondary_display.bounds().ToString());
-  EXPECT_EQ("200,0 300x252", secondary_display.work_area().ToString());
-  EXPECT_EQ("right, 50",
-            display_manager->GetCurrentDisplayLayout().ToString());
-
-  // Switch primary and secondary
-  display_controller->SetPrimaryDisplay(secondary_display);
-  const DisplayLayout& inverted_layout =
-      display_manager->GetCurrentDisplayLayout();
-  EXPECT_EQ("left, -50", inverted_layout.ToString());
-
-  EXPECT_EQ(secondary_display.id(),
-            Shell::GetScreen()->GetPrimaryDisplay().id());
-  EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id());
-  EXPECT_EQ(secondary_display.id(),
-            Shell::GetScreen()->GetDisplayNearestPoint(
-                gfx::Point(-100, -100)).id());
-  EXPECT_EQ(secondary_display.id(),
-            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
-
-  EXPECT_EQ(
-      primary_root,
-      display_controller->GetRootWindowForDisplayId(secondary_display.id()));
-  EXPECT_EQ(
-      secondary_root,
-      display_controller->GetRootWindowForDisplayId(primary_display.id()));
-  EXPECT_TRUE(primary_root->Contains(launcher_window));
-  EXPECT_FALSE(secondary_root->Contains(launcher_window));
-
-  // Test if the bounds are correctly swapped.
-  gfx::Display swapped_primary = Shell::GetScreen()->GetPrimaryDisplay();
-  gfx::Display swapped_secondary = ScreenAsh::GetSecondaryDisplay();
-  EXPECT_EQ("0,0 300x300", swapped_primary.bounds().ToString());
-  EXPECT_EQ("0,0 300x252", swapped_primary.work_area().ToString());
-  EXPECT_EQ("-200,-50 200x200", swapped_secondary.bounds().ToString());
 
-  EXPECT_EQ("-200,-50 200x152", swapped_secondary.work_area().ToString());
-
-  aura::WindowTracker tracker;
-  tracker.Add(primary_root);
-  tracker.Add(secondary_root);
-
-  // Deleting 2nd display should move the primary to original primary display.
-  UpdateDisplay("200x200");
-  RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
-  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
-  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id());
-  EXPECT_EQ(primary_display.id(),
-            Shell::GetScreen()->GetDisplayNearestPoint(
-                gfx::Point(-100, -100)).id());
-  EXPECT_EQ(primary_display.id(),
-            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
-  EXPECT_TRUE(tracker.Contains(primary_root));
-  EXPECT_FALSE(tracker.Contains(secondary_root));
-  EXPECT_TRUE(primary_root->Contains(launcher_window));
+  // Test that points outside of any display return the nearest display.
+  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
+      gfx::Point(-100, 0)).id());
+  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
+      gfx::Point(0, -100)).id());
+  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
+      gfx::Point(100, 100)).id());
+  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
+      gfx::Point(224, 25)).id());
+  EXPECT_EQ(secondary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
+      gfx::Point(226, 25)).id());
+  EXPECT_EQ(secondary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
+      gfx::Point(600, 100)).id());
+  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
+      gfx::Point(174, 225)).id());
+  EXPECT_EQ(secondary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
+      gfx::Point(176, 225)).id());
+  EXPECT_EQ(secondary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
+      gfx::Point(300, 400)).id());
 }
 
 TEST_F(DisplayControllerTest, SwapPrimaryById) {
@@ -721,12 +832,11 @@ TEST_F(DisplayControllerTest, SwapPrimaryById) {
 
   DisplayController* display_controller =
       Shell::GetInstance()->display_controller();
-  internal::DisplayManager* display_manager =
-      Shell::GetInstance()->display_manager();
+  DisplayManager* display_manager = Shell::GetInstance()->display_manager();
 
   UpdateDisplay("200x200,300x300");
   gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
-  gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay();
+  gfx::Display secondary_display = ScreenUtil::GetSecondaryDisplay();
 
   DisplayLayout display_layout(DisplayLayout::RIGHT, 50);
   display_manager->SetLayoutForCurrentDisplays(display_layout);
@@ -736,10 +846,10 @@ TEST_F(DisplayControllerTest, SwapPrimaryById) {
       display_controller->GetRootWindowForDisplayId(primary_display.id());
   aura::Window* secondary_root =
       display_controller->GetRootWindowForDisplayId(secondary_display.id());
-  aura::Window* launcher_window =
-      Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView();
-  EXPECT_TRUE(primary_root->Contains(launcher_window));
-  EXPECT_FALSE(secondary_root->Contains(launcher_window));
+  aura::Window* shelf_window =
+      Shelf::ForPrimaryDisplay()->shelf_widget()->GetNativeView();
+  EXPECT_TRUE(primary_root->Contains(shelf_window));
+  EXPECT_FALSE(secondary_root->Contains(shelf_window));
   EXPECT_NE(primary_root, secondary_root);
   EXPECT_EQ(primary_display.id(),
             Shell::GetScreen()->GetDisplayNearestPoint(
@@ -752,7 +862,7 @@ TEST_F(DisplayControllerTest, SwapPrimaryById) {
   display_controller->SetPrimaryDisplayId(secondary_display.id());
   EXPECT_EQ(secondary_display.id(),
             Shell::GetScreen()->GetPrimaryDisplay().id());
-  EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id());
+  EXPECT_EQ(primary_display.id(), ScreenUtil::GetSecondaryDisplay().id());
   EXPECT_LT(0, observer.CountAndReset());
 
   EXPECT_EQ(
@@ -761,8 +871,8 @@ TEST_F(DisplayControllerTest, SwapPrimaryById) {
   EXPECT_EQ(
       secondary_root,
       display_controller->GetRootWindowForDisplayId(primary_display.id()));
-  EXPECT_TRUE(primary_root->Contains(launcher_window));
-  EXPECT_FALSE(secondary_root->Contains(launcher_window));
+  EXPECT_TRUE(primary_root->Contains(shelf_window));
+  EXPECT_FALSE(secondary_root->Contains(shelf_window));
 
   const DisplayLayout& inverted_layout =
       display_manager->GetCurrentDisplayLayout();
@@ -789,11 +899,11 @@ TEST_F(DisplayControllerTest, SwapPrimaryById) {
             Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
   EXPECT_TRUE(tracker.Contains(primary_root));
   EXPECT_FALSE(tracker.Contains(secondary_root));
-  EXPECT_TRUE(primary_root->Contains(launcher_window));
+  EXPECT_TRUE(primary_root->Contains(shelf_window));
 
   // Adding 2nd display with the same ID.  The 2nd display should become primary
   // since secondary id is still stored as desirable_primary_id.
-  std::vector<internal::DisplayInfo> display_info_list;
+  std::vector<DisplayInfo> display_info_list;
   display_info_list.push_back(
       display_manager->GetDisplayInfo(primary_display.id()));
   display_info_list.push_back(
@@ -803,40 +913,40 @@ TEST_F(DisplayControllerTest, SwapPrimaryById) {
   EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
   EXPECT_EQ(secondary_display.id(),
             Shell::GetScreen()->GetPrimaryDisplay().id());
-  EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id());
+  EXPECT_EQ(primary_display.id(), ScreenUtil::GetSecondaryDisplay().id());
   EXPECT_EQ(
       primary_root,
       display_controller->GetRootWindowForDisplayId(secondary_display.id()));
   EXPECT_NE(
       primary_root,
       display_controller->GetRootWindowForDisplayId(primary_display.id()));
-  EXPECT_TRUE(primary_root->Contains(launcher_window));
+  EXPECT_TRUE(primary_root->Contains(shelf_window));
 
   // Deleting 2nd display and adding 2nd display with a different ID.  The 2nd
   // display shouldn't become primary.
   UpdateDisplay("200x200");
-  internal::DisplayInfo third_display_info(
+  DisplayInfo third_display_info(
       secondary_display.id() + 1, std::string(), false);
   third_display_info.SetBounds(secondary_display.bounds());
   ASSERT_NE(primary_display.id(), third_display_info.id());
 
-  const internal::DisplayInfo& primary_display_info =
+  const DisplayInfo& primary_display_info =
       display_manager->GetDisplayInfo(primary_display.id());
-  std::vector<internal::DisplayInfo> display_info_list2;
+  std::vector<DisplayInfo> display_info_list2;
   display_info_list2.push_back(primary_display_info);
   display_info_list2.push_back(third_display_info);
   display_manager->OnNativeDisplaysChanged(display_info_list2);
   EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
   EXPECT_EQ(primary_display.id(),
             Shell::GetScreen()->GetPrimaryDisplay().id());
-  EXPECT_EQ(third_display_info.id(), ScreenAsh::GetSecondaryDisplay().id());
+  EXPECT_EQ(third_display_info.id(), ScreenUtil::GetSecondaryDisplay().id());
   EXPECT_EQ(
       primary_root,
       display_controller->GetRootWindowForDisplayId(primary_display.id()));
   EXPECT_NE(
       primary_root,
       display_controller->GetRootWindowForDisplayId(third_display_info.id()));
-  EXPECT_TRUE(primary_root->Contains(launcher_window));
+  EXPECT_TRUE(primary_root->Contains(shelf_window));
 }
 
 TEST_F(DisplayControllerTest, CursorDeviceScaleFactorSwapPrimary) {
@@ -848,7 +958,7 @@ TEST_F(DisplayControllerTest, CursorDeviceScaleFactorSwapPrimary) {
 
   UpdateDisplay("200x200,200x200*2");
   gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
-  gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay();
+  gfx::Display secondary_display = ScreenUtil::GetSecondaryDisplay();
 
   aura::Window* primary_root =
       display_controller->GetRootWindowForDisplayId(primary_display.id());
@@ -858,40 +968,40 @@ TEST_F(DisplayControllerTest, CursorDeviceScaleFactorSwapPrimary) {
 
   test::CursorManagerTestApi test_api(Shell::GetInstance()->cursor_manager());
 
-  EXPECT_EQ(1.0f, primary_root->GetDispatcher()->AsRootWindowHostDelegate()->
-      GetDeviceScaleFactor());
+  EXPECT_EQ(1.0f, primary_root->GetHost()->compositor()->
+      device_scale_factor());
   primary_root->MoveCursorTo(gfx::Point(50, 50));
-  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
-  EXPECT_EQ(2.0f, secondary_root->GetDispatcher()->AsRootWindowHostDelegate()->
-      GetDeviceScaleFactor());
+  EXPECT_EQ(1.0f, test_api.GetCurrentCursor().device_scale_factor());
+  EXPECT_EQ(2.0f, secondary_root->GetHost()->compositor()->
+      device_scale_factor());
   secondary_root->MoveCursorTo(gfx::Point(50, 50));
-  EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor());
+  EXPECT_EQ(2.0f, test_api.GetCurrentCursor().device_scale_factor());
 
   // Switch primary and secondary
   display_controller->SetPrimaryDisplay(secondary_display);
 
   // Cursor's device scale factor should be updated accroding to the swap of
   // primary and secondary.
-  EXPECT_EQ(1.0f, secondary_root->GetDispatcher()->AsRootWindowHostDelegate()->
-      GetDeviceScaleFactor());
+  EXPECT_EQ(1.0f, secondary_root->GetHost()->compositor()->
+      device_scale_factor());
   secondary_root->MoveCursorTo(gfx::Point(50, 50));
-  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
+  EXPECT_EQ(1.0f, test_api.GetCurrentCursor().device_scale_factor());
   primary_root->MoveCursorTo(gfx::Point(50, 50));
-  EXPECT_EQ(2.0f, primary_root->GetDispatcher()->AsRootWindowHostDelegate()->
-      GetDeviceScaleFactor());
-  EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor());
+  EXPECT_EQ(2.0f, primary_root->GetHost()->compositor()->
+      device_scale_factor());
+  EXPECT_EQ(2.0f, test_api.GetCurrentCursor().device_scale_factor());
 
   // Deleting 2nd display.
   UpdateDisplay("200x200");
   RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
 
   // Cursor's device scale factor should be updated even without moving cursor.
-  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
+  EXPECT_EQ(1.0f, test_api.GetCurrentCursor().device_scale_factor());
 
   primary_root->MoveCursorTo(gfx::Point(50, 50));
-  EXPECT_EQ(1.0f, primary_root->GetDispatcher()->AsRootWindowHostDelegate()->
-      GetDeviceScaleFactor());
-  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
+  EXPECT_EQ(1.0f, primary_root->GetHost()->compositor()->
+      device_scale_factor());
+  EXPECT_EQ(1.0f, test_api.GetCurrentCursor().device_scale_factor());
 }
 
 TEST_F(DisplayControllerTest, OverscanInsets) {
@@ -905,23 +1015,23 @@ TEST_F(DisplayControllerTest, OverscanInsets) {
 
   UpdateDisplay("120x200,300x400*2");
   gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
-  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
+  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
 
   display_controller->SetOverscanInsets(display1.id(),
                                         gfx::Insets(10, 15, 20, 25));
   EXPECT_EQ("0,0 80x170", root_windows[0]->bounds().ToString());
   EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
   EXPECT_EQ("80,0 150x200",
-            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
+            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
 
-  aura::test::EventGenerator generator(root_windows[0]);
+  ui::test::EventGenerator generator(root_windows[0]);
   generator.MoveMouseToInHost(20, 25);
   EXPECT_EQ("5,15", event_handler.GetLocationAndReset());
 
   display_controller->SetOverscanInsets(display1.id(), gfx::Insets());
   EXPECT_EQ("0,0 120x200", root_windows[0]->bounds().ToString());
   EXPECT_EQ("120,0 150x200",
-            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
+            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
 
   generator.MoveMouseToInHost(30, 20);
   EXPECT_EQ("30,20", event_handler.GetLocationAndReset());
@@ -931,12 +1041,14 @@ TEST_F(DisplayControllerTest, OverscanInsets) {
   UpdateDisplay("400x300*2,600x400/o");
   root_windows = Shell::GetAllRootWindows();
   gfx::Point point;
-  Shell::GetAllRootWindows()[1]->GetRootTransform().TransformPoint(&point);
+  Shell::GetAllRootWindows()[1]->GetHost()->
+      GetRootTransform().TransformPoint(&point);
   EXPECT_EQ("15,10", point.ToString());
 
   display_controller->SwapPrimaryDisplay();
   point.SetPoint(0, 0);
-  Shell::GetAllRootWindows()[1]->GetRootTransform().TransformPoint(&point);
+  Shell::GetAllRootWindows()[1]->GetHost()->
+      GetRootTransform().TransformPoint(&point);
   EXPECT_EQ("15,10", point.ToString());
 
   Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
@@ -946,53 +1058,56 @@ TEST_F(DisplayControllerTest, Rotate) {
   if (!SupportsMultipleDisplays())
     return;
 
-  internal::DisplayManager* display_manager =
-      Shell::GetInstance()->display_manager();
+  DisplayManager* display_manager = Shell::GetInstance()->display_manager();
   TestEventHandler event_handler;
   Shell::GetInstance()->AddPreTargetHandler(&event_handler);
 
   UpdateDisplay("120x200,300x400*2");
   gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
-  int64 display2_id = ScreenAsh::GetSecondaryDisplay().id();
-  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
-  aura::test::EventGenerator generator1(root_windows[0]);
+  int64 display2_id = ScreenUtil::GetSecondaryDisplay().id();
+  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
+  ui::test::EventGenerator generator1(root_windows[0]);
 
+  TestObserver observer;
   EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString());
   EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
   EXPECT_EQ("120,0 150x200",
-            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
+            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
   generator1.MoveMouseToInHost(50, 40);
   EXPECT_EQ("50,40", event_handler.GetLocationAndReset());
   EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display1.id()));
   EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id));
+  EXPECT_EQ(0, observer.GetRotationChangedCountAndReset());
 
   display_manager->SetDisplayRotation(display1.id(),
                                       gfx::Display::ROTATE_90);
   EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString());
   EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
   EXPECT_EQ("200,0 150x200",
-            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
+            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
   generator1.MoveMouseToInHost(50, 40);
   EXPECT_EQ("40,69", event_handler.GetLocationAndReset());
   EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id()));
   EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id));
+  EXPECT_EQ(1, observer.GetRotationChangedCountAndReset());
 
   DisplayLayout display_layout(DisplayLayout::BOTTOM, 50);
   display_manager->SetLayoutForCurrentDisplays(display_layout);
   EXPECT_EQ("50,120 150x200",
-            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
+            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
 
   display_manager->SetDisplayRotation(display2_id,
                                       gfx::Display::ROTATE_270);
   EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString());
   EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString());
   EXPECT_EQ("50,120 200x150",
-            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
+            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
   EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id()));
   EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id));
+  EXPECT_EQ(1, observer.GetRotationChangedCountAndReset());
 
 #if !defined(OS_WIN)
-  aura::test::EventGenerator generator2(root_windows[1]);
+  ui::test::EventGenerator generator2(root_windows[1]);
   generator2.MoveMouseToInHost(50, 40);
   EXPECT_EQ("179,25", event_handler.GetLocationAndReset());
   display_manager->SetDisplayRotation(display1.id(),
@@ -1002,9 +1117,10 @@ TEST_F(DisplayControllerTest, Rotate) {
   EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString());
   // Dislay must share at least 100, so the x's offset becomes 20.
   EXPECT_EQ("20,200 200x150",
-            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
+            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
   EXPECT_EQ(gfx::Display::ROTATE_180, GetStoredRotation(display1.id()));
   EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id));
+  EXPECT_EQ(1, observer.GetRotationChangedCountAndReset());
 
   generator1.MoveMouseToInHost(50, 40);
   EXPECT_EQ("69,159", event_handler.GetLocationAndReset());
@@ -1025,23 +1141,22 @@ TEST_F(DisplayControllerTest, ScaleRootWindow) {
   gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
   gfx::Display::SetInternalDisplayId(display1.id());
 
-  gfx::Display display2 = ScreenAsh::GetSecondaryDisplay();
-  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
+  gfx::Display display2 = ScreenUtil::GetSecondaryDisplay();
+  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
   EXPECT_EQ("0,0 450x300", display1.bounds().ToString());
   EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString());
   EXPECT_EQ("450,0 500x300", display2.bounds().ToString());
   EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
   EXPECT_EQ(1.0f, GetStoredUIScale(display2.id()));
 
-  aura::test::EventGenerator generator(root_windows[0]);
+  ui::test::EventGenerator generator(root_windows[0]);
   generator.MoveMouseToInHost(599, 200);
   EXPECT_EQ("449,150", event_handler.GetLocationAndReset());
 
-  internal::DisplayManager* display_manager =
-      Shell::GetInstance()->display_manager();
+  DisplayManager* display_manager = Shell::GetInstance()->display_manager();
   display_manager->SetDisplayUIScale(display1.id(), 1.25f);
   display1 = Shell::GetScreen()->GetPrimaryDisplay();
-  display2 = ScreenAsh::GetSecondaryDisplay();
+  display2 = ScreenUtil::GetSecondaryDisplay();
   EXPECT_EQ("0,0 375x250", display1.bounds().ToString());
   EXPECT_EQ("0,0 375x250", root_windows[0]->bounds().ToString());
   EXPECT_EQ("375,0 500x300", display2.bounds().ToString());
@@ -1060,9 +1175,9 @@ TEST_F(DisplayControllerTest, TouchScale) {
 
   UpdateDisplay("200x200*2");
   gfx::Display display = Shell::GetScreen()->GetPrimaryDisplay();
-  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
-  aura::RootWindow* root_window = root_windows[0];
-  aura::test::EventGenerator generator(root_window);
+  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
+  aura::Window* root_window = root_windows[0];
+  ui::test::EventGenerator generator(root_window);
 
   generator.PressMoveAndReleaseTouchTo(50, 50);
   // Default test touches have radius_x/y = 1.0, with device scale
@@ -1093,12 +1208,12 @@ TEST_F(DisplayControllerTest, ConvertHostToRootCoords) {
   UpdateDisplay("600x400*2/r@1.5");
 
   gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
-  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
+  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
   EXPECT_EQ("0,0 300x450", display1.bounds().ToString());
   EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString());
   EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
 
-  aura::test::EventGenerator generator(root_windows[0]);
+  ui::test::EventGenerator generator(root_windows[0]);
   generator.MoveMouseToInHost(0, 0);
   EXPECT_EQ("0,449", event_handler.GetLocationAndReset());
   generator.MoveMouseToInHost(599, 0);
@@ -1143,29 +1258,85 @@ TEST_F(DisplayControllerTest, ConvertHostToRootCoords) {
   Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
 }
 
+namespace {
+
+DisplayInfo CreateDisplayInfo(int64 id,
+                              int y,
+                              gfx::Display::Rotation rotation) {
+  DisplayInfo info(id, "", false);
+  info.SetBounds(gfx::Rect(0, y, 500, 500));
+  info.set_rotation(rotation);
+  return info;
+}
+
+}  // namespace
+
+// Make sure that the compositor based mirroring can switch
+// from/to dock mode.
+TEST_F(DisplayControllerTest, DockToSingle) {
+  if (!SupportsMultipleDisplays())
+    return;
+
+  DisplayManager* display_manager = Shell::GetInstance()->display_manager();
+
+  const int64 internal_id = 1;
+
+  const DisplayInfo internal_display_info =
+      CreateDisplayInfo(internal_id, 0, gfx::Display::ROTATE_0);
+  const DisplayInfo external_display_info =
+      CreateDisplayInfo(2, 1, gfx::Display::ROTATE_90);
+
+  std::vector<DisplayInfo> display_info_list;
+  // Extended
+  display_info_list.push_back(internal_display_info);
+  display_info_list.push_back(external_display_info);
+  display_manager->OnNativeDisplaysChanged(display_info_list);
+  const int64 internal_display_id =
+      test::DisplayManagerTestApi(display_manager).
+      SetFirstDisplayAsInternalDisplay();
+  EXPECT_EQ(internal_id, internal_display_id);
+  EXPECT_EQ(2U, display_manager->GetNumDisplays());
+
+  // Dock mode.
+  display_info_list.clear();
+  display_info_list.push_back(external_display_info);
+  display_manager->OnNativeDisplaysChanged(display_info_list);
+  EXPECT_EQ(1U, display_manager->GetNumDisplays());
+  EXPECT_FALSE(Shell::GetPrimaryRootWindow()->GetHost()->
+               GetRootTransform().IsIdentityOrIntegerTranslation());
+
+  // Switch to single mode and make sure the transform is the one
+  // for the internal display.
+  display_info_list.clear();
+  display_info_list.push_back(internal_display_info);
+  display_manager->OnNativeDisplaysChanged(display_info_list);
+  EXPECT_TRUE(Shell::GetPrimaryRootWindow()->GetHost()->
+              GetRootTransform().IsIdentityOrIntegerTranslation());
+}
+
 #if defined(USE_X11)
 TEST_F(DisplayControllerTest, XWidowNameForRootWindow) {
   EXPECT_EQ("aura_root_0", GetXWindowName(
-      Shell::GetPrimaryRootWindow()->GetDispatcher()));
+      Shell::GetPrimaryRootWindow()->GetHost()));
 
   // Multiple display.
   UpdateDisplay("200x200,300x300");
   aura::Window* primary, *secondary;
   GetPrimaryAndSeconary(&primary, &secondary);
-  EXPECT_EQ("aura_root_0", GetXWindowName(primary->GetDispatcher()));
-  EXPECT_EQ("aura_root_x", GetXWindowName(secondary->GetDispatcher()));
+  EXPECT_EQ("aura_root_0", GetXWindowName(primary->GetHost()));
+  EXPECT_EQ("aura_root_x", GetXWindowName(secondary->GetHost()));
 
   // Swap primary.
   primary = secondary = NULL;
   Shell::GetInstance()->display_controller()->SwapPrimaryDisplay();
   GetPrimaryAndSeconary(&primary, &secondary);
-  EXPECT_EQ("aura_root_0", GetXWindowName(primary->GetDispatcher()));
-  EXPECT_EQ("aura_root_x", GetXWindowName(secondary->GetDispatcher()));
+  EXPECT_EQ("aura_root_0", GetXWindowName(primary->GetHost()));
+  EXPECT_EQ("aura_root_x", GetXWindowName(secondary->GetHost()));
 
   // Switching back to single display.
   UpdateDisplay("300x400");
   EXPECT_EQ("aura_root_0", GetXWindowName(
-      Shell::GetPrimaryRootWindow()->GetDispatcher()));
+      Shell::GetPrimaryRootWindow()->GetHost()));
 }
 #endif