OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "google_apis/gaia/oauth2_token_service_request.h" | 5 #include "google_apis/gaia/oauth2_token_service_request.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 // Called on the token service thread. | 64 // Called on the token service thread. |
65 virtual void StopOnTokenServiceThread() = 0; | 65 virtual void StopOnTokenServiceThread() = 0; |
66 | 66 |
67 base::SingleThreadTaskRunner* token_service_task_runner(); | 67 base::SingleThreadTaskRunner* token_service_task_runner(); |
68 OAuth2TokenService* token_service(); | 68 OAuth2TokenService* token_service(); |
69 OAuth2TokenServiceRequest* owner(); | 69 OAuth2TokenServiceRequest* owner(); |
70 | 70 |
71 private: | 71 private: |
72 friend class base::RefCountedThreadSafe<OAuth2TokenServiceRequest::Core>; | 72 friend class base::RefCountedThreadSafe<OAuth2TokenServiceRequest::Core>; |
73 | 73 |
| 74 void DoNothing(); |
| 75 |
74 scoped_refptr<base::SingleThreadTaskRunner> token_service_task_runner_; | 76 scoped_refptr<base::SingleThreadTaskRunner> token_service_task_runner_; |
75 OAuth2TokenServiceRequest* owner_; | 77 OAuth2TokenServiceRequest* owner_; |
76 TokenServiceProvider* provider_; | 78 TokenServiceProvider* provider_; |
77 DISALLOW_COPY_AND_ASSIGN(Core); | 79 DISALLOW_COPY_AND_ASSIGN(Core); |
78 }; | 80 }; |
79 | 81 |
80 OAuth2TokenServiceRequest::Core::Core(OAuth2TokenServiceRequest* owner, | 82 OAuth2TokenServiceRequest::Core::Core(OAuth2TokenServiceRequest* owner, |
81 TokenServiceProvider* provider) | 83 TokenServiceProvider* provider) |
82 : owner_(owner), provider_(provider) { | 84 : owner_(owner), provider_(provider) { |
83 DCHECK(owner_); | 85 DCHECK(owner_); |
(...skipping 13 matching lines...) Expand all Loading... |
97 this)); | 99 this)); |
98 } | 100 } |
99 | 101 |
100 void OAuth2TokenServiceRequest::Core::Stop() { | 102 void OAuth2TokenServiceRequest::Core::Stop() { |
101 DCHECK(CalledOnValidThread()); | 103 DCHECK(CalledOnValidThread()); |
102 DCHECK(!IsStopped()); | 104 DCHECK(!IsStopped()); |
103 | 105 |
104 // Detaches |owner_| from this instance so |owner_| will be called back only | 106 // Detaches |owner_| from this instance so |owner_| will be called back only |
105 // if |Stop()| has never been called. | 107 // if |Stop()| has never been called. |
106 owner_ = NULL; | 108 owner_ = NULL; |
107 token_service_task_runner_->PostTask( | 109 |
| 110 // We are stopping and will likely be destroyed soon. Use a reply closure |
| 111 // (DoNothing) to retain "this" and ensure we are destroyed in the owner |
| 112 // thread, not the task runner thread. PostTaskAndReply guarantees that the |
| 113 // reply closure will execute after StopOnTokenServiceThread has completed. |
| 114 token_service_task_runner_->PostTaskAndReply( |
108 FROM_HERE, | 115 FROM_HERE, |
109 base::Bind(&OAuth2TokenServiceRequest::Core::StopOnTokenServiceThread, | 116 base::Bind(&OAuth2TokenServiceRequest::Core::StopOnTokenServiceThread, |
110 this)); | 117 this), |
| 118 base::Bind(&OAuth2TokenServiceRequest::Core::DoNothing, this)); |
111 } | 119 } |
112 | 120 |
113 bool OAuth2TokenServiceRequest::Core::IsStopped() const { | 121 bool OAuth2TokenServiceRequest::Core::IsStopped() const { |
114 DCHECK(CalledOnValidThread()); | 122 DCHECK(CalledOnValidThread()); |
115 return owner_ == NULL; | 123 return owner_ == NULL; |
116 } | 124 } |
117 | 125 |
118 base::SingleThreadTaskRunner* | 126 base::SingleThreadTaskRunner* |
119 OAuth2TokenServiceRequest::Core::token_service_task_runner() { | 127 OAuth2TokenServiceRequest::Core::token_service_task_runner() { |
120 return token_service_task_runner_; | 128 return token_service_task_runner_; |
121 } | 129 } |
122 | 130 |
123 OAuth2TokenService* OAuth2TokenServiceRequest::Core::token_service() { | 131 OAuth2TokenService* OAuth2TokenServiceRequest::Core::token_service() { |
124 DCHECK(token_service_task_runner_->BelongsToCurrentThread()); | 132 DCHECK(token_service_task_runner_->BelongsToCurrentThread()); |
125 return provider_->GetTokenService(); | 133 return provider_->GetTokenService(); |
126 } | 134 } |
127 | 135 |
128 OAuth2TokenServiceRequest* OAuth2TokenServiceRequest::Core::owner() { | 136 OAuth2TokenServiceRequest* OAuth2TokenServiceRequest::Core::owner() { |
129 DCHECK(CalledOnValidThread()); | 137 DCHECK(CalledOnValidThread()); |
130 return owner_; | 138 return owner_; |
131 } | 139 } |
132 | 140 |
| 141 void OAuth2TokenServiceRequest::Core::DoNothing() { |
| 142 DCHECK(CalledOnValidThread()); |
| 143 } |
| 144 |
133 namespace { | 145 namespace { |
134 | 146 |
135 // An implementation of Core for getting an access token. | 147 // An implementation of Core for getting an access token. |
136 class RequestCore : public OAuth2TokenServiceRequest::Core, | 148 class RequestCore : public OAuth2TokenServiceRequest::Core, |
137 public OAuth2TokenService::Consumer { | 149 public OAuth2TokenService::Consumer { |
138 public: | 150 public: |
139 RequestCore(OAuth2TokenServiceRequest* owner, | 151 RequestCore(OAuth2TokenServiceRequest* owner, |
140 OAuth2TokenServiceRequest::TokenServiceProvider* provider, | 152 OAuth2TokenServiceRequest::TokenServiceProvider* provider, |
141 OAuth2TokenService::Consumer* consumer, | 153 OAuth2TokenService::Consumer* consumer, |
142 const std::string& account_id, | 154 const std::string& account_id, |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 const std::string& account_id) | 351 const std::string& account_id) |
340 : account_id_(account_id) { | 352 : account_id_(account_id) { |
341 DCHECK(!account_id_.empty()); | 353 DCHECK(!account_id_.empty()); |
342 } | 354 } |
343 | 355 |
344 void OAuth2TokenServiceRequest::StartWithCore(const scoped_refptr<Core>& core) { | 356 void OAuth2TokenServiceRequest::StartWithCore(const scoped_refptr<Core>& core) { |
345 DCHECK(core); | 357 DCHECK(core); |
346 core_ = core; | 358 core_ = core; |
347 core_->Start(); | 359 core_->Start(); |
348 } | 360 } |
OLD | NEW |