Index: webkit/plugins/ppapi/ppb_websocket_impl.cc |
diff --git a/webkit/plugins/ppapi/ppb_websocket_impl.cc b/webkit/plugins/ppapi/ppb_websocket_impl.cc |
index 825a4e94f92ee5cab56ebfcb8042cc66041ad07f..b3fb63ed9ec721c5c087fa3bf27c47d93ef3fadb 100644 |
--- a/webkit/plugins/ppapi/ppb_websocket_impl.cc |
+++ b/webkit/plugins/ppapi/ppb_websocket_impl.cc |
@@ -79,22 +79,26 @@ PPB_WebSocket_Impl::PPB_WebSocket_Impl(PP_Instance instance) |
: Resource(instance), |
state_(PP_WEBSOCKETREADYSTATE_INVALID_DEV), |
error_was_received_(false), |
+ connect_callback_(PP_BlockUntilComplete()), |
+ receive_callback_(PP_BlockUntilComplete()), |
receive_callback_var_(NULL), |
wait_for_receive_(false), |
+ close_callback_(PP_BlockUntilComplete()), |
close_code_(0), |
close_was_clean_(PP_FALSE), |
buffered_amount_(0), |
buffered_amount_after_close_(0) { |
Takashi Toyoshima
2011/12/22 07:56:29
Replace initializers for callbacks by my ongoing c
|
- connect_callback_.func = NULL; |
- connect_callback_.user_data = NULL; |
- receive_callback_.func = NULL; |
- receive_callback_.user_data = NULL; |
- close_callback_.func = NULL; |
- close_callback_.user_data = NULL; |
empty_string_ = new StringVar("", 0); |
} |
PPB_WebSocket_Impl::~PPB_WebSocket_Impl() { |
+ // Abort outstanding processings having a callback. |
+ if (connect_callback_.func) |
+ PP_RunAndClearCompletionCallback(&connect_callback_, PP_ERROR_ABORTED); |
+ AbortOutstandingReceive(); |
+ if (close_callback_.func) |
+ PP_RunAndClearCompletionCallback(&close_callback_, PP_ERROR_ABORTED); |
+ |
if (websocket_.get()) |
websocket_->disconnect(); |
@@ -262,11 +266,7 @@ int32_t PPB_WebSocket_Impl::Close(uint16_t code, |
} |
// Abort ongoing receive. |
- if (wait_for_receive_) { |
- wait_for_receive_ = false; |
- receive_callback_var_ = NULL; |
- PP_RunAndClearCompletionCallback(&receive_callback_, PP_ERROR_ABORTED); |
- } |
+ AbortOutstandingReceive(); |
// Close connection. |
state_ = PP_WEBSOCKETREADYSTATE_CLOSING_DEV; |
@@ -484,11 +484,7 @@ void PPB_WebSocket_Impl::didClose(unsigned long unhandled_buffered_amount, |
if (state == PP_WEBSOCKETREADYSTATE_CONNECTING_DEV) |
PP_RunAndClearCompletionCallback(&connect_callback_, PP_ERROR_FAILED); |
- if (wait_for_receive_) { |
- wait_for_receive_ = false; |
- receive_callback_var_ = NULL; |
- PP_RunAndClearCompletionCallback(&receive_callback_, PP_ERROR_ABORTED); |
- } |
+ AbortOutstandingReceive(); |
if (state == PP_WEBSOCKETREADYSTATE_CLOSING_DEV) |
PP_RunAndClearCompletionCallback(&close_callback_, PP_OK); |
@@ -509,5 +505,13 @@ int32_t PPB_WebSocket_Impl::DoReceive() { |
return PP_OK; |
} |
+void PPB_WebSocket_Impl::AbortOutstandingReceive() { |
+ if (!wait_for_receive_) |
+ return; |
+ wait_for_receive_ = false; |
+ receive_callback_var_ = NULL; |
+ PP_RunAndClearCompletionCallback(&receive_callback_, PP_ERROR_ABORTED); |
+} |
+ |
} // namespace ppapi |
} // namespace webkit |