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

Unified Diff: content/browser/renderer_host/pepper_message_filter.cc

Issue 9455092: HostResolver is exposed to plugin. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Sync. Created 8 years, 9 months 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_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) {

Powered by Google App Engine
This is Rietveld 408576698