X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fchrome%2Fbrowser%2Fchromeos%2Flogin%2Fmerge_session_xhr_request_waiter.cc;h=ac3896cc45e9dec893aa4b120989776af261a7c1;hb=ff3e2503a20db9193d323c1d19c38c68004dec4a;hp=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391;hpb=7338fba38ba696536d1cc9d389afd716a6ab2fe6;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/chrome/browser/chromeos/login/merge_session_xhr_request_waiter.cc b/src/chrome/browser/chromeos/login/merge_session_xhr_request_waiter.cc index e69de29..ac3896c 100644 --- a/src/chrome/browser/chromeos/login/merge_session_xhr_request_waiter.cc +++ b/src/chrome/browser/chromeos/login/merge_session_xhr_request_waiter.cc @@ -0,0 +1,93 @@ +// Copyright 2013 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/chromeos/login/merge_session_xhr_request_waiter.h" + +#include "base/bind.h" +#include "base/lazy_instance.h" +#include "base/logging.h" +#include "base/memory/weak_ptr.h" +#include "base/message_loop/message_loop.h" +#include "chrome/browser/chromeos/login/oauth2_login_manager.h" +#include "chrome/browser/chromeos/login/oauth2_login_manager_factory.h" +#include "content/public/browser/browser_thread.h" + +using content::BrowserThread; + +namespace chromeos { + +namespace { + +// Maximum time for delaying XHR requests. +const int kMaxRequestWaitTimeMS = 10000; + +} + +MergeSessionXHRRequestWaiter::MergeSessionXHRRequestWaiter( + Profile* profile, + const MergeSessionThrottle::CompletionCallback& callback) + : profile_(profile), + callback_(callback), + weak_ptr_factory_(this) { +} + +MergeSessionXHRRequestWaiter::~MergeSessionXHRRequestWaiter() { + chromeos::OAuth2LoginManager* manager = + chromeos::OAuth2LoginManagerFactory::GetInstance()->GetForProfile( + profile_); + if (manager) + manager->RemoveObserver(this); +} + +void MergeSessionXHRRequestWaiter::StartWaiting() { + OAuth2LoginManager* manager = + OAuth2LoginManagerFactory::GetInstance()->GetForProfile(profile_); + if (manager && manager->ShouldBlockTabLoading()) { + DVLOG(1) << "Waiting for XHR request throttle"; + manager->AddObserver(this); + BrowserThread::PostDelayedTask( + BrowserThread::UI, FROM_HERE, + base::Bind(&MergeSessionXHRRequestWaiter::OnTimeout, + weak_ptr_factory_.GetWeakPtr()), + base::TimeDelta::FromMilliseconds(kMaxRequestWaitTimeMS)); + } else { + NotifyBlockingDone(); + } +} + +void MergeSessionXHRRequestWaiter::OnSessionRestoreStateChanged( + Profile* user_profile, + OAuth2LoginManager::SessionRestoreState state) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + + OAuth2LoginManager* manager = + OAuth2LoginManagerFactory::GetInstance()->GetForProfile(profile_); + DVLOG(1) << "Merge session throttle should " + << (!manager->ShouldBlockTabLoading() ? + " NOT" : "") + << " be blocking now, " + << state; + if (!manager->ShouldBlockTabLoading()) { + DVLOG(1) << "Unblocking XHR request throttle due to session merge"; + manager->RemoveObserver(this); + NotifyBlockingDone(); + } +} + +void MergeSessionXHRRequestWaiter::OnTimeout() { + DVLOG(1) << "Unblocking XHR request throttle due to timeout"; + NotifyBlockingDone(); +} + +void MergeSessionXHRRequestWaiter::NotifyBlockingDone() { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + if (!callback_.is_null()) { + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, callback_); + } + weak_ptr_factory_.InvalidateWeakPtrs(); + base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); +} + +} // namespace chromeos