Index: net/base/server_bound_cert_service.cc |
diff --git a/net/base/server_bound_cert_service.cc b/net/base/server_bound_cert_service.cc |
index 52e3d42adb12a5cd5c7721337697f86d997e8e74..3194a6623ad2491e3b9fb1a4f672ac3aebe2e326 100644 |
--- a/net/base/server_bound_cert_service.cc |
+++ b/net/base/server_bound_cert_service.cc |
@@ -349,6 +349,38 @@ class ServerBoundCertServiceJob { |
// static |
const char ServerBoundCertService::kEPKIPassword[] = ""; |
+ServerBoundCertService::RequestHandle::RequestHandle() |
+ : service_(NULL), |
+ request_(NULL) {} |
+ |
+ServerBoundCertService::RequestHandle::~RequestHandle() { |
+ Cancel(); |
+} |
+ |
+void ServerBoundCertService::RequestHandle::Cancel() { |
+ if (request_) { |
+ service_->CancelRequest(request_); |
+ request_ = NULL; |
+ callback_.Reset(); |
+ } |
+} |
+ |
+void ServerBoundCertService::RequestHandle::RequestStarted( |
+ ServerBoundCertService* service, |
+ ServerBoundCertServiceRequest* request, |
+ const CompletionCallback& callback) { |
+ DCHECK(request_ == NULL); |
+ service_ = service; |
+ request_ = request; |
+ callback_ = callback; |
+} |
+ |
+void ServerBoundCertService::RequestHandle::OnRequestComplete(int result) { |
+ request_ = NULL; |
+ callback_.Run(result); |
+ callback_.Reset(); |
+} |
+ |
ServerBoundCertService::ServerBoundCertService( |
ServerBoundCertStore* server_bound_cert_store, |
const scoped_refptr<base::TaskRunner>& task_runner) |
@@ -391,8 +423,6 @@ int ServerBoundCertService::GetDomainBoundCert( |
DCHECK(CalledOnValidThread()); |
base::TimeTicks request_start = base::TimeTicks::Now(); |
- *out_req = NULL; |
- |
if (callback.is_null() || !private_key || !cert || origin.empty() || |
requested_types.empty()) { |
RecordGetDomainBoundCertResult(INVALID_ARGUMENT); |
@@ -491,9 +521,11 @@ int ServerBoundCertService::GetDomainBoundCert( |
} |
ServerBoundCertServiceRequest* request = new ServerBoundCertServiceRequest( |
- request_start, callback, type, private_key, cert); |
+ request_start, |
+ base::Bind(&RequestHandle::OnRequestComplete, base::Unretained(out_req)), |
+ type, private_key, cert); |
job->AddRequest(request); |
- *out_req = request; |
+ out_req->RequestStarted(this, request, callback); |
return ERR_IO_PENDING; |
} |
@@ -501,11 +533,9 @@ ServerBoundCertStore* ServerBoundCertService::GetCertStore() { |
return server_bound_cert_store_.get(); |
} |
-void ServerBoundCertService::CancelRequest(RequestHandle req) { |
+void ServerBoundCertService::CancelRequest(ServerBoundCertServiceRequest* req) { |
DCHECK(CalledOnValidThread()); |
- ServerBoundCertServiceRequest* request = |
- reinterpret_cast<ServerBoundCertServiceRequest*>(req); |
- request->Cancel(); |
+ req->Cancel(); |
} |
// HandleResult is called by ServerBoundCertServiceWorker on the origin message |