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