Index: chrome/browser/renderer_host/resource_message_filter.cc |
diff --git a/chrome/browser/renderer_host/resource_message_filter.cc b/chrome/browser/renderer_host/resource_message_filter.cc |
index 9733f96b380739102df14ceadadc19f0c8de0b44..bb3bfe951eb95ba1000c62956b18f616cbf5d5cd 100755 |
--- a/chrome/browser/renderer_host/resource_message_filter.cc |
+++ b/chrome/browser/renderer_host/resource_message_filter.cc |
@@ -15,6 +15,7 @@ |
#include "base/process_util.h" |
#include "base/thread.h" |
#include "base/utf_string_conversions.h" |
+#include "base/worker_pool.h" |
#include "chrome/browser/appcache/appcache_dispatcher_host.h" |
#include "chrome/browser/browser_about_handler.h" |
#include "chrome/browser/child_process_security_policy.h" |
@@ -587,7 +588,7 @@ bool ResourceMessageFilter::OnMessageReceived(const IPC::Message& msg) { |
IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetFileModificationTime, |
OnGetFileModificationTime) |
IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_OpenFile, OnOpenFile) |
- IPC_MESSAGE_HANDLER(ViewHostMsg_Keygen, OnKeygen) |
+ IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_Keygen, OnKeygen) |
IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetExtensionMessageBundle, |
OnGetExtensionMessageBundle) |
#if defined(USE_TCMALLOC) |
@@ -1577,7 +1578,7 @@ void ResourceMessageFilter::OnOpenFileOnFileThread(const FilePath& path, |
void ResourceMessageFilter::OnKeygen(uint32 key_size_index, |
const std::string& challenge_string, |
const GURL& url, |
- std::string* signed_public_key) { |
+ IPC::Message* reply_msg) { |
// Map displayed strings indicating level of keysecurity in the <keygen> |
// menu to the key size in bits. (See SSLKeyGeneratorChromium.cpp in WebCore.) |
int key_size_in_bits; |
@@ -1590,11 +1591,44 @@ void ResourceMessageFilter::OnKeygen(uint32 key_size_index, |
break; |
default: |
DCHECK(false) << "Illegal key_size_index " << key_size_index; |
- *signed_public_key = std::string(); |
+ ViewHostMsg_Keygen::WriteReplyParams(reply_msg, std::string()); |
+ Send(reply_msg); |
return; |
} |
+ |
+ LOG(INFO) << "Dispatching keygen task to worker pool."; |
+ // Dispatch to worker pool, so we do not block the IO thread. |
+ if (!WorkerPool::PostTask( |
+ FROM_HERE, |
+ NewRunnableMethod( |
+ this, &ResourceMessageFilter::OnKeygenOnWorkerThread, |
+ key_size_in_bits, challenge_string, reply_msg), |
+ true)) { |
+ NOTREACHED() << "Failed to dispatch keygen task to worker pool"; |
+ ViewHostMsg_Keygen::WriteReplyParams(reply_msg, std::string()); |
+ Send(reply_msg); |
+ return; |
+ } |
+} |
+ |
+void ResourceMessageFilter::OnKeygenOnWorkerThread( |
+ int key_size_in_bits, |
+ const std::string& challenge_string, |
+ IPC::Message* reply_msg) { |
+ DCHECK(reply_msg); |
+ // Verify we are on a worker thread. |
+ DCHECK(!MessageLoop::current()); |
+ |
+ // Generate a signed public key and challenge, then send it back. |
net::KeygenHandler keygen_handler(key_size_in_bits, challenge_string); |
- *signed_public_key = keygen_handler.GenKeyAndSignChallenge(); |
+ |
+ ViewHostMsg_Keygen::WriteReplyParams( |
+ reply_msg, |
+ keygen_handler.GenKeyAndSignChallenge()); |
+ |
+ ChromeThread::PostTask( |
+ ChromeThread::IO, FROM_HERE, |
+ NewRunnableMethod(this, &ResourceMessageFilter::Send, reply_msg)); |
} |
#if defined(USE_TCMALLOC) |