Home | History | Annotate | Download | only in signin
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/chromeos/login/signin/merge_session_xhr_request_waiter.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/lazy_instance.h"
      9 #include "base/logging.h"
     10 #include "base/memory/weak_ptr.h"
     11 #include "base/message_loop/message_loop.h"
     12 #include "chrome/browser/chromeos/login/signin/oauth2_login_manager.h"
     13 #include "chrome/browser/chromeos/login/signin/oauth2_login_manager_factory.h"
     14 #include "content/public/browser/browser_thread.h"
     15 
     16 using content::BrowserThread;
     17 
     18 namespace chromeos {
     19 
     20 namespace {
     21 
     22 // Maximum time for delaying XHR requests.
     23 const int kMaxRequestWaitTimeMS = 10000;
     24 
     25 }
     26 
     27 MergeSessionXHRRequestWaiter::MergeSessionXHRRequestWaiter(
     28     Profile* profile,
     29     const MergeSessionThrottle::CompletionCallback& callback)
     30    : profile_(profile),
     31      callback_(callback),
     32      weak_ptr_factory_(this) {
     33 }
     34 
     35 MergeSessionXHRRequestWaiter::~MergeSessionXHRRequestWaiter() {
     36   chromeos::OAuth2LoginManager* manager =
     37       chromeos::OAuth2LoginManagerFactory::GetInstance()->GetForProfile(
     38           profile_);
     39   if (manager)
     40     manager->RemoveObserver(this);
     41 }
     42 
     43 void MergeSessionXHRRequestWaiter::StartWaiting() {
     44   OAuth2LoginManager* manager =
     45       OAuth2LoginManagerFactory::GetInstance()->GetForProfile(profile_);
     46   if (manager && manager->ShouldBlockTabLoading()) {
     47     DVLOG(1) << "Waiting for XHR request throttle";
     48     manager->AddObserver(this);
     49     BrowserThread::PostDelayedTask(
     50         BrowserThread::UI, FROM_HERE,
     51         base::Bind(&MergeSessionXHRRequestWaiter::OnTimeout,
     52                    weak_ptr_factory_.GetWeakPtr()),
     53         base::TimeDelta::FromMilliseconds(kMaxRequestWaitTimeMS));
     54   } else {
     55     NotifyBlockingDone();
     56   }
     57 }
     58 
     59 void MergeSessionXHRRequestWaiter::OnSessionRestoreStateChanged(
     60     Profile* user_profile,
     61     OAuth2LoginManager::SessionRestoreState state) {
     62   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
     63 
     64   OAuth2LoginManager* manager =
     65       OAuth2LoginManagerFactory::GetInstance()->GetForProfile(profile_);
     66   DVLOG(1) << "Merge session throttle should "
     67            << (!manager->ShouldBlockTabLoading() ?
     68                   " NOT" : "")
     69            << " be blocking now, "
     70            << state;
     71   if (!manager->ShouldBlockTabLoading()) {
     72     DVLOG(1) << "Unblocking XHR request throttle due to session merge";
     73     manager->RemoveObserver(this);
     74     NotifyBlockingDone();
     75   }
     76 }
     77 
     78 void MergeSessionXHRRequestWaiter::OnTimeout() {
     79   DVLOG(1) << "Unblocking XHR request throttle due to timeout";
     80   NotifyBlockingDone();
     81 }
     82 
     83 void MergeSessionXHRRequestWaiter::NotifyBlockingDone() {
     84   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
     85   if (!callback_.is_null()) {
     86     BrowserThread::PostTask(
     87         BrowserThread::IO, FROM_HERE, callback_);
     88   }
     89   weak_ptr_factory_.InvalidateWeakPtrs();
     90   base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
     91 }
     92 
     93 }  // namespace chromeos
     94