Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(366)

Side by Side Diff: content/browser/renderer_host/pepper/pepper_tcp_socket_message_filter.cc

Issue 690903002: Remove timing limitation of SetOption invocation for PPAPI sockets. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/renderer_host/pepper/pepper_tcp_socket_message_filter. h" 5 #include "content/browser/renderer_host/pepper/pepper_tcp_socket_message_filter. h"
6 6
7 #include <cstring> 7 #include <cstring>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 : version_(version), 56 : version_(version),
57 external_plugin_(host->external_plugin()), 57 external_plugin_(host->external_plugin()),
58 render_process_id_(0), 58 render_process_id_(0),
59 render_frame_id_(0), 59 render_frame_id_(0),
60 ppapi_host_(host->GetPpapiHost()), 60 ppapi_host_(host->GetPpapiHost()),
61 factory_(factory), 61 factory_(factory),
62 instance_(instance), 62 instance_(instance),
63 state_(TCPSocketState::INITIAL), 63 state_(TCPSocketState::INITIAL),
64 end_of_file_reached_(false), 64 end_of_file_reached_(false),
65 bind_input_addr_(NetAddressPrivateImpl::kInvalidNetAddress), 65 bind_input_addr_(NetAddressPrivateImpl::kInvalidNetAddress),
66 socket_options_(SOCKET_OPTION_NODELAY),
66 address_index_(0), 67 address_index_(0),
67 socket_(new net::TCPSocket(NULL, net::NetLog::Source())), 68 socket_(new net::TCPSocket(NULL, net::NetLog::Source())),
68 ssl_context_helper_(host->ssl_context_helper()), 69 ssl_context_helper_(host->ssl_context_helper()),
69 pending_accept_(false) { 70 pending_accept_(false) {
70 DCHECK(host); 71 DCHECK(host);
71 ++g_num_instances; 72 ++g_num_instances;
72 if (!host->GetRenderFrameIDsForInstance( 73 if (!host->GetRenderFrameIDsForInstance(
73 instance, &render_process_id_, &render_frame_id_)) { 74 instance, &render_process_id_, &render_frame_id_)) {
74 NOTREACHED(); 75 NOTREACHED();
75 } 76 }
76 } 77 }
77 78
78 PepperTCPSocketMessageFilter::PepperTCPSocketMessageFilter( 79 PepperTCPSocketMessageFilter::PepperTCPSocketMessageFilter(
79 BrowserPpapiHostImpl* host, 80 BrowserPpapiHostImpl* host,
80 PP_Instance instance, 81 PP_Instance instance,
81 TCPSocketVersion version, 82 TCPSocketVersion version,
82 scoped_ptr<net::TCPSocket> socket) 83 scoped_ptr<net::TCPSocket> socket)
83 : version_(version), 84 : version_(version),
84 external_plugin_(host->external_plugin()), 85 external_plugin_(host->external_plugin()),
85 render_process_id_(0), 86 render_process_id_(0),
86 render_frame_id_(0), 87 render_frame_id_(0),
87 ppapi_host_(host->GetPpapiHost()), 88 ppapi_host_(host->GetPpapiHost()),
88 factory_(NULL), 89 factory_(NULL),
89 instance_(instance), 90 instance_(instance),
90 state_(TCPSocketState::CONNECTED), 91 state_(TCPSocketState::CONNECTED),
91 end_of_file_reached_(false), 92 end_of_file_reached_(false),
92 bind_input_addr_(NetAddressPrivateImpl::kInvalidNetAddress), 93 bind_input_addr_(NetAddressPrivateImpl::kInvalidNetAddress),
94 socket_options_(SOCKET_OPTION_NODELAY),
93 address_index_(0), 95 address_index_(0),
94 socket_(socket.Pass()), 96 socket_(socket.Pass()),
95 ssl_context_helper_(host->ssl_context_helper()), 97 ssl_context_helper_(host->ssl_context_helper()),
96 pending_accept_(false) { 98 pending_accept_(false) {
97 DCHECK(host); 99 DCHECK(host);
98 DCHECK_NE(version, ppapi::TCP_SOCKET_VERSION_1_0); 100 DCHECK_NE(version, ppapi::TCP_SOCKET_VERSION_1_0);
99 101
100 ++g_num_instances; 102 ++g_num_instances;
101 if (!host->GetRenderFrameIDsForInstance( 103 if (!host->GetRenderFrameIDsForInstance(
102 instance, &render_process_id_, &render_frame_id_)) { 104 instance, &render_process_id_, &render_frame_id_)) {
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 } 451 }
450 452
451 int32_t PepperTCPSocketMessageFilter::OnMsgSetOption( 453 int32_t PepperTCPSocketMessageFilter::OnMsgSetOption(
452 const ppapi::host::HostMessageContext* context, 454 const ppapi::host::HostMessageContext* context,
453 PP_TCPSocket_Option name, 455 PP_TCPSocket_Option name,
454 const ppapi::SocketOptionData& value) { 456 const ppapi::SocketOptionData& value) {
455 DCHECK_CURRENTLY_ON(BrowserThread::IO); 457 DCHECK_CURRENTLY_ON(BrowserThread::IO);
456 458
457 switch (name) { 459 switch (name) {
458 case PP_TCPSOCKET_OPTION_NO_DELAY: { 460 case PP_TCPSOCKET_OPTION_NO_DELAY: {
459 if (state_.state() != TCPSocketState::CONNECTED)
460 return PP_ERROR_FAILED;
461
462 bool boolean_value = false; 461 bool boolean_value = false;
463 if (!value.GetBool(&boolean_value)) 462 if (!value.GetBool(&boolean_value))
464 return PP_ERROR_BADARGUMENT; 463 return PP_ERROR_BADARGUMENT;
465 return socket_->SetNoDelay(boolean_value) ? PP_OK : PP_ERROR_FAILED; 464 if (state_.state() == TCPSocketState::CONNECTED)
465 return socket_->SetNoDelay(boolean_value) ? PP_OK : PP_ERROR_FAILED;
466
467 if (boolean_value) {
468 socket_options_ |= SOCKET_OPTION_NODELAY;
469 } else {
470 socket_options_ &= ~SOCKET_OPTION_NODELAY;
471 }
472 return PP_OK;
466 } 473 }
467 case PP_TCPSOCKET_OPTION_SEND_BUFFER_SIZE: 474 case PP_TCPSOCKET_OPTION_SEND_BUFFER_SIZE:
468 case PP_TCPSOCKET_OPTION_RECV_BUFFER_SIZE: { 475 case PP_TCPSOCKET_OPTION_RECV_BUFFER_SIZE: {
469 if (state_.state() != TCPSocketState::CONNECTED)
470 return PP_ERROR_FAILED;
471
472 int32_t integer_value = 0; 476 int32_t integer_value = 0;
473 if (!value.GetInt32(&integer_value) || integer_value <= 0) 477 if (!value.GetInt32(&integer_value) || integer_value <= 0)
474 return PP_ERROR_BADARGUMENT; 478 return PP_ERROR_BADARGUMENT;
475 479
476 int net_result = net::ERR_UNEXPECTED;
477 if (name == PP_TCPSOCKET_OPTION_SEND_BUFFER_SIZE) { 480 if (name == PP_TCPSOCKET_OPTION_SEND_BUFFER_SIZE) {
478 if (integer_value > TCPSocketResourceBase::kMaxSendBufferSize) 481 if (integer_value > TCPSocketResourceBase::kMaxSendBufferSize)
479 return PP_ERROR_BADARGUMENT; 482 return PP_ERROR_BADARGUMENT;
480 net_result = socket_->SetSendBufferSize(integer_value); 483 if (state_.state() == TCPSocketState::CONNECTED) {
484 return NetErrorToPepperError(
485 socket_->SetSendBufferSize(integer_value));
486 }
487 socket_options_ |= SOCKET_OPTION_SNDBUF_SIZE;
488 sndbuf_size_ = integer_value;
489 return PP_OK;
481 } else { 490 } else {
482 if (integer_value > TCPSocketResourceBase::kMaxReceiveBufferSize) 491 if (integer_value > TCPSocketResourceBase::kMaxReceiveBufferSize)
483 return PP_ERROR_BADARGUMENT; 492 return PP_ERROR_BADARGUMENT;
484 net_result = socket_->SetReceiveBufferSize(integer_value); 493 if (state_.state() == TCPSocketState::CONNECTED) {
494 return NetErrorToPepperError(
495 socket_->SetReceiveBufferSize(integer_value));
496 }
497 socket_options_ |= SOCKET_OPTION_RCVBUF_SIZE;
498 rcvbuf_size_ = integer_value;
499 return PP_OK;
485 } 500 }
486 // TODO(wtc): Add error mapping code.
487 return (net_result == net::OK) ? PP_OK : PP_ERROR_FAILED;
488 } 501 }
489 default: { 502 default: {
490 NOTREACHED(); 503 NOTREACHED();
491 return PP_ERROR_BADARGUMENT; 504 return PP_ERROR_BADARGUMENT;
492 } 505 }
493 } 506 }
494 } 507 }
495 508
496 void PepperTCPSocketMessageFilter::DoBind( 509 void PepperTCPSocketMessageFilter::DoBind(
497 const ppapi::host::ReplyMessageContext& context, 510 const ppapi::host::ReplyMessageContext& context,
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 &local_addr) || 755 &local_addr) ||
743 !NetAddressPrivateImpl::IPEndPointToNetAddress( 756 !NetAddressPrivateImpl::IPEndPointToNetAddress(
744 ip_end_point_remote.address(), 757 ip_end_point_remote.address(),
745 ip_end_point_remote.port(), 758 ip_end_point_remote.port(),
746 &remote_addr)) { 759 &remote_addr)) {
747 pp_result = PP_ERROR_ADDRESS_INVALID; 760 pp_result = PP_ERROR_ADDRESS_INVALID;
748 break; 761 break;
749 } 762 }
750 763
751 socket_->SetDefaultOptionsForClient(); 764 socket_->SetDefaultOptionsForClient();
765 // NODELAY is set by SetDefaultOptionsForClient().
766 if (!(socket_options_ & SOCKET_OPTION_NODELAY)) {
767 pp_result = NetErrorToPepperError(socket_->SetNoDelay(false));
768 if (pp_result != PP_OK)
769 break;
770 }
771 if (socket_options_ & SOCKET_OPTION_RCVBUF_SIZE) {
772 pp_result = NetErrorToPepperError(
773 socket_->SetReceiveBufferSize(rcvbuf_size_));
774 if (pp_result != PP_OK)
775 break;
776 }
777 if (socket_options_ & SOCKET_OPTION_SNDBUF_SIZE) {
778 pp_result = NetErrorToPepperError(
779 socket_->SetSendBufferSize(sndbuf_size_));
780 if (pp_result != PP_OK)
781 break;
782 }
783 socket_options_ = SOCKET_OPTION_NODELAY;
752 SendConnectReply(context, PP_OK, local_addr, remote_addr); 784 SendConnectReply(context, PP_OK, local_addr, remote_addr);
753 state_.CompletePendingTransition(true); 785 state_.CompletePendingTransition(true);
754 return; 786 return;
755 } while (false); 787 } while (false);
756 788
757 if (version_ == ppapi::TCP_SOCKET_VERSION_1_1_OR_ABOVE) { 789 if (version_ == ppapi::TCP_SOCKET_VERSION_1_1_OR_ABOVE) {
758 DCHECK_EQ(1u, address_list_.size()); 790 DCHECK_EQ(1u, address_list_.size());
759 791
760 SendConnectError(context, pp_result); 792 SendConnectError(context, pp_result);
jar (doing other things) 2014/11/04 22:51:08 What are the list of previously expectable error c
hidehiko 2014/11/05 12:48:29 IIUC, it is not managed, at least not-documented.
761 state_.CompletePendingTransition(false); 793 state_.CompletePendingTransition(false);
762 } else { 794 } else {
763 // We have to recreate |socket_| because it doesn't allow a second connect 795 // We have to recreate |socket_| because it doesn't allow a second connect
764 // attempt. We won't lose any state such as bound address or set options, 796 // attempt. We won't lose any state such as bound address or set options,
765 // because in the private or v1.0 API, connect must be the first operation. 797 // because in the private or v1.0 API, connect must be the first operation.
jar (doing other things) 2014/11/04 22:51:09 This comment appears to be broken by this change.
hidehiko 2014/11/05 12:48:29 I think this is still correct comment? Could you k
766 socket_.reset(new net::TCPSocket(NULL, net::NetLog::Source())); 798 socket_.reset(new net::TCPSocket(NULL, net::NetLog::Source()));
767 799
768 if (address_index_ + 1 < address_list_.size()) { 800 if (address_index_ + 1 < address_list_.size()) {
769 DCHECK_EQ(version_, ppapi::TCP_SOCKET_VERSION_PRIVATE); 801 DCHECK_EQ(version_, ppapi::TCP_SOCKET_VERSION_PRIVATE);
770 address_index_++; 802 address_index_++;
771 StartConnect(context); 803 StartConnect(context);
772 } else { 804 } else {
773 SendConnectError(context, pp_result); 805 SendConnectError(context, pp_result);
774 // In order to maintain backward compatibility, allow further attempts to 806 // In order to maintain backward compatibility, allow further attempts to
775 // connect the socket. 807 // connect the socket.
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
993 const ppapi::host::ReplyMessageContext& context, 1025 const ppapi::host::ReplyMessageContext& context,
994 int32_t pp_error) { 1026 int32_t pp_error) {
995 SendAcceptReply(context, 1027 SendAcceptReply(context,
996 pp_error, 1028 pp_error,
997 0, 1029 0,
998 NetAddressPrivateImpl::kInvalidNetAddress, 1030 NetAddressPrivateImpl::kInvalidNetAddress,
999 NetAddressPrivateImpl::kInvalidNetAddress); 1031 NetAddressPrivateImpl::kInvalidNetAddress);
1000 } 1032 }
1001 1033
1002 } // namespace content 1034 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698