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