| Index: chrome/browser/signin/signin_manager.cc
 | 
| diff --git a/chrome/browser/signin/signin_manager.cc b/chrome/browser/signin/signin_manager.cc
 | 
| index 956b8da68ddb7ee79f0fa7ad5288a51f51136781..19898174df0c370d1694faa2e0b29e4572482021 100644
 | 
| --- a/chrome/browser/signin/signin_manager.cc
 | 
| +++ b/chrome/browser/signin/signin_manager.cc
 | 
| @@ -38,6 +38,7 @@
 | 
|  #include "chrome/common/pref_names.h"
 | 
|  #include "content/public/browser/browser_thread.h"
 | 
|  #include "content/public/browser/notification_service.h"
 | 
| +#include "content/public/browser/render_process_host.h"
 | 
|  #include "google_apis/gaia/gaia_auth_fetcher.h"
 | 
|  #include "google_apis/gaia/gaia_auth_util.h"
 | 
|  #include "google_apis/gaia/gaia_constants.h"
 | 
| @@ -63,6 +64,8 @@ const char kGetInfoEmailKey[] = "email";
 | 
|  
 | 
|  const char kGoogleAccountsUrl[] = "https://accounts.google.com";
 | 
|  
 | 
| +const int kInvalidProcessId = -1;
 | 
| +
 | 
|  }  // namespace
 | 
|  
 | 
|  // This class fetches GAIA cookie on IO thread on behalf of SigninManager which
 | 
| @@ -148,6 +151,26 @@ void SigninManagerCookieHelper::NotifyOnUIThread(
 | 
|    base::ResetAndReturn(&completion_callback_).Run(cookies);
 | 
|  }
 | 
|  
 | 
| +// Under the covers, we use a dummy chrome-extension ID to serve the purposes
 | 
| +// outlined in the .h file comment for this string.
 | 
| +const char* SigninManager::kChromeSigninEffectiveSite =
 | 
| +    "chrome-extension://acfccoigjajmmgbhpfbjnpckhjjegnih";
 | 
| +
 | 
| +// static
 | 
| +bool SigninManager::IsWebBasedSigninFlowURL(const GURL& url) {
 | 
| +  GURL effective(kChromeSigninEffectiveSite);
 | 
| +  if (url.SchemeIs(effective.scheme().c_str()) &&
 | 
| +      url.host() == effective.host()) {
 | 
| +    return true;
 | 
| +  }
 | 
| +
 | 
| +  GURL service_login(GaiaUrls::GetInstance()->service_login_url());
 | 
| +  if (url.GetOrigin() != service_login.GetOrigin())
 | 
| +    return false;
 | 
| +
 | 
| +  return url.path() == service_login.path();
 | 
| +}
 | 
| +
 | 
|  // static
 | 
|  bool SigninManager::AreSigninCookiesAllowed(Profile* profile) {
 | 
|    CookieSettings* cookie_settings =
 | 
| @@ -200,7 +223,30 @@ SigninManager::SigninManager()
 | 
|        prohibit_signout_(false),
 | 
|        had_two_factor_error_(false),
 | 
|        type_(SIGNIN_TYPE_NONE),
 | 
| -      weak_pointer_factory_(this) {
 | 
| +      weak_pointer_factory_(this),
 | 
| +      signin_process_id_(kInvalidProcessId) {
 | 
| +}
 | 
| +
 | 
| +void SigninManager::SetSigninProcess(int process_id) {
 | 
| +  if (process_id == signin_process_id_)
 | 
| +    return;
 | 
| +  DLOG_IF(WARNING, signin_process_id_ != kInvalidProcessId) <<
 | 
| +      "Replacing in-use signin process.";
 | 
| +  signin_process_id_ = process_id;
 | 
| +  const content::RenderProcessHost* process =
 | 
| +      content::RenderProcessHost::FromID(process_id);
 | 
| +  DCHECK(process);
 | 
| +  registrar_.Add(this,
 | 
| +                 content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
 | 
| +                 content::Source<content::RenderProcessHost>(process));
 | 
| +}
 | 
| +
 | 
| +bool SigninManager::IsSigninProcess(int process_id) const {
 | 
| +  return process_id == signin_process_id_;
 | 
| +}
 | 
| +
 | 
| +bool SigninManager::HasSigninProcess() const {
 | 
| +  return signin_process_id_ != kInvalidProcessId;
 | 
|  }
 | 
|  
 | 
|  SigninManager::~SigninManager() {
 | 
| @@ -899,6 +945,20 @@ void SigninManager::Observe(int type,
 | 
|        }
 | 
|        break;
 | 
|      }
 | 
| +    case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED: {
 | 
| +      // It's possible we're listening to a "stale" renderer because it was
 | 
| +      // replaced with a new process by process-per-site. In either case,
 | 
| +      // stop listening to it, but only reset signin_process_id_ tracking
 | 
| +      // if this was from the current signin process.
 | 
| +      registrar_.Remove(this,
 | 
| +                        content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
 | 
| +                        source);
 | 
| +      if (signin_process_id_ ==
 | 
| +          content::Source<content::RenderProcessHost>(source)->GetID()) {
 | 
| +        signin_process_id_ = kInvalidProcessId;
 | 
| +      }
 | 
| +      break;
 | 
| +    }
 | 
|  #endif
 | 
|      default:
 | 
|        NOTREACHED();
 | 
| 
 |