Chromium Code Reviews| Index: net/cert/nss_cert_database.cc |
| diff --git a/net/cert/nss_cert_database.cc b/net/cert/nss_cert_database.cc |
| index 935b271bd47b479aa46338de540737efe2ba33af..d86e55f1116247ed7a6f12850404f74036d889ad 100644 |
| --- a/net/cert/nss_cert_database.cc |
| +++ b/net/cert/nss_cert_database.cc |
| @@ -10,10 +10,14 @@ |
| #include <pk11pub.h> |
| #include <secmod.h> |
| +#include "base/bind.h" |
| +#include "base/callback.h" |
| #include "base/lazy_instance.h" |
| #include "base/logging.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/observer_list_threadsafe.h" |
| +#include "base/task_runner.h" |
| +#include "base/threading/worker_pool.h" |
| #include "crypto/nss_util.h" |
| #include "crypto/nss_util_internal.h" |
| #include "crypto/scoped_nss_types.h" |
| @@ -42,7 +46,6 @@ base::LazyInstance<NSSCertDatabase>::Leaky |
| } // namespace |
| - |
| NSSCertDatabase::ImportCertFailure::ImportCertFailure( |
| const scoped_refptr<X509Certificate>& cert, |
| int err) |
| @@ -71,18 +74,20 @@ NSSCertDatabase::NSSCertDatabase() |
| NSSCertDatabase::~NSSCertDatabase() {} |
| -void NSSCertDatabase::ListCerts(CertificateList* certs) { |
| - certs->clear(); |
| +void NSSCertDatabase::ListCertsSync(CertificateList* certs) { |
| + ListCertsImpl(certs); |
| +} |
| - CERTCertList* cert_list = PK11_ListCerts(PK11CertListUnique, NULL); |
| - CERTCertListNode* node; |
| - for (node = CERT_LIST_HEAD(cert_list); |
| - !CERT_LIST_END(node, cert_list); |
| - node = CERT_LIST_NEXT(node)) { |
| - certs->push_back(X509Certificate::CreateFromHandle( |
| - node->cert, X509Certificate::OSCertHandles())); |
| - } |
| - CERT_DestroyCertList(cert_list); |
| +void NSSCertDatabase::ListCerts( |
| + const base::Callback<void(scoped_ptr<CertificateList> certs)>& callback) { |
| + scoped_ptr<CertificateList> certs(new CertificateList()); |
| + CertificateList* raw_certs = certs.get(); |
|
stevenjb
2014/02/04 22:28:42
nit: No need for local here, I think it would be m
tbarzic
2014/02/04 23:12:38
base::Passed(&certs) would get called before certs
stevenjb
2014/02/05 00:25:00
Ah, right, sorry, nevermind :)
|
| + |
| + GetSlowTaskRunner()->PostTaskAndReply( |
| + FROM_HERE, |
| + base::Bind(&NSSCertDatabase::ListCertsImpl, |
| + base::Unretained(raw_certs)), |
| + base::Bind(callback, base::Passed(&certs))); |
| } |
| crypto::ScopedPK11Slot NSSCertDatabase::GetPublicSlot() const { |
| @@ -350,6 +355,32 @@ void NSSCertDatabase::RemoveObserver(Observer* observer) { |
| observer_list_->RemoveObserver(observer); |
| } |
| +void NSSCertDatabase::SetSlowTaskRunnerForTest( |
| + const scoped_refptr<base::TaskRunner>& task_runner) { |
| + slow_task_runner_for_test_ = task_runner; |
| +} |
| + |
| +// static |
| +void NSSCertDatabase::ListCertsImpl(CertificateList* certs) { |
| + certs->clear(); |
| + |
| + CERTCertList* cert_list = PK11_ListCerts(PK11CertListUnique, NULL); |
| + CERTCertListNode* node; |
| + for (node = CERT_LIST_HEAD(cert_list); |
| + !CERT_LIST_END(node, cert_list); |
| + node = CERT_LIST_NEXT(node)) { |
| + certs->push_back(X509Certificate::CreateFromHandle( |
| + node->cert, X509Certificate::OSCertHandles())); |
| + } |
| + CERT_DestroyCertList(cert_list); |
| +} |
| + |
| +scoped_refptr<base::TaskRunner> NSSCertDatabase::GetSlowTaskRunner() const { |
| + if (slow_task_runner_for_test_) |
| + return slow_task_runner_for_test_; |
| + return base::WorkerPool::GetTaskRunner(true /*task is slow*/); |
| +} |
| + |
| void NSSCertDatabase::NotifyObserversOfCertAdded(const X509Certificate* cert) { |
| observer_list_->Notify(&Observer::OnCertAdded, make_scoped_refptr(cert)); |
| } |