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/aura/chrome_browser_main_extra_parts_aura.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/command_line.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/run_loop.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/aura/active_desktop_monitor.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/host_desktop.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/simple_message_box.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/chromium_strings.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/ui_base_switches.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget_aura.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(USE_X11) && !defined(OS_CHROMEOS) 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/prefs/pref_service.h" 245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/profiles/profile.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/gtk2_ui.h" 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/common/pref_names.h" 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/aura/window.h" 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/base/ime/input_method_initializer.h" 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/native_theme/native_theme_aura.h" 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/views/linux_ui/linux_ui.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/ash/ash_init.h" 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(USE_ASH) 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if !defined(OS_CHROMEOS) 38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/views/widget/desktop_aura/desktop_screen.h" 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(USE_X11) && !defined(OS_CHROMEOS) 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuui::NativeTheme* GetNativeThemeForWindow(aura::Window* window) { 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!window) 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return NULL; 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Profile* profile = NULL; 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (window->type() == ui::wm::WINDOW_TYPE_NORMAL || 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu window->type() == ui::wm::WINDOW_TYPE_POPUP) { 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu profile = reinterpret_cast<Profile*>( 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu window->GetNativeWindowProperty(Profile::kProfileKey)); 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (profile && !profile->GetPrefs()->GetBoolean(prefs::kUsesSystemTheme)) 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return ui::NativeThemeAura::instance(); 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return NULL; 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if !defined(OS_CHROMEOS) && defined(USE_ASH) 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns the desktop this process was initially launched in. 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochchrome::HostDesktopType GetInitialDesktop() { 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN) && defined(USE_ASH) 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const CommandLine* command_line = CommandLine::ForCurrentProcess(); 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (command_line->HasSwitch(switches::kViewerConnect) || 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch command_line->HasSwitch(switches::kViewerLaunchViaAppId)) { 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return chrome::HOST_DESKTOP_TYPE_ASH; 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#elif defined(OS_LINUX) 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const CommandLine* command_line = CommandLine::ForCurrentProcess(); 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (command_line->HasSwitch(switches::kOpenAsh)) 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return chrome::HOST_DESKTOP_TYPE_ASH; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return chrome::HOST_DESKTOP_TYPE_NATIVE; 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // !defined(OS_CHROMEOS) && defined(USE_ASH) 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeBrowserMainExtraPartsAura::ChromeBrowserMainExtraPartsAura() { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeBrowserMainExtraPartsAura::~ChromeBrowserMainExtraPartsAura() { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void ChromeBrowserMainExtraPartsAura::PreEarlyInitialization() { 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(USE_X11) && !defined(OS_CHROMEOS) 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (GetInitialDesktop() != chrome::HOST_DESKTOP_TYPE_ASH) { 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(erg): Refactor this into a dlopen call when we add a GTK3 port. 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) views::LinuxUI* gtk2_ui = BuildGtk2UI(); 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gtk2_ui->SetNativeThemeOverride(base::Bind(&GetNativeThemeForWindow)); 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) views::LinuxUI::SetInstance(gtk2_ui); 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(erg): Eventually, we'll need to somehow support IMEs in ash on 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Linux. 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::InitializeInputMethodForTesting(); 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif 1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeBrowserMainExtraPartsAura::ToolkitInitialized() { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH) 1070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CHECK(aura::Env::GetInstance()); 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch active_desktop_monitor_.reset(new ActiveDesktopMonitor(GetInitialDesktop())); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(USE_X11) && !defined(OS_CHROMEOS) 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (GetInitialDesktop() != chrome::HOST_DESKTOP_TYPE_ASH) 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) views::LinuxUI::instance()->Initialize(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ChromeBrowserMainExtraPartsAura::PreCreateThreads() { 11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if !defined(OS_CHROMEOS) 12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(USE_ASH) 12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!chrome::ShouldOpenAshOnStartup()) 12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif 12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) { 12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, 12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) views::CreateDesktopScreen()); 12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif 12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ChromeBrowserMainExtraPartsAura::PreProfileInit() { 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Now that we have some minimal ui initialized, check to see if we're 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // running as root and bail if we are. 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DetectRunningAsRoot(); 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeBrowserMainExtraPartsAura::PostMainMessageLoopRun() { 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_desktop_monitor_.reset(); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // aura::Env instance is deleted in BrowserProcessImpl::StartTearDown 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after the metrics service is deleted. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ChromeBrowserMainExtraPartsAura::DetectRunningAsRoot() { 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (getuid() == 0) { 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (command_line.HasSwitch(switches::kUserDataDir)) 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 title = l10n_util::GetStringFUTF16( 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IDS_REFUSE_TO_RUN_AS_ROOT, 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 message = l10n_util::GetStringFUTF16( 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IDS_REFUSE_TO_RUN_AS_ROOT_2, 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::ShowMessageBox(NULL, 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) title, 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) message, 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::MESSAGE_BOX_TYPE_WARNING); 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Avoids gpu_process_transport_factory.cc(153)] Check failed: 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // per_compositor_data_.empty() when quit is chosen. 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) exit(EXIT_FAILURE); 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 172