15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/ash/ash_init.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/accelerators/accelerator_controller.h" 8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ash/accelerometer/accelerometer_controller.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_switches.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/high_contrast/high_contrast_controller.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/magnifier/magnification_controller.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/magnifier/partial_magnification_controller.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ash/shell_init_params.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_shutdown.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/ash/chrome_shell_delegate.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/ash/screenshot_taker.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/browser/browser_thread.h" 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/context_factory.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/aura/window_tree_host.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/sys_info.h" 28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/accessibility/accessibility_manager.h" 29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/accessibility/magnification_manager.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/ash/ime_controller_chromeos.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/ash/volume_controller_chromeos.h" 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/login/login_state.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/x/x11_util.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ShouldOpenAshOnStartup() { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(scottmg): http://crbug.com/133312, will need this for Win8 too. 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return CommandLine::ForCurrentProcess()->HasSwitch(switches::kOpenAsh); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void OpenAsh(gfx::AcceleratedWidget remote_window) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(USE_X11) 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (base::SysInfo::IsRunningOnChromeOS()) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hides the cursor outside of the Aura root window. The cursor will be 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // drawn within the Aura root window, and it'll remain hidden after the 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Aura window is closed. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::HideHostCursor(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Hide the mouse cursor completely at boot. 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!chromeos::LoginState::Get()->IsUserLoggedIn()) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::set_initially_hide_cursor(true); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ash::ShellInitParams shell_init_params; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shell takes ownership of ChromeShellDelegate. 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) shell_init_params.delegate = new ChromeShellDelegate; 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) shell_init_params.context_factory = content::GetContextFactory(); 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_WIN) 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) shell_init_params.remote_hwnd = remote_window; 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ash::Shell* shell = ash::Shell::CreateInstance(shell_init_params); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->accelerator_controller()->SetScreenshotDelegate( 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ash::ScreenshotDelegate>(new ScreenshotTaker).Pass()); 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // TODO(flackr): Investigate exposing a blocking pool task runner to chromeos. 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch shell->accelerometer_controller()->Initialize( 76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::BrowserThread::GetBlockingPool()-> 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetTaskRunnerWithShutdownBehavior( 78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->accelerator_controller()->SetImeControlDelegate( 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ash::ImeControlDelegate>(new ImeController).Pass()); 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shell->high_contrast_controller()->SetEnabled( 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) chromeos::AccessibilityManager::Get()->IsHighContrastEnabled()); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(chromeos::MagnificationManager::Get()); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool magnifier_enabled = 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::MagnificationManager::Get()->IsMagnifierEnabled(); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::MagnifierType magnifier_type = 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::MagnificationManager::Get()->GetMagnifierType(); 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shell->magnification_controller()-> 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetEnabled(magnifier_enabled && magnifier_type == ash::MAGNIFIER_FULL); 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shell->partial_magnification_controller()-> 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetEnabled(magnifier_enabled && magnifier_type == ash::MAGNIFIER_PARTIAL); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CommandLine::ForCurrentProcess()->HasSwitch( 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableZeroBrowsersOpenForTests)) { 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chrome::IncrementKeepAliveCount(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ash::Shell::GetPrimaryRootWindow()->GetHost()->Show(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloseAsh() { 104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (ash::Shell::HasInstance()) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::DeleteInstance(); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chrome 109