summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ppapi/tests/test_websocket.cc18
-rw-r--r--webkit/plugins/ppapi/ppb_websocket_impl.cc4
2 files changed, 20 insertions, 2 deletions
diff --git a/ppapi/tests/test_websocket.cc b/ppapi/tests/test_websocket.cc
index 11a4260..93ce956 100644
--- a/ppapi/tests/test_websocket.cc
+++ b/ppapi/tests/test_websocket.cc
@@ -38,6 +38,9 @@ const char kEchoServerURL[] = "websocket/tests/hybi/echo-with-no-extension";
const char kCloseServerURL[] = "websocket/tests/hybi/close";
+const char kCloseWithCodeAndReasonServerURL[] =
+ "websocket/tests/hybi/close-code-and-reason";
+
const char kProtocolTestServerURL[] =
"websocket/tests/hybi/protocol-test?protocol=";
@@ -634,6 +637,21 @@ std::string TestWebSocket::TestValidClose() {
ASSERT_EQ(PP_OK, result);
core_interface_->ReleaseResource(ws);
+ // Server initiated closing handshake.
+ ws = Connect(GetFullURL(kCloseWithCodeAndReasonServerURL), &result, "");
+ ASSERT_TRUE(ws);
+ ASSERT_EQ(PP_OK, result);
+ // Text messsage "1000 bye" requests the server to initiate closing handshake
+ // with code being 1000 and reason being "bye".
+ PP_Var close_request_var = CreateVarString("1000 bye");
+ result = websocket_interface_->SendMessage(ws, close_request_var);
+ ReleaseVar(close_request_var);
+ callback.WaitForResult(websocket_interface_->ReceiveMessage(
+ ws, &receive_message_var,
+ callback.GetCallback().pp_completion_callback()));
+ ASSERT_EQ(PP_ERROR_FAILED, callback.result());
+ core_interface_->ReleaseResource(ws);
+
ReleaseVar(reason);
ReleaseVar(url);
diff --git a/webkit/plugins/ppapi/ppb_websocket_impl.cc b/webkit/plugins/ppapi/ppb_websocket_impl.cc
index 154fe99..c639fc6 100644
--- a/webkit/plugins/ppapi/ppb_websocket_impl.cc
+++ b/webkit/plugins/ppapi/ppb_websocket_impl.cc
@@ -512,10 +512,10 @@ void PPB_WebSocket_Impl::didClose(unsigned long unhandled_buffered_amount,
if (wait_for_receive_) {
wait_for_receive_ = false;
receive_callback_var_ = NULL;
- TrackedCallback::ClearAndAbort(&receive_callback_);
+ TrackedCallback::ClearAndRun(&receive_callback_, PP_ERROR_FAILED);
}
- if (state == PP_WEBSOCKETREADYSTATE_CLOSING)
+ if ((state == PP_WEBSOCKETREADYSTATE_CLOSING) && close_callback_.get())
TrackedCallback::ClearAndRun(&close_callback_, PP_OK);
// Disconnect.