Index: chrome/browser/ssl/ssl_client_auth_handler.cc |
diff --git a/chrome/browser/ssl/ssl_client_auth_handler.cc b/chrome/browser/ssl/ssl_client_auth_handler.cc |
index f46c6f31f95dfaaad32a7819008d4a7faf79b775..74b25bf590d88e30707bf5220fedb6e6f5fa0272 100644 |
--- a/chrome/browser/ssl/ssl_client_auth_handler.cc |
+++ b/chrome/browser/ssl/ssl_client_auth_handler.cc |
@@ -4,13 +4,10 @@ |
#include "chrome/browser/ssl/ssl_client_auth_handler.h" |
-#include "app/l10n_util.h" |
-#include "base/string_util.h" |
-#include "chrome/browser/browser_list.h" |
-#include "chrome/browser/browser.h" |
-#include "chrome/browser/browser_window.h" |
#include "chrome/browser/chrome_thread.h" |
-#include "grit/generated_resources.h" |
+#include "chrome/browser/renderer_host/render_view_host_delegate.h" |
+#include "chrome/browser/renderer_host/render_view_host_notification_task.h" |
+#include "chrome/browser/renderer_host/resource_dispatcher_host.h" |
#include "net/url_request/url_request.h" |
SSLClientAuthHandler::SSLClientAuthHandler( |
@@ -18,11 +15,11 @@ SSLClientAuthHandler::SSLClientAuthHandler( |
net::SSLCertRequestInfo* cert_request_info) |
: request_(request), |
cert_request_info_(cert_request_info) { |
- // Keep us alive until a cert is selected. |
- AddRef(); |
} |
SSLClientAuthHandler::~SSLClientAuthHandler() { |
+ // If we were simply dropped, then act as if we selected no certificate. |
+ DoCertificateSelected(NULL); |
} |
void SSLClientAuthHandler::OnRequestCancelled() { |
@@ -30,14 +27,24 @@ void SSLClientAuthHandler::OnRequestCancelled() { |
} |
void SSLClientAuthHandler::SelectCertificate() { |
- // Let's move the request to the UI thread. |
- ChromeThread::PostTask( |
- ChromeThread::UI, FROM_HERE, |
- NewRunnableMethod(this, &SSLClientAuthHandler::DoSelectCertificate)); |
-} |
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
-// Looking for DoSelectCertificate()? |
-// It's implemented in a separate source file for each platform. |
+ int render_process_host_id; |
+ int render_view_host_id; |
+ if (!ResourceDispatcherHost::RenderViewForRequest(request_, |
+ &render_process_host_id, |
+ &render_view_host_id)) |
+ NOTREACHED(); |
+ |
+ // If the RVH does not exist by the time this task gets run, then the task |
+ // will be dropped and the scoped_refptr to SSLClientAuthHandler will go |
+ // away, so we do not leak anything. The destructor takes care of ensuring |
+ // the URLRequest always gets a response. |
+ CallRenderViewHostSSLDelegate( |
+ render_process_host_id, render_view_host_id, |
+ &RenderViewHostDelegate::SSL::ShowClientCertificateRequestDialog, |
+ scoped_refptr<SSLClientAuthHandler>(this)); |
+} |
// Notify the IO thread that we have selected a cert. |
void SSLClientAuthHandler::CertificateSelected(net::X509Certificate* cert) { |
@@ -48,11 +55,12 @@ void SSLClientAuthHandler::CertificateSelected(net::X509Certificate* cert) { |
} |
void SSLClientAuthHandler::DoCertificateSelected(net::X509Certificate* cert) { |
- // request_ could have been NULLed if the request was cancelled while the user |
- // was choosing a cert. |
- if (request_) |
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
+ // request_ could have been NULLed if the request was cancelled while the |
+ // user was choosing a cert, or because we have already responded to the |
+ // certificate. |
+ if (request_) { |
request_->ContinueWithCertificate(cert); |
- |
- // We are done. |
- Release(); |
+ request_ = NULL; |
+ } |
} |