From 3edbaaf33744e5b24e6946d4b84174e8db2d161e Mon Sep 17 00:00:00 2001 From: "jiayl@webrtc.org" Date: Fri, 18 Jul 2014 23:57:50 +0000 Subject: [PATCH] Ignore empty data in DataChannel::Send to match FF's behavior. BUG=crbug/395205 R=pthatcher@webrtc.org Review URL: https://webrtc-codereview.appspot.com/16949004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@6742 4adac7df-926f-26a2-2b94-8c16560cd09d --- talk/app/webrtc/datachannel.cc | 8 ++++++++ talk/app/webrtc/datachannel_unittest.cc | 13 +++++++++++++ talk/app/webrtc/test/fakedatachannelprovider.h | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/talk/app/webrtc/datachannel.cc b/talk/app/webrtc/datachannel.cc index af4fb244f5..d98f8be802 100644 --- a/talk/app/webrtc/datachannel.cc +++ b/talk/app/webrtc/datachannel.cc @@ -195,6 +195,14 @@ bool DataChannel::Send(const DataBuffer& buffer) { if (state_ != kOpen) { return false; } + + // TODO(jiayl): the spec is unclear about if the remote side should get the + // onmessage event. We need to figure out the expected behavior and change the + // code accordingly. + if (buffer.size() == 0) { + return true; + } + // If the queue is non-empty, we're waiting for SignalReadyToSend, // so just add to the end of the queue and keep waiting. if (!queued_send_data_.Empty()) { diff --git a/talk/app/webrtc/datachannel_unittest.cc b/talk/app/webrtc/datachannel_unittest.cc index 6f223fe426..ef4d26f924 100644 --- a/talk/app/webrtc/datachannel_unittest.cc +++ b/talk/app/webrtc/datachannel_unittest.cc @@ -410,3 +410,16 @@ TEST_F(SctpDataChannelTest, ClosedWhenReceivedBufferFull) { EXPECT_EQ(webrtc::DataChannelInterface::kClosed, webrtc_data_channel_->state()); } + +// Tests that sending empty data returns no error and keeps the channel open. +TEST_F(SctpDataChannelTest, SendEmptyData) { + webrtc_data_channel_->SetSctpSid(1); + SetChannelReady(); + EXPECT_EQ(webrtc::DataChannelInterface::kOpen, + webrtc_data_channel_->state()); + + webrtc::DataBuffer buffer(""); + EXPECT_TRUE(webrtc_data_channel_->Send(buffer)); + EXPECT_EQ(webrtc::DataChannelInterface::kOpen, + webrtc_data_channel_->state()); +} diff --git a/talk/app/webrtc/test/fakedatachannelprovider.h b/talk/app/webrtc/test/fakedatachannelprovider.h index 053b3acce4..5859cdba24 100644 --- a/talk/app/webrtc/test/fakedatachannelprovider.h +++ b/talk/app/webrtc/test/fakedatachannelprovider.h @@ -45,7 +45,7 @@ class FakeDataChannelProvider : public webrtc::DataChannelProviderInterface { return false; } - if (transport_error_) { + if (transport_error_ || payload.length() == 0) { *result = cricket::SDR_ERROR; return false; }