| 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..f68f375d283b8c3fb1b0884859dbe296f7f454ef | 
| --- /dev/null | 
| +++ b/chrome/browser/ui/views/profiles/force_signout_dialog.cc | 
| @@ -0,0 +1,112 @@ | 
| +// 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 <string> | 
| + | 
| +#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 | 
| + | 
| +// static | 
| +ForceSignoutDialogView* ForceSignoutDialog::dialog_view_ = nullptr; | 
| + | 
| +// static | 
| +void ForceSignoutDialog::ShowDialog(Profile* profile, | 
| +                                    SigninManager* signin_manager, | 
| +                                    const base::Closure& signout_timer) { | 
| +  if (dialog_view_) | 
| +    return; | 
| + | 
| +  Browser* browser = FindBrowserWithProfile(profile); | 
| +  if (browser == nullptr) {  // If there is no browser, we can just sign | 
| +                             // out profile directly. | 
| +    Signout(signin_manager); | 
| +    return; | 
| +  } | 
| +  dialog_view_ = new ForceSignoutDialogView( | 
| +      browser, | 
| +      base::MakeUnique<ForceSignoutDialog>(signin_manager, signout_timer)); | 
| +} | 
| + | 
| +// static | 
| +void ForceSignoutDialog::ActivateModalDialog() { | 
| +  if (dialog_view_) | 
| +    dialog_view_->ActivateModalDialog(); | 
| +} | 
| + | 
| +// static | 
| +bool ForceSignoutDialog::IsShowing() { | 
| +  return dialog_view_ && dialog_view_->IsShowing(); | 
| +} | 
| + | 
| +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; | 
| +} | 
| + | 
| +ForceSignoutDialog::~ForceSignoutDialog() {} | 
| + | 
| +ForceSignoutDialog::ForceSignoutDialog(SigninManager* signin_manager, | 
| +                                       const base::Closure& signout_timer) | 
| +    : signin_manager_(signin_manager), signout_timer_(signout_timer) {} | 
| + | 
| +// static | 
| +ForceSignoutDialogView* ForceSignoutDialog::GetDialogViewForTesting() { | 
| +  return dialog_view_; | 
| +} | 
|  |