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"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ash/shell_init_params.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/system/user/login_status.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/icu_util.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/message_loop/message_loop.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/context_factory.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_browser_context.h"
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_net_log.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_module.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/aura/window_tree_host.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_paths.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/screen.h"
32a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "ui/message_center/message_center.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/test/test_views_delegate.h"
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/wm_state.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(USE_X11)
3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/x/touch_factory_x11.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
41a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/audio/cras_audio_handler.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace shell {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitWindowTypeLauncher();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
50a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShellViewsDelegate : public views::TestViewsDelegate {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellViewsDelegate() {}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ShellViewsDelegate() {}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::TestViewsDelegate:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual views::NonClientFrameView* CreateDefaultNonClientFrameView(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      views::Widget* widget) OVERRIDE {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ash::Shell::GetInstance()->CreateDefaultNonClientFrameView(widget);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnBeforeWidgetInit(
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::Widget::InitParams* params,
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::internal::NativeWidgetDelegate* delegate) OVERRIDE {
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (params->opacity == views::Widget::InitParams::INFER_OPACITY)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      params->opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (params->native_widget)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!params->parent && !params->context && !params->child)
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)
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellBrowserMainParts::ToolkitInitialized() {
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  wm_state_.reset(new wm::WMState);
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShellBrowserMainParts::PreMainMessageLoopRun() {
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net_log_.reset(new content::ShellNetLog("ash_shell"));
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  browser_context_.reset(new content::ShellBrowserContext(
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      false, net_log_.get()));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A ViewsDelegate is required.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!views::ViewsDelegate::views_delegate)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::ViewsDelegate::views_delegate = new ShellViewsDelegate;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_ = new ash::shell::ShellDelegateImpl;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The global message center state must be initialized absent
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // g_browser_process.
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_center::MessageCenter::Initialize();
118a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
119a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#if defined(OS_CHROMEOS)
120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Create CrasAudioHandler for testing since g_browser_process
121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // is absent.
122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  chromeos::CrasAudioHandler::InitializeForTesting();
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
124a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ash::ShellInitParams init_params;
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  init_params.delegate = delegate_;
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  init_params.context_factory = content::GetContextFactory();
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ash::Shell::CreateInstance(init_params);
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  delegate_->set_browser_context(browser_context_.get());
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ash::Shell::GetInstance()->CreateShelf();
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ash::Shell::GetInstance()->UpdateAfterLoginStatusChange(
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      user::LOGGED_IN_USER);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_watcher_.reset(new ash::shell::WindowWatcher);
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Screen* screen = Shell::GetInstance()->GetScreen();
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  screen->AddObserver(window_watcher_.get());
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_->SetWatcher(window_watcher_.get());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ash::shell::InitWindowTypeLauncher();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ash::Shell::GetPrimaryRootWindow()->GetHost()->Show();
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShellBrowserMainParts::PostMainMessageLoopRun() {
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Screen* screen = Shell::GetInstance()->GetScreen();
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  screen->RemoveObserver(window_watcher_.get());
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_watcher_.reset();
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_->SetWatcher(NULL);
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_ = NULL;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ash::Shell::DeleteInstance();
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The global message center state must be shutdown absent
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // g_browser_process.
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_center::MessageCenter::Shutdown();
155a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
156a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#if defined(OS_CHROMEOS)
157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  chromeos::CrasAudioHandler::Shutdown();
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
159a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Env::DeleteInstance();
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The keyboard may have created a WebContents. The WebContents is destroyed
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // with the UI, and it needs the BrowserContext to be alive during its
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // destruction. So destroy all of the UI elements before destroying the
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // browser context.
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  browser_context_.reset();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ShellBrowserMainParts::MainMessageLoopRun(int* result_code) {
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoopForUI::current()->Run();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace shell
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
176