Chromium Code Reviews| 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 1282b131cee410c4052c8f84c7aa02f761fe0341..ef2d6ddb396b8b957bee497dca137b817622893b 100644 |
| --- a/webkit/plugins/ppapi/ppb_websocket_impl.cc |
| +++ b/webkit/plugins/ppapi/ppb_websocket_impl.cc |
| @@ -33,6 +33,7 @@ using ppapi::ArrayBufferVar; |
| using ppapi::PpapiGlobals; |
| using ppapi::StringVar; |
| using ppapi::thunk::PPB_WebSocket_API; |
| +using ppapi::TrackedCallback; |
| using ppapi::VarTracker; |
| using WebKit::WebData; |
| using WebKit::WebDocument; |
| @@ -82,15 +83,9 @@ PPB_WebSocket_Impl::PPB_WebSocket_Impl(PP_Instance instance) |
| wait_for_receive_(false), |
| close_code_(0), |
| close_was_clean_(PP_FALSE), |
| + empty_string_(new StringVar("", 0)), |
| buffered_amount_(0), |
| buffered_amount_after_close_(0) { |
| - 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() { |
| @@ -209,7 +204,7 @@ int32_t PPB_WebSocket_Impl::Connect(PP_Var url, |
| state_ = PP_WEBSOCKETREADYSTATE_CONNECTING_DEV; |
| // Install callback. |
| - connect_callback_ = callback; |
| + connect_callback_ = new TrackedCallback(this, callback); |
| return PP_OK_COMPLETIONPENDING; |
| } |
| @@ -250,12 +245,14 @@ int32_t PPB_WebSocket_Impl::Close(uint16_t code, |
| return PP_ERROR_BLOCKS_MAIN_THREAD; |
| // Install |callback|. |
| - close_callback_ = callback; |
| + close_callback_ = new TrackedCallback(this, callback); |
| // Abort ongoing connect. |
| if (state_ == PP_WEBSOCKETREADYSTATE_CONNECTING_DEV) { |
| state_ = PP_WEBSOCKETREADYSTATE_CLOSING_DEV; |
|
viettrungluu
2012/01/03 22:55:20
Whoa. In this case apparently it gets stuck in the
|
| - PP_RunAndClearCompletionCallback(&connect_callback_, PP_ERROR_ABORTED); |
| + // Need to do a "Post" to avoid reentering the plugin. |
| + connect_callback_->PostAbort(); |
| + connect_callback_ = NULL; |
| websocket_->fail( |
| "WebSocket was closed before the connection was established."); |
| return PP_OK_COMPLETIONPENDING; |
| @@ -265,7 +262,10 @@ int32_t PPB_WebSocket_Impl::Close(uint16_t code, |
| if (wait_for_receive_) { |
| wait_for_receive_ = false; |
| receive_callback_var_ = NULL; |
| - PP_RunAndClearCompletionCallback(&receive_callback_, PP_ERROR_ABORTED); |
| + |
| + // Need to do a "Post" to avoid reentering the plugin. |
| + receive_callback_->PostAbort(); |
| + receive_callback_ = NULL; |
| } |
| // Close connection. |
| @@ -305,7 +305,7 @@ int32_t PPB_WebSocket_Impl::ReceiveMessage(PP_Var* message, |
| // Or retain |message| as buffer to store and install |callback|. |
| wait_for_receive_ = true; |
| receive_callback_var_ = message; |
| - receive_callback_ = callback; |
| + receive_callback_ = new TrackedCallback(this, callback); |
| return PP_OK_COMPLETIONPENDING; |
| } |
| @@ -422,7 +422,7 @@ PP_Var PPB_WebSocket_Impl::GetURL() { |
| void PPB_WebSocket_Impl::didConnect() { |
| DCHECK_EQ(PP_WEBSOCKETREADYSTATE_CONNECTING_DEV, state_); |
| state_ = PP_WEBSOCKETREADYSTATE_OPEN_DEV; |
| - PP_RunAndClearCompletionCallback(&connect_callback_, PP_OK); |
| + TrackedCallback::ClearAndRun(&connect_callback_, PP_OK); |
| } |
| void PPB_WebSocket_Impl::didReceiveMessage(const WebString& message) { |
| @@ -438,7 +438,7 @@ void PPB_WebSocket_Impl::didReceiveMessage(const WebString& message) { |
| if (!wait_for_receive_) |
| return; |
| - PP_RunAndClearCompletionCallback(&receive_callback_, DoReceive()); |
| + TrackedCallback::ClearAndRun(&receive_callback_, DoReceive()); |
| } |
| void PPB_WebSocket_Impl::didReceiveBinaryData(const WebData& binaryData) { |
| @@ -457,7 +457,7 @@ void PPB_WebSocket_Impl::didReceiveBinaryData(const WebData& binaryData) { |
| if (!wait_for_receive_) |
| return; |
| - PP_RunAndClearCompletionCallback(&receive_callback_, DoReceive()); |
| + TrackedCallback::ClearAndRun(&receive_callback_, DoReceive()); |
| } |
| void PPB_WebSocket_Impl::didReceiveMessageError() { |
| @@ -476,7 +476,7 @@ void PPB_WebSocket_Impl::didReceiveMessageError() { |
| // We must invoke the callback with error code here. |
| wait_for_receive_ = false; |
| receive_callback_var_ = NULL; |
| - PP_RunAndClearCompletionCallback(&receive_callback_, PP_ERROR_FAILED); |
| + TrackedCallback::ClearAndRun(&receive_callback_, PP_ERROR_FAILED); |
| } |
| void PPB_WebSocket_Impl::didUpdateBufferedAmount( |
| @@ -515,16 +515,16 @@ void PPB_WebSocket_Impl::didClose(unsigned long unhandled_buffered_amount, |
| state_ = PP_WEBSOCKETREADYSTATE_CLOSED_DEV; |
| if (state == PP_WEBSOCKETREADYSTATE_CONNECTING_DEV) |
| - PP_RunAndClearCompletionCallback(&connect_callback_, PP_ERROR_FAILED); |
| + TrackedCallback::ClearAndRun(&connect_callback_, PP_ERROR_FAILED); |
| if (wait_for_receive_) { |
| wait_for_receive_ = false; |
| receive_callback_var_ = NULL; |
| - PP_RunAndClearCompletionCallback(&receive_callback_, PP_ERROR_ABORTED); |
| + TrackedCallback::ClearAndAbort(&receive_callback_); |
| } |
| if (state == PP_WEBSOCKETREADYSTATE_CLOSING_DEV) |
| - PP_RunAndClearCompletionCallback(&close_callback_, PP_OK); |
| + TrackedCallback::ClearAndRun(&close_callback_, PP_OK); |
| // Disconnect. |
| if (websocket_.get()) |