diff options
-rw-r--r-- | ppapi/tests/test_websocket.cc | 18 | ||||
-rw-r--r-- | webkit/plugins/ppapi/ppb_websocket_impl.cc | 4 |
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. |