Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1055)

Unified Diff: chrome/browser/ui/views/profiles/force_signout_dialog.cc

Issue 2862653002: If force-sign-in policy is enabled, popup warning dialog before window closing if auth token becom… (Closed)
Patch Set: cr Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_;
+}

Powered by Google App Engine
This is Rietveld 408576698