blob: 57a5099ad9955e1def2b653e7730c75f1b6ab2fb [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/ash/chrome_shell_delegate.h"
#include <vector>
#include "ash/accessibility_delegate.h"
#include "ash/magnifier/magnifier_constants.h"
#include "ash/media_delegate.h"
#include "ash/wm/window_util.h"
#include "base/command_line.h"
#include "chrome/browser/accessibility/accessibility_events.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/prefs/session_startup_pref.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/signin/signin_error_notifier_factory_ash.h"
#include "chrome/browser/sync/sync_error_notifier_factory_ash.h"
#include "chrome/browser/ui/ash/chrome_new_window_delegate.h"
#include "chrome/browser/ui/ash/session_state_delegate_views.h"
#include "chrome/browser/ui/ash/solid_color_user_wallpaper_delegate.h"
#include "chrome/browser/ui/ash/system_tray_delegate_common.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/host_desktop.h"
#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
#include "chrome/browser/ui/startup/startup_browser_creator_impl.h"
#include "chrome/common/chrome_switches.h"
#include "content/public/browser/notification_service.h"
namespace {
class NewWindowDelegateImpl : public ChromeNewWindowDelegate {
public:
NewWindowDelegateImpl() {}
virtual ~NewWindowDelegateImpl() {}
// Overridden from ash::NewWindowDelegate:
virtual void OpenFileManager() override {}
virtual void OpenCrosh() override {}
virtual void ShowKeyboardOverlay() override {}
private:
DISALLOW_COPY_AND_ASSIGN(NewWindowDelegateImpl);
};
class MediaDelegateImpl : public ash::MediaDelegate {
public:
MediaDelegateImpl() {}
virtual ~MediaDelegateImpl() {}
virtual void HandleMediaNextTrack() override {}
virtual void HandleMediaPlayPause() override {}
virtual void HandleMediaPrevTrack() override {}
virtual ash::MediaCaptureState GetMediaCaptureState(
content::BrowserContext* context) override {
return ash::MEDIA_CAPTURE_NONE;
}
private:
DISALLOW_COPY_AND_ASSIGN(MediaDelegateImpl);
};
class EmptyAccessibilityDelegate : public ash::AccessibilityDelegate {
public:
EmptyAccessibilityDelegate() {}
virtual ~EmptyAccessibilityDelegate() {}
virtual void ToggleHighContrast() override {
}
virtual bool IsHighContrastEnabled() const override {
return false;
}
virtual bool IsSpokenFeedbackEnabled() const override {
return false;
}
virtual void ToggleSpokenFeedback(
ash::AccessibilityNotificationVisibility notify) override {
}
virtual void SetLargeCursorEnabled(bool enalbed) override {
}
virtual bool IsLargeCursorEnabled() const override {
return false;
}
virtual void SetMagnifierEnabled(bool enabled) override {
}
virtual void SetMagnifierType(ash::MagnifierType type) override {
}
virtual bool IsMagnifierEnabled() const override {
return false;
}
virtual void SetAutoclickEnabled(bool enabled) override {
}
virtual bool IsAutoclickEnabled() const override {
return false;
}
virtual ash::MagnifierType GetMagnifierType() const override {
return ash::kDefaultMagnifierType;
}
virtual void SaveScreenMagnifierScale(double scale) override {
}
virtual double GetSavedScreenMagnifierScale() override {
return std::numeric_limits<double>::min();
}
virtual bool ShouldShowAccessibilityMenu() const override {
return false;
}
virtual bool IsBrailleDisplayConnected() const override { return false; }
virtual void SilenceSpokenFeedback() const override {
}
virtual void SetVirtualKeyboardEnabled(bool enabled) override {
}
virtual bool IsVirtualKeyboardEnabled() const override {
return false;
}
virtual void TriggerAccessibilityAlert(
ash::AccessibilityAlert alert) override {
}
virtual ash::AccessibilityAlert GetLastAccessibilityAlert() override {
return ash::A11Y_ALERT_NONE;
}
virtual void PlayEarcon(int sound_key) override {
}
virtual base::TimeDelta PlayShutdownSound() const override {
return base::TimeDelta();
}
private:
DISALLOW_COPY_AND_ASSIGN(EmptyAccessibilityDelegate);
};
} // namespace
bool ChromeShellDelegate::IsFirstRunAfterBoot() const {
return false;
}
void ChromeShellDelegate::PreInit() {
}
void ChromeShellDelegate::PreShutdown() {
}
ash::NewWindowDelegate* ChromeShellDelegate::CreateNewWindowDelegate() {
return new NewWindowDelegateImpl;
}
ash::MediaDelegate* ChromeShellDelegate::CreateMediaDelegate() {
return new MediaDelegateImpl;
}
ash::SessionStateDelegate* ChromeShellDelegate::CreateSessionStateDelegate() {
return new SessionStateDelegate;
}
ash::SystemTrayDelegate* ChromeShellDelegate::CreateSystemTrayDelegate() {
return new SystemTrayDelegateCommon();
}
ash::AccessibilityDelegate* ChromeShellDelegate::CreateAccessibilityDelegate() {
return new EmptyAccessibilityDelegate;
}
ash::UserWallpaperDelegate* ChromeShellDelegate::CreateUserWallpaperDelegate() {
return CreateSolidColorUserWallpaperDelegate();
}
void ChromeShellDelegate::Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
switch (type) {
case chrome::NOTIFICATION_PROFILE_ADDED: {
// Start the error notifier services to show sync/auth notifications.
Profile* profile = content::Source<Profile>(source).ptr();
SigninErrorNotifierFactory::GetForProfile(profile);
SyncErrorNotifierFactory::GetForProfile(profile);
break;
}
case chrome::NOTIFICATION_ASH_SESSION_STARTED: {
// Start the error notifier services for the already loaded profiles.
const std::vector<Profile*> profiles =
g_browser_process->profile_manager()->GetLoadedProfiles();
for (std::vector<Profile*>::const_iterator it = profiles.begin();
it != profiles.end(); ++it) {
SigninErrorNotifierFactory::GetForProfile(*it);
SyncErrorNotifierFactory::GetForProfile(*it);
}
#if defined(OS_WIN)
// If we are launched to service a windows 8 search request then let the
// IPC which carries the search string create the browser and initiate
// the navigation.
if (CommandLine::ForCurrentProcess()->HasSwitch(
switches::kWindows8Search))
break;
#endif
// If Chrome ASH is launched when no browser is open in the desktop,
// we should execute the startup code.
// If there are browsers open in the desktop, we create a browser window
// and open a new tab page, if session restore is not on.
BrowserList* desktop_list = BrowserList::GetInstance(
chrome::HOST_DESKTOP_TYPE_NATIVE);
if (desktop_list->empty()) {
// We pass a dummy command line here, because the browser is launched in
// silent-mode by the metro viewer process, which causes the
// StartupBrowserCreatorImpl class to not create any browsers which is
// not the behavior we want.
CommandLine dummy(CommandLine::NO_PROGRAM);
StartupBrowserCreatorImpl startup_impl(
base::FilePath(),
dummy,
chrome::startup::IS_NOT_FIRST_RUN);
startup_impl.Launch(
ProfileManager::GetActiveUserProfile(),
std::vector<GURL>(),
true,
chrome::HOST_DESKTOP_TYPE_ASH);
} else {
Browser* browser =
chrome::FindBrowserWithWindow(ash::wm::GetActiveWindow());
if (browser && browser->is_type_tabbed()) {
chrome::AddTabAt(browser, GURL(), -1, true);
return;
}
chrome::ScopedTabbedBrowserDisplayer displayer(
ProfileManager::GetActiveUserProfile(),
chrome::HOST_DESKTOP_TYPE_ASH);
chrome::AddTabAt(displayer.browser(), GURL(), -1, true);
}
break;
}
case chrome::NOTIFICATION_ASH_SESSION_ENDED:
break;
default:
NOTREACHED() << "Unexpected notification " << type;
}
}
void ChromeShellDelegate::PlatformInit() {
#if defined(OS_WIN)
registrar_.Add(this,
chrome::NOTIFICATION_PROFILE_ADDED,
content::NotificationService::AllSources());
registrar_.Add(this,
chrome::NOTIFICATION_ASH_SESSION_STARTED,
content::NotificationService::AllSources());
registrar_.Add(this,
chrome::NOTIFICATION_ASH_SESSION_ENDED,
content::NotificationService::AllSources());
#endif
}