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..3fd1d07ca55631fec60c500b2cd2be5f6b598781 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(); |
+ |
+ 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,28 @@ void NSSCertDatabase::RemoveObserver(Observer* observer) { |
observer_list_->RemoveObserver(observer); |
} |
+// static |
+void NSSCertDatabase::ListCertsImpl(CertificateList* certs) { |
+ CHECK(certs); |
Ryan Sleevi
2014/01/29 02:24:20
unnecessary check - certs->clear() will error if c
tbarzic
2014/01/29 20:50:52
Done.
|
+ 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)); |
} |
@@ -365,4 +392,9 @@ void NSSCertDatabase::NotifyObserversOfCACertChanged( |
&Observer::OnCACertChanged, make_scoped_refptr(cert)); |
} |
+void NSSCertDatabase::SetSlowTaskRunnerForTest( |
+ const scoped_refptr<base::TaskRunner>& task_runner) { |
+ slow_task_runner_for_test_ = task_runner; |
+} |
+ |
} // namespace net |