| Index: content/browser/renderer_host/pepper/pepper_tcp_socket_message_filter.cc | 
| diff --git a/content/browser/renderer_host/pepper/pepper_tcp_socket_message_filter.cc b/content/browser/renderer_host/pepper/pepper_tcp_socket_message_filter.cc | 
| index 38248f423413940c40078ddfecff6501071ebb09..df51021375efa793cdfc717cc9f714233befb29a 100644 | 
| --- a/content/browser/renderer_host/pepper/pepper_tcp_socket_message_filter.cc | 
| +++ b/content/browser/renderer_host/pepper/pepper_tcp_socket_message_filter.cc | 
| @@ -63,6 +63,7 @@ PepperTCPSocketMessageFilter::PepperTCPSocketMessageFilter( | 
| state_(TCPSocketState::INITIAL), | 
| end_of_file_reached_(false), | 
| bind_input_addr_(NetAddressPrivateImpl::kInvalidNetAddress), | 
| +      socket_options_(SOCKET_OPTION_NODELAY), | 
| address_index_(0), | 
| socket_(new net::TCPSocket(NULL, net::NetLog::Source())), | 
| ssl_context_helper_(host->ssl_context_helper()), | 
| @@ -90,6 +91,7 @@ PepperTCPSocketMessageFilter::PepperTCPSocketMessageFilter( | 
| state_(TCPSocketState::CONNECTED), | 
| end_of_file_reached_(false), | 
| bind_input_addr_(NetAddressPrivateImpl::kInvalidNetAddress), | 
| +      socket_options_(SOCKET_OPTION_NODELAY), | 
| address_index_(0), | 
| socket_(socket.Pass()), | 
| ssl_context_helper_(host->ssl_context_helper()), | 
| @@ -456,35 +458,46 @@ int32_t PepperTCPSocketMessageFilter::OnMsgSetOption( | 
|  | 
| switch (name) { | 
| case PP_TCPSOCKET_OPTION_NO_DELAY: { | 
| -      if (state_.state() != TCPSocketState::CONNECTED) | 
| -        return PP_ERROR_FAILED; | 
| - | 
| bool boolean_value = false; | 
| if (!value.GetBool(&boolean_value)) | 
| return PP_ERROR_BADARGUMENT; | 
| -      return socket_->SetNoDelay(boolean_value) ? PP_OK : PP_ERROR_FAILED; | 
| +      if (state_.state() == TCPSocketState::CONNECTED) | 
| +        return socket_->SetNoDelay(boolean_value) ? PP_OK : PP_ERROR_FAILED; | 
| + | 
| +      if (boolean_value) { | 
| +        socket_options_ |= SOCKET_OPTION_NODELAY; | 
| +      } else { | 
| +        socket_options_ &= ~SOCKET_OPTION_NODELAY; | 
| +      } | 
| +      return PP_OK; | 
| } | 
| case PP_TCPSOCKET_OPTION_SEND_BUFFER_SIZE: | 
| case PP_TCPSOCKET_OPTION_RECV_BUFFER_SIZE: { | 
| -      if (state_.state() != TCPSocketState::CONNECTED) | 
| -        return PP_ERROR_FAILED; | 
| - | 
| int32_t integer_value = 0; | 
| if (!value.GetInt32(&integer_value) || integer_value <= 0) | 
| return PP_ERROR_BADARGUMENT; | 
|  | 
| -      int net_result = net::ERR_UNEXPECTED; | 
| if (name == PP_TCPSOCKET_OPTION_SEND_BUFFER_SIZE) { | 
| if (integer_value > TCPSocketResourceBase::kMaxSendBufferSize) | 
| return PP_ERROR_BADARGUMENT; | 
| -        net_result = socket_->SetSendBufferSize(integer_value); | 
| +        if (state_.state() == TCPSocketState::CONNECTED) { | 
| +          return NetErrorToPepperError( | 
| +              socket_->SetSendBufferSize(integer_value)); | 
| +        } | 
| +        socket_options_ |= SOCKET_OPTION_SNDBUF_SIZE; | 
| +        sndbuf_size_ = integer_value; | 
| +        return PP_OK; | 
| } else { | 
| if (integer_value > TCPSocketResourceBase::kMaxReceiveBufferSize) | 
| return PP_ERROR_BADARGUMENT; | 
| -        net_result = socket_->SetReceiveBufferSize(integer_value); | 
| +        if (state_.state() == TCPSocketState::CONNECTED) { | 
| +          return NetErrorToPepperError( | 
| +              socket_->SetReceiveBufferSize(integer_value)); | 
| +        } | 
| +        socket_options_ |= SOCKET_OPTION_RCVBUF_SIZE; | 
| +        rcvbuf_size_ = integer_value; | 
| +        return PP_OK; | 
| } | 
| -      // TODO(wtc): Add error mapping code. | 
| -      return (net_result == net::OK) ? PP_OK : PP_ERROR_FAILED; | 
| } | 
| default: { | 
| NOTREACHED(); | 
| @@ -749,6 +762,25 @@ void PepperTCPSocketMessageFilter::OnConnectCompleted( | 
| } | 
|  | 
| socket_->SetDefaultOptionsForClient(); | 
| +    // NODELAY is set by SetDefaultOptionsForClient(). | 
| +    if (!(socket_options_ & SOCKET_OPTION_NODELAY)) { | 
| +      pp_result = NetErrorToPepperError(socket_->SetNoDelay(false)); | 
| +      if (pp_result != PP_OK) | 
| +        break; | 
| +    } | 
| +    if (socket_options_ & SOCKET_OPTION_RCVBUF_SIZE) { | 
| +      pp_result = NetErrorToPepperError( | 
| +          socket_->SetReceiveBufferSize(rcvbuf_size_)); | 
| +      if (pp_result != PP_OK) | 
| +        break; | 
| +    } | 
| +    if (socket_options_ & SOCKET_OPTION_SNDBUF_SIZE) { | 
| +      pp_result = NetErrorToPepperError( | 
| +          socket_->SetSendBufferSize(sndbuf_size_)); | 
| +      if (pp_result != PP_OK) | 
| +        break; | 
| +    } | 
| +    socket_options_ = SOCKET_OPTION_NODELAY; | 
| SendConnectReply(context, PP_OK, local_addr, remote_addr); | 
| state_.CompletePendingTransition(true); | 
| return; | 
|  |