Commit 2c32b260 authored by toyoshim@chromium.org's avatar toyoshim@chromium.org

WebSocket Pepper API: PPB_WebSocket::close must accept undefined reason

IDL defines close behavior as it ignores the reason argument if the type of
reason is PP_VARTYPE_UNDEFINED.

BUG=124609
TEST=browser_tests --gtest_filter='*WebSocket*'


Review URL: http://codereview.chromium.org/10167028

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@133646 0039d316-1c4b-4281-b951-d872f2087c98
parent d87e7e76
......@@ -450,11 +450,12 @@ std::string TestWebSocket::TestValidConnect() {
std::string TestWebSocket::TestInvalidClose() {
PP_Var reason = CreateVarString("close for test");
TestCompletionCallback callback(instance_->pp_instance());
TestCompletionCallback another_callback(instance_->pp_instance());
// Close before connect.
PP_Resource ws = websocket_interface_->Create(instance_->pp_instance());
int32_t result = websocket_interface_->Close(
ws, PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE, reason,
int32_t result = websocket_interface_->Close(ws,
PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE, reason,
callback.GetCallback().pp_completion_callback());
ASSERT_EQ(PP_ERROR_FAILED, result);
core_interface_->ReleaseResource(ws);
......@@ -468,6 +469,39 @@ std::string TestWebSocket::TestInvalidClose() {
ASSERT_EQ(PP_ERROR_NOACCESS, result);
core_interface_->ReleaseResource(ws);
// Close with PP_VARTYPE_NULL.
ws = Connect(GetFullURL(kEchoServerURL), &result, "");
ASSERT_TRUE(ws);
ASSERT_EQ(PP_OK, result);
result = websocket_interface_->Close(ws,
PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE, PP_MakeNull(),
callback.GetCallback().pp_completion_callback());
ASSERT_EQ(PP_ERROR_BADARGUMENT, result);
core_interface_->ReleaseResource(ws);
// Close with PP_VARTYPE_NULL and ongoing receive message.
ws = Connect(GetFullURL(kEchoServerURL), &result, "");
ASSERT_TRUE(ws);
ASSERT_EQ(PP_OK, result);
PP_Var receive_message_var;
result = websocket_interface_->ReceiveMessage(ws, &receive_message_var,
callback.GetCallback().pp_completion_callback());
ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
result = websocket_interface_->Close(ws,
PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE, PP_MakeNull(),
another_callback.GetCallback().pp_completion_callback());
ASSERT_EQ(PP_ERROR_BADARGUMENT, result);
const char* send_message = "hi";
PP_Var send_message_var = CreateVarString(send_message);
result = websocket_interface_->SendMessage(ws, send_message_var);
ReleaseVar(send_message_var);
ASSERT_EQ(PP_OK, result);
result = callback.WaitForResult();
ASSERT_EQ(PP_OK, result);
ASSERT_TRUE(AreEqualWithString(receive_message_var, send_message));
ReleaseVar(receive_message_var);
core_interface_->ReleaseResource(ws);
ReleaseVar(reason);
PASS();
......@@ -493,6 +527,18 @@ std::string TestWebSocket::TestValidClose() {
ASSERT_EQ(PP_OK, result);
core_interface_->ReleaseResource(ws);
// Close with PP_VARTYPE_UNDEFINED.
ws = Connect(GetFullURL(kEchoServerURL), &result, "");
ASSERT_TRUE(ws);
ASSERT_EQ(PP_OK, result);
result = websocket_interface_->Close(ws,
PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE, PP_MakeUndefined(),
callback.GetCallback().pp_completion_callback());
ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
result = callback.WaitForResult();
ASSERT_EQ(PP_OK, result);
core_interface_->ReleaseResource(ws);
// Close in connecting.
// The ongoing connect failed with PP_ERROR_ABORTED, then the close is done
// successfully.
......@@ -546,6 +592,23 @@ std::string TestWebSocket::TestValidClose() {
ASSERT_EQ(PP_OK, result);
core_interface_->ReleaseResource(ws);
// Close with PP_VARTYPE_UNDEFINED and ongoing receive message.
ws = Connect(GetFullURL(kEchoServerURL), &result, "");
ASSERT_TRUE(ws);
ASSERT_EQ(PP_OK, result);
result = websocket_interface_->ReceiveMessage(ws, &receive_message_var,
callback.GetCallback().pp_completion_callback());
ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
result = websocket_interface_->Close(ws,
PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE, PP_MakeUndefined(),
another_callback.GetCallback().pp_completion_callback());
ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
result = callback.WaitForResult();
ASSERT_EQ(PP_ERROR_ABORTED, result);
result = another_callback.WaitForResult();
ASSERT_EQ(PP_OK, result);
core_interface_->ReleaseResource(ws);
ReleaseVar(reason);
ReleaseVar(url);
......@@ -1311,4 +1374,3 @@ std::string TestWebSocket::TestUtilityBufferedAmount() {
PASS();
}
......@@ -223,12 +223,17 @@ int32_t PPB_WebSocket_Impl::Close(uint16_t code,
return PP_ERROR_NOACCESS;
}
// Validate |reason|.
// TODO(toyoshim): Returns PP_ERROR_BADARGUMENT if |reason| contains any
// surrogates.
scoped_refptr<StringVar> reason_string = StringVar::FromPPVar(reason);
if (!reason_string || reason_string->value().size() > kMaxReasonSizeInBytes)
return PP_ERROR_BADARGUMENT;
scoped_refptr<StringVar> reason_string;
WebString web_reason;
// |reason| must be ignored if it is PP_VARTYPE_UNDEFINED.
if (reason.type != PP_VARTYPE_UNDEFINED) {
// Validate |reason|.
reason_string = StringVar::FromPPVar(reason);
if (!reason_string ||
reason_string->value().size() > kMaxReasonSizeInBytes)
return PP_ERROR_BADARGUMENT;
web_reason = WebString::fromUTF8(reason_string->value());
}
// Check state.
if (state_ == PP_WEBSOCKETREADYSTATE_CLOSING ||
......@@ -265,7 +270,6 @@ int32_t PPB_WebSocket_Impl::Close(uint16_t code,
// Close connection.
state_ = PP_WEBSOCKETREADYSTATE_CLOSING;
WebString web_reason = WebString::fromUTF8(reason_string->value());
websocket_->close(code, web_reason);
return PP_OK_COMPLETIONPENDING;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment