| Index: chrome/browser/profiles/profile_io_data.cc
|
| diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc
|
| index dcf3bcf9d593e80c22e8e293bff942b704ac5f2a..fd1b3fd5b13153465e530d11c44ae9fe419a92cc 100644
|
| --- a/chrome/browser/profiles/profile_io_data.cc
|
| +++ b/chrome/browser/profiles/profile_io_data.cc
|
| @@ -41,6 +41,7 @@
|
| #include "chrome/browser/net/chrome_net_log.h"
|
| #include "chrome/browser/net/chrome_network_delegate.h"
|
| #include "chrome/browser/net/cookie_store_util.h"
|
| +#include "chrome/browser/net/nss_context.h"
|
| #include "chrome/browser/net/proxy_service_factory.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/profiles/profile_manager.h"
|
| @@ -317,6 +318,22 @@ void StartNSSInitOnIOThread(const std::string& username,
|
| }
|
| #endif // defined(OS_CHROMEOS)
|
|
|
| +#if defined(USE_NSS)
|
| +void CreateKeygenHandlerWithSlot(
|
| + const GURL& url,
|
| + const base::Callback<void(scoped_ptr<net::KeygenHandler>)>& callback,
|
| + scoped_ptr<net::KeygenHandler> keygen_handler,
|
| + crypto::ScopedPK11Slot slot) {
|
| + scoped_ptr<crypto::CryptoModuleBlockingPasswordDelegate> delegate(
|
| + new ChromeNSSCryptoModuleDelegate(chrome::kCryptoModulePasswordKeygen,
|
| + net::HostPortPair::FromURL(url)));
|
| + keygen_handler->set_crypto_module_delegate(delegate.Pass());
|
| + keygen_handler->set_key_slot(slot.Pass());
|
| +
|
| + callback.Run(keygen_handler.Pass());
|
| +}
|
| +#endif // defined(USE_NSS)
|
| +
|
| } // namespace
|
|
|
| void ProfileIOData::InitializeOnUIThread(Profile* profile) {
|
| @@ -908,21 +925,22 @@ void ProfileIOData::ResourceContext::CreateKeygenHandler(
|
| scoped_ptr<net::KeygenHandler> keygen_handler(
|
| new net::KeygenHandler(key_size_in_bits, challenge_string, url));
|
|
|
| - scoped_ptr<ChromeNSSCryptoModuleDelegate> delegate(
|
| - new ChromeNSSCryptoModuleDelegate(chrome::kCryptoModulePasswordKeygen,
|
| - net::HostPortPair::FromURL(url)));
|
| - ChromeNSSCryptoModuleDelegate* delegate_ptr = delegate.get();
|
| - keygen_handler->set_crypto_module_delegate(
|
| - delegate.PassAs<crypto::NSSCryptoModuleDelegate>());
|
| -
|
| - base::Closure bound_callback =
|
| - base::Bind(callback, base::Passed(&keygen_handler));
|
| - if (delegate_ptr->InitializeSlot(this, bound_callback)) {
|
| - // Initialization complete, run the callback synchronously.
|
| - bound_callback.Run();
|
| + base::Callback<void(crypto::ScopedPK11Slot)> get_slot_callback =
|
| + base::Bind(&CreateKeygenHandlerWithSlot,
|
| + url,
|
| + callback,
|
| + base::Passed(&keygen_handler));
|
| +
|
| + crypto::ScopedPK11Slot slot =
|
| + GetPrivateNSSKeySlotForResourceContext(this, get_slot_callback);
|
| +
|
| + if (slot) {
|
| + // Obtained the slot synchronously, run the callback synchronously.
|
| + get_slot_callback.Run(slot.Pass());
|
| return;
|
| }
|
| - // Otherwise, the InitializeSlot will run the callback asynchronously.
|
| + // Otherwise, GetPrivateNSSKeySlotForResourceContext will run the callback
|
| + // asynchronously.
|
| #else
|
| callback.Run(make_scoped_ptr(
|
| new net::KeygenHandler(key_size_in_bits, challenge_string, url)));
|
|
|