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

Unified Diff: content/browser/renderer_host/pepper/pepper_udp_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 side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
diff --git a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
index 26c0e44ee34f6277a36309c6dd4b5c2c73a0e4c1..1f32678dcfffb3f974f79a2ae82166518e180392 100644
--- a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
+++ b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
@@ -44,8 +44,7 @@ PepperUDPSocketMessageFilter::PepperUDPSocketMessageFilter(
BrowserPpapiHostImpl* host,
PP_Instance instance,
bool private_api)
- : allow_address_reuse_(false),
- allow_broadcast_(false),
+ : socket_options_(0),
closed_(false),
remaining_recv_slots_(
ppapi::proxy::UDPSocketResourceBase::kPluginReceiveBufferSlots),
@@ -114,49 +113,71 @@ int32_t PepperUDPSocketMessageFilter::OnMsgSetOption(
return PP_ERROR_FAILED;
switch (name) {
- case PP_UDPSOCKET_OPTION_ADDRESS_REUSE:
- case PP_UDPSOCKET_OPTION_BROADCAST: {
+ case PP_UDPSOCKET_OPTION_ADDRESS_REUSE: {
+ bool boolean_value = false;
+ if (!value.GetBool(&boolean_value))
+ return PP_ERROR_BADARGUMENT;
+
if (socket_.get()) {
- // They only take effect before the socket is bound.
- return PP_ERROR_FAILED;
+ return NetErrorToPepperError(
+ boolean_value ?
+ socket_->AllowAddressReuse() : socket_->DisallowAddressReuse());
}
-
+ if (boolean_value) {
+ socket_options_ |= SOCKET_OPTION_ADDRESS_REUSE;
+ } else {
+ socket_options_ &= ~SOCKET_OPTION_ADDRESS_REUSE;
+ }
+ return PP_OK;
+ }
+ case PP_UDPSOCKET_OPTION_BROADCAST: {
bool boolean_value = false;
if (!value.GetBool(&boolean_value))
return PP_ERROR_BADARGUMENT;
- if (name == PP_UDPSOCKET_OPTION_ADDRESS_REUSE)
- allow_address_reuse_ = boolean_value;
- else
- allow_broadcast_ = boolean_value;
+ if (socket_.get()) {
+ return NetErrorToPepperError(
+ boolean_value ?
+ socket_->AllowBroadcast() : socket_->DisallowBroadcast());
+ }
+ if (boolean_value) {
+ socket_options_ |= SOCKET_OPTION_BROADCAST;
+ } else {
+ socket_options_ &= ~SOCKET_OPTION_BROADCAST;
+ }
return PP_OK;
}
case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE:
case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: {
- if (!socket_.get()) {
- // They only take effect after the socket is bound.
- 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_UDPSOCKET_OPTION_SEND_BUFFER_SIZE) {
if (integer_value >
ppapi::proxy::UDPSocketResourceBase::kMaxSendBufferSize) {
return PP_ERROR_BADARGUMENT;
}
- net_result = socket_->SetSendBufferSize(integer_value);
+ if (socket_.get()) {
+ return NetErrorToPepperError(
+ socket_->SetSendBufferSize(integer_value));
+ }
+ socket_options_ |= SOCKET_OPTION_SNDBUF_SIZE;
+ sndbuf_size_ = integer_value;
+ return PP_OK;
} else {
if (integer_value >
ppapi::proxy::UDPSocketResourceBase::kMaxReceiveBufferSize) {
return PP_ERROR_BADARGUMENT;
}
- net_result = socket_->SetReceiveBufferSize(integer_value);
+ if (socket_.get()) {
+ 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();
@@ -263,12 +284,38 @@ void PepperUDPSocketMessageFilter::DoBind(
return;
}
- if (allow_address_reuse_)
- socket->AllowAddressReuse();
- if (allow_broadcast_)
- socket->AllowBroadcast();
+ int32_t pp_result;
+ if (socket_options_ & SOCKET_OPTION_ADDRESS_REUSE) {
+ pp_result = NetErrorToPepperError(socket->AllowAddressReuse());
+ if (pp_result != PP_OK) {
+ SendBindError(context, pp_result);
+ return;
+ }
+ }
+ if (socket_options_ & SOCKET_OPTION_BROADCAST) {
+ pp_result = NetErrorToPepperError(socket->AllowBroadcast());
+ if (pp_result != PP_OK) {
+ SendBindError(context, pp_result);
+ return;
+ }
+ }
+ if (socket_options_ & SOCKET_OPTION_RCVBUF_SIZE) {
+ pp_result = NetErrorToPepperError(
+ socket->SetReceiveBufferSize(rcvbuf_size_));
+ if (pp_result != PP_OK) {
+ SendBindError(context, pp_result);
+ return;
+ }
+ }
+ if (socket_options_ & SOCKET_OPTION_SNDBUF_SIZE) {
+ pp_result = NetErrorToPepperError(socket->SetSendBufferSize(sndbuf_size_));
+ if (pp_result != PP_OK) {
+ SendBindError(context, pp_result);
+ return;
+ }
+ }
- int32_t pp_result =
+ pp_result =
NetErrorToPepperError(socket->Listen(net::IPEndPoint(address, port)));
if (pp_result != PP_OK) {
SendBindError(context, pp_result);
@@ -289,8 +336,7 @@ void PepperUDPSocketMessageFilter::DoBind(
return;
}
- allow_address_reuse_ = false;
- allow_broadcast_ = false;
+ socket_options_ = 0;
socket_.swap(socket);
SendBindReply(context, PP_OK, net_address);

Powered by Google App Engine
This is Rietveld 408576698