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