Home | History | Annotate | Download | only in ash
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/ash/chrome_shell_delegate.h"
      6 
      7 #include <vector>
      8 
      9 #include "ash/accessibility_delegate.h"
     10 #include "ash/magnifier/magnifier_constants.h"
     11 #include "ash/media_delegate.h"
     12 #include "ash/system/tray/default_system_tray_delegate.h"
     13 #include "ash/wm/window_util.h"
     14 #include "base/command_line.h"
     15 #include "chrome/browser/accessibility/accessibility_events.h"
     16 #include "chrome/browser/browser_process.h"
     17 #include "chrome/browser/chrome_notification_types.h"
     18 #include "chrome/browser/prefs/session_startup_pref.h"
     19 #include "chrome/browser/profiles/profile.h"
     20 #include "chrome/browser/profiles/profile_manager.h"
     21 #include "chrome/browser/signin/signin_error_notifier_factory_ash.h"
     22 #include "chrome/browser/sync/sync_error_notifier_factory_ash.h"
     23 #include "chrome/browser/ui/ash/chrome_new_window_delegate.h"
     24 #include "chrome/browser/ui/ash/session_state_delegate_views.h"
     25 #include "chrome/browser/ui/ash/solid_color_user_wallpaper_delegate.h"
     26 #include "chrome/browser/ui/browser.h"
     27 #include "chrome/browser/ui/browser_finder.h"
     28 #include "chrome/browser/ui/browser_list.h"
     29 #include "chrome/browser/ui/browser_tabstrip.h"
     30 #include "chrome/browser/ui/browser_window.h"
     31 #include "chrome/browser/ui/host_desktop.h"
     32 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
     33 #include "chrome/browser/ui/startup/startup_browser_creator_impl.h"
     34 #include "chrome/common/chrome_switches.h"
     35 #include "content/public/browser/notification_service.h"
     36 
     37 #if defined(OS_WIN)
     38 #include "chrome/browser/ui/ash/system_tray_delegate_win.h"
     39 #endif
     40 
     41 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
     42 #include "chrome/browser/ui/ash/system_tray_delegate_linux.h"
     43 #endif
     44 
     45 namespace {
     46 
     47 class NewWindowDelegateImpl : public ChromeNewWindowDelegate {
     48  public:
     49   NewWindowDelegateImpl() {}
     50   virtual ~NewWindowDelegateImpl() {}
     51 
     52   // Overridden from ash::NewWindowDelegate:
     53   virtual void OpenFileManager() OVERRIDE {}
     54   virtual void OpenCrosh() OVERRIDE {}
     55   virtual void ShowKeyboardOverlay() OVERRIDE {}
     56 
     57  private:
     58   DISALLOW_COPY_AND_ASSIGN(NewWindowDelegateImpl);
     59 };
     60 
     61 class MediaDelegateImpl : public ash::MediaDelegate {
     62  public:
     63   MediaDelegateImpl() {}
     64   virtual ~MediaDelegateImpl() {}
     65   virtual void HandleMediaNextTrack() OVERRIDE {}
     66   virtual void HandleMediaPlayPause() OVERRIDE {}
     67   virtual void HandleMediaPrevTrack() OVERRIDE {}
     68   virtual ash::MediaCaptureState GetMediaCaptureState(
     69       content::BrowserContext* context) OVERRIDE {
     70     return ash::MEDIA_CAPTURE_NONE;
     71   }
     72 
     73  private:
     74   DISALLOW_COPY_AND_ASSIGN(MediaDelegateImpl);
     75 };
     76 
     77 class EmptyAccessibilityDelegate : public ash::AccessibilityDelegate {
     78  public:
     79   EmptyAccessibilityDelegate() {}
     80   virtual ~EmptyAccessibilityDelegate() {}
     81 
     82   virtual void ToggleHighContrast() OVERRIDE {
     83   }
     84 
     85   virtual bool IsHighContrastEnabled() const OVERRIDE {
     86     return false;
     87   }
     88 
     89   virtual bool IsSpokenFeedbackEnabled() const OVERRIDE {
     90     return false;
     91   }
     92 
     93   virtual void ToggleSpokenFeedback(
     94       ash::AccessibilityNotificationVisibility notify) OVERRIDE {
     95   }
     96 
     97   virtual void SetLargeCursorEnabled(bool enalbed) OVERRIDE {
     98   }
     99 
    100   virtual bool IsLargeCursorEnabled() const OVERRIDE {
    101     return false;
    102   }
    103 
    104   virtual void SetMagnifierEnabled(bool enabled) OVERRIDE {
    105   }
    106 
    107   virtual void SetMagnifierType(ash::MagnifierType type) OVERRIDE {
    108   }
    109 
    110   virtual bool IsMagnifierEnabled() const OVERRIDE {
    111     return false;
    112   }
    113 
    114   virtual void SetAutoclickEnabled(bool enabled) OVERRIDE {
    115   }
    116 
    117   virtual bool IsAutoclickEnabled() const OVERRIDE {
    118     return false;
    119   }
    120 
    121   virtual ash::MagnifierType GetMagnifierType() const OVERRIDE {
    122     return ash::kDefaultMagnifierType;
    123   }
    124 
    125   virtual void SaveScreenMagnifierScale(double scale) OVERRIDE {
    126   }
    127 
    128   virtual double GetSavedScreenMagnifierScale() OVERRIDE {
    129     return std::numeric_limits<double>::min();
    130   }
    131 
    132   virtual bool ShouldShowAccessibilityMenu() const OVERRIDE {
    133     return false;
    134   }
    135 
    136   virtual bool IsBrailleDisplayConnected() const OVERRIDE { return false; }
    137 
    138   virtual void SilenceSpokenFeedback() const OVERRIDE {
    139   }
    140 
    141   virtual void SetVirtualKeyboardEnabled(bool enabled) OVERRIDE {
    142   }
    143 
    144   virtual bool IsVirtualKeyboardEnabled() const OVERRIDE {
    145     return false;
    146   }
    147 
    148   virtual void TriggerAccessibilityAlert(
    149       ash::AccessibilityAlert alert) OVERRIDE {
    150   }
    151 
    152   virtual ash::AccessibilityAlert GetLastAccessibilityAlert() OVERRIDE {
    153     return ash::A11Y_ALERT_NONE;
    154   }
    155 
    156   virtual void PlayEarcon(int sound_key) OVERRIDE {
    157   }
    158 
    159   virtual base::TimeDelta PlayShutdownSound() const OVERRIDE {
    160     return base::TimeDelta();
    161   }
    162 
    163  private:
    164   DISALLOW_COPY_AND_ASSIGN(EmptyAccessibilityDelegate);
    165 };
    166 
    167 }  // namespace
    168 
    169 bool ChromeShellDelegate::IsFirstRunAfterBoot() const {
    170   return false;
    171 }
    172 
    173 void ChromeShellDelegate::PreInit() {
    174 }
    175 
    176 void ChromeShellDelegate::PreShutdown() {
    177 }
    178 
    179 ash::NewWindowDelegate* ChromeShellDelegate::CreateNewWindowDelegate() {
    180   return new NewWindowDelegateImpl;
    181 }
    182 
    183 ash::MediaDelegate* ChromeShellDelegate::CreateMediaDelegate() {
    184   return new MediaDelegateImpl;
    185 }
    186 
    187 ash::SessionStateDelegate* ChromeShellDelegate::CreateSessionStateDelegate() {
    188   return new SessionStateDelegate;
    189 }
    190 
    191 ash::SystemTrayDelegate* ChromeShellDelegate::CreateSystemTrayDelegate() {
    192 #if defined(OS_WIN)
    193   return CreateWindowsSystemTrayDelegate();
    194 #elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
    195   return CreateLinuxSystemTrayDelegate();
    196 #else
    197   return new ash::DefaultSystemTrayDelegate;
    198 #endif
    199 }
    200 
    201 ash::AccessibilityDelegate* ChromeShellDelegate::CreateAccessibilityDelegate() {
    202   return new EmptyAccessibilityDelegate;
    203 }
    204 
    205 ash::UserWallpaperDelegate* ChromeShellDelegate::CreateUserWallpaperDelegate() {
    206   return CreateSolidColorUserWallpaperDelegate();
    207 }
    208 
    209 void ChromeShellDelegate::Observe(int type,
    210                                   const content::NotificationSource& source,
    211                                   const content::NotificationDetails& details) {
    212   switch (type) {
    213     case chrome::NOTIFICATION_PROFILE_ADDED: {
    214       // Start the error notifier services to show sync/auth notifications.
    215       Profile* profile = content::Source<Profile>(source).ptr();
    216       SigninErrorNotifierFactory::GetForProfile(profile);
    217       SyncErrorNotifierFactory::GetForProfile(profile);
    218       break;
    219     }
    220     case chrome::NOTIFICATION_ASH_SESSION_STARTED: {
    221       // Start the error notifier services for the already loaded profiles.
    222       const std::vector<Profile*> profiles =
    223           g_browser_process->profile_manager()->GetLoadedProfiles();
    224       for (std::vector<Profile*>::const_iterator it = profiles.begin();
    225            it != profiles.end(); ++it) {
    226         SigninErrorNotifierFactory::GetForProfile(*it);
    227         SyncErrorNotifierFactory::GetForProfile(*it);
    228       }
    229 
    230 #if defined(OS_WIN)
    231       // If we are launched to service a windows 8 search request then let the
    232       // IPC which carries the search string create the browser and initiate
    233       // the navigation.
    234       if (CommandLine::ForCurrentProcess()->HasSwitch(
    235           switches::kWindows8Search))
    236         break;
    237 #endif
    238       // If Chrome ASH is launched when no browser is open in the desktop,
    239       // we should execute the startup code.
    240       // If there are browsers open in the desktop, we create a browser window
    241       // and open a new tab page, if session restore is not on.
    242       BrowserList* desktop_list = BrowserList::GetInstance(
    243           chrome::HOST_DESKTOP_TYPE_NATIVE);
    244       if (desktop_list->empty()) {
    245         // We pass a dummy command line here, because the browser is launched in
    246         // silent-mode by the metro viewer process, which causes the
    247         // StartupBrowserCreatorImpl class to not create any browsers which is
    248         // not the behavior we want.
    249         CommandLine dummy(CommandLine::NO_PROGRAM);
    250         StartupBrowserCreatorImpl startup_impl(
    251             base::FilePath(),
    252             dummy,
    253             chrome::startup::IS_NOT_FIRST_RUN);
    254         startup_impl.Launch(
    255             ProfileManager::GetActiveUserProfile(),
    256             std::vector<GURL>(),
    257             true,
    258             chrome::HOST_DESKTOP_TYPE_ASH);
    259       } else {
    260         Browser* browser =
    261             chrome::FindBrowserWithWindow(ash::wm::GetActiveWindow());
    262         if (browser && browser->is_type_tabbed()) {
    263           chrome::AddTabAt(browser, GURL(), -1, true);
    264           return;
    265         }
    266 
    267         chrome::ScopedTabbedBrowserDisplayer displayer(
    268             ProfileManager::GetActiveUserProfile(),
    269             chrome::HOST_DESKTOP_TYPE_ASH);
    270         chrome::AddTabAt(displayer.browser(), GURL(), -1, true);
    271       }
    272       break;
    273     }
    274     case chrome::NOTIFICATION_ASH_SESSION_ENDED:
    275       break;
    276     default:
    277       NOTREACHED() << "Unexpected notification " << type;
    278   }
    279 }
    280 
    281 void ChromeShellDelegate::PlatformInit() {
    282 #if defined(OS_WIN)
    283   registrar_.Add(this,
    284                  chrome::NOTIFICATION_PROFILE_ADDED,
    285                  content::NotificationService::AllSources());
    286   registrar_.Add(this,
    287                  chrome::NOTIFICATION_ASH_SESSION_STARTED,
    288                  content::NotificationService::AllSources());
    289   registrar_.Add(this,
    290                  chrome::NOTIFICATION_ASH_SESSION_ENDED,
    291                  content::NotificationService::AllSources());
    292 #endif
    293 }
    294