15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Copyright 2013 The Chromium Authors. All rights reserved.
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Use of this source code is governed by a BSD-style license that can be
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// found in the LICENSE file.
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner#include "chrome/browser/ui/ash/chrome_shell_delegate.h"
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <vector>
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "ash/accessibility_delegate.h"
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "ash/magnifier/magnifier_constants.h"
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "ash/media_delegate.h"
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "ash/system/tray/default_system_tray_delegate.h"
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "ash/wm/window_util.h"
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "base/command_line.h"
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "chrome/browser/accessibility/accessibility_events.h"
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "chrome/browser/browser_process.h"
177573098b83e780d1c5bea13b384b610d8f155676Steve Naroff#include "chrome/browser/chrome_notification_types.h"
18a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek#include "chrome/browser/prefs/session_startup_pref.h"
195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "chrome/browser/profiles/profile.h"
20d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor#include "chrome/browser/profiles/profile_manager.h"
219caf8b1ca6beb254f420dada3c0e94d5ef027f58Ted Kremenek#include "chrome/browser/signin/signin_error_notifier_factory_ash.h"
228ffb159441e923322bef6b5dee1aaf24c738d75eTed Kremenek#include "chrome/browser/sync/sync_error_notifier_factory_ash.h"
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "chrome/browser/ui/ash/chrome_new_window_delegate.h"
248189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek#include "chrome/browser/ui/ash/session_state_delegate_views.h"
256e340496341a4704be0ede9c1ff4f8eacea7ee2cChris Lattner#include "chrome/browser/ui/ash/solid_color_user_wallpaper_delegate.h"
267573098b83e780d1c5bea13b384b610d8f155676Steve Naroff#include "chrome/browser/ui/browser.h"
277573098b83e780d1c5bea13b384b610d8f155676Steve Naroff#include "chrome/browser/ui/browser_finder.h"
2841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor#include "chrome/browser/ui/browser_list.h"
2941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor#include "chrome/browser/ui/browser_tabstrip.h"
3041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor#include "chrome/browser/ui/browser_window.h"
3141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor#include "chrome/browser/ui/host_desktop.h"
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
33e2563ca02a519c2ad6d64dfed87d6e86c5d3c072Sam Bishop#include "chrome/browser/ui/startup/startup_browser_creator_impl.h"
345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "chrome/common/chrome_switches.h"
355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "content/public/browser/notification_service.h"
367ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff
374b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl#if defined(OS_WIN)
385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "chrome/browser/ui/ash/system_tray_delegate_win.h"
390c727a35718556866a978f64ac549d9798735f08Chris Lattner#endif
406a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson
416c36be5b383875b490684bcf439d6d427298c1afChris Lattner#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#include "chrome/browser/ui/ash/system_tray_delegate_linux.h"
43ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek#endif
44ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek
45ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremeneknamespace {
46ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek
47ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenekclass NewWindowDelegateImpl : public ChromeNewWindowDelegate {
481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump public:
49ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  NewWindowDelegateImpl() {}
50ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  virtual ~NewWindowDelegateImpl() {}
511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  // Overridden from ash::NewWindowDelegate:
53ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  virtual void OpenFileManager() OVERRIDE {}
54ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  virtual void OpenCrosh() OVERRIDE {}
55ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  virtual void ShowKeyboardOverlay() OVERRIDE {}
561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
57ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek private:
58ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  DISALLOW_COPY_AND_ASSIGN(NewWindowDelegateImpl);
59ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek};
60ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek
61ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenekclass MediaDelegateImpl : public ash::MediaDelegate {
62ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek public:
63ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  MediaDelegateImpl() {}
64ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  virtual ~MediaDelegateImpl() {}
65ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  virtual void HandleMediaNextTrack() OVERRIDE {}
66ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  virtual void HandleMediaPlayPause() OVERRIDE {}
67ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  virtual void HandleMediaPrevTrack() OVERRIDE {}
68ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  virtual ash::MediaCaptureState GetMediaCaptureState(
69ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek      content::BrowserContext* context) OVERRIDE {
701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return ash::MEDIA_CAPTURE_NONE;
71ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  }
721705fe9ec0efb65f77a46e669e48302923204fe8Benjamin Kramer
73ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek private:
741705fe9ec0efb65f77a46e669e48302923204fe8Benjamin Kramer  DISALLOW_COPY_AND_ASSIGN(MediaDelegateImpl);
751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
76ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek
771705fe9ec0efb65f77a46e669e48302923204fe8Benjamin Kramerclass EmptyAccessibilityDelegate : public ash::AccessibilityDelegate {
781705fe9ec0efb65f77a46e669e48302923204fe8Benjamin Kramer public:
79ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  EmptyAccessibilityDelegate() {}
80ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  virtual ~EmptyAccessibilityDelegate() {}
81ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek
82ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  virtual void ToggleHighContrast() OVERRIDE {
83ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  }
84ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek
85ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  virtual bool IsHighContrastEnabled() const OVERRIDE {
86ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek    return false;
871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
89ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  virtual bool IsSpokenFeedbackEnabled() const OVERRIDE {
90ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek    return false;
91ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  }
921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void ToggleSpokenFeedback(
945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      ash::AccessibilityNotificationVisibility notify) OVERRIDE {
955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void SetLargeCursorEnabled(bool enalbed) OVERRIDE {
98f2cad8633e46cce12fc3d77c0bd451ffd7264bafDouglas Gregor  }
99f2cad8633e46cce12fc3d77c0bd451ffd7264bafDouglas Gregor
1007381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt  virtual bool IsLargeCursorEnabled() const OVERRIDE {
1019a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt    return false;
1027381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt  }
1039a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt
1047381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt  virtual void SetMagnifierEnabled(bool enabled) OVERRIDE {
1054bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt  }
1068e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall
1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  virtual void SetMagnifierType(ash::MagnifierType type) OVERRIDE {
1088189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek  }
1098189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek
1108189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek  virtual bool IsMagnifierEnabled() const OVERRIDE {
1118189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek    return false;
1128189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek  }
1138189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek
1148189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek  virtual void SetAutoclickEnabled(bool enabled) OVERRIDE {
1158189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek  }
1168189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek
1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  virtual bool IsAutoclickEnabled() const OVERRIDE {
1188e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    return false;
1198e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  }
1208e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall
1218e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  virtual ash::MagnifierType GetMagnifierType() const OVERRIDE {
1228e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    return ash::kDefaultMagnifierType;
1238e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  }
1248e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall
1258e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  virtual void SaveScreenMagnifierScale(double scale) OVERRIDE {
1268e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  }
1278e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall
1288e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  virtual double GetSavedScreenMagnifierScale() OVERRIDE {
1298e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    return std::numeric_limits<double>::min();
1308e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  }
1318e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall
1328e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  virtual bool ShouldShowAccessibilityMenu() const OVERRIDE {
1338e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    return false;
1348e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  }
1358e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall
1368e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  virtual bool IsBrailleDisplayConnected() const OVERRIDE { return false; }
1378e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall
138d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  virtual void SilenceSpokenFeedback() const OVERRIDE {
139bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
140bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
141bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  virtual void SetVirtualKeyboardEnabled(bool enabled) OVERRIDE {
142bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
143bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
144bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  virtual bool IsVirtualKeyboardEnabled() const OVERRIDE {
145bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    return false;
146bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
147bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
148bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  virtual void TriggerAccessibilityAlert(
149bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ash::AccessibilityAlert alert) OVERRIDE {
150bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
1518e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall
1528e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  virtual ash::AccessibilityAlert GetLastAccessibilityAlert() OVERRIDE {
1538e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    return ash::A11Y_ALERT_NONE;
154f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  }
1558e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall
1568e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  virtual void PlayEarcon(int sound_key) OVERRIDE {
157d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  }
1588e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall
159d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  virtual base::TimeDelta PlayShutdownSound() const OVERRIDE {
1608e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    return base::TimeDelta();
161cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth  }
162cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth
163cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth private:
164cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth  DISALLOW_COPY_AND_ASSIGN(EmptyAccessibilityDelegate);
165cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth};
166cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth
167cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth}  // namespace
1683aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth
169cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruthbool ChromeShellDelegate::IsFirstRunAfterBoot() const {
170cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth  return false;
1718e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall}
1728e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall
1738e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCallvoid ChromeShellDelegate::PreInit() {
1748e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall}
1752bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall
1762bb5d00fcf71a7b4d478d478be778fff0494aff6John McCallvoid ChromeShellDelegate::PreShutdown() {
1778e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall}
1788e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall
179cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourneash::NewWindowDelegate* ChromeShellDelegate::CreateNewWindowDelegate() {
180cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  return new NewWindowDelegateImpl;
181cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne}
182cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne
183cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourneash::MediaDelegate* ChromeShellDelegate::CreateMediaDelegate() {
184cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  return new MediaDelegateImpl;
185cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne}
186f85e193739c953358c865005855253af4f68a497John McCall
187f85e193739c953358c865005855253af4f68a497John McCallash::SessionStateDelegate* ChromeShellDelegate::CreateSessionStateDelegate() {
188f85e193739c953358c865005855253af4f68a497John McCall  return new SessionStateDelegate;
189f85e193739c953358c865005855253af4f68a497John McCall}
190f85e193739c953358c865005855253af4f68a497John McCall
191f85e193739c953358c865005855253af4f68a497John McCallash::SystemTrayDelegate* ChromeShellDelegate::CreateSystemTrayDelegate() {
192f85e193739c953358c865005855253af4f68a497John McCall#if defined(OS_WIN)
1938e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  return CreateWindowsSystemTrayDelegate();
19463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
19563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  return CreateLinuxSystemTrayDelegate();
19663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall#else
1978e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  return new ash::DefaultSystemTrayDelegate;
1988e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall#endif
1998e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall}
200cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth
2018e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCallash::AccessibilityDelegate* ChromeShellDelegate::CreateAccessibilityDelegate() {
202cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  return new EmptyAccessibilityDelegate;
203f85e193739c953358c865005855253af4f68a497John McCall}
2048e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall
2058e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCallash::UserWallpaperDelegate* ChromeShellDelegate::CreateUserWallpaperDelegate() {
206d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  return CreateSolidColorUserWallpaperDelegate();
207d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor}
2088189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek
2098189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenekvoid ChromeShellDelegate::Observe(int type,
2101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                  const content::NotificationSource& source,
2118189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek                                  const content::NotificationDetails& details) {
212f4e689b8528770001f4792f1f4ebdfb09d859e3dDouglas Gregor  switch (type) {
2138189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek    case chrome::NOTIFICATION_PROFILE_ADDED: {
2148189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek      // Start the error notifier services to show sync/auth notifications.
2151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Profile* profile = content::Source<Profile>(source).ptr();
2168189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek      SigninErrorNotifierFactory::GetForProfile(profile);
217f4e689b8528770001f4792f1f4ebdfb09d859e3dDouglas Gregor      SyncErrorNotifierFactory::GetForProfile(profile);
2188189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek      break;
2198189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek    }
2201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    case chrome::NOTIFICATION_ASH_SESSION_STARTED: {
2218189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek      // Start the error notifier services for the already loaded profiles.
2228189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek      const std::vector<Profile*> profiles =
2238189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek          g_browser_process->profile_manager()->GetLoadedProfiles();
224e2dedf8f61b8f306f704781456b482eb61871e8eDouglas Gregor      for (std::vector<Profile*>::const_iterator it = profiles.begin();
225fb523e16dd1f860ff02a3ae03e5e3e25327a5860Chris Lattner           it != profiles.end(); ++it) {
226fb523e16dd1f860ff02a3ae03e5e3e25327a5860Chris Lattner        SigninErrorNotifierFactory::GetForProfile(*it);
227e2dedf8f61b8f306f704781456b482eb61871e8eDouglas Gregor        SyncErrorNotifierFactory::GetForProfile(*it);
228fb523e16dd1f860ff02a3ae03e5e3e25327a5860Chris Lattner      }
229e2dedf8f61b8f306f704781456b482eb61871e8eDouglas Gregor
230025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor#if defined(OS_WIN)
231025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor      // If we are launched to service a windows 8 search request then let the
232025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor      // IPC which carries the search string create the browser and initiate
233025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor      // the navigation.
234025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor      if (CommandLine::ForCurrentProcess()->HasSwitch(
235025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor          switches::kWindows8Search))
2369c1863ef36a74e8203f00289d19856ad956f48b9Ted Kremenek        break;
237025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor#endif
2388e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall      // If Chrome ASH is launched when no browser is open in the desktop,
2398e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall      // we should execute the startup code.
240025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor      // If there are browsers open in the desktop, we create a browser window
241025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor      // and open a new tab page, if session restore is not on.
242025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor      BrowserList* desktop_list = BrowserList::GetInstance(
2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer          chrome::HOST_DESKTOP_TYPE_NATIVE);
2448e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall      if (desktop_list->empty()) {
2458e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall        // We pass a dummy command line here, because the browser is launched in
2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // silent-mode by the metro viewer process, which causes the
2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // StartupBrowserCreatorImpl class to not create any browsers which is
2481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        // not the behavior we want.
249c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt        CommandLine dummy(CommandLine::NO_PROGRAM);
2508e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall        StartupBrowserCreatorImpl startup_impl(
251b2f81cf7f8445e0c65c0428f4fbb0442566916b8Douglas Gregor            base::FilePath(),
2525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer            dummy,
2531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            chrome::startup::IS_NOT_FIRST_RUN);
254b5a69586f1b8855ee4c1f0bb7a8f0ff4fe32ce09Steve Naroff        startup_impl.Launch(
255b5a69586f1b8855ee4c1f0bb7a8f0ff4fe32ce09Steve Naroff            ProfileManager::GetActiveUserProfile(),
256b5a69586f1b8855ee4c1f0bb7a8f0ff4fe32ce09Steve Naroff            std::vector<GURL>(),
25763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall            true,
25863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall            chrome::HOST_DESKTOP_TYPE_ASH);
259311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner      } else {
260311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner        Browser* browser =
2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer            chrome::FindBrowserWithWindow(ash::wm::GetActiveWindow());
2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        if (browser && browser->is_type_tabbed()) {
2635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer          chrome::AddTabAt(browser, GURL(), -1, true);
2642024f4d4b0d57616f79ea742fa782d633d414462Kovarththanan Rajaratnam          return;
2655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        }
2666000dace22f110d8768476989313e9d981d690d0Chris Lattner
2676000dace22f110d8768476989313e9d981d690d0Chris Lattner        chrome::ScopedTabbedBrowserDisplayer displayer(
2686000dace22f110d8768476989313e9d981d690d0Chris Lattner            ProfileManager::GetActiveUserProfile(),
2696000dace22f110d8768476989313e9d981d690d0Chris Lattner            chrome::HOST_DESKTOP_TYPE_ASH);
2705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        chrome::AddTabAt(displayer.browser(), GURL(), -1, true);
271e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner      }
2729668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis      break;
2736000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
2746000dace22f110d8768476989313e9d981d690d0Chris Lattner    case chrome::NOTIFICATION_ASH_SESSION_ENDED:
2756000dace22f110d8768476989313e9d981d690d0Chris Lattner      break;
276e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    default:
2776000dace22f110d8768476989313e9d981d690d0Chris Lattner      NOTREACHED() << "Unexpected notification " << type;
2786000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
2796000dace22f110d8768476989313e9d981d690d0Chris Lattner}
28048d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman
2811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid ChromeShellDelegate::PlatformInit() {
282e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner#if defined(OS_WIN)
28348d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman  registrar_.Add(this,
28448d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman                 chrome::NOTIFICATION_PROFILE_ADDED,
28548d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman                 content::NotificationService::AllSources());
286e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  registrar_.Add(this,
2871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                 chrome::NOTIFICATION_ASH_SESSION_STARTED,
288e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner                 content::NotificationService::AllSources());
289d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  registrar_.Add(this,
2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                 chrome::NOTIFICATION_ASH_SESSION_ENDED,
291d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek                 content::NotificationService::AllSources());
292d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek#endif
293d2a4a1af1088fca80e2dc76eb3369db0fbbfdefdTed Kremenek}
2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump