Index: chrome/browser/extensions/api/socket/socket_api.cc |
diff --git a/chrome/browser/extensions/api/socket/socket_api.cc b/chrome/browser/extensions/api/socket/socket_api.cc |
index da173c2952ae873f8068a4db783838efd5bf2225..d9829e95bef5e72a7d380705cb63fdcf87381048 100644 |
--- a/chrome/browser/extensions/api/socket/socket_api.cc |
+++ b/chrome/browser/extensions/api/socket/socket_api.cc |
@@ -12,6 +12,7 @@ |
#include "chrome/browser/extensions/api/dns/host_resolver_wrapper.h" |
#include "chrome/browser/extensions/api/socket/socket.h" |
#include "chrome/browser/extensions/api/socket/tcp_socket.h" |
+#include "chrome/browser/extensions/api/socket/tls_socket.h" |
#include "chrome/browser/extensions/api/socket/udp_socket.h" |
#include "chrome/browser/extensions/extension_system.h" |
#include "chrome/browser/io_thread.h" |
@@ -76,6 +77,11 @@ Socket* SocketAsyncApiFunction::GetSocket(int api_resource_id) { |
return manager_->Get(extension_->id(), api_resource_id); |
} |
+void SocketAsyncApiFunction::SetSocket(int api_resource_id, |
+ Socket* socket) { |
+ manager_->Set(extension_->id(), api_resource_id, socket); |
+} |
+ |
base::hash_set<int>* SocketAsyncApiFunction::GetSocketIds() { |
return manager_->GetResourceIds(extension_->id()); |
} |
@@ -239,6 +245,7 @@ void SocketConnectFunction::AfterDnsLookup(int lookup_result) { |
} |
void SocketConnectFunction::StartConnect() { |
+ socket_->SetHostname(hostname_); |
socket_->Connect(resolved_address_, port_, |
base::Bind(&SocketConnectFunction::OnConnect, this)); |
} |
@@ -896,4 +903,60 @@ void SocketGetJoinedGroupsFunction::Work() { |
SetResult(values); |
} |
+SocketSecureFunction::SocketSecureFunction() {} |
+SocketSecureFunction::~SocketSecureFunction() {} |
+ |
+bool SocketSecureFunction::Prepare() { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ params_ = api::socket::Secure::Params::Create(*args_); |
+ EXTENSION_FUNCTION_VALIDATE(params_.get()); |
+ url_request_getter_ = GetProfile()->GetRequestContext(); |
+ return true; |
+} |
+ |
+void SocketSecureFunction::Work() { |
rpaquay
2013/12/09 23:02:03
Using "Work" is slightly different than the conven
lally
2013/12/12 02:31:39
Done.
|
+ base::Value *result; |
+ async_completed_needs_invocation_ = false; |
+ const char * error_str = TLSSocket::SecureTCPSocket( |
rpaquay
2013/12/09 23:02:03
There are issues with the way error handling is do
lally
2013/12/12 02:31:39
Done.
|
+ GetSocket(params_->socket_id), |
+ GetProfile(), |
+ url_request_getter_, |
+ extension_id(), |
+ params_->options.get(), |
+ base::Bind(&SocketSecureFunction::TlsConnectDone, this), |
+ &result); |
+ if (error_str) { |
+ error_ = error_str; |
+ } |
+ SetResult(result); |
+ |
+ if (async_completed_needs_invocation_) { |
+ AsyncWorkCompleted(); |
+ async_completed_needs_invocation_ = false; |
+ } else { |
+ async_completed_needs_invocation_ = true; |
+ } |
+} |
+ |
+// Override the regular implementation, which would call AsyncWorkCompleted |
+// immediately after Work(). |
+void SocketSecureFunction::AsyncWorkStart() { |
+ Work(); |
+} |
+ |
+void SocketSecureFunction::TlsConnectDone(Socket *sock, int result) { |
+ if (sock) { |
+ SetSocket(params_->socket_id, sock); |
+ } else { |
+ RemoveSocket(params_->socket_id); |
+ } |
+ |
+ if (async_completed_needs_invocation_) { |
rpaquay
2013/12/09 23:02:03
As mentioned above, the code here should be someth
lally
2013/12/12 02:31:39
Done.
|
+ AsyncWorkCompleted(); |
+ async_completed_needs_invocation_ = false; |
+ } else { |
+ async_completed_needs_invocation_ = true; |
+ } |
+} |
+ |
} // namespace extensions |