Index: extensions/browser/api/cast_channel/cast_channel_api.cc |
diff --git a/extensions/browser/api/cast_channel/cast_channel_api.cc b/extensions/browser/api/cast_channel/cast_channel_api.cc |
index 8878a0c5c26fd3a439aad1ab2d5531530902e3c2..c5bc286f3df6a9e511309925624f68082acdb41b 100644 |
--- a/extensions/browser/api/cast_channel/cast_channel_api.cc |
+++ b/extensions/browser/api/cast_channel/cast_channel_api.cc |
@@ -162,7 +162,8 @@ CastSocket* CastChannelAsyncApiFunction::GetSocketOrCompleteWithError( |
int channel_id) { |
CastSocket* socket = GetSocket(channel_id); |
if (!socket) { |
- SetResultFromError(cast_channel::CHANNEL_ERROR_INVALID_CHANNEL_ID); |
+ SetResultFromError(channel_id, |
+ cast_channel::CHANNEL_ERROR_INVALID_CHANNEL_ID); |
AsyncWorkCompleted(); |
} |
return socket; |
@@ -183,21 +184,24 @@ void CastChannelAsyncApiFunction::RemoveSocket(int channel_id) { |
manager_->Remove(extension_->id(), channel_id); |
} |
-void CastChannelAsyncApiFunction::SetResultFromSocket(int channel_id) { |
- CastSocket* socket = GetSocket(channel_id); |
- DCHECK(socket); |
+void CastChannelAsyncApiFunction::SetResultFromSocket( |
+ const CastSocket& socket) { |
ChannelInfo channel_info; |
- FillChannelInfo(*socket, &channel_info); |
- error_ = socket->error_state(); |
+ FillChannelInfo(socket, &channel_info); |
+ error_ = socket.error_state(); |
SetResultFromChannelInfo(channel_info); |
} |
-void CastChannelAsyncApiFunction::SetResultFromError(ChannelError error) { |
+void CastChannelAsyncApiFunction::SetResultFromError(int channel_id, |
+ ChannelError error) { |
ChannelInfo channel_info; |
- channel_info.channel_id = -1; |
+ channel_info.channel_id = channel_id; |
channel_info.url = ""; |
channel_info.ready_state = cast_channel::READY_STATE_CLOSED; |
channel_info.error_state = error; |
+ channel_info.connect_info.ip_address = ""; |
+ channel_info.connect_info.port = 0; |
+ channel_info.connect_info.auth = cast_channel::CHANNEL_AUTH_TYPE_SSL; |
SetResultFromChannelInfo(channel_info); |
error_ = error; |
} |
@@ -338,7 +342,13 @@ void CastChannelOpenFunction::AsyncWorkStart() { |
void CastChannelOpenFunction::OnOpen(int result) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
VLOG(1) << "Connect finished, OnOpen invoked."; |
- SetResultFromSocket(new_channel_id_); |
+ CastSocket* socket = GetSocket(new_channel_id_); |
+ if (!socket) { |
Wez
2014/07/31 22:57:53
Is there a simple test we can add to verify that t
mark a. foltz
2014/08/01 23:21:48
I tried writing an API test for this case but it i
|
+ SetResultFromError(new_channel_id_, |
+ cast_channel::CHANNEL_ERROR_CONNECT_ERROR); |
+ } else { |
+ SetResultFromSocket(*socket); |
+ } |
AsyncWorkCompleted(); |
} |
@@ -382,10 +392,13 @@ void CastChannelSendFunction::AsyncWorkStart() { |
void CastChannelSendFunction::OnSend(int result) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- if (result < 0) { |
- SetResultFromError(cast_channel::CHANNEL_ERROR_SOCKET_ERROR); |
+ int channel_id = params_->channel.channel_id; |
+ CastSocket* socket = GetSocket(channel_id); |
+ if (result < 0 || !socket) { |
+ SetResultFromError(channel_id, |
+ cast_channel::CHANNEL_ERROR_SOCKET_ERROR); |
} else { |
- SetResultFromSocket(params_->channel.channel_id); |
+ SetResultFromSocket(*socket); |
} |
AsyncWorkCompleted(); |
} |
@@ -410,11 +423,13 @@ void CastChannelCloseFunction::AsyncWorkStart() { |
void CastChannelCloseFunction::OnClose(int result) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
VLOG(1) << "CastChannelCloseFunction::OnClose result = " << result; |
- if (result < 0) { |
- SetResultFromError(cast_channel::CHANNEL_ERROR_SOCKET_ERROR); |
+ int channel_id = params_->channel.channel_id; |
+ CastSocket* socket = GetSocket(channel_id); |
+ if (result < 0 || !socket) { |
+ SetResultFromError(channel_id, |
+ cast_channel::CHANNEL_ERROR_SOCKET_ERROR); |
} else { |
- int channel_id = params_->channel.channel_id; |
- SetResultFromSocket(channel_id); |
+ SetResultFromSocket(*socket); |
RemoveSocket(channel_id); |
} |
AsyncWorkCompleted(); |