Index: chrome/browser/net/nss_context_chromeos.cc |
diff --git a/chrome/browser/net/nss_context_chromeos.cc b/chrome/browser/net/nss_context_chromeos.cc |
index fdd96cf57da99687e2e2b1a6b61b4b32b9f66a51..abac67c65864769a2889fe92b12e12903010bc4c 100644 |
--- a/chrome/browser/net/nss_context_chromeos.cc |
+++ b/chrome/browser/net/nss_context_chromeos.cc |
@@ -17,6 +17,8 @@ void* kDatabaseManagerKey = &kDatabaseManagerKey; |
class NSSCertDatabaseChromeOSManager : public base::SupportsUserData::Data { |
public: |
+ typedef base::Callback<void(net::NSSCertDatabaseChromeOS*)> |
+ GetNSSCertDatabaseCallback; |
explicit NSSCertDatabaseChromeOSManager(const std::string& username_hash) |
: username_hash_(username_hash), weak_ptr_factory_(this) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
@@ -32,8 +34,8 @@ class NSSCertDatabaseChromeOSManager : public base::SupportsUserData::Data { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
} |
- net::NSSCertDatabase* GetNSSCertDatabase( |
- const base::Callback<void(net::NSSCertDatabase*)>& callback) { |
+ net::NSSCertDatabaseChromeOS* GetNSSCertDatabase( |
+ const GetNSSCertDatabaseCallback& callback) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
if (nss_cert_database_) |
@@ -44,8 +46,7 @@ class NSSCertDatabaseChromeOSManager : public base::SupportsUserData::Data { |
} |
private: |
- typedef std::vector<base::Callback<void(net::NSSCertDatabase*)> > |
- ReadyCallbackList; |
+ typedef std::vector<GetNSSCertDatabaseCallback> ReadyCallbackList; |
void DidGetPrivateSlot(crypto::ScopedPK11Slot private_slot) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
@@ -74,6 +75,43 @@ std::string GetUsername(content::ResourceContext* context) { |
return ProfileIOData::FromResourceContext(context)->username_hash(); |
} |
+net::NSSCertDatabaseChromeOS* GetNSSCertDatabaseChromeOS( |
+ content::ResourceContext* context, |
+ const NSSCertDatabaseChromeOSManager::GetNSSCertDatabaseCallback& |
+ callback) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
+ NSSCertDatabaseChromeOSManager* manager = |
+ static_cast<NSSCertDatabaseChromeOSManager*>( |
+ context->GetUserData(kDatabaseManagerKey)); |
+ if (!manager) { |
+ manager = new NSSCertDatabaseChromeOSManager(GetUsername(context)); |
+ context->SetUserData(kDatabaseManagerKey, manager); |
+ } |
+ return manager->GetNSSCertDatabase(callback); |
+} |
+ |
+void CallWithNSSCertDatabase( |
+ const base::Callback<void(net::NSSCertDatabase*)>& callback, |
+ net::NSSCertDatabaseChromeOS* db) { |
+ callback.Run(db); |
+} |
+ |
+void SetSystemSlot(crypto::ScopedPK11Slot system_slot, |
+ net::NSSCertDatabaseChromeOS* db) { |
+ db->SetSystemSlot(system_slot.Pass()); |
+} |
+ |
+void SetSystemSlotOfDBForResourceContext(content::ResourceContext* context, |
+ crypto::ScopedPK11Slot system_slot) { |
+ base::Callback<void(net::NSSCertDatabaseChromeOS*)> callback = |
+ base::Bind(&SetSystemSlot, base::Passed(&system_slot)); |
+ |
+ net::NSSCertDatabaseChromeOS* db = |
+ GetNSSCertDatabaseChromeOS(context, callback); |
+ if (db) |
+ callback.Run(db); |
+} |
+ |
} // namespace |
crypto::ScopedPK11Slot GetPublicNSSKeySlotForResourceContext( |
@@ -92,13 +130,16 @@ crypto::ScopedPK11Slot GetPrivateNSSKeySlotForResourceContext( |
net::NSSCertDatabase* GetNSSCertDatabaseForResourceContext( |
content::ResourceContext* context, |
const base::Callback<void(net::NSSCertDatabase*)>& callback) { |
+ return GetNSSCertDatabaseChromeOS( |
+ context, base::Bind(&CallWithNSSCertDatabase, callback)); |
+} |
+ |
+void EnableNSSSystemKeySlotForResourceContext( |
+ content::ResourceContext* context) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
- NSSCertDatabaseChromeOSManager* manager = |
- static_cast<NSSCertDatabaseChromeOSManager*>( |
- context->GetUserData(kDatabaseManagerKey)); |
- if (!manager) { |
- manager = new NSSCertDatabaseChromeOSManager(GetUsername(context)); |
- context->SetUserData(kDatabaseManagerKey, manager); |
- } |
- return manager->GetNSSCertDatabase(callback); |
+ base::Callback<void(crypto::ScopedPK11Slot)> callback = |
+ base::Bind(&SetSystemSlotOfDBForResourceContext, context); |
+ crypto::ScopedPK11Slot system_slot = crypto::GetSystemNSSKeySlot(callback); |
+ if (system_slot) |
+ callback.Run(system_slot.Pass()); |
} |