user_manager_view.cc revision 010d83a9304c5a91596085d917d248abff47903a
1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/views/profiles/user_manager_view.h"
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/browser_process.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile_metrics.h"
1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/browser/profiles/profile_window.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/views/auto_keep_alive.h"
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/web_contents.h"
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "grit/generated_resources.h"
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/views/controls/webview/webview.h"
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/views/layout/fill_layout.h"
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/views/view.h"
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/views/widget/widget.h"
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(USE_ASH)
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ash/wm/window_util.h"
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN)
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/shell_integration.h"
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/base/win/shell.h"
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/views/win/hwnd_util.h"
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace {
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Default window size.
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const int kWindowWidth = 900;
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const int kWindowHeight = 700;
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)namespace chrome {
430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Declared in browser_dialogs.h so others don't have to depend on this header.
450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void ShowUserManager(const base::FilePath& profile_path_to_focus) {
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  UserManagerView::Show(
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      profile_path_to_focus, profiles::USER_MANAGER_NO_TUTORIAL);
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ShowUserManagerWithTutorial(profiles::UserManagerTutorialMode tutorial) {
5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  UserManagerView::Show(base::FilePath(), tutorial);
520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void HideUserManager() {
550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  UserManagerView::Hide();
560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}  // namespace chrome
590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// static
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)UserManagerView* UserManagerView::instance_ = NULL;
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)UserManagerView::UserManagerView()
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : web_view_(NULL),
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      keep_alive_(new AutoKeepAlive(NULL)) {
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)UserManagerView::~UserManagerView() {
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// static
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void UserManagerView::Show(const base::FilePath& profile_path_to_focus,
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                           profiles::UserManagerTutorialMode tutorial_mode) {
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProfileMetrics::LogProfileSwitchUser(ProfileMetrics::OPEN_USER_MANAGER);
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (instance_) {
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // If there's a user manager window open already, just activate it.
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    instance_->GetWidget()->Activate();
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Create the guest profile, if necessary, and open the user manager
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // from the guest profile.
8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  profiles::CreateGuestProfileForUserManager(
8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      profile_path_to_focus,
8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      tutorial_mode,
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::Bind(&UserManagerView::OnGuestProfileCreated,
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 base::Passed(make_scoped_ptr(new UserManagerView))));
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// static
910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void UserManagerView::Hide() {
920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (instance_)
930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    instance_->GetWidget()->Close();
940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// static
970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)bool UserManagerView::IsShowing() {
980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return instance_ ? instance_->GetWidget()->IsActive() : false;
990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
1000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// static
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void UserManagerView::OnGuestProfileCreated(
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_ptr<UserManagerView> instance,
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Profile* guest_profile,
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& url) {
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  instance_ = instance.release();  // |instance_| takes over ownership.
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  instance_->Init(guest_profile, GURL(url));
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void UserManagerView::Init(Profile* guest_profile, const GURL& url) {
111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  web_view_ = new views::WebView(guest_profile);
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetLayoutManager(new views::FillLayout);
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  AddChildView(web_view_);
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DialogDelegate::CreateDialogWidget(this, NULL, NULL);
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN)
1180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Set the app id for the task manager to the app id of its parent
1190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ui::win::SetAppIdForWindow(
1200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      ShellIntegration::GetChromiumModelIdForProfile(
1210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          guest_profile->GetPath()),
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      views::HWNDForWidget(GetWidget()));
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GetWidget()->Show();
1250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  web_view_->LoadInitialURL(url);
127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  web_view_->RequestFocus();
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)gfx::Size UserManagerView::GetPreferredSize() {
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return gfx::Size(kWindowWidth, kWindowHeight);
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool UserManagerView::CanResize() const {
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return true;
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool UserManagerView::CanMaximize() const {
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return true;
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 UserManagerView::GetWindowTitle() const {
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_USER_MANAGER_SCREEN_TITLE);
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)int UserManagerView::GetDialogButtons() const {
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return ui::DIALOG_BUTTON_NONE;
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void UserManagerView::WindowClosing() {
15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Now that the window is closed, we can allow a new one to be opened.
15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // (WindowClosing comes in asynchronously from the call to Close() and we
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // may have already opened a new instance).
15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (instance_ == this)
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    instance_ = NULL;
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool UserManagerView::UseNewStyleForThisDialog() const {
15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return false;
16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
161