Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Side by Side Diff: chrome/browser/chromeos/cros/cert_library.cc

Issue 9535003: Fix WeakPtr's thread restriction violation in chromeos::CertLibrary (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/browser/chromeos/cros/cert_library.h" 5 #include "chrome/browser/chromeos/cros/cert_library.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/memory/weak_ptr.h" 9 #include "base/memory/weak_ptr.h"
10 #include "base/observer_list_threadsafe.h" 10 #include "base/observer_list_threadsafe.h"
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 } 92 }
93 93
94 } // namespace 94 } // namespace
95 95
96 ////////////////////////////////////////////////////////////////////////////// 96 //////////////////////////////////////////////////////////////////////////////
97 97
98 namespace chromeos { 98 namespace chromeos {
99 99
100 ////////////////////////////////////////////////////////////////////////////// 100 //////////////////////////////////////////////////////////////////////////////
101 101
102 // base::Unretained(this) in the class is safe. By the time this object is
103 // deleted as part of CrosLibrary, the DB thread and the UI message loop
104 // are already terminated.
102 class CertLibraryImpl 105 class CertLibraryImpl
103 : public CertLibrary, 106 : public CertLibrary,
104 public net::CertDatabase::Observer { 107 public net::CertDatabase::Observer {
105 public: 108 public:
106 typedef ObserverListThreadSafe<CertLibrary::Observer> CertLibraryObserverList; 109 typedef ObserverListThreadSafe<CertLibrary::Observer> CertLibraryObserverList;
107 110
108 CertLibraryImpl() : 111 CertLibraryImpl() :
109 observer_list_(new CertLibraryObserverList), 112 observer_list_(new CertLibraryObserverList),
110 user_logged_in_(false), 113 user_logged_in_(false),
111 certificates_requested_(false), 114 certificates_requested_(false),
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 235 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
233 } 236 }
234 237
235 virtual void OnUserCertAdded(const net::X509Certificate* cert) OVERRIDE { 238 virtual void OnUserCertAdded(const net::X509Certificate* cert) OVERRIDE {
236 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 239 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
237 // Only load certificates if we have completed an initial request. 240 // Only load certificates if we have completed an initial request.
238 if (certificates_loaded_) { 241 if (certificates_loaded_) {
239 BrowserThread::PostTask( 242 BrowserThread::PostTask(
240 BrowserThread::DB, FROM_HERE, 243 BrowserThread::DB, FROM_HERE,
241 base::Bind(&CertLibraryImpl::LoadCertificates, 244 base::Bind(&CertLibraryImpl::LoadCertificates,
242 weak_ptr_factory_.GetWeakPtr())); 245 base::Unretained(this)));
243 } 246 }
244 } 247 }
245 248
246 virtual void OnUserCertRemoved(const net::X509Certificate* cert) OVERRIDE { 249 virtual void OnUserCertRemoved(const net::X509Certificate* cert) OVERRIDE {
247 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 250 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
248 // Only load certificates if we have completed an initial request. 251 // Only load certificates if we have completed an initial request.
249 if (certificates_loaded_) { 252 if (certificates_loaded_) {
250 BrowserThread::PostTask( 253 BrowserThread::PostTask(
251 BrowserThread::DB, FROM_HERE, 254 BrowserThread::DB, FROM_HERE,
252 base::Bind(&CertLibraryImpl::LoadCertificates, 255 base::Bind(&CertLibraryImpl::LoadCertificates,
253 weak_ptr_factory_.GetWeakPtr())); 256 base::Unretained(this)));
254 } 257 }
255 } 258 }
256 259
257 virtual const std::string& GetTpmTokenName() const OVERRIDE { 260 virtual const std::string& GetTpmTokenName() const OVERRIDE {
258 return tpm_token_name_; 261 return tpm_token_name_;
259 } 262 }
260 263
261 private: 264 private:
262 void LoadCertificates() { 265 void LoadCertificates() {
263 VLOG(1) << " Loading Certificates."; 266 VLOG(1) << " Loading Certificates.";
264 // Certificate fetch occurs on the DB thread. 267 // Certificate fetch occurs on the DB thread.
265 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 268 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
266 net::CertDatabase cert_db; 269 net::CertDatabase cert_db;
267 net::CertificateList* cert_list = new net::CertificateList(); 270 net::CertificateList* cert_list = new net::CertificateList();
268 cert_db.ListCerts(cert_list); 271 cert_db.ListCerts(cert_list);
269 // Pass the list to the UI thread to safely update the local lists. 272 // Pass the list to the UI thread to safely update the local lists.
270 BrowserThread::PostTask( 273 BrowserThread::PostTask(
271 BrowserThread::UI, FROM_HERE, 274 BrowserThread::UI, FROM_HERE,
272 base::Bind(&CertLibraryImpl::UpdateCertificates, 275 base::Bind(&CertLibraryImpl::UpdateCertificates,
273 weak_ptr_factory_.GetWeakPtr(), cert_list)); 276 base::Unretained(this), cert_list));
274 } 277 }
275 278
276 // Comparison functor for locale-sensitive sorting of certificates by name. 279 // Comparison functor for locale-sensitive sorting of certificates by name.
277 class CertNameComparator { 280 class CertNameComparator {
278 public: 281 public:
279 explicit CertNameComparator(icu::Collator* collator) 282 explicit CertNameComparator(icu::Collator* collator)
280 : collator_(collator) { } 283 : collator_(collator) { }
281 284
282 bool operator()(const scoped_refptr<net::X509Certificate>& lhs, 285 bool operator()(const scoped_refptr<net::X509Certificate>& lhs,
283 const scoped_refptr<net::X509Certificate>& rhs) const { 286 const scoped_refptr<net::X509Certificate>& rhs) const {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 } 406 }
404 return; 407 return;
405 } 408 }
406 // TPM is not enabled, so proceed with empty tpm token name. 409 // TPM is not enabled, so proceed with empty tpm token name.
407 VLOG(1) << "TPM not available."; 410 VLOG(1) << "TPM not available.";
408 } 411 }
409 412
410 // tpm_token_name_ is set, load the certificates on the DB thread. 413 // tpm_token_name_ is set, load the certificates on the DB thread.
411 BrowserThread::PostTask( 414 BrowserThread::PostTask(
412 BrowserThread::DB, FROM_HERE, 415 BrowserThread::DB, FROM_HERE,
413 base::Bind(&CertLibraryImpl::LoadCertificates, 416 base::Bind(&CertLibraryImpl::LoadCertificates, base::Unretained(this)));
414 weak_ptr_factory_.GetWeakPtr()));
415 } 417 }
416 418
417 // Observers. 419 // Observers.
418 const scoped_refptr<CertLibraryObserverList> observer_list_; 420 const scoped_refptr<CertLibraryObserverList> observer_list_;
419 421
420 // Active request task for re-requests while waiting for TPM init. 422 // Active request task for re-requests while waiting for TPM init.
421 base::Closure request_task_; 423 base::Closure request_task_;
422 424
423 // Cached TPM token name. 425 // Cached TPM token name.
424 std::string tpm_token_name_; 426 std::string tpm_token_name_;
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 net::X509Certificate* cert = GetCertificateAt(index); 506 net::X509Certificate* cert = GetCertificateAt(index);
505 net::X509Certificate::OSCertHandle cert_handle = cert->os_cert_handle(); 507 net::X509Certificate::OSCertHandle cert_handle = cert->os_cert_handle();
506 std::string id = x509_certificate_model::GetPkcs11Id(cert_handle); 508 std::string id = x509_certificate_model::GetPkcs11Id(cert_handle);
507 if (id == pkcs11_id) 509 if (id == pkcs11_id)
508 return index; 510 return index;
509 } 511 }
510 return -1; // Not found. 512 return -1; // Not found.
511 } 513 }
512 514
513 } // chromeos 515 } // chromeos
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698