Index: content/browser/renderer_host/pepper_message_filter.cc |
diff --git a/content/browser/renderer_host/pepper_message_filter.cc b/content/browser/renderer_host/pepper_message_filter.cc |
index f17f73c4dbcc022a0233c82d7437a49df0a1c280..92a30aec6c764223ee6b3c51fe681322cbb176b2 100644 |
--- a/content/browser/renderer_host/pepper_message_filter.cc |
+++ b/content/browser/renderer_host/pepper_message_filter.cc |
@@ -6,6 +6,7 @@ |
#include "base/bind.h" |
#include "base/bind_helpers.h" |
+#include "base/callback.h" |
#include "base/compiler_specific.h" |
#include "base/logging.h" |
#include "base/memory/ref_counted.h" |
@@ -13,6 +14,7 @@ |
#include "base/process_util.h" |
#include "base/threading/worker_pool.h" |
#include "base/values.h" |
+#include "content/browser/renderer_host/pepper_lookup_request.h" |
#include "content/browser/renderer_host/pepper_tcp_server_socket.h" |
#include "content/browser/renderer_host/pepper_tcp_socket.h" |
#include "content/browser/renderer_host/pepper_udp_socket.h" |
@@ -25,16 +27,18 @@ |
#include "content/public/browser/resource_context.h" |
#include "content/public/browser/site_instance.h" |
#include "content/public/common/content_client.h" |
+#include "net/base/address_family.h" |
#include "net/base/address_list.h" |
#include "net/base/cert_verifier.h" |
#include "net/base/host_port_pair.h" |
-#include "net/base/host_resolver.h" |
-#include "net/base/net_errors.h" |
-#include "net/base/single_request_host_resolver.h" |
+#include "net/base/sys_addrinfo.h" |
#include "ppapi/c/pp_errors.h" |
#include "ppapi/c/private/ppb_flash_net_connector.h" |
+#include "ppapi/c/private/ppb_host_resolver_private.h" |
+#include "ppapi/c/private/ppb_net_address_private.h" |
#include "ppapi/proxy/ppapi_messages.h" |
#include "ppapi/shared_impl/private/net_address_private_impl.h" |
+#include "ppapi/shared_impl/private/ppb_host_resolver_shared.h" |
#include "webkit/plugins/ppapi/ppb_flash_net_connector_impl.h" |
#if defined(ENABLE_FLAPPER_HACKS) |
@@ -88,7 +92,8 @@ void PepperMessageFilter::OverrideThreadForMessage( |
if (message.type() == PpapiHostMsg_PPBTCPSocket_Connect::ID || |
message.type() == PpapiHostMsg_PPBTCPSocket_ConnectWithNetAddress::ID || |
message.type() == PpapiHostMsg_PPBUDPSocket_Bind::ID || |
- message.type() == PpapiHostMsg_PPBTCPServerSocket_Listen::ID) { |
+ message.type() == PpapiHostMsg_PPBTCPServerSocket_Listen::ID || |
+ message.type() == PpapiHostMsg_PPBHostResolver_Resolve::ID) { |
*thread = BrowserThread::UI; |
} |
} |
@@ -131,6 +136,10 @@ bool PepperMessageFilter::OnMessageReceived(const IPC::Message& msg, |
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBTCPServerSocket_Destroy, |
RemoveTCPServerSocket) |
+ // HostResolver messages. |
+ IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBHostResolver_Resolve, |
+ OnHostResolverResolve) |
+ |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP_EX() |
return handled; |
@@ -217,48 +226,6 @@ int ConnectTcpSocket(const PP_NetAddress_Private& addr, |
} // namespace |
-class PepperMessageFilter::LookupRequest { |
- public: |
- LookupRequest(PepperMessageFilter* pepper_message_filter, |
- net::HostResolver* resolver, |
- int routing_id, |
- int request_id, |
- const net::HostResolver::RequestInfo& request_info) |
- : pepper_message_filter_(pepper_message_filter), |
- resolver_(resolver), |
- routing_id_(routing_id), |
- request_id_(request_id), |
- request_info_(request_info) { |
- } |
- |
- void Start() { |
- int result = resolver_.Resolve( |
- request_info_, &addresses_, |
- base::Bind(&LookupRequest::OnLookupFinished, base::Unretained(this)), |
- net::BoundNetLog()); |
- if (result != net::ERR_IO_PENDING) |
- OnLookupFinished(result); |
- } |
- |
- private: |
- void OnLookupFinished(int /*result*/) { |
- pepper_message_filter_->ConnectTcpLookupFinished( |
- routing_id_, request_id_, addresses_); |
- delete this; |
- } |
- |
- PepperMessageFilter* pepper_message_filter_; |
- net::SingleRequestHostResolver resolver_; |
- |
- int routing_id_; |
- int request_id_; |
- net::HostResolver::RequestInfo request_info_; |
- |
- net::AddressList addresses_; |
- |
- DISALLOW_COPY_AND_ASSIGN(LookupRequest); |
-}; |
- |
void PepperMessageFilter::OnConnectTcp(int routing_id, |
int request_id, |
const std::string& host, |
@@ -267,10 +234,18 @@ void PepperMessageFilter::OnConnectTcp(int routing_id, |
net::HostResolver::RequestInfo request_info(net::HostPortPair(host, port)); |
+ scoped_ptr<OnConnectTcpBoundInfo> bound_info(new OnConnectTcpBoundInfo); |
+ bound_info->routing_id = routing_id; |
+ bound_info->request_id = request_id; |
+ |
// The lookup request will delete itself on completion. |
- LookupRequest* lookup_request = |
- new LookupRequest(this, GetHostResolver(), |
- routing_id, request_id, request_info); |
+ PepperLookupRequest<OnConnectTcpBoundInfo>* lookup_request = |
+ new PepperLookupRequest<OnConnectTcpBoundInfo>( |
+ GetHostResolver(), |
+ request_info, |
+ bound_info.release(), |
+ base::Bind(&PepperMessageFilter::ConnectTcpLookupFinished, |
+ this)); |
lookup_request->Start(); |
} |
@@ -302,9 +277,9 @@ bool PepperMessageFilter::SendConnectTcpACKError(int routing_id, |
} |
void PepperMessageFilter::ConnectTcpLookupFinished( |
- int routing_id, |
- int request_id, |
- const net::AddressList& addresses) { |
+ int result, |
+ const net::AddressList& addresses, |
+ const OnConnectTcpBoundInfo& bound_info) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
// If the lookup returned addresses, continue (doing |connect()|) on a worker |
@@ -314,9 +289,9 @@ void PepperMessageFilter::ConnectTcpLookupFinished( |
FROM_HERE, |
base::Bind( |
&PepperMessageFilter::ConnectTcpOnWorkerThread, this, |
- routing_id, request_id, addresses), |
+ bound_info.routing_id, bound_info.request_id, addresses), |
true)) { |
- SendConnectTcpACKError(routing_id, request_id); |
+ SendConnectTcpACKError(bound_info.routing_id, bound_info.request_id); |
} |
} |
@@ -647,6 +622,121 @@ void PepperMessageFilter::OnTCPServerAccept(uint32 real_socket_id) { |
iter->second->Accept(); |
} |
+void PepperMessageFilter::OnHostResolverResolve( |
+ int32 routing_id, |
+ uint32 plugin_dispatcher_id, |
+ uint32 host_resolver_id, |
+ const ppapi::HostPortPair& host_port, |
+ const PP_HostResolver_Private_Hint& hint) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&PepperMessageFilter::DoHostResolverResolve, this, |
+ CanUseSocketAPIs(routing_id), |
+ routing_id, |
+ plugin_dispatcher_id, |
+ host_resolver_id, |
+ host_port, |
+ hint)); |
+} |
+ |
+void PepperMessageFilter::DoHostResolverResolve( |
+ bool allowed, |
+ int32 routing_id, |
+ uint32 plugin_dispatcher_id, |
+ uint32 host_resolver_id, |
+ const ppapi::HostPortPair& host_port, |
+ const PP_HostResolver_Private_Hint& hint) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ if (!allowed) { |
+ SendHostResolverResolveACKError(routing_id, |
+ plugin_dispatcher_id, |
+ host_resolver_id); |
+ return; |
+ } |
+ |
+ net::HostResolver::RequestInfo request_info( |
+ net::HostPortPair(host_port.host, host_port.port)); |
+ |
+ net::AddressFamily address_family; |
+ switch (hint.family) { |
+ case PP_NETADDRESSFAMILY_IPV4: |
+ address_family = net::ADDRESS_FAMILY_IPV4; |
+ break; |
+ case PP_NETADDRESSFAMILY_IPV6: |
+ address_family = net::ADDRESS_FAMILY_IPV6; |
+ break; |
+ default: |
+ address_family = net::ADDRESS_FAMILY_UNSPECIFIED; |
+ } |
+ request_info.set_address_family(address_family); |
+ |
+ net::HostResolverFlags host_resolver_flags = 0; |
+ if (hint.flags & PP_HOST_RESOLVER_FLAGS_CANONNAME) |
+ host_resolver_flags |= net::HOST_RESOLVER_CANONNAME; |
+ if (hint.flags & PP_HOST_RESOLVER_FLAGS_LOOPBACK_ONLY) |
+ host_resolver_flags |= net::HOST_RESOLVER_LOOPBACK_ONLY; |
+ request_info.set_host_resolver_flags(host_resolver_flags); |
+ |
+ scoped_ptr<OnHostResolverResolveBoundInfo> bound_info( |
+ new OnHostResolverResolveBoundInfo); |
+ bound_info->routing_id = routing_id; |
+ bound_info->plugin_dispatcher_id = plugin_dispatcher_id; |
+ bound_info->host_resolver_id = host_resolver_id; |
+ |
+ // The lookup request will delete itself on completion. |
+ PepperLookupRequest<OnHostResolverResolveBoundInfo>* lookup_request = |
+ new PepperLookupRequest<OnHostResolverResolveBoundInfo>( |
+ GetHostResolver(), |
+ request_info, |
+ bound_info.release(), |
+ base::Bind(&PepperMessageFilter::OnHostResolverResolveLookupFinished, |
+ this)); |
+ lookup_request->Start(); |
+} |
+ |
+void PepperMessageFilter::OnHostResolverResolveLookupFinished( |
+ int result, |
+ const net::AddressList& addresses, |
+ const OnHostResolverResolveBoundInfo& bound_info) { |
+ if (result != net::OK) { |
+ SendHostResolverResolveACKError(bound_info.routing_id, |
+ bound_info.plugin_dispatcher_id, |
+ bound_info.host_resolver_id); |
+ } else { |
+ std::string canonical_name; |
+ addresses.GetCanonicalName(&canonical_name); |
+ scoped_ptr<ppapi::NetAddressList> net_address_list( |
+ ppapi::CreateNetAddressListFromAddrInfo(addresses.head())); |
+ if (!net_address_list.get()) { |
+ SendHostResolverResolveACKError(bound_info.routing_id, |
+ bound_info.plugin_dispatcher_id, |
+ bound_info.host_resolver_id); |
+ } else { |
+ Send(new PpapiMsg_PPBHostResolver_ResolveACK( |
+ bound_info.routing_id, |
+ bound_info.plugin_dispatcher_id, |
+ bound_info.host_resolver_id, |
+ true, |
+ canonical_name, |
+ *net_address_list.get())); |
+ } |
+ } |
+} |
+ |
+bool PepperMessageFilter::SendHostResolverResolveACKError( |
+ int32 routing_id, |
+ uint32 plugin_dispatcher_id, |
+ uint32 host_resolver_id) { |
+ return Send(new PpapiMsg_PPBHostResolver_ResolveACK( |
+ routing_id, |
+ plugin_dispatcher_id, |
+ host_resolver_id, |
+ false, |
+ "", |
+ ppapi::NetAddressList())); |
+} |
+ |
void PepperMessageFilter::GetFontFamiliesComplete( |
IPC::Message* reply_msg, |
scoped_ptr<base::ListValue> result) { |