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