Index: extensions/browser/api/sockets_tcp_server/sockets_tcp_server_api.cc |
diff --git a/extensions/browser/api/sockets_tcp_server/sockets_tcp_server_api.cc b/extensions/browser/api/sockets_tcp_server/sockets_tcp_server_api.cc |
index a55d0b5e7383b69b4e90c0aba3e7117aeac57ee9..a4a1dca880b7083bba5b4908454d53f8ea169e8d 100644 |
--- a/extensions/browser/api/sockets_tcp_server/sockets_tcp_server_api.cc |
+++ b/extensions/browser/api/sockets_tcp_server/sockets_tcp_server_api.cc |
@@ -176,10 +176,11 @@ bool SocketsTcpServerListenFunction::Prepare() { |
return socket_event_dispatcher_ != NULL; |
} |
-void SocketsTcpServerListenFunction::Work() { |
+void SocketsTcpServerListenFunction::AsyncWorkStart() { |
ResumableTCPServerSocket* socket = GetTcpSocket(params_->socket_id); |
if (!socket) { |
error_ = kSocketNotFoundError; |
+ AsyncWorkCompleted(); |
return; |
} |
@@ -187,6 +188,7 @@ void SocketsTcpServerListenFunction::Work() { |
SocketPermissionRequest::TCP_LISTEN, params_->address, params_->port); |
if (!SocketsManifestData::CheckRequest(extension(), param)) { |
error_ = kPermissionError; |
+ AsyncWorkCompleted(); |
return; |
} |
@@ -195,16 +197,17 @@ void SocketsTcpServerListenFunction::Work() { |
params_->port, |
params_->backlog.get() ? *params_->backlog.get() : kDefaultListenBacklog, |
&error_); |
- |
- if (net_result != net::OK) |
- error_ = net::ErrorToString(net_result); |
- |
+ results_ = sockets_tcp_server::Listen::Results::Create(net_result); |
if (net_result == net::OK) { |
socket_event_dispatcher_->OnServerSocketListen(extension_->id(), |
params_->socket_id); |
+ } else { |
+ error_ = net::ErrorToString(net_result); |
+ AsyncWorkCompleted(); |
+ return; |
} |
- results_ = sockets_tcp_server::Listen::Results::Create(net_result); |
+ OpenFirewallHole(params_->address, params_->socket_id, socket); |
} |
SocketsTcpServerDisconnectFunction::SocketsTcpServerDisconnectFunction() {} |