| Index: chrome/browser/ui/views/profiles/force_signout_dialog.cc
|
| diff --git a/chrome/browser/ui/views/profiles/force_signout_dialog.cc b/chrome/browser/ui/views/profiles/force_signout_dialog.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..df4272805485f6950752461969cf17b5a519db8c
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/views/profiles/force_signout_dialog.cc
|
| @@ -0,0 +1,131 @@
|
| +// Copyright 2017 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/views/profiles/force_signout_dialog.h"
|
| +
|
| +#include <memory>
|
| +#include <string>
|
| +#include <utility>
|
| +
|
| +#include "base/strings/string16.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/ui/browser.h"
|
| +#include "chrome/browser/ui/browser_list.h"
|
| +#include "chrome/browser/ui/tabs/tab_strip_model.h"
|
| +#include "chrome/browser/ui/views/frame/browser_view.h"
|
| +#include "chrome/browser/ui/views/profiles/force_signout_dialog_view.h"
|
| +#include "chrome/grit/generated_resources.h"
|
| +#include "components/signin/core/browser/signin_manager.h"
|
| +
|
| +namespace {
|
| +
|
| +void Signout(SigninManager* signin_manager) {
|
| + signin_manager->SignOut(
|
| + signin_metrics::AUTHENTICATION_FAILED_WITH_FORCE_SIGNIN,
|
| + signin_metrics::SignoutDelete::KEEPING);
|
| +}
|
| +
|
| +bool IsMatchingBrowser(Browser* browser, Profile* profile) {
|
| + return browser->profile()->GetOriginalProfile() ==
|
| + profile->GetOriginalProfile() &&
|
| + !browser->tab_strip_model()->empty() &&
|
| + BrowserView::GetBrowserViewForBrowser(browser)->frame()->IsVisible();
|
| +}
|
| +
|
| +// Find a browser that is assoicated with |profile| to show the dialog for
|
| +// Sign out warning.
|
| +Browser* FindBrowserWithProfile(Profile* profile) {
|
| + Browser* browser = BrowserList::GetInstance()->GetLastActive();
|
| + if (browser && IsMatchingBrowser(browser, profile))
|
| + return browser;
|
| + for (auto* browser : *BrowserList::GetInstance()) {
|
| + if (IsMatchingBrowser(browser, profile)) {
|
| + return browser;
|
| + }
|
| + }
|
| + return nullptr;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +ForceSignoutDialog::ForceSignoutDialog(Browser* browser,
|
| + SigninManager* signin_manager,
|
| + const base::Closure& signout_timer)
|
| + : BrowserModalDialog(),
|
| + browser_(browser),
|
| + signin_manager_(signin_manager),
|
| + signout_timer_(signout_timer),
|
| + dialog_view_(nullptr) {}
|
| +
|
| +ForceSignoutDialog::~ForceSignoutDialog() {
|
| + BrowserList::RemoveObserver(this);
|
| +}
|
| +
|
| +// static
|
| +ForceSignoutDialog* ForceSignoutDialog::ShowDialog(
|
| + Profile* profile,
|
| + SigninManager* signin_manager,
|
| + const base::Closure& signout_timer) {
|
| + Browser* browser = FindBrowserWithProfile(profile);
|
| + if (browser == nullptr) { // If there is no browser, we can just sign
|
| + // out profile directly.
|
| + Signout(signin_manager);
|
| + return nullptr;
|
| + }
|
| +
|
| + std::unique_ptr<ForceSignoutDialog> dialog =
|
| + base::MakeUnique<ForceSignoutDialog>(browser, signin_manager,
|
| + signout_timer);
|
| + ForceSignoutDialog* dialog_ptr = dialog.get();
|
| + ForceSignoutDialogView* dialog_view =
|
| + new ForceSignoutDialogView(browser, std::move(dialog));
|
| + dialog_ptr->dialog_view_ = dialog_view;
|
| + BrowserList::AddObserver(dialog_ptr);
|
| +
|
| + return dialog_ptr;
|
| +}
|
| +
|
| +void ForceSignoutDialog::ActivateModalDialog(Browser* other_browser) {
|
| + if (dialog_view_) {
|
| + if (browser_ && browser_ != other_browser) {
|
| + browser_->window()->FlashFrame(true);
|
| + browser_->window()->Activate();
|
| + }
|
| + dialog_view_->ActivateModalDialog();
|
| + }
|
| +}
|
| +
|
| +bool ForceSignoutDialog::IsShowing() {
|
| + return dialog_view_ && dialog_view_->IsShowing();
|
| +}
|
| +
|
| +void ForceSignoutDialog::OnBrowserRemoved(Browser* browser) {
|
| + if (browser_ == browser)
|
| + browser_ = nullptr;
|
| +}
|
| +
|
| +void ForceSignoutDialog::OnAccept() {
|
| + Signout(signin_manager_);
|
| +}
|
| +
|
| +void ForceSignoutDialog::OnCancel() {
|
| + if (!signout_timer_.is_null())
|
| + signout_timer_.Run();
|
| +}
|
| +
|
| +std::string ForceSignoutDialog::GetEmail() {
|
| + return signin_manager_->GetAuthenticatedAccountInfo().email;
|
| +}
|
| +
|
| +bool ForceSignoutDialog::IsDelayAllowed() {
|
| + return !signout_timer_.is_null();
|
| +}
|
| +
|
| +void ForceSignoutDialog::OnViewClosing() {
|
| + dialog_view_ = nullptr;
|
| +}
|
| +
|
| +ForceSignoutDialogView* ForceSignoutDialog::GetDialogViewForTesting() {
|
| + return dialog_view_;
|
| +}
|
|
|