Home | History | Annotate | Download | only in ash
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/views/ash/chrome_browser_main_extra_parts_ash.h"
      6 
      7 #include "ash/root_window_controller.h"
      8 #include "ash/session/session_state_delegate.h"
      9 #include "ash/shell.h"
     10 #include "base/command_line.h"
     11 #include "base/lazy_instance.h"
     12 #include "chrome/browser/chrome_browser_main.h"
     13 #include "chrome/browser/ui/ash/ash_init.h"
     14 #include "chrome/browser/ui/ash/ash_util.h"
     15 #include "chrome/browser/ui/views/ash/tab_scrubber.h"
     16 #include "chrome/common/chrome_switches.h"
     17 #include "ui/aura/env.h"
     18 #include "ui/gfx/screen.h"
     19 #include "ui/gfx/screen_type_delegate.h"
     20 #include "ui/keyboard/keyboard.h"
     21 #include "ui/keyboard/keyboard_controller.h"
     22 #include "ui/keyboard/keyboard_util.h"
     23 
     24 #if defined(OS_CHROMEOS)
     25 #include "chrome/browser/ui/views/select_file_dialog_extension.h"
     26 #include "chrome/browser/ui/views/select_file_dialog_extension_factory.h"
     27 #endif
     28 
     29 #if !defined(OS_CHROMEOS)
     30 #include "ui/shell_dialogs/select_file_dialog.h"
     31 #include "ui/shell_dialogs/shell_dialogs_delegate.h"
     32 #endif
     33 
     34 #if !defined(OS_CHROMEOS)
     35 class ScreenTypeDelegateWin : public gfx::ScreenTypeDelegate {
     36  public:
     37   ScreenTypeDelegateWin() {}
     38   virtual gfx::ScreenType GetScreenTypeForNativeView(
     39       gfx::NativeView view) OVERRIDE {
     40     return chrome::IsNativeViewInAsh(view) ?
     41         gfx::SCREEN_TYPE_ALTERNATE :
     42         gfx::SCREEN_TYPE_NATIVE;
     43   }
     44  private:
     45   DISALLOW_COPY_AND_ASSIGN(ScreenTypeDelegateWin);
     46 };
     47 
     48 class ShellDialogsDelegateWin : public ui::ShellDialogsDelegate {
     49  public:
     50   ShellDialogsDelegateWin() {}
     51   virtual bool IsWindowInMetro(gfx::NativeWindow window) OVERRIDE {
     52     return chrome::IsNativeViewInAsh(window);
     53   }
     54  private:
     55   DISALLOW_COPY_AND_ASSIGN(ShellDialogsDelegateWin);
     56 };
     57 
     58 base::LazyInstance<ShellDialogsDelegateWin> g_shell_dialogs_delegate;
     59 
     60 #endif
     61 
     62 ChromeBrowserMainExtraPartsAsh::ChromeBrowserMainExtraPartsAsh() {
     63 }
     64 
     65 ChromeBrowserMainExtraPartsAsh::~ChromeBrowserMainExtraPartsAsh() {
     66 }
     67 
     68 void ChromeBrowserMainExtraPartsAsh::PreProfileInit() {
     69   if (chrome::ShouldOpenAshOnStartup()) {
     70     chrome::OpenAsh(gfx::kNullAcceleratedWidget);
     71 
     72 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
     73   ash::Shell::GetInstance()->CreateShelf();
     74   ash::Shell::GetInstance()->ShowShelf();
     75 #endif
     76   } else {
     77 #if !defined(OS_CHROMEOS)
     78     gfx::Screen::SetScreenTypeDelegate(new ScreenTypeDelegateWin);
     79     ui::SelectFileDialog::SetShellDialogsDelegate(
     80         g_shell_dialogs_delegate.Pointer());
     81 #endif
     82   }
     83 #if defined(OS_CHROMEOS)
     84   // For OS_CHROMEOS, virtual keyboard needs to be initialized before profile
     85   // initialized. Otherwise, virtual keyboard extension will not load at login
     86   // screen.
     87   keyboard::InitializeKeyboard();
     88 #endif
     89 
     90 #if defined(OS_CHROMEOS)
     91   ui::SelectFileDialog::SetFactory(new SelectFileDialogExtensionFactory);
     92 #endif
     93 }
     94 
     95 void ChromeBrowserMainExtraPartsAsh::PostProfileInit() {
     96   if (!ash::Shell::HasInstance())
     97     return;
     98 
     99   // Initialize TabScrubber after the Ash Shell has been initialized.
    100   TabScrubber::GetInstance();
    101   // Activate virtual keyboard after profile is initialized. It depends on the
    102   // default profile. If keyboard usability experiment flag is set, defer the
    103   // activation to UpdateWindow() in virtual_keyboard_window_controller.cc.
    104   if (!keyboard::IsKeyboardUsabilityExperimentEnabled()) {
    105     ash::Shell::GetPrimaryRootWindowController()->ActivateKeyboard(
    106         keyboard::KeyboardController::GetInstance());
    107   }
    108 }
    109 
    110 void ChromeBrowserMainExtraPartsAsh::PostMainMessageLoopRun() {
    111   chrome::CloseAsh();
    112 }
    113