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_; |
+} |