12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/ash/chrome_shell_delegate.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/accelerators/magnifier_key_scroller.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/accelerators/spoken_feedback_toggler.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/accessibility_delegate.h"
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ash/wm/mru_window_tracker.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/window_util.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/accessibility/accessibility_events.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/app_mode/app_mode_utils.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/accessibility/magnification_manager.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/background/ash_user_wallpaper_delegate.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/display/display_configuration_observer.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/display/display_preferences.h"
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/profiles/profile_helper.h"
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/signin/signin_error_notifier_factory_ash.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/speech/tts_controller.h"
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/sync/sync_error_notifier_factory_ash.h"
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/ash/chrome_new_window_delegate_chromeos.h"
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/ui/ash/media_delegate_chromeos.h"
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/ash/session_state_delegate_chromeos.h"
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/ash/system_tray_delegate_chromeos.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/input_method_manager.h"
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/notification_service.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/user_metrics.h"
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/aura/window.h"
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace {
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InitAfterSessionStart() {
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Restore focus after the user session is started.  It's needed because some
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // windows can be opened in background while login UI is still active because
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // we currently restore browser windows before login UI is deleted.
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ash::Shell* shell = ash::Shell::GetInstance();
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ash::MruWindowTracker::WindowList mru_list =
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      shell->mru_window_tracker()->BuildMruWindowList();
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!mru_list.empty())
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    mru_list.front()->Focus();
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(USE_X11)
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Enable magnifier scroll keys as there may be no mouse cursor in kiosk mode.
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ash::MagnifierKeyScroller::SetEnabled(chrome::IsRunningInForcedAppMode());
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Enable long press action to toggle spoken feedback with hotrod
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // remote which can't handle shortcut.
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ash::SpokenFeedbackToggler::SetEnabled(chrome::IsRunningInForcedAppMode());
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class AccessibilityDelegateImpl : public ash::AccessibilityDelegate {
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AccessibilityDelegateImpl() {}
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual ~AccessibilityDelegateImpl() {}
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void ToggleHighContrast() OVERRIDE {
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(chromeos::AccessibilityManager::Get());
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    chromeos::AccessibilityManager::Get()->EnableHighContrast(
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        !chromeos::AccessibilityManager::Get()->IsHighContrastEnabled());
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool IsSpokenFeedbackEnabled() const OVERRIDE {
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(chromeos::AccessibilityManager::Get());
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return chromeos::AccessibilityManager::Get()->IsSpokenFeedbackEnabled();
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void ToggleSpokenFeedback(
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ash::AccessibilityNotificationVisibility notify) OVERRIDE {
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(chromeos::AccessibilityManager::Get());
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    chromeos::AccessibilityManager::Get()->ToggleSpokenFeedback(notify);
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool IsHighContrastEnabled() const OVERRIDE {
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(chromeos::AccessibilityManager::Get());
901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return chromeos::AccessibilityManager::Get()->IsHighContrastEnabled();
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void SetMagnifierEnabled(bool enabled) OVERRIDE {
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(chromeos::MagnificationManager::Get());
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return chromeos::MagnificationManager::Get()->SetMagnifierEnabled(enabled);
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void SetMagnifierType(ash::MagnifierType type) OVERRIDE {
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(chromeos::MagnificationManager::Get());
1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return chromeos::MagnificationManager::Get()->SetMagnifierType(type);
1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool IsMagnifierEnabled() const OVERRIDE {
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(chromeos::MagnificationManager::Get());
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return chromeos::MagnificationManager::Get()->IsMagnifierEnabled();
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual ash::MagnifierType GetMagnifierType() const OVERRIDE {
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(chromeos::MagnificationManager::Get());
1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return chromeos::MagnificationManager::Get()->GetMagnifierType();
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void SetLargeCursorEnabled(bool enabled) OVERRIDE {
1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(chromeos::AccessibilityManager::Get());
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return chromeos::AccessibilityManager::Get()->EnableLargeCursor(enabled);
1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool IsLargeCursorEnabled() const OVERRIDE {
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(chromeos::AccessibilityManager::Get());
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return chromeos::AccessibilityManager::Get()->IsLargeCursorEnabled();
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void SetAutoclickEnabled(bool enabled) OVERRIDE {
1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(chromeos::AccessibilityManager::Get());
1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return chromeos::AccessibilityManager::Get()->EnableAutoclick(enabled);
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool IsAutoclickEnabled() const OVERRIDE {
1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(chromeos::AccessibilityManager::Get());
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return chromeos::AccessibilityManager::Get()->IsAutoclickEnabled();
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetVirtualKeyboardEnabled(bool enabled) OVERRIDE {
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(chromeos::AccessibilityManager::Get());
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return chromeos::AccessibilityManager::Get()->
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EnableVirtualKeyboard(enabled);
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool IsVirtualKeyboardEnabled() const OVERRIDE {
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(chromeos::AccessibilityManager::Get());
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return chromeos::AccessibilityManager::Get()->IsVirtualKeyboardEnabled();
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool ShouldShowAccessibilityMenu() const OVERRIDE {
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(chromeos::AccessibilityManager::Get());
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return chromeos::AccessibilityManager::Get()->
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ShouldShowAccessibilityMenu();
1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual bool IsBrailleDisplayConnected() const OVERRIDE {
151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    DCHECK(chromeos::AccessibilityManager::Get());
152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return chromeos::AccessibilityManager::Get()->IsBrailleDisplayConnected();
153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void SilenceSpokenFeedback() const OVERRIDE {
1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TtsController::GetInstance()->Stop();
1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void SaveScreenMagnifierScale(double scale) OVERRIDE {
1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (chromeos::MagnificationManager::Get())
1611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      chromeos::MagnificationManager::Get()->SaveScreenMagnifierScale(scale);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual double GetSavedScreenMagnifierScale() OVERRIDE {
1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (chromeos::MagnificationManager::Get()) {
1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return chromeos::MagnificationManager::Get()->
1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          GetSavedScreenMagnifierScale();
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return std::numeric_limits<double>::min();
1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void TriggerAccessibilityAlert(
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ash::AccessibilityAlert alert) OVERRIDE {
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Profile* profile = ProfileManager::GetActiveUserProfile();
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (profile) {
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      switch (alert) {
177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        case ash::A11Y_ALERT_WINDOW_NEEDED: {
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          AccessibilityAlertInfo event(
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              profile, l10n_util::GetStringUTF8(IDS_A11Y_ALERT_WINDOW_NEEDED));
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          SendControlAccessibilityNotification(
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              ui::AX_EVENT_ALERT, &event);
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          break;
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        }
1845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        case ash::A11Y_ALERT_WINDOW_OVERVIEW_MODE_ENTERED: {
1855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          AccessibilityAlertInfo event(
1865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              profile, l10n_util::GetStringUTF8(
1875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                  IDS_A11Y_ALERT_WINDOW_OVERVIEW_MODE_ENTERED));
1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          SendControlAccessibilityNotification(
1895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              ui::AX_EVENT_ALERT, &event);
1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          break;
1915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        }
192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        case ash::A11Y_ALERT_NONE:
193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          break;
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ash::AccessibilityAlert GetLastAccessibilityAlert() OVERRIDE {
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return ash::A11Y_ALERT_NONE;
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void PlayEarcon(int sound_key) OVERRIDE {
2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DCHECK(chromeos::AccessibilityManager::Get());
2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return chromeos::AccessibilityManager::Get()->PlayEarcon(sound_key);
2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual base::TimeDelta PlayShutdownSound() const OVERRIDE {
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return chromeos::AccessibilityManager::Get()->PlayShutdownSound();
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
2121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AccessibilityDelegateImpl);
2131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // anonymous namespace
2161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool ChromeShellDelegate::IsFirstRunAfterBoot() const {
2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return CommandLine::ForCurrentProcess()->HasSwitch(
2191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      chromeos::switches::kFirstExecAfterBoot);
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void ChromeShellDelegate::PreInit() {
2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  chromeos::LoadDisplayPreferences(IsFirstRunAfterBoot());
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Set the observer now so that we can save the initial state
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // in Shell::Init.
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  display_configuration_observer_.reset(
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new chromeos::DisplayConfigurationObserver());
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ChromeShellDelegate::PreShutdown() {
231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  display_configuration_observer_.reset();
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ash::SessionStateDelegate* ChromeShellDelegate::CreateSessionStateDelegate() {
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return new SessionStateDelegateChromeos;
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)ash::AccessibilityDelegate* ChromeShellDelegate::CreateAccessibilityDelegate() {
2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return new AccessibilityDelegateImpl;
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)ash::NewWindowDelegate* ChromeShellDelegate::CreateNewWindowDelegate() {
2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return new ChromeNewWindowDelegateChromeos;
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)ash::MediaDelegate* ChromeShellDelegate::CreateMediaDelegate() {
247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return new MediaDelegateChromeOS;
2480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
2490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ash::SystemTrayDelegate* ChromeShellDelegate::CreateSystemTrayDelegate() {
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return chromeos::CreateSystemTrayDelegate();
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ash::UserWallpaperDelegate* ChromeShellDelegate::CreateUserWallpaperDelegate() {
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return chromeos::CreateUserWallpaperDelegate();
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeShellDelegate::Observe(int type,
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  const content::NotificationSource& source,
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  const content::NotificationDetails& details) {
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (type) {
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED: {
263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      Profile* profile = content::Details<Profile>(details).ptr();
264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (!chromeos::ProfileHelper::IsSigninProfile(profile) &&
265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          !profile->IsGuestSession() && !profile->IsSupervised()) {
266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        // Start the error notifier services to show auth/sync notifications.
267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        SigninErrorNotifierFactory::GetForProfile(profile);
268effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        SyncErrorNotifierFactory::GetForProfile(profile);
269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      }
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ash::Shell::GetInstance()->OnLoginUserProfilePrepared();
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::NOTIFICATION_SESSION_STARTED:
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InitAfterSessionStart();
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ash::Shell::GetInstance()->ShowShelf();
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED() << "Unexpected notification " << type;
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeShellDelegate::PlatformInit() {
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this,
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED,
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 content::NotificationService::AllSources());
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this,
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 chrome::NOTIFICATION_SESSION_STARTED,
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 content::NotificationService::AllSources());
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
290