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 0d37776841951678e24a0cf1108f2350c5cccfa6..fe63ce8adf32e73bf916c3f55c81c6c27742560f 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 |
@@ -33,6 +33,10 @@ |
#include "ppapi/shared_impl/private/net_address_private_impl.h" |
#include "ppapi/shared_impl/socket_option_data.h" |
+#if defined(OS_CHROMEOS) |
+#include "chromeos/network/firewall_hole.h" |
+#endif // defined(OS_CHROMEOS) |
+ |
using ppapi::NetAddressPrivateImpl; |
using ppapi::host::NetErrorToPepperError; |
using ppapi::proxy::UDPSocketFilter; |
@@ -490,12 +494,52 @@ void PepperUDPSocketMessageFilter::DoBind( |
return; |
} |
bbudge
2015/07/09 19:55:17
Have chromeos-specific code here to make it cleare
avallee
2015/07/13 18:29:10
Done.
|
+ base::Closure bind_complete = base::Bind( |
bbudge
2015/07/09 19:55:17
Do this inline, since there is only one consumer o
avallee
2015/07/13 18:29:10
Done.
|
+ &PepperUDPSocketMessageFilter::OnBindComplete, base::Unretained(this), |
+ base::Passed(&socket), context, net_address); |
+ MaybeOpenFirewallHole(bound_address, bind_complete); |
+} |
+ |
+void PepperUDPSocketMessageFilter::OnBindComplete( |
+ scoped_ptr<net::UDPSocket> socket, |
+ const ppapi::host::ReplyMessageContext& context, |
+ const PP_NetAddress_Private& net_address) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
socket_.swap(socket); |
SendBindReply(context, PP_OK, net_address); |
DoRecvFrom(); |
} |
+void PepperUDPSocketMessageFilter::MaybeOpenFirewallHole( |
+ const net::IPEndPoint& local_address, |
+ base::Closure bind_complete) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+#if defined(OS_CHROMEOS) |
+ pepper_socket_utils::FirewallHoleOpenCallback callback = |
+ base::Bind(&PepperUDPSocketMessageFilter::OnFirewallHoleOpened, |
+ base::Unretained(this), bind_complete); |
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
+ base::Bind(&pepper_socket_utils::OpenUDPFirewallHole, |
+ local_address, callback)); |
+#else |
+ bind_complete.Run(); |
+#endif // defined(OS_CHROMEOS) |
+} |
+ |
+#if defined(OS_CHROMEOS) |
+void PepperUDPSocketMessageFilter::OnFirewallHoleOpened( |
+ base::Closure bind_complete, |
+ scoped_ptr<chromeos::FirewallHole> hole) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ |
+ LOG_IF(WARNING, !hole.get()) << "Firewall hole could not be opened."; |
+ firewall_hole_.reset(hole.release()); |
+ |
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, bind_complete); |
+} |
+#endif // defined(OS_CHROMEOS) |
+ |
void PepperUDPSocketMessageFilter::DoRecvFrom() { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
DCHECK(!closed_); |