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