Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / login / merge_session_xhr_request_waiter.cc
1 // Copyright 2013 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/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/oauth2_login_manager.h"
13 #include "chrome/browser/chromeos/login/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