mash: Move SystemTrayDelegate ownership to WmShell

This makes it possible to use inside //ash/common.

(SystemTrayDelegate is a dependency of TrayUpdate, which I'm in the process
of moving to //ash/common.)

* Make WmShell non-pure-virtual
* Fix now-unneeded includes of shell.h
* Fix some unnecessary ash:: qualifiers along the way

BUG=615155
TEST=existing ash_unittests, chrome unit_tests and browser_tests
[email protected] for mechanical changes to //chrome/browser

Review-Url: https://codereview.chromium.org/2058173002
Cr-Commit-Position: refs/heads/master@{#399277}
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc
index cfb66bf2..76f68db 100644
--- a/ash/accelerators/accelerator_controller.cc
+++ b/ash/accelerators/accelerator_controller.cc
@@ -20,6 +20,7 @@
 #include "ash/common/wm/mru_window_tracker.h"
 #include "ash/common/wm/window_state.h"
 #include "ash/common/wm/wm_event.h"
+#include "ash/common/wm_shell.h"
 #include "ash/debug.h"
 #include "ash/display/window_tree_host_manager.h"
 #include "ash/focus_cycler.h"
@@ -732,21 +733,21 @@
 
 void HandleVolumeDown(const ui::Accelerator& accelerator) {
   VolumeControlDelegate* volume_delegate =
-      Shell::GetInstance()->system_tray_delegate()->GetVolumeControlDelegate();
+      WmShell::Get()->system_tray_delegate()->GetVolumeControlDelegate();
   if (volume_delegate)
     volume_delegate->HandleVolumeDown(accelerator);
 }
 
 void HandleVolumeMute(const ui::Accelerator& accelerator) {
   VolumeControlDelegate* volume_delegate =
-      Shell::GetInstance()->system_tray_delegate()->GetVolumeControlDelegate();
+      WmShell::Get()->system_tray_delegate()->GetVolumeControlDelegate();
   if (volume_delegate)
     volume_delegate->HandleVolumeMute(accelerator);
 }
 
 void HandleVolumeUp(const ui::Accelerator& accelerator) {
   VolumeControlDelegate* volume_delegate =
-      Shell::GetInstance()->system_tray_delegate()->GetVolumeControlDelegate();
+      WmShell::Get()->system_tray_delegate()->GetVolumeControlDelegate();
   if (volume_delegate)
     volume_delegate->HandleVolumeUp(accelerator);
 }
diff --git a/ash/accelerators/accelerator_controller_unittest.cc b/ash/accelerators/accelerator_controller_unittest.cc
index 19e3822..1f279bf 100644
--- a/ash/accelerators/accelerator_controller_unittest.cc
+++ b/ash/accelerators/accelerator_controller_unittest.cc
@@ -15,6 +15,7 @@
 #include "ash/common/wm/window_positioning_utils.h"
 #include "ash/common/wm/window_state.h"
 #include "ash/common/wm/wm_event.h"
+#include "ash/common/wm_shell.h"
 #include "ash/display/display_manager.h"
 #include "ash/ime_control_delegate.h"
 #include "ash/screen_util.h"
@@ -866,7 +867,7 @@
   const ui::Accelerator volume_up(ui::VKEY_VOLUME_UP, ui::EF_NONE);
   {
     TestVolumeControlDelegate* delegate = new TestVolumeControlDelegate;
-    ash::Shell::GetInstance()->system_tray_delegate()->SetVolumeControlDelegate(
+    ash::WmShell::Get()->system_tray_delegate()->SetVolumeControlDelegate(
         std::unique_ptr<VolumeControlDelegate>(delegate));
     EXPECT_EQ(0, delegate->handle_volume_mute_count());
     EXPECT_TRUE(ProcessInController(volume_mute));
@@ -1426,7 +1427,7 @@
     EXPECT_TRUE(ProcessInController(volume_down));
     EXPECT_TRUE(ProcessInController(volume_up));
     TestVolumeControlDelegate* delegate = new TestVolumeControlDelegate;
-    ash::Shell::GetInstance()->system_tray_delegate()->SetVolumeControlDelegate(
+    ash::WmShell::Get()->system_tray_delegate()->SetVolumeControlDelegate(
         std::unique_ptr<VolumeControlDelegate>(delegate));
     EXPECT_EQ(0, delegate->handle_volume_mute_count());
     EXPECT_TRUE(ProcessInController(volume_mute));
diff --git a/ash/accelerators/accelerator_interactive_uitest_chromeos.cc b/ash/accelerators/accelerator_interactive_uitest_chromeos.cc
index f354910..cee9816a 100644
--- a/ash/accelerators/accelerator_interactive_uitest_chromeos.cc
+++ b/ash/accelerators/accelerator_interactive_uitest_chromeos.cc
@@ -169,7 +169,7 @@
 
   // Test VOLUME_MUTE, VOLUME_DOWN, and VOLUME_UP.
   TestVolumeControlDelegate* volume_delegate = new TestVolumeControlDelegate;
-  shell()->system_tray_delegate()->SetVolumeControlDelegate(
+  WmShell::Get()->system_tray_delegate()->SetVolumeControlDelegate(
       std::unique_ptr<VolumeControlDelegate>(volume_delegate));
   // VOLUME_MUTE.
   EXPECT_EQ(0, volume_delegate->handle_volume_mute_count());
diff --git a/ash/common/wm_shell.cc b/ash/common/wm_shell.cc
index 2161121..def0eb5 100644
--- a/ash/common/wm_shell.cc
+++ b/ash/common/wm_shell.cc
@@ -4,6 +4,9 @@
 
 #include "ash/common/wm_shell.h"
 
+#include "ash/common/system/tray/system_tray_delegate.h"
+#include "base/logging.h"
+
 namespace ash {
 
 // static
@@ -19,4 +22,22 @@
   return instance_;
 }
 
+WmShell::WmShell() {}
+
+WmShell::~WmShell() {}
+
+void WmShell::SetSystemTrayDelegate(
+    std::unique_ptr<SystemTrayDelegate> delegate) {
+  if (delegate) {
+    DCHECK(!system_tray_delegate_);
+    // TODO(jamescook): Create via ShellDelegate once it moves to //ash/common.
+    system_tray_delegate_ = std::move(delegate);
+    system_tray_delegate_->Initialize();
+  } else {
+    DCHECK(system_tray_delegate_);
+    system_tray_delegate_->Shutdown();
+    system_tray_delegate_.reset();
+  }
+}
+
 }  // namespace ash
diff --git a/ash/common/wm_shell.h b/ash/common/wm_shell.h
index 3a34e36..a51c6546 100644
--- a/ash/common/wm_shell.h
+++ b/ash/common/wm_shell.h
@@ -21,7 +21,9 @@
 class AccessibilityDelegate;
 class MruWindowTracker;
 class SessionStateDelegate;
+class Shell;
 class ShellObserver;
+class SystemTrayDelegate;
 class WindowResizer;
 class WmActivationObserver;
 class WmDisplayObserver;
@@ -43,6 +45,10 @@
   static WmShell* Get();
   static bool HasInstance() { return instance_ != nullptr; }
 
+  SystemTrayDelegate* system_tray_delegate() {
+    return system_tray_delegate_.get();
+  }
+
   virtual MruWindowTracker* GetMruWindowTracker() = 0;
 
   // Creates a new window used as a container of other windows. No painting is
@@ -115,10 +121,19 @@
   virtual void RemoveShellObserver(ShellObserver* observer) = 0;
 
  protected:
-  virtual ~WmShell() {}
+  WmShell();
+  virtual ~WmShell();
+
+  // If |delegate| is not null, sets and initializes the delegate. If |delegate|
+  // is null, shuts down and destroys the delegate.
+  void SetSystemTrayDelegate(std::unique_ptr<SystemTrayDelegate> delegate);
 
  private:
+  friend class Shell;
+
   static WmShell* instance_;
+
+  std::unique_ptr<SystemTrayDelegate> system_tray_delegate_;
 };
 
 }  // namespace ash
diff --git a/ash/content/display/screen_orientation_controller_chromeos_unittest.cc b/ash/content/display/screen_orientation_controller_chromeos_unittest.cc
index d8fb9064..bd1e276 100644
--- a/ash/content/display/screen_orientation_controller_chromeos_unittest.cc
+++ b/ash/content/display/screen_orientation_controller_chromeos_unittest.cc
@@ -8,6 +8,7 @@
 #include <vector>
 
 #include "ash/ash_switches.h"
+#include "ash/common/wm_shell.h"
 #include "ash/content/shell_content_state.h"
 #include "ash/display/display_info.h"
 #include "ash/display/display_manager.h"
@@ -416,9 +417,7 @@
 // triggered by the accelerometer.
 TEST_F(ScreenOrientationControllerTest, BlockRotationNotifications) {
   EnableMaximizeMode(true);
-  test::TestSystemTrayDelegate* tray_delegate =
-      static_cast<test::TestSystemTrayDelegate*>(
-          Shell::GetInstance()->system_tray_delegate());
+  test::TestSystemTrayDelegate* tray_delegate = GetSystemTrayDelegate();
   tray_delegate->set_should_show_display_notification(true);
   test::DisplayManagerTestApi().SetFirstDisplayAsInternalDisplay();
 
diff --git a/ash/metrics/user_metrics_recorder.cc b/ash/metrics/user_metrics_recorder.cc
index 6663aed..2d090b6 100644
--- a/ash/metrics/user_metrics_recorder.cc
+++ b/ash/metrics/user_metrics_recorder.cc
@@ -11,6 +11,7 @@
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/wm/window_state.h"
 #include "ash/common/wm/wm_user_metrics_action.h"
+#include "ash/common/wm_shell.h"
 #include "ash/metrics/desktop_task_switch_metric_recorder.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_delegate.h"
@@ -73,14 +74,14 @@
 
 // Returns true if kiosk mode is active.
 bool IsKioskModeActive() {
-  return Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus() ==
+  return WmShell::Get()->system_tray_delegate()->GetUserLoginStatus() ==
          LoginStatus::KIOSK_APP;
 }
 
 // Returns true if there is an active user and their session isn't currently
 // locked.
 bool IsUserActive() {
-  switch (Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus()) {
+  switch (WmShell::Get()->system_tray_delegate()->GetUserLoginStatus()) {
     case LoginStatus::NOT_LOGGED_IN:
     case LoginStatus::LOCKED:
       return false;
diff --git a/ash/mus/bridge/wm_shell_mus.cc b/ash/mus/bridge/wm_shell_mus.cc
index c204ccb..7b58f17 100644
--- a/ash/mus/bridge/wm_shell_mus.cc
+++ b/ash/mus/bridge/wm_shell_mus.cc
@@ -8,6 +8,7 @@
 #include "ash/common/session/session_state_delegate.h"
 #include "ash/common/shell_observer.h"
 #include "ash/common/shell_window_ids.h"
+#include "ash/common/system/tray/default_system_tray_delegate.h"
 #include "ash/common/wm/mru_window_tracker.h"
 #include "ash/common/wm/window_resizer.h"
 #include "ash/common/wm_activation_observer.h"
@@ -98,9 +99,11 @@
   wm_shell_common_->CreateMruWindowTracker();
 
   accessibility_delegate_.reset(new DefaultAccessibilityDelegate);
+  SetSystemTrayDelegate(base::WrapUnique(new DefaultSystemTrayDelegate));
 }
 
 WmShellMus::~WmShellMus() {
+  SetSystemTrayDelegate(nullptr);
   wm_shell_common_->DeleteMruWindowTracker();
   RemoveClientObserver();
   WmShell::Set(nullptr);
diff --git a/ash/root_window_controller_unittest.cc b/ash/root_window_controller_unittest.cc
index 6f974ddd..ee08285 100644
--- a/ash/root_window_controller_unittest.cc
+++ b/ash/root_window_controller_unittest.cc
@@ -10,6 +10,7 @@
 #include "ash/common/shell_window_ids.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/wm/window_state.h"
+#include "ash/common/wm_shell.h"
 #include "ash/display/display_manager.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
@@ -370,9 +371,10 @@
 TEST_F(RootWindowControllerTest, ModalContainer) {
   UpdateDisplay("600x600");
   Shell* shell = Shell::GetInstance();
+  WmShell* wm_shell = WmShell::Get();
   RootWindowController* controller = shell->GetPrimaryRootWindowController();
   EXPECT_EQ(LoginStatus::USER,
-            shell->system_tray_delegate()->GetUserLoginStatus());
+            wm_shell->system_tray_delegate()->GetUserLoginStatus());
   EXPECT_EQ(controller->GetContainer(kShellWindowId_SystemModalContainer)
                 ->layout_manager(),
             controller->GetSystemModalLayoutManager(NULL));
@@ -386,7 +388,7 @@
 
   shell->session_state_delegate()->LockScreen();
   EXPECT_EQ(LoginStatus::LOCKED,
-            shell->system_tray_delegate()->GetUserLoginStatus());
+            wm_shell->system_tray_delegate()->GetUserLoginStatus());
   EXPECT_EQ(controller->GetContainer(kShellWindowId_LockSystemModalContainer)
                 ->layout_manager(),
             controller->GetSystemModalLayoutManager(NULL));
@@ -410,11 +412,12 @@
 TEST_F(RootWindowControllerTest, ModalContainerNotLoggedInLoggedIn) {
   UpdateDisplay("600x600");
   Shell* shell = Shell::GetInstance();
+  WmShell* wm_shell = WmShell::Get();
 
   // Configure login screen environment.
   SetUserLoggedIn(false);
   EXPECT_EQ(LoginStatus::NOT_LOGGED_IN,
-            shell->system_tray_delegate()->GetUserLoginStatus());
+            wm_shell->system_tray_delegate()->GetUserLoginStatus());
   EXPECT_EQ(0, shell->session_state_delegate()->NumberOfLoggedInUsers());
   EXPECT_FALSE(shell->session_state_delegate()->IsActiveUserSessionStarted());
 
@@ -437,7 +440,7 @@
   SetUserLoggedIn(true);
   SetSessionStarted(true);
   EXPECT_EQ(LoginStatus::USER,
-            shell->system_tray_delegate()->GetUserLoginStatus());
+            wm_shell->system_tray_delegate()->GetUserLoginStatus());
   EXPECT_EQ(1, shell->session_state_delegate()->NumberOfLoggedInUsers());
   EXPECT_TRUE(shell->session_state_delegate()->IsActiveUserSessionStarted());
   EXPECT_EQ(controller->GetContainer(kShellWindowId_SystemModalContainer)
diff --git a/ash/shelf/shelf_widget.cc b/ash/shelf/shelf_widget.cc
index 8430737..9c6ea09e 100644
--- a/ash/shelf/shelf_widget.cc
+++ b/ash/shelf/shelf_widget.cc
@@ -15,6 +15,7 @@
 #include "ash/common/shell_window_ids.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/wm_root_window_controller.h"
+#include "ash/common/wm_shell.h"
 #include "ash/focus_cycler.h"
 #include "ash/shelf/shelf_delegate.h"
 #include "ash/shelf/shelf_layout_manager.h"
@@ -677,11 +678,11 @@
 
 // static
 bool ShelfWidget::ShelfAlignmentAllowed() {
-  if (Shell::GetInstance()->system_tray_delegate()->IsUserSupervised())
+  if (WmShell::Get()->system_tray_delegate()->IsUserSupervised())
     return false;
 
   LoginStatus login_status =
-      Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus();
+      WmShell::Get()->system_tray_delegate()->GetUserLoginStatus();
 
   switch (login_status) {
     case LoginStatus::LOCKED:
diff --git a/ash/shell.cc b/ash/shell.cc
index fafa99d..968e8a9 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -24,6 +24,7 @@
 #include "ash/common/wm/mru_window_tracker.h"
 #include "ash/common/wm/root_window_finder.h"
 #include "ash/common/wm/window_positioner.h"
+#include "ash/common/wm_shell.h"
 #include "ash/common/wm_shell_common.h"
 #include "ash/container_delegate.h"
 #include "ash/desktop_background/desktop_background_controller.h"
@@ -727,8 +728,8 @@
   // Destroy SystemTrayDelegate before destroying the status area(s). Make sure
   // to deinitialize the shelf first, as it is initialized after the delegate.
   ShutdownShelf();
-  system_tray_delegate_->Shutdown();
-  system_tray_delegate_.reset();
+  wm_shell_->system_tray_delegate()->Shutdown();
+  wm_shell_->SetSystemTrayDelegate(nullptr);
 
   locale_notification_controller_.reset();
 
@@ -1079,15 +1080,13 @@
   // Create system_tray_notifier_ before the delegate.
   system_tray_notifier_.reset(new SystemTrayNotifier());
 
-  // Initialize system_tray_delegate_ before initializing StatusAreaWidget.
-  system_tray_delegate_.reset(delegate()->CreateSystemTrayDelegate());
-  DCHECK(system_tray_delegate_.get());
+  SystemTrayDelegate* system_tray_delegate =
+      delegate()->CreateSystemTrayDelegate();
+  DCHECK(system_tray_delegate);
+  wm_shell_->SetSystemTrayDelegate(base::WrapUnique(system_tray_delegate));
 
   locale_notification_controller_.reset(new LocaleNotificationController);
 
-  // Initialize system_tray_delegate_ after StatusAreaWidget is created.
-  system_tray_delegate_->Initialize();
-
   // Initialize toast manager
   toast_manager_.reset(new ToastManager);
 
@@ -1095,7 +1094,7 @@
   // Create the LogoutConfirmationController after the SystemTrayDelegate.
   logout_confirmation_controller_.reset(new LogoutConfirmationController(
       base::Bind(&SystemTrayDelegate::SignOut,
-                 base::Unretained(system_tray_delegate_.get()))));
+                 base::Unretained(system_tray_delegate))));
 
   // Create TouchTransformerController before
   // WindowTreeHostManager::InitDisplays()
diff --git a/ash/shell.h b/ash/shell.h
index 6aff8bcc1..d4d1033 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -148,7 +148,6 @@
 class SystemGestureEventFilter;
 class SystemModalContainerEventFilter;
 class SystemTray;
-class SystemTrayDelegate;
 class SystemTrayNotifier;
 class ToastManager;
 class ToplevelWindowEventHandler;
@@ -495,10 +494,6 @@
   // Returns the system tray on primary display.
   SystemTray* GetPrimarySystemTray();
 
-  SystemTrayDelegate* system_tray_delegate() {
-    return system_tray_delegate_.get();
-  }
-
   SystemTrayNotifier* system_tray_notifier() {
     return system_tray_notifier_.get();
   }
@@ -665,7 +660,6 @@
   std::unique_ptr<UserMetricsRecorder> user_metrics_recorder_;
   std::unique_ptr<AcceleratorController> accelerator_controller_;
   std::unique_ptr<ShellDelegate> delegate_;
-  std::unique_ptr<SystemTrayDelegate> system_tray_delegate_;
   std::unique_ptr<SystemTrayNotifier> system_tray_notifier_;
   std::unique_ptr<UserWallpaperDelegate> user_wallpaper_delegate_;
   std::unique_ptr<SessionStateDelegate> session_state_delegate_;
diff --git a/ash/system/cast/tray_cast.cc b/ash/system/cast/tray_cast.cc
index fe95125..3339da8 100644
--- a/ash/system/cast/tray_cast.cc
+++ b/ash/system/cast/tray_cast.cc
@@ -45,9 +45,7 @@
 
 // Returns the active CastConfigDelegate instance.
 ash::CastConfigDelegate* GetCastConfigDelegate() {
-  return ash::Shell::GetInstance()
-      ->system_tray_delegate()
-      ->GetCastConfigDelegate();
+  return WmShell::Get()->system_tray_delegate()->GetCastConfigDelegate();
 }
 
 // Helper method to elide the given string to the maximum length. If a string is
diff --git a/ash/system/chromeos/bluetooth/tray_bluetooth.cc b/ash/system/chromeos/bluetooth/tray_bluetooth.cc
index 47a46950..9227f423 100644
--- a/ash/system/chromeos/bluetooth/tray_bluetooth.cc
+++ b/ash/system/chromeos/bluetooth/tray_bluetooth.cc
@@ -7,6 +7,7 @@
 #include "ash/common/session/session_state_delegate.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/system/tray/fixed_sized_scroll_view.h"
 #include "ash/system/tray/hover_highlight_view.h"
@@ -75,7 +76,7 @@
 
   void UpdateLabel() {
     ash::SystemTrayDelegate* delegate =
-        ash::Shell::GetInstance()->system_tray_delegate();
+        ash::WmShell::Get()->system_tray_delegate();
     if (delegate->GetBluetoothAvailable()) {
       ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
       const base::string16 label =
@@ -131,7 +132,7 @@
 
   void BluetoothStartDiscovering() {
     ash::SystemTrayDelegate* delegate =
-        ash::Shell::GetInstance()->system_tray_delegate();
+        ash::WmShell::Get()->system_tray_delegate();
     bool bluetooth_enabled = delegate->GetBluetoothEnabled();
     bool bluetooth_discovering = delegate->GetBluetoothDiscovering();
     if (bluetooth_discovering) {
@@ -146,7 +147,7 @@
 
   void BluetoothStopDiscovering() {
     ash::SystemTrayDelegate* delegate =
-        ash::Shell::GetInstance()->system_tray_delegate();
+        ash::WmShell::Get()->system_tray_delegate();
     if (delegate && delegate->GetBluetoothDiscovering()) {
       delegate->BluetoothStopDiscovering();
       throbber_->Stop();
@@ -160,8 +161,7 @@
     std::set<std::string> new_discovered_not_paired_devices;
 
     BluetoothDeviceList list;
-    Shell::GetInstance()->system_tray_delegate()->GetAvailableBluetoothDevices(
-        &list);
+    WmShell::Get()->system_tray_delegate()->GetAvailableBluetoothDevices(&list);
     for (size_t i = 0; i < list.size(); ++i) {
       if (list[i].connecting) {
         list[i].display_name = l10n_util::GetStringFUTF16(
@@ -204,7 +204,7 @@
 
     // Do not allow toggling bluetooth in the lock screen.
     ash::SystemTrayDelegate* delegate =
-        ash::Shell::GetInstance()->system_tray_delegate();
+        ash::WmShell::Get()->system_tray_delegate();
     toggle_bluetooth_ =
         new TrayPopupHeaderButton(this, IDR_AURA_UBER_TRAY_BLUETOOTH_ENABLED,
                                   IDR_AURA_UBER_TRAY_BLUETOOTH_DISABLED,
@@ -222,9 +222,8 @@
 
   void UpdateHeaderEntry() {
     if (toggle_bluetooth_) {
-      toggle_bluetooth_->SetToggled(!ash::Shell::GetInstance()
-                                         ->system_tray_delegate()
-                                         ->GetBluetoothEnabled());
+      toggle_bluetooth_->SetToggled(
+          !ash::WmShell::Get()->system_tray_delegate()->GetBluetoothEnabled());
     }
   }
 
@@ -234,7 +233,7 @@
     enable_bluetooth_ = NULL;
 
     ash::SystemTrayDelegate* delegate =
-        ash::Shell::GetInstance()->system_tray_delegate();
+        ash::WmShell::Get()->system_tray_delegate();
     bool bluetooth_enabled = delegate->GetBluetoothEnabled();
     bool blueooth_available = delegate->GetBluetoothAvailable();
     if (blueooth_available && !bluetooth_enabled && toggle_bluetooth_) {
@@ -292,11 +291,8 @@
 
   // Add settings entries.
   void AppendSettingsEntries() {
-    if (!ash::Shell::GetInstance()
-             ->system_tray_delegate()
-             ->ShouldShowSettings()) {
+    if (!ash::WmShell::Get()->system_tray_delegate()->ShouldShowSettings())
       return;
-    }
 
     // Add bluetooth device requires a browser window, hide it for non logged in
     // user.
@@ -309,7 +305,7 @@
       return;
 
     ash::SystemTrayDelegate* delegate =
-        ash::Shell::GetInstance()->system_tray_delegate();
+        ash::WmShell::Get()->system_tray_delegate();
     ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
     HoverHighlightView* container = new HoverHighlightView(this);
     container->AddLabel(
@@ -356,7 +352,7 @@
   // Overridden from ViewClickListener.
   void OnViewClicked(views::View* sender) override {
     ash::SystemTrayDelegate* delegate =
-        ash::Shell::GetInstance()->system_tray_delegate();
+        ash::WmShell::Get()->system_tray_delegate();
     if (sender == footer()->content()) {
       TransitionToDefaultView();
     } else if (sender == manage_devices_) {
@@ -385,7 +381,7 @@
   // Overridden from ButtonListener.
   void ButtonPressed(views::Button* sender, const ui::Event& event) override {
     ash::SystemTrayDelegate* delegate =
-        ash::Shell::GetInstance()->system_tray_delegate();
+        ash::WmShell::Get()->system_tray_delegate();
     if (sender == toggle_bluetooth_)
       delegate->ToggleBluetooth();
     else
@@ -430,7 +426,7 @@
 }
 
 views::View* TrayBluetooth::CreateDetailedView(LoginStatus status) {
-  if (!Shell::GetInstance()->system_tray_delegate()->GetBluetoothAvailable())
+  if (!WmShell::Get()->system_tray_delegate()->GetBluetoothAvailable())
     return NULL;
   Shell::GetInstance()->metrics()->RecordUserMetricsAction(
       ash::UMA_STATUS_AREA_DETAILED_BLUETOOTH_VIEW);
diff --git a/ash/system/chromeos/enterprise/tray_enterprise.cc b/ash/system/chromeos/enterprise/tray_enterprise.cc
index 96047b0..a082a3d 100644
--- a/ash/system/chromeos/enterprise/tray_enterprise.cc
+++ b/ash/system/chromeos/enterprise/tray_enterprise.cc
@@ -5,6 +5,7 @@
 #include "ash/system/chromeos/enterprise/tray_enterprise.h"
 
 #include "ash/common/system/tray/system_tray_delegate.h"
+#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/system/chromeos/label_tray_view.h"
 #include "ash/system/tray/system_tray_notifier.h"
@@ -28,8 +29,8 @@
 }
 
 void TrayEnterprise::UpdateEnterpriseMessage() {
-  base::string16 message = Shell::GetInstance()->system_tray_delegate()->
-      GetEnterpriseMessage();
+  base::string16 message =
+      WmShell::Get()->system_tray_delegate()->GetEnterpriseMessage();
   if (tray_view_)
     tray_view_->SetMessage(message);
 }
@@ -54,7 +55,7 @@
 }
 
 void TrayEnterprise::OnViewClicked(views::View* sender) {
-  Shell::GetInstance()->system_tray_delegate()->ShowEnterpriseInfo();
+  WmShell::Get()->system_tray_delegate()->ShowEnterpriseInfo();
 }
 
 } // namespace ash
diff --git a/ash/system/chromeos/network/network_state_list_detailed_view.cc b/ash/system/chromeos/network/network_state_list_detailed_view.cc
index 39f0b66..a3a1ff4 100644
--- a/ash/system/chromeos/network/network_state_list_detailed_view.cc
+++ b/ash/system/chromeos/network/network_state_list_detailed_view.cc
@@ -14,6 +14,7 @@
 #include "ash/common/system/tray/fixed_sized_image_view.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/metrics/user_metrics_recorder.h"
 #include "ash/root_window_controller.h"
 #include "ash/shell.h"
@@ -374,7 +375,7 @@
 
   NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
   ash::SystemTrayDelegate* delegate =
-      ash::Shell::GetInstance()->system_tray_delegate();
+      ash::WmShell::Get()->system_tray_delegate();
   if (sender == button_wifi_) {
     bool enabled = handler->IsTechnologyEnabled(NetworkTypePattern::WiFi());
     handler->SetTechnologyEnabled(NetworkTypePattern::WiFi(), !enabled,
@@ -427,7 +428,7 @@
         list_type_ == LIST_TYPE_VPN
             ? ash::UMA_STATUS_AREA_SHOW_NETWORK_CONNECTION_DETAILS
             : ash::UMA_STATUS_AREA_SHOW_VPN_CONNECTION_DETAILS);
-    Shell::GetInstance()->system_tray_delegate()->ShowNetworkSettingsForGuid(
+    WmShell::Get()->system_tray_delegate()->ShowNetworkSettingsForGuid(
         network ? network->guid() : "");
   } else {
     Shell::GetInstance()->metrics()->RecordUserMetricsAction(
@@ -717,7 +718,7 @@
 void NetworkStateListDetailedView::CreateSettingsEntry() {
   ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
   bool show_settings =
-      ash::Shell::GetInstance()->system_tray_delegate()->ShouldShowSettings();
+      WmShell::Get()->system_tray_delegate()->ShouldShowSettings();
   if (login_ != LoginStatus::NOT_LOGGED_IN) {
     // Allow user access settings only if user is logged in
     // and showing settings is allowed. There're situations (supervised user
@@ -835,9 +836,7 @@
 views::View* NetworkStateListDetailedView::CreateControlledByExtensionView(
     const ui::NetworkInfo& info) {
   NetworkingConfigDelegate* networking_config_delegate =
-      Shell::GetInstance()
-          ->system_tray_delegate()
-          ->GetNetworkingConfigDelegate();
+      WmShell::Get()->system_tray_delegate()->GetNetworkingConfigDelegate();
   if (!networking_config_delegate)
     return nullptr;
   std::unique_ptr<const ash::NetworkingConfigDelegate::ExtensionInfo>
diff --git a/ash/system/chromeos/network/tray_vpn.cc b/ash/system/chromeos/network/tray_vpn.cc
index 0a9f7679..291c785 100644
--- a/ash/system/chromeos/network/tray_vpn.cc
+++ b/ash/system/chromeos/network/tray_vpn.cc
@@ -7,6 +7,7 @@
 #include "ash/common/session/session_state_delegate.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/metrics/user_metrics_recorder.h"
 #include "ash/shell.h"
 #include "ash/system/chromeos/network/network_state_list_detailed_view.h"
@@ -47,7 +48,7 @@
   static bool ShouldShow() {
     // Show the VPN entry in the ash tray bubble if at least one third-party VPN
     // provider is installed.
-    if (Shell::GetInstance()
+    if (WmShell::Get()
             ->system_tray_delegate()
             ->GetVPNDelegate()
             ->HaveThirdPartyVPNProviders()) {
diff --git a/ash/system/chromeos/network/vpn_list_view.cc b/ash/system/chromeos/network/vpn_list_view.cc
index ec00e5c..04ada09 100644
--- a/ash/system/chromeos/network/vpn_list_view.cc
+++ b/ash/system/chromeos/network/vpn_list_view.cc
@@ -10,6 +10,7 @@
 
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/metrics/user_metrics_recorder.h"
 #include "ash/shell.h"
 #include "ash/system/chromeos/network/vpn_delegate.h"
@@ -233,14 +234,13 @@
 
 VPNListView::VPNListView(ui::NetworkListDelegate* delegate)
     : delegate_(delegate) {
-  Shell::GetInstance()->system_tray_delegate()->GetVPNDelegate()->AddObserver(
-      this);
+  WmShell::Get()->system_tray_delegate()->GetVPNDelegate()->AddObserver(this);
 }
 
 VPNListView::~VPNListView() {
   // We need the check as on shell destruction, the delegate is destroyed first.
   SystemTrayDelegate* const system_tray_delegate =
-      Shell::GetInstance()->system_tray_delegate();
+      WmShell::Get()->system_tray_delegate();
   if (system_tray_delegate) {
     VPNDelegate* const vpn_delegate = system_tray_delegate->GetVPNDelegate();
     if (vpn_delegate)
@@ -345,11 +345,10 @@
     // If the user clicks on a provider entry, request that the "add network"
     // dialog for this provider be shown.
     const VPNProvider::Key& key = provider->second;
-    Shell* shell = Shell::GetInstance();
-    shell->metrics()->RecordUserMetricsAction(
+    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
         key.third_party ? UMA_STATUS_AREA_VPN_ADD_THIRD_PARTY_CLICKED
                         : UMA_STATUS_AREA_VPN_ADD_BUILT_IN_CLICKED);
-    shell->system_tray_delegate()->GetVPNDelegate()->ShowAddPage(key);
+    WmShell::Get()->system_tray_delegate()->GetVPNDelegate()->ShowAddPage(key);
     return;
   }
 
@@ -394,7 +393,7 @@
 void VPNListView::AddProvidersAndNetworks(
     const chromeos::NetworkStateHandler::NetworkStateList& networks) {
   // Get the list of VPN providers enabled in the primary user's profile.
-  std::vector<VPNProvider> providers = Shell::GetInstance()
+  std::vector<VPNProvider> providers = WmShell::Get()
                                            ->system_tray_delegate()
                                            ->GetVPNDelegate()
                                            ->GetVPNProviders();
diff --git a/ash/system/chromeos/power/dual_role_notification.cc b/ash/system/chromeos/power/dual_role_notification.cc
index 36c78fc..58e6aec 100644
--- a/ash/system/chromeos/power/dual_role_notification.cc
+++ b/ash/system/chromeos/power/dual_role_notification.cc
@@ -7,7 +7,7 @@
 #include <set>
 
 #include "ash/common/system/tray/system_tray_delegate.h"
-#include "ash/shell.h"
+#include "ash/common/wm_shell.h"
 #include "ash/system/chromeos/power/power_status.h"
 #include "ash/system/system_notifier.h"
 #include "base/strings/utf_string_conversions.h"
@@ -37,7 +37,7 @@
 
   // Overridden from message_center::NotificationDelegate.
   void Click() override {
-    Shell::GetInstance()->system_tray_delegate()->ShowPowerSettings();
+    WmShell::Get()->system_tray_delegate()->ShowPowerSettings();
   }
 
  private:
diff --git a/ash/system/chromeos/session/last_window_closed_logout_reminder.cc b/ash/system/chromeos/session/last_window_closed_logout_reminder.cc
index 98da9e92..709e691 100644
--- a/ash/system/chromeos/session/last_window_closed_logout_reminder.cc
+++ b/ash/system/chromeos/session/last_window_closed_logout_reminder.cc
@@ -5,6 +5,7 @@
 #include "ash/system/chromeos/session/last_window_closed_logout_reminder.h"
 
 #include "ash/common/system/tray/system_tray_delegate.h"
+#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/system/chromeos/session/logout_confirmation_controller.h"
 #include "ash/system/tray/system_tray_notifier.h"
@@ -27,7 +28,7 @@
 }
 
 void LastWindowClosedLogoutReminder::OnLastWindowClosed() {
-  if (Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus() !=
+  if (WmShell::Get()->system_tray_delegate()->GetUserLoginStatus() !=
       LoginStatus::PUBLIC) {
     return;
   }
diff --git a/ash/system/chromeos/session/logout_button_tray.cc b/ash/system/chromeos/session/logout_button_tray.cc
index 78f7d154..f7218f5 100644
--- a/ash/system/chromeos/session/logout_button_tray.cc
+++ b/ash/system/chromeos/session/logout_button_tray.cc
@@ -10,6 +10,7 @@
 #include "ash/common/shelf/shelf_types.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/system/chromeos/session/logout_confirmation_controller.h"
 #include "ash/system/status_area_widget.h"
@@ -138,7 +139,7 @@
   DCHECK_EQ(sender, button_);
   if (dialog_duration_ <= base::TimeDelta()) {
     // Sign out immediately if |dialog_duration_| is non-positive.
-    Shell::GetInstance()->system_tray_delegate()->SignOut();
+    WmShell::Get()->system_tray_delegate()->SignOut();
   } else if (Shell::GetInstance()->logout_confirmation_controller()) {
     Shell::GetInstance()->logout_confirmation_controller()->ConfirmLogout(
         base::TimeTicks::Now() + dialog_duration_);
diff --git a/ash/system/chromeos/session/tray_session_length_limit.cc b/ash/system/chromeos/session/tray_session_length_limit.cc
index 5fd1cba1..5588718 100644
--- a/ash/system/chromeos/session/tray_session_length_limit.cc
+++ b/ash/system/chromeos/session/tray_session_length_limit.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "ash/common/system/tray/system_tray_delegate.h"
+#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/system/chromeos/label_tray_view.h"
 #include "ash/system/system_notifier.h"
@@ -91,7 +92,7 @@
 }
 
 void TraySessionLengthLimit::UpdateState() {
-  SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
+  SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
   if (delegate->GetSessionStartTime(&session_start_time_) &&
       delegate->GetSessionLengthLimit(&time_limit_)) {
     const base::TimeDelta expiring_soon_threshold(
diff --git a/ash/system/chromeos/settings/tray_settings.cc b/ash/system/chromeos/settings/tray_settings.cc
index a0ca04d6..ecc20bc 100644
--- a/ash/system/chromeos/settings/tray_settings.cc
+++ b/ash/system/chromeos/settings/tray_settings.cc
@@ -8,6 +8,7 @@
 #include "ash/common/system/tray/fixed_sized_image_view.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/system/chromeos/power/power_status.h"
 #include "ash/system/chromeos/power/power_status_view.h"
@@ -72,15 +73,16 @@
 
   // Overridden from ash::ActionableView.
   bool PerformAction(const ui::Event& event) override {
-    bool userAddingRunning = ash::Shell::GetInstance()
-                                 ->session_state_delegate()
-                                 ->IsInSecondaryLoginScreen();
+    bool adding_user = Shell::GetInstance()
+                           ->session_state_delegate()
+                           ->IsInSecondaryLoginScreen();
 
     if (login_status_ == LoginStatus::NOT_LOGGED_IN ||
-        login_status_ == LoginStatus::LOCKED || userAddingRunning)
+        login_status_ == LoginStatus::LOCKED || adding_user) {
       return false;
+    }
 
-    ash::Shell::GetInstance()->system_tray_delegate()->ShowSettings();
+    WmShell::Get()->system_tray_delegate()->ShowSettings();
     return true;
   }
 
@@ -143,7 +145,7 @@
   if ((status == LoginStatus::NOT_LOGGED_IN || status == LoginStatus::LOCKED) &&
       !PowerStatus::Get()->IsBatteryPresent())
     return NULL;
-  if (!ash::Shell::GetInstance()->system_tray_delegate()->ShouldShowSettings())
+  if (!WmShell::Get()->system_tray_delegate()->ShouldShowSettings())
     return NULL;
   CHECK(default_view_ == NULL);
   default_view_ =  new tray::SettingsDefaultView(status);
diff --git a/ash/system/chromeos/supervised/tray_supervised_user.cc b/ash/system/chromeos/supervised/tray_supervised_user.cc
index ab8feb0c..c260140 100644
--- a/ash/system/chromeos/supervised/tray_supervised_user.cc
+++ b/ash/system/chromeos/supervised/tray_supervised_user.cc
@@ -7,7 +7,7 @@
 #include <utility>
 
 #include "ash/common/system/tray/system_tray_delegate.h"
-#include "ash/shell.h"
+#include "ash/common/wm_shell.h"
 #include "ash/system/chromeos/label_tray_view.h"
 #include "ash/system/system_notifier.h"
 #include "ash/system/tray/system_tray_notifier.h"
@@ -33,21 +33,20 @@
       tray_view_(NULL),
       status_(LoginStatus::NOT_LOGGED_IN),
       is_user_supervised_(false) {
-  Shell::GetInstance()->system_tray_delegate()->
-      AddCustodianInfoTrayObserver(this);
+  WmShell::Get()->system_tray_delegate()->AddCustodianInfoTrayObserver(this);
 }
 
 TraySupervisedUser::~TraySupervisedUser() {
   // We need the check as on shell destruction delegate is destroyed first.
   SystemTrayDelegate* system_tray_delegate =
-      Shell::GetInstance()->system_tray_delegate();
+      WmShell::Get()->system_tray_delegate();
   if (system_tray_delegate)
     system_tray_delegate->RemoveCustodianInfoTrayObserver(this);
 }
 
 void TraySupervisedUser::UpdateMessage() {
-  base::string16 message = Shell::GetInstance()->system_tray_delegate()->
-      GetSupervisedUserMessage();
+  base::string16 message =
+      WmShell::Get()->system_tray_delegate()->GetSupervisedUserMessage();
   if (tray_view_)
     tray_view_->SetMessage(message);
   if (message_center::MessageCenter::Get()->FindVisibleNotificationById(
@@ -57,7 +56,7 @@
 
 views::View* TraySupervisedUser::CreateDefaultView(LoginStatus status) {
   CHECK(tray_view_ == NULL);
-  SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
+  SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
   if (!delegate->IsUserSupervised())
     return NULL;
 
@@ -71,11 +70,11 @@
 }
 
 void TraySupervisedUser::OnViewClicked(views::View* sender) {
-  Shell::GetInstance()->system_tray_delegate()->ShowSupervisedUserInfo();
+  WmShell::Get()->system_tray_delegate()->ShowSupervisedUserInfo();
 }
 
 void TraySupervisedUser::UpdateAfterLoginStatusChange(LoginStatus status) {
-  SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
+  SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
 
   bool is_user_supervised = delegate->IsUserSupervised();
   if (status == status_ && is_user_supervised == is_user_supervised_)
@@ -104,12 +103,12 @@
 }
 
 void TraySupervisedUser::CreateOrUpdateSupervisedWarningNotification() {
-  SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
+  SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
   CreateOrUpdateNotification(delegate->GetSupervisedUserMessage());
 }
 
 void TraySupervisedUser::OnCustodianInfoChanged() {
-  SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
+  SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
   std::string manager_name = delegate->GetSupervisedUserManager();
   if (!manager_name.empty()) {
     if (!delegate->IsUserChild() &&
@@ -122,7 +121,7 @@
 }
 
 int TraySupervisedUser::GetSupervisedUserIconId() const {
-  SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
+  SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
 
   // Not intended to be used for non-supervised users.
   CHECK(delegate->IsUserSupervised());
diff --git a/ash/system/chromeos/supervised/tray_supervised_user_unittest.cc b/ash/system/chromeos/supervised/tray_supervised_user_unittest.cc
index 5ff42955..b99c1ba 100644
--- a/ash/system/chromeos/supervised/tray_supervised_user_unittest.cc
+++ b/ash/system/chromeos/supervised/tray_supervised_user_unittest.cc
@@ -4,7 +4,6 @@
 
 #include "ash/system/chromeos/supervised/tray_supervised_user.h"
 
-#include "ash/shell.h"
 #include "ash/system/user/login_status.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/test/test_system_tray_delegate.h"
@@ -63,9 +62,7 @@
 }
 
 TEST_F(TraySupervisedUserTest, SupervisedUserHasNotification) {
-  test::TestSystemTrayDelegate* delegate =
-      static_cast<test::TestSystemTrayDelegate*>(
-          ash::Shell::GetInstance()->system_tray_delegate());
+  test::TestSystemTrayDelegate* delegate = GetSystemTrayDelegate();
   delegate->SetLoginStatus(LoginStatus::SUPERVISED);
 
   message_center::Notification* notification = GetPopup();
@@ -83,4 +80,4 @@
             notification->rich_notification_data().priority);
 }
 
-}  // namespace
+}  // namespace ash
diff --git a/ash/system/chromeos/tray_caps_lock.cc b/ash/system/chromeos/tray_caps_lock.cc
index 4bf2602..cd9bfc8b 100644
--- a/ash/system/chromeos/tray_caps_lock.cc
+++ b/ash/system/chromeos/tray_caps_lock.cc
@@ -7,6 +7,7 @@
 #include "ash/common/system/tray/fixed_sized_image_view.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/metrics/user_metrics_recorder.h"
 #include "ash/shell.h"
 #include "ash/system/tray/actionable_view.h"
@@ -72,8 +73,8 @@
     text_label_->SetText(bundle.GetLocalizedString(text_string_id));
 
     int shortcut_string_id = 0;
-    bool search_mapped_to_caps_lock = Shell::GetInstance()->
-        system_tray_delegate()->IsSearchKeyMappedToCapsLock();
+    bool search_mapped_to_caps_lock =
+        WmShell::Get()->system_tray_delegate()->IsSearchKeyMappedToCapsLock();
     if (caps_lock_enabled) {
       shortcut_string_id = search_mapped_to_caps_lock ?
           IDS_ASH_STATUS_TRAY_CAPS_LOCK_SHORTCUT_SEARCH_OR_SHIFT :
@@ -197,10 +198,10 @@
 
   detailed_->AddChildView(image);
 
-  const int string_id = Shell::GetInstance()->system_tray_delegate()->
-                            IsSearchKeyMappedToCapsLock() ?
-      IDS_ASH_STATUS_TRAY_CAPS_LOCK_CANCEL_BY_SEARCH :
-      IDS_ASH_STATUS_TRAY_CAPS_LOCK_CANCEL_BY_ALT_SEARCH;
+  const int string_id =
+      WmShell::Get()->system_tray_delegate()->IsSearchKeyMappedToCapsLock()
+          ? IDS_ASH_STATUS_TRAY_CAPS_LOCK_CANCEL_BY_SEARCH
+          : IDS_ASH_STATUS_TRAY_CAPS_LOCK_CANCEL_BY_ALT_SEARCH;
   views::Label* label = new views::Label(bundle.GetLocalizedString(string_id));
   label->SetMultiLine(true);
   label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
diff --git a/ash/system/chromeos/tray_display.cc b/ash/system/chromeos/tray_display.cc
index 8da404d..58613d09 100644
--- a/ash/system/chromeos/tray_display.cc
+++ b/ash/system/chromeos/tray_display.cc
@@ -11,6 +11,7 @@
 #include "ash/common/system/tray/fixed_sized_image_view.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/display/display_manager.h"
 #include "ash/display/screen_orientation_controller_chromeos.h"
 #include "ash/display/window_tree_host_manager.h"
@@ -117,7 +118,7 @@
 void OpenSettings() {
   // switch is intentionally introduced without default, to cause an error when
   // a new type of login status is introduced.
-  switch (Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus()) {
+  switch (WmShell::Get()->system_tray_delegate()->GetUserLoginStatus()) {
     case LoginStatus::NOT_LOGGED_IN:
     case LoginStatus::LOCKED:
       return;
@@ -128,8 +129,7 @@
     case LoginStatus::PUBLIC:
     case LoginStatus::SUPERVISED:
     case LoginStatus::KIOSK_APP:
-      ash::SystemTrayDelegate* delegate =
-          Shell::GetInstance()->system_tray_delegate();
+      SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
       if (delegate->ShouldShowSettings())
         delegate->ShowDisplaySettings();
   }
@@ -432,8 +432,9 @@
   if (default_)
     default_->Update();
 
-  if (!Shell::GetInstance()->system_tray_delegate()->
-          ShouldShowDisplayNotification()) {
+  if (!WmShell::Get()
+           ->system_tray_delegate()
+           ->ShouldShowDisplayNotification()) {
     return;
   }
 
diff --git a/ash/system/chromeos/tray_display_unittest.cc b/ash/system/chromeos/tray_display_unittest.cc
index 306611d..ce5a878 100644
--- a/ash/system/chromeos/tray_display_unittest.cc
+++ b/ash/system/chromeos/tray_display_unittest.cc
@@ -443,9 +443,7 @@
 }
 
 TEST_F(TrayDisplayTest, DisplayNotifications) {
-  test::TestSystemTrayDelegate* tray_delegate =
-      static_cast<test::TestSystemTrayDelegate*>(
-          Shell::GetInstance()->system_tray_delegate());
+  test::TestSystemTrayDelegate* tray_delegate = GetSystemTrayDelegate();
   tray_delegate->set_should_show_display_notification(true);
 
   UpdateDisplay("400x400");
@@ -554,9 +552,7 @@
 }
 
 TEST_F(TrayDisplayTest, DisplayConfigurationChangedTwice) {
-  test::TestSystemTrayDelegate* tray_delegate =
-      static_cast<test::TestSystemTrayDelegate*>(
-          Shell::GetInstance()->system_tray_delegate());
+  test::TestSystemTrayDelegate* tray_delegate = GetSystemTrayDelegate();
   tray_delegate->set_should_show_display_notification(true);
 
   UpdateDisplay("400x400,200x200");
@@ -583,9 +579,7 @@
 TEST_F(TrayDisplayTest, UpdateAfterSuppressDisplayNotification) {
   UpdateDisplay("400x400,200x200");
 
-  test::TestSystemTrayDelegate* tray_delegate =
-      static_cast<test::TestSystemTrayDelegate*>(
-          Shell::GetInstance()->system_tray_delegate());
+  test::TestSystemTrayDelegate* tray_delegate = GetSystemTrayDelegate();
   tray_delegate->set_should_show_display_notification(true);
 
   // rotate the second.
diff --git a/ash/system/chromeos/tray_tracing.cc b/ash/system/chromeos/tray_tracing.cc
index 4750923a..5d125be3 100644
--- a/ash/system/chromeos/tray_tracing.cc
+++ b/ash/system/chromeos/tray_tracing.cc
@@ -7,6 +7,7 @@
 #include "ash/common/system/tray/fixed_sized_image_view.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/system/tray/actionable_view.h"
 #include "ash/system/tray/system_tray.h"
@@ -48,7 +49,7 @@
  private:
   // Overridden from ActionableView.
   bool PerformAction(const ui::Event& event) override {
-    Shell::GetInstance()->system_tray_delegate()->ShowChromeSlow();
+    WmShell::Get()->system_tray_delegate()->ShowChromeSlow();
     return true;
   }
 
diff --git a/ash/system/date/date_default_view.cc b/ash/system/date/date_default_view.cc
index 75087c26..92f96ba9 100644
--- a/ash/system/date/date_default_view.cc
+++ b/ash/system/date/date_default_view.cc
@@ -7,6 +7,7 @@
 #include "ash/common/session/session_state_delegate.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/metrics/user_metrics_recorder.h"
 #include "ash/shell.h"
 #include "ash/system/date/date_view.h"
@@ -95,7 +96,7 @@
     view->AddButton(lock_button_);
   }
   SystemTrayDelegate* system_tray_delegate =
-      Shell::GetInstance()->system_tray_delegate();
+      WmShell::Get()->system_tray_delegate();
   system_tray_delegate->AddShutdownPolicyObserver(this);
   system_tray_delegate->ShouldRebootOnShutdown(base::Bind(
       &DateDefaultView::OnShutdownPolicyChanged, weak_factory_.GetWeakPtr()));
@@ -105,7 +106,7 @@
 DateDefaultView::~DateDefaultView() {
   // We need the check as on shell destruction, the delegate is destroyed first.
   SystemTrayDelegate* system_tray_delegate =
-      Shell::GetInstance()->system_tray_delegate();
+      WmShell::Get()->system_tray_delegate();
   if (system_tray_delegate)
     system_tray_delegate->RemoveShutdownPolicyObserver(this);
 }
@@ -128,14 +129,14 @@
 
 void DateDefaultView::ButtonPressed(views::Button* sender,
                                     const ui::Event& event) {
-  ash::Shell* shell = ash::Shell::GetInstance();
-  ash::SystemTrayDelegate* tray_delegate = shell->system_tray_delegate();
+  Shell* shell = Shell::GetInstance();
+  SystemTrayDelegate* tray_delegate = WmShell::Get()->system_tray_delegate();
   if (sender == help_button_) {
     shell->metrics()->RecordUserMetricsAction(ash::UMA_TRAY_HELP);
     tray_delegate->ShowHelp();
   } else if (sender == shutdown_button_) {
     shell->metrics()->RecordUserMetricsAction(ash::UMA_TRAY_SHUT_DOWN);
-    ash::Shell::GetInstance()->lock_state_controller()->RequestShutdown();
+    shell->lock_state_controller()->RequestShutdown();
   } else if (sender == lock_button_) {
     shell->metrics()->RecordUserMetricsAction(ash::UMA_TRAY_LOCK_SCREEN);
     tray_delegate->RequestLockScreen();
diff --git a/ash/system/date/date_view.cc b/ash/system/date/date_view.cc
index 85a5e61..e805643 100644
--- a/ash/system/date/date_view.cc
+++ b/ash/system/date/date_view.cc
@@ -6,7 +6,7 @@
 
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
-#include "ash/shell.h"
+#include "ash/common/wm_shell.h"
 #include "ash/system/tray/tray_utils.h"
 #include "base/command_line.h"
 #include "base/i18n/rtl.h"
@@ -99,9 +99,7 @@
 }
 
 BaseDateTimeView::BaseDateTimeView()
-    : hour_type_(ash::Shell::GetInstance()
-                     ->system_tray_delegate()
-                     ->GetHourClockType()) {
+    : hour_type_(WmShell::Get()->system_tray_delegate()->GetHourClockType()) {
   SetTimer(base::Time::Now());
   SetFocusBehavior(FocusBehavior::NEVER);
 }
@@ -174,8 +172,7 @@
 }
 
 void DateView::UpdateTimeFormat() {
-  hour_type_ =
-      ash::Shell::GetInstance()->system_tray_delegate()->GetHourClockType();
+  hour_type_ = WmShell::Get()->system_tray_delegate()->GetHourClockType();
   UpdateText();
 }
 
@@ -200,9 +197,9 @@
   if (action_ == TrayDate::NONE)
     return false;
   if (action_ == TrayDate::SHOW_DATE_SETTINGS)
-    ash::Shell::GetInstance()->system_tray_delegate()->ShowDateSettings();
+    WmShell::Get()->system_tray_delegate()->ShowDateSettings();
   else if (action_ == TrayDate::SET_SYSTEM_TIME)
-    ash::Shell::GetInstance()->system_tray_delegate()->ShowSetTimeDialog();
+    WmShell::Get()->system_tray_delegate()->ShowSetTimeDialog();
   return true;
 }
 
@@ -242,8 +239,7 @@
 }
 
 void TimeView::UpdateTimeFormat() {
-  hour_type_ =
-      ash::Shell::GetInstance()->system_tray_delegate()->GetHourClockType();
+  hour_type_ = WmShell::Get()->system_tray_delegate()->GetHourClockType();
   UpdateText();
 }
 
diff --git a/ash/system/ime/tray_ime_chromeos.cc b/ash/system/ime/tray_ime_chromeos.cc
index effed3e..2c93bb7 100644
--- a/ash/system/ime/tray_ime_chromeos.cc
+++ b/ash/system/ime/tray_ime_chromeos.cc
@@ -9,6 +9,7 @@
 #include "ash/common/session/session_state_delegate.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/metrics/user_metrics_recorder.h"
 #include "ash/root_window_controller.h"
 #include "ash/shelf/shelf_widget.h"
@@ -94,7 +95,7 @@
                   LoginStatus login,
                   bool show_keyboard_toggle)
       : TrayDetailsView(owner), login_(login) {
-    SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
+    SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
     IMEInfoList list;
     delegate->GetAvailableIMEList(&list);
     IMEPropertyInfoList property_list;
@@ -188,7 +189,7 @@
 
   // Overridden from ViewClickListener.
   void OnViewClicked(views::View* sender) override {
-    SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
+    SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
     if (sender == footer()->content()) {
       TransitionToDefaultView();
     } else if (sender == settings_) {
@@ -300,7 +301,7 @@
 base::string16 TrayIME::GetDefaultViewLabel(bool show_ime_label) {
   if (show_ime_label) {
     IMEInfo current;
-    Shell::GetInstance()->system_tray_delegate()->GetCurrentIME(&current);
+    WmShell::Get()->system_tray_delegate()->GetCurrentIME(&current);
     return current.name;
   } else {
     // Display virtual keyboard status instead.
@@ -358,7 +359,7 @@
 
 void TrayIME::OnIMERefresh() {
   // Caches the current ime state.
-  SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
+  SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
   ime_list_.clear();
   property_list_.clear();
   delegate->GetCurrentIME(&current_ime_);
diff --git a/ash/system/overview/overview_button_tray.cc b/ash/system/overview/overview_button_tray.cc
index 3bb0c8a..1badb5a 100644
--- a/ash/system/overview/overview_button_tray.cc
+++ b/ash/system/overview/overview_button_tray.cc
@@ -146,7 +146,7 @@
       !session_state_delegate->IsScreenLocked() &&
       session_state_delegate->GetSessionState() ==
           SessionStateDelegate::SESSION_STATE_ACTIVE &&
-      shell->system_tray_delegate()->GetUserLoginStatus() !=
+      WmShell::Get()->system_tray_delegate()->GetUserLoginStatus() !=
           LoginStatus::KIOSK_APP);
 }
 
diff --git a/ash/system/status_area_widget.cc b/ash/system/status_area_widget.cc
index f2adc90..57d82b6 100644
--- a/ash/system/status_area_widget.cc
+++ b/ash/system/status_area_widget.cc
@@ -7,6 +7,7 @@
 #include "ash/common/shell_window_ids.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/wm_root_window_controller.h"
+#include "ash/common/wm_shell.h"
 #include "ash/common/wm_window.h"
 #include "ash/shelf/shelf_layout_manager.h"
 #include "ash/shelf/shelf_widget.h"
@@ -63,8 +64,7 @@
   AddVirtualKeyboardTray();
 #endif
 
-  SystemTrayDelegate* delegate =
-      ash::Shell::GetInstance()->system_tray_delegate();
+  SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
   DCHECK(delegate);
   // Initialize after all trays have been created.
   system_tray_->InitializeTrayItems(delegate);
diff --git a/ash/system/tray/system_tray.cc b/ash/system/tray/system_tray.cc
index 97cd0cb..33675962 100644
--- a/ash/system/tray/system_tray.cc
+++ b/ash/system/tray/system_tray.cc
@@ -9,6 +9,7 @@
 #include "ash/common/shell_window_ids.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/metrics/user_metrics_recorder.h"
 #include "ash/shelf/shelf_layout_manager.h"
 #include "ash/shelf/shelf_util.h"
@@ -94,7 +95,7 @@
                 bool is_persistent) {
     DCHECK(anchor);
     LoginStatus login_status =
-        Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus();
+        WmShell::Get()->system_tray_delegate()->GetUserLoginStatus();
     bubble_->InitView(anchor, login_status, init_params);
     bubble_wrapper_.reset(new TrayBubbleWrapper(tray, bubble_->bubble_view()));
     // The system bubble should not have an arrow.
@@ -216,14 +217,15 @@
   AddTrayItem(tray_date_);
 #endif
 
-  SetVisible(ash::Shell::GetInstance()->system_tray_delegate()->
-      GetTrayVisibilityOnStartup());
+  SetVisible(ash::WmShell::Get()
+                 ->system_tray_delegate()
+                 ->GetTrayVisibilityOnStartup());
 }
 
 void SystemTray::AddTrayItem(SystemTrayItem* item) {
   items_.push_back(item);
 
-  SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
+  SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
   views::View* tray_item = item->CreateTrayView(delegate->GetUserLoginStatus());
   item->UpdateAfterShelfAlignmentChange(shelf_alignment());
 
@@ -452,7 +454,7 @@
                            int arrow_offset,
                            bool persistent) {
   // No system tray bubbles in kiosk mode.
-  if (Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus() ==
+  if (WmShell::Get()->system_tray_delegate()->GetUserLoginStatus() ==
       LoginStatus::KIOSK_APP) {
     return;
   }
@@ -485,8 +487,9 @@
     // (like network) replaces most of the menu.
     full_system_tray_menu_ = items.size() > 1;
     // The menu width is fixed, and it is a per language setting.
-    int menu_width = std::max(kMinimumSystemTrayMenuWidth,
-        Shell::GetInstance()->system_tray_delegate()->GetSystemTrayMenuWidth());
+    int menu_width = std::max(
+        kMinimumSystemTrayMenuWidth,
+        WmShell::Get()->system_tray_delegate()->GetSystemTrayMenuWidth());
 
     TrayBubbleView::InitParams init_params(TrayBubbleView::ANCHOR_TYPE_TRAY,
                                            GetAnchorAlignment(),
@@ -608,7 +611,7 @@
 base::string16 SystemTray::GetAccessibleTimeString(
     const base::Time& now) const {
   base::HourClockType hour_type =
-      ash::Shell::GetInstance()->system_tray_delegate()->GetHourClockType();
+      ash::WmShell::Get()->system_tray_delegate()->GetHourClockType();
   return base::TimeFormatTimeOfDayWithHourClockType(
       now, hour_type, base::kKeepAmPm);
 }
diff --git a/ash/system/tray/system_tray_bubble.cc b/ash/system/tray/system_tray_bubble.cc
index 1fbd188..04f6e81b 100644
--- a/ash/system/tray/system_tray_bubble.cc
+++ b/ash/system/tray/system_tray_bubble.cc
@@ -6,6 +6,7 @@
 
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/system/tray/system_tray.h"
 #include "ash/system/tray/system_tray_item.h"
@@ -138,8 +139,7 @@
 
   items_ = items;
   bubble_type_ = bubble_type;
-  CreateItemViews(
-      Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus());
+  CreateItemViews(WmShell::Get()->system_tray_delegate()->GetUserLoginStatus());
 
   // Close bubble view if we failed to create the item view.
   if (!bubble_view_->has_children()) {
diff --git a/ash/system/tray_accessibility.cc b/ash/system/tray_accessibility.cc
index 08b5a0f5..6ede507 100644
--- a/ash/system/tray_accessibility.cc
+++ b/ash/system/tray_accessibility.cc
@@ -8,6 +8,7 @@
 #include "ash/common/session/session_state_delegate.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/metrics/user_metrics_recorder.h"
 #include "ash/shell.h"
 #include "ash/system/tray/hover_highlight_view.h"
@@ -63,7 +64,7 @@
 }
 
 LoginStatus GetCurrentLoginStatus() {
-  return Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus();
+  return WmShell::Get()->system_tray_delegate()->GetUserLoginStatus();
 }
 
 }  // namespace
@@ -292,8 +293,7 @@
 
 void AccessibilityDetailedView::ButtonPressed(views::Button* sender,
                                               const ui::Event& event) {
-  SystemTrayDelegate* tray_delegate =
-      Shell::GetInstance()->system_tray_delegate();
+  SystemTrayDelegate* tray_delegate = WmShell::Get()->system_tray_delegate();
   if (sender == help_view_)
     tray_delegate->ShowAccessibilityHelp();
   else if (sender == settings_view_)
diff --git a/ash/system/tray_update.cc b/ash/system/tray_update.cc
index befe870..ac46d50 100644
--- a/ash/system/tray_update.cc
+++ b/ash/system/tray_update.cc
@@ -7,6 +7,7 @@
 #include "ash/common/system/tray/fixed_sized_image_view.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/system/tray/system_tray.h"
 #include "ash/system/tray/system_tray_notifier.h"
@@ -75,8 +76,7 @@
  private:
   // Overridden from ActionableView.
   bool PerformAction(const ui::Event& event) override {
-    ash::Shell::GetInstance()->
-        system_tray_delegate()->RequestRestartForUpdate();
+    ash::WmShell::Get()->system_tray_delegate()->RequestRestartForUpdate();
     return true;
   }
 
@@ -98,13 +98,13 @@
 
 bool TrayUpdate::GetInitialVisibility() {
   UpdateInfo info;
-  Shell::GetInstance()->system_tray_delegate()->GetSystemUpdateInfo(&info);
+  WmShell::Get()->system_tray_delegate()->GetSystemUpdateInfo(&info);
   return info.update_required;
 }
 
 views::View* TrayUpdate::CreateDefaultView(LoginStatus status) {
   UpdateInfo info;
-  Shell::GetInstance()->system_tray_delegate()->GetSystemUpdateInfo(&info);
+  WmShell::Get()->system_tray_delegate()->GetSystemUpdateInfo(&info);
   return info.update_required ? new UpdateView(info) : nullptr;
 }
 
diff --git a/ash/system/user/tray_user.cc b/ash/system/user/tray_user.cc
index e7617d9..db2fda0 100644
--- a/ash/system/user/tray_user.cc
+++ b/ash/system/user/tray_user.cc
@@ -9,6 +9,7 @@
 #include "ash/common/shelf/wm_shelf_util.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/shelf/shelf_layout_manager.h"
 #include "ash/shelf/shelf_util.h"
 #include "ash/shell.h"
@@ -129,7 +130,7 @@
     return;
   bool need_label = false;
   bool need_avatar = false;
-  SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
+  SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
   if (delegate->IsUserSupervised())
     need_label =  true;
   switch (status) {
@@ -233,8 +234,8 @@
 }
 
 void TrayUser::OnUserUpdate() {
-  UpdateAvatarImage(Shell::GetInstance()->system_tray_delegate()->
-      GetUserLoginStatus());
+  UpdateAvatarImage(
+      WmShell::Get()->system_tray_delegate()->GetUserLoginStatus());
 }
 
 void TrayUser::OnUserAddedToSession() {
@@ -249,7 +250,7 @@
 
   // Update the user item.
   UpdateAvatarImage(
-      Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus());
+      WmShell::Get()->system_tray_delegate()->GetUserLoginStatus());
 }
 
 void TrayUser::UpdateAvatarImage(LoginStatus status) {
diff --git a/ash/system/user/user_card_view.cc b/ash/system/user/user_card_view.cc
index 1d956ed..6e21bbb 100644
--- a/ash/system/user/user_card_view.cc
+++ b/ash/system/user/user_card_view.cc
@@ -10,6 +10,7 @@
 #include "ash/common/session/session_state_delegate.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/system/tray/system_tray_notifier.h"
 #include "ash/system/tray/tray_utils.h"
@@ -169,7 +170,7 @@
   display_name = kDisplayNameMark[0] + display_name + kDisplayNameMark[0];
   // Retrieve the domain managing the device and wrap it with markers.
   base::string16 domain = base::UTF8ToUTF16(
-      Shell::GetInstance()->system_tray_delegate()->GetEnterpriseDomain());
+      WmShell::Get()->system_tray_delegate()->GetEnterpriseDomain());
   base::RemoveChars(domain, kDisplayNameMark, &domain);
   base::i18n::WrapStringWithLTRFormatting(&domain);
   // Retrieve the label text, inserting the display name and domain.
@@ -274,7 +275,7 @@
 void PublicAccountUserDetails::LinkClicked(views::Link* source,
                                            int event_flags) {
   DCHECK_EQ(source, learn_more_);
-  Shell::GetInstance()->system_tray_delegate()->ShowPublicAccountInfo();
+  WmShell::Get()->system_tray_delegate()->ShowPublicAccountInfo();
 }
 
 void PublicAccountUserDetails::CalculatePreferredSize(int max_allowed_width) {
@@ -381,8 +382,7 @@
 
   views::Label* user_email = NULL;
   if (login_status != LoginStatus::GUEST) {
-    SystemTrayDelegate* tray_delegate =
-        Shell::GetInstance()->system_tray_delegate();
+    SystemTrayDelegate* tray_delegate = WmShell::Get()->system_tray_delegate();
     base::string16 user_email_string =
         tray_delegate->IsUserSupervised()
             ? l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SUPERVISED_LABEL)
diff --git a/ash/system/user/user_view.cc b/ash/system/user/user_view.cc
index 7df5382..a62f24e 100644
--- a/ash/system/user/user_view.cc
+++ b/ash/system/user/user_view.cc
@@ -12,6 +12,7 @@
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/wm_lookup.h"
 #include "ash/common/wm_root_window_controller.h"
+#include "ash/common/wm_shell.h"
 #include "ash/common/wm_window.h"
 #include "ash/multi_profile_uma.h"
 #include "ash/popup_message.h"
@@ -298,7 +299,7 @@
     Shell::GetInstance()->metrics()->RecordUserMetricsAction(
         ash::UMA_STATUS_AREA_SIGN_OUT);
     RemoveAddUserMenuOption();
-    Shell::GetInstance()->system_tray_delegate()->SignOut();
+    WmShell::Get()->system_tray_delegate()->SignOut();
   } else if (sender == user_card_view_ &&
              IsMultiProfileSupportedAndUserActive()) {
     if (!user_index_) {
@@ -315,7 +316,7 @@
     RemoveAddUserMenuOption();
     // Let the user add another account to the session.
     MultiProfileUMA::RecordSigninUser(MultiProfileUMA::SIGNIN_USER_BY_TRAY);
-    Shell::GetInstance()->system_tray_delegate()->ShowUserLogin();
+    WmShell::Get()->system_tray_delegate()->ShowUserLogin();
     owner_->system_tray()->CloseSystemBubble();
   } else {
     NOTREACHED();
diff --git a/ash/system/web_notification/web_notification_tray_unittest.cc b/ash/system/web_notification/web_notification_tray_unittest.cc
index 054c0d2..5d808e5 100644
--- a/ash/system/web_notification/web_notification_tray_unittest.cc
+++ b/ash/system/web_notification/web_notification_tray_unittest.cc
@@ -286,9 +286,7 @@
     return;
 
   // Enables to appear the notification for display changes.
-  test::TestSystemTrayDelegate* tray_delegate =
-      static_cast<test::TestSystemTrayDelegate*>(
-          Shell::GetInstance()->system_tray_delegate());
+  test::TestSystemTrayDelegate* tray_delegate = GetSystemTrayDelegate();
   tray_delegate->set_should_show_display_notification(true);
 
   UpdateDisplay("400x400,200x200");
diff --git a/ash/test/ash_test_base.cc b/ash/test/ash_test_base.cc
index 46df91c..6ce049e 100644
--- a/ash/test/ash_test_base.cc
+++ b/ash/test/ash_test_base.cc
@@ -9,6 +9,7 @@
 
 #include "ash/ash_switches.h"
 #include "ash/common/wm/window_positioner.h"
+#include "ash/common/wm_shell.h"
 #include "ash/display/window_tree_host_manager.h"
 #include "ash/ime/input_method_event_handler.h"
 #include "ash/shell.h"
@@ -273,7 +274,7 @@
 
 TestSystemTrayDelegate* AshTestBase::GetSystemTrayDelegate() {
   return static_cast<TestSystemTrayDelegate*>(
-      Shell::GetInstance()->system_tray_delegate());
+      WmShell::Get()->system_tray_delegate());
 }
 
 void AshTestBase::SetSessionStarted(bool session_started) {
diff --git a/ash/test/status_area_widget_test_helper.cc b/ash/test/status_area_widget_test_helper.cc
index 6fcf599f..82837c6 100644
--- a/ash/test/status_area_widget_test_helper.cc
+++ b/ash/test/status_area_widget_test_helper.cc
@@ -5,6 +5,7 @@
 #include "ash/test/status_area_widget_test_helper.h"
 
 #include "ash/common/system/tray/system_tray_delegate.h"
+#include "ash/common/wm_shell.h"
 #include "ash/root_window_controller.h"
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
@@ -13,7 +14,7 @@
 namespace ash {
 
 LoginStatus StatusAreaWidgetTestHelper::GetUserLoginStatus() {
-  return Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus();
+  return WmShell::Get()->system_tray_delegate()->GetUserLoginStatus();
 }
 
 StatusAreaWidget* StatusAreaWidgetTestHelper::GetStatusAreaWidget() {
diff --git a/ash/test/tray_cast_test_api.cc b/ash/test/tray_cast_test_api.cc
index dc96f5f..430be7d 100644
--- a/ash/test/tray_cast_test_api.cc
+++ b/ash/test/tray_cast_test_api.cc
@@ -6,7 +6,7 @@
 
 #include "ash/cast_config_delegate.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
-#include "ash/shell.h"
+#include "ash/common/wm_shell.h"
 #include "ash/system/tray/system_tray.h"
 #include "ui/views/view.h"
 
@@ -51,9 +51,8 @@
 void TrayCastTestAPI::ReleaseConfigCallbacks() {
   tray_cast_->added_observer_ = false;
 
-  if (ash::Shell::GetInstance() &&
-      ash::Shell::GetInstance()->system_tray_delegate()) {
-    ash::Shell::GetInstance()
+  if (WmShell::Get() && WmShell::Get()->system_tray_delegate()) {
+    WmShell::Get()
         ->system_tray_delegate()
         ->GetCastConfigDelegate()
         ->RemoveObserver(tray_cast_);
diff --git a/ash/wm/overview/window_selector_controller.cc b/ash/wm/overview/window_selector_controller.cc
index cc7182b..8999d940 100644
--- a/ash/wm/overview/window_selector_controller.cc
+++ b/ash/wm/overview/window_selector_controller.cc
@@ -33,7 +33,7 @@
   return session_state_delegate->IsActiveUserSessionStarted() &&
          !session_state_delegate->IsScreenLocked() &&
          !Shell::GetInstance()->IsSystemModalWindowOpen() &&
-         Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus() !=
+         WmShell::Get()->system_tray_delegate()->GetUserLoginStatus() !=
              LoginStatus::KIOSK_APP;
 }
 
diff --git a/chrome/browser/chromeos/policy/device_system_use_24hour_clock_browsertest.cc b/chrome/browser/chromeos/policy/device_system_use_24hour_clock_browsertest.cc
index b69cc595..ff7daa7 100644
--- a/chrome/browser/chromeos/policy/device_system_use_24hour_clock_browsertest.cc
+++ b/chrome/browser/chromeos/policy/device_system_use_24hour_clock_browsertest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/system/date/date_default_view.h"
 #include "ash/system/date/date_view.h"
@@ -66,7 +67,7 @@
   static bool GetSystemTrayDelegateShouldUse24HourClock() {
     chromeos::SystemTrayDelegateChromeOS* tray_delegate =
         static_cast<chromeos::SystemTrayDelegateChromeOS*>(
-            ash::Shell::GetInstance()->system_tray_delegate());
+            ash::WmShell::Get()->system_tray_delegate());
     return tray_delegate->GetShouldUse24HourClockForTesting();
   }
 
diff --git a/chrome/browser/chromeos/power/power_button_observer.cc b/chrome/browser/chromeos/power/power_button_observer.cc
index 1ae37bc..4565a3f 100644
--- a/chrome/browser/chromeos/power/power_button_observer.cc
+++ b/chrome/browser/chromeos/power/power_button_observer.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/chromeos/power/power_button_observer.h"
 
 #include "ash/common/system/tray/system_tray_delegate.h"
+#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/system/user/login_status.h"
 #include "ash/wm/power_button_controller.h"
@@ -24,10 +25,10 @@
 namespace {
 
 ash::LoginStatus GetCurrentLoginStatus() {
-  if (!ash::Shell::GetInstance()->system_tray_delegate())
-    return ash::LoginStatus::NOT_LOGGED_IN;
-  return ash::Shell::GetInstance()->system_tray_delegate()->
-      GetUserLoginStatus();
+  if (ash::WmShell::Get()->system_tray_delegate())
+    return ash::WmShell::Get()->system_tray_delegate()->GetUserLoginStatus();
+
+  return ash::LoginStatus::NOT_LOGGED_IN;
 }
 
 }  // namespace
diff --git a/chrome/browser/chromeos/profiles/avatar_menu_actions_chromeos.cc b/chrome/browser/chromeos/profiles/avatar_menu_actions_chromeos.cc
index 7fb743e..8526838 100644
--- a/chrome/browser/chromeos/profiles/avatar_menu_actions_chromeos.cc
+++ b/chrome/browser/chromeos/profiles/avatar_menu_actions_chromeos.cc
@@ -5,8 +5,8 @@
 #include "chrome/browser/chromeos/profiles/avatar_menu_actions_chromeos.h"
 
 #include "ash/common/system/tray/system_tray_delegate.h"
+#include "ash/common/wm_shell.h"
 #include "ash/multi_profile_uma.h"
-#include "ash/shell.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_avatar_icon_util.h"
 #include "chrome/browser/ui/browser.h"
@@ -29,7 +29,7 @@
   // Let the user add another account to the session.
   ash::MultiProfileUMA::RecordSigninUser(
       ash::MultiProfileUMA::SIGNIN_USER_BY_BROWSER_FRAME);
-  ash::Shell::GetInstance()->system_tray_delegate()->ShowUserLogin();
+  ash::WmShell::Get()->system_tray_delegate()->ShowUserLogin();
 }
 
 void AvatarMenuActionsChromeOS::EditProfile(Profile* profile) {
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
index 9c03483..2c24223 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
@@ -12,6 +12,7 @@
 #include "ash/common/shelf/shelf_item_delegate_manager.h"
 #include "ash/common/shelf/shelf_model.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
+#include "ash/common/wm_shell.h"
 #include "ash/desktop_background/desktop_background_controller.h"
 #include "ash/multi_profile_uma.h"
 #include "ash/root_window_controller.h"
@@ -1009,7 +1010,7 @@
   // user.
   RestoreUnpinnedRunningApplicationOrder(user_email);
   // Inform the system tray of the change.
-  ash::Shell::GetInstance()->system_tray_delegate()->ActiveUserWasChanged();
+  ash::WmShell::Get()->system_tray_delegate()->ActiveUserWasChanged();
   // Force on-screen keyboard to reset.
   if (keyboard::IsKeyboardEnabled())
     ash::Shell::GetInstance()->CreateKeyboard();
diff --git a/chrome/browser/ui/ash/network_connect_delegate_chromeos.cc b/chrome/browser/ui/ash/network_connect_delegate_chromeos.cc
index f103dd27..ea8581b2 100644
--- a/chrome/browser/ui/ash/network_connect_delegate_chromeos.cc
+++ b/chrome/browser/ui/ash/network_connect_delegate_chromeos.cc
@@ -7,6 +7,7 @@
 #include "ash/common/session/session_state_delegate.h"
 #include "ash/common/shell_window_ids.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
+#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/system/user/login_status.h"
 #include "chrome/browser/chromeos/enrollment_dialog_view.h"
@@ -26,7 +27,7 @@
                              ->session_state_delegate()
                              ->IsActiveUserSessionStarted();
   ash::LoginStatus login_status =
-      ash::Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus();
+      ash::WmShell::Get()->system_tray_delegate()->GetUserLoginStatus();
   bool isUserAddingRunning = ash::Shell::GetInstance()
                                  ->session_state_delegate()
                                  ->IsInSecondaryLoginScreen();
@@ -61,7 +62,7 @@
     const std::string& network_id) {
   if (!IsUIAvailable())
     return;
-  ash::Shell::GetInstance()->system_tray_delegate()->ShowNetworkSettingsForGuid(
+  ash::WmShell::Get()->system_tray_delegate()->ShowNetworkSettingsForGuid(
       network_id);
 }
 
diff --git a/chrome/browser/ui/ash/system_tray_tray_cast_browsertest_chromeos.cc b/chrome/browser/ui/ash/system_tray_tray_cast_browsertest_chromeos.cc
index 905f89f..b9f1266b 100644
--- a/chrome/browser/ui/ash/system_tray_tray_cast_browsertest_chromeos.cc
+++ b/chrome/browser/ui/ash/system_tray_tray_cast_browsertest_chromeos.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "ash/common/system/tray/system_tray_delegate.h"
+#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/system/cast/tray_cast.h"
 #include "ash/system/tray/system_tray.h"
@@ -158,9 +159,8 @@
 // recognizes the cast extension.
 IN_PROC_BROWSER_TEST_F(SystemTrayTrayCastChromeOSTest,
                        CastTraySanityCheckTestExtensionGetsRecognized) {
-  ash::CastConfigDelegate* cast_config_delegate = ash::Shell::GetInstance()
-                                                      ->system_tray_delegate()
-                                                      ->GetCastConfigDelegate();
+  ash::CastConfigDelegate* cast_config_delegate =
+      ash::WmShell::Get()->system_tray_delegate()->GetCastConfigDelegate();
 
   EXPECT_FALSE(cast_config_delegate->HasCastExtension());
   const extensions::Extension* extension = LoadCastTestExtension();
@@ -283,9 +283,8 @@
 IN_PROC_BROWSER_TEST_F(SystemTrayTrayCastChromeOSTest, CastTrayOpenOptions) {
   const extensions::Extension* extension = LoadCastTestExtension();
 
-  ash::CastConfigDelegate* cast_config_delegate = ash::Shell::GetInstance()
-                                                      ->system_tray_delegate()
-                                                      ->GetCastConfigDelegate();
+  ash::CastConfigDelegate* cast_config_delegate =
+      ash::WmShell::Get()->system_tray_delegate()->GetCastConfigDelegate();
   cast_config_delegate->LaunchCastOptions();
 
   const GURL url =
diff --git a/chrome/browser/ui/ash/system_tray_tray_cast_browsertest_media_router_chromeos.cc b/chrome/browser/ui/ash/system_tray_tray_cast_browsertest_media_router_chromeos.cc
index 885f837..c8966e8 100644
--- a/chrome/browser/ui/ash/system_tray_tray_cast_browsertest_media_router_chromeos.cc
+++ b/chrome/browser/ui/ash/system_tray_tray_cast_browsertest_media_router_chromeos.cc
@@ -5,6 +5,7 @@
 #include <vector>
 
 #include "ash/common/system/tray/system_tray_delegate.h"
+#include "ash/common/wm_shell.h"
 #include "ash/shell.h"
 #include "ash/system/tray/system_tray.h"
 #include "ash/test/tray_cast_test_api.h"
@@ -96,9 +97,8 @@
 // Sanity check to make sure that the media router delegate is getting used.
 IN_PROC_BROWSER_TEST_F(SystemTrayTrayCastMediaRouterChromeOSTest,
                        VerifyThatMediaRouterIsBeingUsed) {
-  ash::CastConfigDelegate* cast_config_delegate = ash::Shell::GetInstance()
-                                                      ->system_tray_delegate()
-                                                      ->GetCastConfigDelegate();
+  ash::CastConfigDelegate* cast_config_delegate =
+      ash::WmShell::Get()->system_tray_delegate()->GetCastConfigDelegate();
 
   // The media router always reports false for HasOptions(); the extension
   // always reports true.
diff --git a/chrome/browser/ui/ash/vpn_delegate_chromeos.cc b/chrome/browser/ui/ash/vpn_delegate_chromeos.cc
index 08c8a25..e34b8e1 100644
--- a/chrome/browser/ui/ash/vpn_delegate_chromeos.cc
+++ b/chrome/browser/ui/ash/vpn_delegate_chromeos.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/ui/ash/vpn_delegate_chromeos.h"
 
 #include "ash/common/system/tray/system_tray_delegate.h"
-#include "ash/shell.h"
+#include "ash/common/wm_shell.h"
 #include "base/bind.h"
 #include "base/location.h"
 #include "base/logging.h"
@@ -80,7 +80,7 @@
 void VPNDelegateChromeOS::ShowAddPage(const ash::VPNProvider::Key& key) {
   if (!key.third_party) {
     // Show the "add network" dialog for the built-in OpenVPN/L2TP provider.
-    ash::Shell::GetInstance()->system_tray_delegate()->ShowOtherNetworkDialog(
+    ash::WmShell::Get()->system_tray_delegate()->ShowOtherNetworkDialog(
         shill::kTypeVPN);
     return;
   }
diff --git a/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.cc b/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.cc
index 9a7accd1..07ab292 100644
--- a/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.cc
@@ -8,7 +8,7 @@
 #include <utility>
 
 #include "ash/common/system/tray/system_tray_delegate.h"
-#include "ash/shell.h"
+#include "ash/common/wm_shell.h"
 #include "base/bind.h"
 #include "base/macros.h"
 #include "base/strings/string_number_conversions.h"
@@ -279,7 +279,7 @@
 
   // Try to pair the device with the main adapter. The device is identified
   // by its device ID, which, in this case is the same as its address.
-  ash::Shell::GetInstance()->system_tray_delegate()->ConnectToBluetoothDevice(
+  ash::WmShell::Get()->system_tray_delegate()->ConnectToBluetoothDevice(
       props->address.value());
   if (!props->paired.value()) {
     web_ui()->CallJavascriptFunctionUnsafe(kPairFailedJSCallback,