Home | History | Annotate | Download | only in profiles
      1 // Copyright 2014 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/profiles/user_manager_view.h"
      6 
      7 #include "chrome/browser/browser_process.h"
      8 #include "chrome/browser/lifetime/application_lifetime.h"
      9 #include "chrome/browser/profiles/profile_manager.h"
     10 #include "chrome/browser/profiles/profile_metrics.h"
     11 #include "chrome/browser/profiles/profile_window.h"
     12 #include "chrome/browser/ui/browser.h"
     13 #include "chrome/browser/ui/browser_dialogs.h"
     14 #include "chrome/browser/ui/browser_window.h"
     15 #include "chrome/browser/ui/views/auto_keep_alive.h"
     16 #include "content/public/browser/web_contents.h"
     17 #include "grit/generated_resources.h"
     18 #include "ui/base/l10n/l10n_util.h"
     19 #include "ui/views/controls/webview/webview.h"
     20 #include "ui/views/layout/fill_layout.h"
     21 #include "ui/views/view.h"
     22 #include "ui/views/widget/widget.h"
     23 
     24 #if defined(OS_WIN)
     25 #include "chrome/browser/shell_integration.h"
     26 #include "ui/base/win/shell.h"
     27 #include "ui/views/win/hwnd_util.h"
     28 #endif
     29 
     30 namespace {
     31 
     32 // Default window size.
     33 const int kWindowWidth = 900;
     34 const int kWindowHeight = 700;
     35 
     36 }
     37 
     38 namespace chrome {
     39 
     40 // Declared in browser_dialogs.h so others don't have to depend on this header.
     41 void ShowUserManager(const base::FilePath& profile_path_to_focus) {
     42   UserManagerView::Show(
     43       profile_path_to_focus, profiles::USER_MANAGER_NO_TUTORIAL);
     44 }
     45 
     46 void ShowUserManagerWithTutorial(profiles::UserManagerTutorialMode tutorial) {
     47   UserManagerView::Show(base::FilePath(), tutorial);
     48 }
     49 
     50 void HideUserManager() {
     51   UserManagerView::Hide();
     52 }
     53 
     54 }  // namespace chrome
     55 
     56 // static
     57 UserManagerView* UserManagerView::instance_ = NULL;
     58 
     59 UserManagerView::UserManagerView()
     60     : web_view_(NULL),
     61       keep_alive_(new AutoKeepAlive(NULL)) {
     62 }
     63 
     64 UserManagerView::~UserManagerView() {
     65 }
     66 
     67 // static
     68 void UserManagerView::Show(const base::FilePath& profile_path_to_focus,
     69                            profiles::UserManagerTutorialMode tutorial_mode) {
     70   ProfileMetrics::LogProfileSwitchUser(ProfileMetrics::OPEN_USER_MANAGER);
     71   if (instance_) {
     72     // If there's a user manager window open already, just activate it.
     73     instance_->GetWidget()->Activate();
     74     return;
     75   }
     76 
     77   // Create the guest profile, if necessary, and open the user manager
     78   // from the guest profile.
     79   profiles::CreateGuestProfileForUserManager(
     80       profile_path_to_focus,
     81       tutorial_mode,
     82       base::Bind(&UserManagerView::OnGuestProfileCreated,
     83                  base::Passed(make_scoped_ptr(new UserManagerView))));
     84 }
     85 
     86 // static
     87 void UserManagerView::Hide() {
     88   if (instance_)
     89     instance_->GetWidget()->Close();
     90 }
     91 
     92 // static
     93 bool UserManagerView::IsShowing() {
     94   return instance_ ? instance_->GetWidget()->IsActive() : false;
     95 }
     96 
     97 // static
     98 void UserManagerView::OnGuestProfileCreated(
     99     scoped_ptr<UserManagerView> instance,
    100     Profile* guest_profile,
    101     const std::string& url) {
    102   instance_ = instance.release();  // |instance_| takes over ownership.
    103   instance_->Init(guest_profile, GURL(url));
    104 }
    105 
    106 void UserManagerView::Init(Profile* guest_profile, const GURL& url) {
    107   web_view_ = new views::WebView(guest_profile);
    108   SetLayoutManager(new views::FillLayout);
    109   AddChildView(web_view_);
    110 
    111   DialogDelegate::CreateDialogWidget(this, NULL, NULL);
    112 
    113 #if defined(OS_WIN)
    114   // Set the app id for the task manager to the app id of its parent
    115   ui::win::SetAppIdForWindow(
    116       ShellIntegration::GetChromiumModelIdForProfile(
    117           guest_profile->GetPath()),
    118       views::HWNDForWidget(GetWidget()));
    119 #endif
    120   GetWidget()->Show();
    121 
    122   web_view_->LoadInitialURL(url);
    123   web_view_->RequestFocus();
    124 }
    125 
    126 gfx::Size UserManagerView::GetPreferredSize() const {
    127   return gfx::Size(kWindowWidth, kWindowHeight);
    128 }
    129 
    130 bool UserManagerView::CanResize() const {
    131   return true;
    132 }
    133 
    134 bool UserManagerView::CanMaximize() const {
    135   return true;
    136 }
    137 
    138 base::string16 UserManagerView::GetWindowTitle() const {
    139   return l10n_util::GetStringUTF16(IDS_USER_MANAGER_SCREEN_TITLE);
    140 }
    141 
    142 int UserManagerView::GetDialogButtons() const {
    143   return ui::DIALOG_BUTTON_NONE;
    144 }
    145 
    146 void UserManagerView::WindowClosing() {
    147   // Now that the window is closed, we can allow a new one to be opened.
    148   // (WindowClosing comes in asynchronously from the call to Close() and we
    149   // may have already opened a new instance).
    150   if (instance_ == this)
    151     instance_ = NULL;
    152 }
    153 
    154 bool UserManagerView::UseNewStyleForThisDialog() const {
    155   return false;
    156 }
    157