shell_browser_main_parts.cc revision f2477e01787aa58f445919b809d89e252beef54f
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 "ash/shell/content_client/shell_browser_main_parts.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "ash/ash_switches.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/desktop_background/desktop_background_controller.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell/shell_delegate_impl.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell/window_watcher.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/system/user/login_status.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/icu_util.h" 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/message_loop/message_loop.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_browser_context.h" 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_net_log.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_module.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_paths.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/screen.h" 31a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "ui/message_center/message_center.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/accelerator_handler.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/test/test_views_delegate.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(USE_X11) 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/x/touch_factory_x11.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 40a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/audio/cras_audio_handler.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace shell { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitWindowTypeLauncher(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 49a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShellViewsDelegate : public views::TestViewsDelegate { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellViewsDelegate() {} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ShellViewsDelegate() {} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::TestViewsDelegate: 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual views::NonClientFrameView* CreateDefaultNonClientFrameView( 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* widget) OVERRIDE { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ash::Shell::GetInstance()->CreateDefaultNonClientFrameView(widget); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool UseTransparentWindows() const OVERRIDE { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ash uses transparent window frames. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnBeforeWidgetInit( 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::InitParams* params, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::internal::NativeWidgetDelegate* delegate) OVERRIDE { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params->native_widget) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!params->parent && !params->context && params->top_level) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->context = Shell::GetPrimaryRootWindow(); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ShellViewsDelegate); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellBrowserMainParts::ShellBrowserMainParts( 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::MainFunctionParams& parameters) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : BrowserMainParts(), 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_(NULL) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellBrowserMainParts::~ShellBrowserMainParts() { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShellBrowserMainParts::PreMainMessageLoopStart() { 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(USE_X11) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchFactory::SetTouchDeviceListFromCommandLine(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShellBrowserMainParts::PostMainMessageLoopStart() { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::DBusThreadManager::Initialize(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShellBrowserMainParts::PreMainMessageLoopRun() { 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch net_log_.reset(new content::ShellNetLog()); 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser_context_.reset(new content::ShellBrowserContext( 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch false, net_log_.get())); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A ViewsDelegate is required. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!views::ViewsDelegate::views_delegate) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::ViewsDelegate::views_delegate = new ShellViewsDelegate; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_ = new ash::shell::ShellDelegateImpl; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The global message center state must be initialized absent 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // g_browser_process. 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_center::MessageCenter::Initialize(); 114a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 115a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#if defined(OS_CHROMEOS) 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Create CrasAudioHandler for testing since g_browser_process 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // is absent. 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) chromeos::CrasAudioHandler::InitializeForTesting(); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 120a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::CreateInstance(delegate_); 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate_->set_browser_context(browser_context_.get()); 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ash::Shell::GetInstance()->CreateLauncher(); 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ash::Shell::GetInstance()->UpdateAfterLoginStatusChange( 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch user::LOGGED_IN_USER); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_watcher_.reset(new ash::shell::WindowWatcher); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Screen* screen = Shell::GetInstance()->GetScreen(); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screen->AddObserver(window_watcher_.get()); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->SetWatcher(window_watcher_.get()); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::shell::InitWindowTypeLauncher(); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Shell::GetInstance()->desktop_background_controller()->SetDefaultWallpaper( 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch false /* is_guest */); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ash::Shell::GetPrimaryRootWindow()->GetDispatcher()->host()->Show(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShellBrowserMainParts::PostMainMessageLoopRun() { 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Screen* screen = Shell::GetInstance()->GetScreen(); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screen->RemoveObserver(window_watcher_.get()); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_watcher_.reset(); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->SetWatcher(NULL); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_ = NULL; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::DeleteInstance(); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The global message center state must be shutdown absent 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // g_browser_process. 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_center::MessageCenter::Shutdown(); 151a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 152a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#if defined(OS_CHROMEOS) 153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) chromeos::CrasAudioHandler::Shutdown(); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 155a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Env::DeleteInstance(); 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The keyboard may have created a WebContents. The WebContents is destroyed 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // with the UI, and it needs the BrowserContext to be alive during its 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // destruction. So destroy all of the UI elements before destroying the 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // browser context. 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_context_.reset(); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ShellBrowserMainParts::MainMessageLoopRun(int* result_code) { 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoopForUI::current()->Run(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace shell 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 172