blob: 8bda6fa986951d78320e67b0103b714e5b0dc1b3 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/webui/signin/signin_error_handler.h"
#include "base/bind.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/profiles/profile_window.h"
#include "chrome/browser/signin/signin_ui_util.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/user_manager.h"
#include "chrome/browser/ui/webui/signin/signin_utils.h"
#include "content/public/browser/web_ui.h"
#include "url/gurl.h"
SigninErrorHandler::SigninErrorHandler(Browser* browser, bool is_system_profile)
: browser_(browser), is_system_profile_(is_system_profile) {
// |browser_| must not be null when this dialog is presented from the
// user manager.
DCHECK(browser_ || is_system_profile_);
BrowserList::AddObserver(this);
}
SigninErrorHandler::~SigninErrorHandler() {
BrowserList::RemoveObserver(this);
}
void SigninErrorHandler::OnBrowserRemoved(Browser* browser) {
if (browser_ == browser)
browser_ = nullptr;
}
void SigninErrorHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
"confirm", base::BindRepeating(&SigninErrorHandler::HandleConfirm,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"switchToExistingProfile",
base::BindRepeating(&SigninErrorHandler::HandleSwitchToExistingProfile,
base::Unretained(this)));
if (!is_system_profile_) {
web_ui()->RegisterMessageCallback(
"learnMore", base::BindRepeating(&SigninErrorHandler::HandleLearnMore,
base::Unretained(this)));
}
web_ui()->RegisterMessageCallback(
"initializedWithSize",
base::BindRepeating(&SigninErrorHandler::HandleInitializedWithSize,
base::Unretained(this)));
}
void SigninErrorHandler::HandleSwitchToExistingProfile(
const base::ListValue* args) {
if (duplicate_profile_path_.empty())
return;
// CloseDialog will eventually destroy this object, so nothing should access
// its members after this call. However, closing the dialog may steal focus
// back to the original window, so make a copy of the path to switch to and
// perform the switch after the dialog is closed.
base::FilePath path_switching_to = duplicate_profile_path_;
CloseDialog();
// Switch to the existing duplicate profile. Do not create a new window when
// any existing ones can be reused.
profiles::SwitchToProfile(path_switching_to, false,
ProfileManager::CreateCallback(),
ProfileMetrics::SWITCH_PROFILE_DUPLICATE);
}
void SigninErrorHandler::HandleConfirm(const base::ListValue* args) {
CloseDialog();
}
void SigninErrorHandler::HandleLearnMore(const base::ListValue* args) {
// "Learn more" only shown when is_system_profile_=false
DCHECK(!is_system_profile_);
if (!browser_)
return;
CloseDialog();
signin_ui_util::ShowSigninErrorLearnMorePage(browser_->profile());
}
void SigninErrorHandler::HandleInitializedWithSize(
const base::ListValue* args) {
AllowJavascript();
if (duplicate_profile_path_.empty())
CallJavascriptFunction("signin.error.removeSwitchButton");
signin::SetInitializedModalHeight(browser_, web_ui(), args);
// After the dialog is shown, some platforms might have an element focused.
// To be consistent, clear the focused element on all platforms.
// TODO(anthonyvd): Figure out why this is needed on Mac and not other
// platforms and if there's a way to start unfocused while avoiding this
// workaround.
CallJavascriptFunction("signin.error.clearFocus");
}
void SigninErrorHandler::CloseDialog() {
if (is_system_profile_) {
CloseUserManagerProfileDialog();
} else if (browser_){
CloseBrowserModalSigninDialog();
}
}
void SigninErrorHandler::CloseBrowserModalSigninDialog() {
browser_->signin_view_controller()->CloseModalSignin();
}
void SigninErrorHandler::CloseUserManagerProfileDialog() {
UserManagerProfileDialog::HideDialog();
}