Index: chrome/browser/certificate_manager_model.cc |
diff --git a/chrome/browser/certificate_manager_model.cc b/chrome/browser/certificate_manager_model.cc |
index 826a29aa65493e0c6754fbf49a215cbae85b4317..3287662cdba094419048c18362fe36d7896bd459 100644 |
--- a/chrome/browser/certificate_manager_model.cc |
+++ b/chrome/browser/certificate_manager_model.cc |
@@ -8,23 +8,64 @@ |
#include "base/i18n/time_formatting.h" |
#include "base/logging.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "chrome/browser/net/nss_context.h" |
#include "chrome/browser/ui/crypto_module_password_dialog_nss.h" |
#include "chrome/common/net/x509_certificate_model.h" |
+#include "content/public/browser/browser_context.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/resource_context.h" |
#include "grit/generated_resources.h" |
#include "net/base/crypto_module.h" |
#include "net/base/net_errors.h" |
#include "net/cert/x509_certificate.h" |
#include "ui/base/l10n/l10n_util.h" |
-CertificateManagerModel::CertificateManagerModel(Observer* observer) |
- : cert_db_(net::NSSCertDatabase::GetInstance()), |
- observer_(observer) { |
+using content::BrowserThread; |
+ |
+namespace { |
+ |
+void DidGetCertDBOnIOThread( |
+ const base::Callback<void(net::NSSCertDatabase*)>& callback, |
+ net::NSSCertDatabase* cert_db) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, base::Bind(callback, cert_db)); |
+} |
+ |
+void GetCertDBOnIOThread( |
+ content::ResourceContext* context, |
+ const base::Callback<void(net::NSSCertDatabase*)>& callback) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ net::NSSCertDatabase* cert_db = GetNSSCertDatabaseForResourceContext( |
+ context, base::Bind(&DidGetCertDBOnIOThread, callback)); |
+ if (cert_db) |
+ DidGetCertDBOnIOThread(callback, cert_db); |
+} |
+ |
+} // namespace |
+ |
+CertificateManagerModel::CertificateManagerModel( |
+ content::BrowserContext* browser_context, |
+ Observer* observer) |
+ : observer_(observer), |
+ weak_ptr_factory_(this) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DVLOG(1) << "Getting cert_db for profile..."; |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(&GetCertDBOnIOThread, |
+ browser_context->GetResourceContext(), |
+ base::Bind(&CertificateManagerModel::DidGetCertDB, |
+ weak_ptr_factory_.GetWeakPtr()))); |
} |
CertificateManagerModel::~CertificateManagerModel() { |
} |
void CertificateManagerModel::Refresh() { |
+ // TODO(mattm): XXX move the NSS operations stuff onto a worker thread? |
DVLOG(1) << "refresh started"; |
net::CryptoModuleList modules; |
cert_db_->ListModules(&modules, false); |
@@ -38,6 +79,14 @@ void CertificateManagerModel::Refresh() { |
base::Unretained(this))); |
} |
+void CertificateManagerModel::DidGetCertDB(net::NSSCertDatabase* cert_db) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(cert_db); |
+ DVLOG(1) << "Got cert_db"; |
+ cert_db_ = cert_db; |
+ observer_->CertificateManagerModelReady(); |
+} |
+ |
void CertificateManagerModel::RefreshSlotsUnlocked() { |
DVLOG(1) << "refresh listing certs..."; |
cert_db_->ListCerts(&cert_list_); |