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; |
- 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()) |