Index: content/browser/renderer_host/pepper/pepper_message_filter.cc |
diff --git a/content/browser/renderer_host/pepper/pepper_message_filter.cc b/content/browser/renderer_host/pepper/pepper_message_filter.cc |
index 648b3a31470c76bb5e802dcff7b92efacd7829fb..c58eb4aafc1db245e203578f5c1beb213b1fd671 100644 |
--- a/content/browser/renderer_host/pepper/pepper_message_filter.cc |
+++ b/content/browser/renderer_host/pepper/pepper_message_filter.cc |
@@ -18,9 +18,9 @@ |
#include "base/threading/worker_pool.h" |
#include "build/build_config.h" |
#include "content/browser/renderer_host/pepper/pepper_lookup_request.h" |
+#include "content/browser/renderer_host/pepper/pepper_socket_utils.h" |
#include "content/browser/renderer_host/pepper/pepper_tcp_server_socket.h" |
#include "content/browser/renderer_host/pepper/pepper_tcp_socket.h" |
-#include "content/browser/renderer_host/pepper/pepper_udp_socket.h" |
#include "content/browser/renderer_host/render_process_host_impl.h" |
#include "content/browser/renderer_host/render_view_host_impl.h" |
#include "content/common/pepper_messages.h" |
@@ -28,7 +28,6 @@ |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/content_browser_client.h" |
#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" |
@@ -68,17 +67,17 @@ void CreateNetAddressListFromAddressList( |
} // namespace |
-PepperMessageFilter::PepperMessageFilter(ProcessType type, |
+PepperMessageFilter::PepperMessageFilter(ProcessType process_type, |
int process_id, |
BrowserContext* browser_context) |
- : process_type_(type), |
+ : process_type_(process_type), |
permissions_(), |
process_id_(process_id), |
nacl_render_view_id_(0), |
resource_context_(browser_context->GetResourceContext()), |
host_resolver_(NULL), |
next_socket_id_(1) { |
- DCHECK(type == RENDERER); |
+ DCHECK(process_type == PROCESS_TYPE_RENDERER); |
DCHECK(browser_context); |
// Keep BrowserContext data in FILE-thread friendly storage. |
browser_path_ = browser_context->GetPath(); |
@@ -87,10 +86,10 @@ PepperMessageFilter::PepperMessageFilter(ProcessType type, |
} |
PepperMessageFilter::PepperMessageFilter( |
- ProcessType type, |
+ ProcessType process_type, |
const ppapi::PpapiPermissions& permissions, |
net::HostResolver* host_resolver) |
- : process_type_(type), |
+ : process_type_(process_type), |
permissions_(permissions), |
process_id_(0), |
nacl_render_view_id_(0), |
@@ -98,24 +97,24 @@ PepperMessageFilter::PepperMessageFilter( |
host_resolver_(host_resolver), |
next_socket_id_(1), |
incognito_(false) { |
- DCHECK(type == PLUGIN); |
+ DCHECK(process_type == PROCESS_TYPE_PPAPI_PLUGIN); |
DCHECK(host_resolver); |
} |
PepperMessageFilter::PepperMessageFilter( |
- ProcessType type, |
+ ProcessType process_type, |
const ppapi::PpapiPermissions& permissions, |
net::HostResolver* host_resolver, |
int process_id, |
int render_view_id) |
- : process_type_(type), |
+ : process_type_(process_type), |
permissions_(permissions), |
process_id_(process_id), |
nacl_render_view_id_(render_view_id), |
resource_context_(NULL), |
host_resolver_(host_resolver), |
next_socket_id_(1) { |
- DCHECK(type == NACL); |
+ DCHECK(process_type == PROCESS_TYPE_NACL_LOADER); |
DCHECK(host_resolver); |
} |
@@ -125,8 +124,6 @@ void PepperMessageFilter::OverrideThreadForMessage( |
if (message.type() == PpapiHostMsg_PPBTCPServerSocket_Listen::ID || |
message.type() == PpapiHostMsg_PPBTCPSocket_Connect::ID || |
message.type() == PpapiHostMsg_PPBTCPSocket_ConnectWithNetAddress::ID || |
- message.type() == PpapiHostMsg_PPBUDPSocket_Bind::ID || |
- message.type() == PpapiHostMsg_PPBUDPSocket_SendTo::ID || |
message.type() == PpapiHostMsg_PPBHostResolver_Resolve::ID) { |
*thread = BrowserThread::UI; |
} |
@@ -147,15 +144,6 @@ bool PepperMessageFilter::OnMessageReceived(const IPC::Message& msg, |
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBTCPSocket_Write, OnTCPWrite) |
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBTCPSocket_Disconnect, OnTCPDisconnect) |
- // UDP messages. |
- IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBUDPSocket_Create, OnUDPCreate) |
- IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBUDPSocket_SetBoolSocketFeature, |
- OnUDPSetBoolSocketFeature) |
- IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBUDPSocket_Bind, OnUDPBind) |
- IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBUDPSocket_RecvFrom, OnUDPRecvFrom) |
- IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBUDPSocket_SendTo, OnUDPSendTo) |
- IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBUDPSocket_Close, OnUDPClose) |
- |
// TCP Server messages. |
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBTCPServerSocket_Listen, |
OnTCPServerListen) |
@@ -282,8 +270,10 @@ void PepperMessageFilter::OnTCPConnectWithNetAddress( |
uint32 socket_id, |
const PP_NetAddress_Private& net_addr) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- bool allowed = CanUseSocketAPIs(routing_id, CreateSocketPermissionRequest( |
- content::SocketPermissionRequest::TCP_CONNECT, net_addr)); |
+ bool allowed = CanUseSocketAPIs( |
+ routing_id, |
+ pepper_socket_utils::CreateSocketPermissionRequest( |
+ content::SocketPermissionRequest::TCP_CONNECT, net_addr)); |
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
base::Bind(&PepperMessageFilter::DoTCPConnectWithNetAddress, this, |
allowed, routing_id, socket_id, net_addr)); |
@@ -357,137 +347,16 @@ void PepperMessageFilter::OnTCPDisconnect(uint32 socket_id) { |
tcp_sockets_.erase(iter); |
} |
-void PepperMessageFilter::OnUDPCreate(int32 routing_id, |
- uint32 plugin_dispatcher_id, |
- uint32* socket_id) { |
- *socket_id = GenerateSocketID(); |
- if (*socket_id == kInvalidSocketID) |
- return; |
- |
- udp_sockets_[*socket_id] = linked_ptr<PepperUDPSocket>( |
- new PepperUDPSocket(this, routing_id, plugin_dispatcher_id, *socket_id)); |
-} |
- |
-void PepperMessageFilter::OnUDPSetBoolSocketFeature( |
- int32 routing_id, |
- uint32 socket_id, |
- int32_t name, |
- bool value) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- UDPSocketMap::iterator iter = udp_sockets_.find(socket_id); |
- if (iter == udp_sockets_.end()) { |
- NOTREACHED(); |
- return; |
- } |
- |
- if (routing_id != iter->second->routing_id()) { |
- NOTREACHED(); |
- return; |
- } |
- |
- switch(static_cast<PP_UDPSocketFeature_Private>(name)) { |
- case PP_UDPSOCKETFEATURE_ADDRESS_REUSE: |
- iter->second->AllowAddressReuse(value); |
- break; |
- case PP_UDPSOCKETFEATURE_BROADCAST: |
- iter->second->AllowBroadcast(value); |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
-} |
- |
-void PepperMessageFilter::OnUDPBind(int32 routing_id, |
- uint32 socket_id, |
- const PP_NetAddress_Private& addr) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- bool allowed = CanUseSocketAPIs(routing_id, CreateSocketPermissionRequest( |
- content::SocketPermissionRequest::UDP_BIND, addr)); |
- BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
- base::Bind(&PepperMessageFilter::DoUDPBind, this, |
- allowed, routing_id, socket_id, addr)); |
-} |
- |
-void PepperMessageFilter::DoUDPBind(bool allowed, |
- int32 routing_id, |
- uint32 socket_id, |
- const PP_NetAddress_Private& addr) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- UDPSocketMap::iterator iter = udp_sockets_.find(socket_id); |
- if (iter == udp_sockets_.end()) { |
- NOTREACHED(); |
- return; |
- } |
- |
- if (routing_id == iter->second->routing_id() && allowed) |
- iter->second->Bind(addr); |
- else |
- iter->second->SendBindACKError(); |
-} |
- |
-void PepperMessageFilter::OnUDPRecvFrom(uint32 socket_id, int32_t num_bytes) { |
- UDPSocketMap::iterator iter = udp_sockets_.find(socket_id); |
- if (iter == udp_sockets_.end()) { |
- NOTREACHED(); |
- return; |
- } |
- |
- iter->second->RecvFrom(num_bytes); |
-} |
- |
-void PepperMessageFilter::OnUDPSendTo(int32 routing_id, |
- uint32 socket_id, |
- const std::string& data, |
- const PP_NetAddress_Private& addr) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- bool allowed = CanUseSocketAPIs(routing_id, CreateSocketPermissionRequest( |
- content::SocketPermissionRequest::UDP_SEND_TO, addr)); |
- BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
- base::Bind(&PepperMessageFilter::DoUDPSendTo, this, |
- allowed, routing_id, socket_id, data, addr)); |
- |
-} |
- |
-void PepperMessageFilter::DoUDPSendTo(bool allowed, |
- int32 routing_id, |
- uint32 socket_id, |
- const std::string& data, |
- const PP_NetAddress_Private& addr) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- UDPSocketMap::iterator iter = udp_sockets_.find(socket_id); |
- if (iter == udp_sockets_.end()) { |
- NOTREACHED(); |
- return; |
- } |
- |
- if (routing_id == iter->second->routing_id() && allowed) |
- iter->second->SendTo(data, addr); |
- else |
- iter->second->SendSendToACKError(); |
-} |
- |
-void PepperMessageFilter::OnUDPClose(uint32 socket_id) { |
- UDPSocketMap::iterator iter = udp_sockets_.find(socket_id); |
- if (iter == udp_sockets_.end()) { |
- NOTREACHED(); |
- return; |
- } |
- |
- // Destroy the UDPSocket instance will cancel any pending completion |
- // callback. From this point on, there won't be any messages associated with |
- // this socket sent to the plugin side. |
- udp_sockets_.erase(iter); |
-} |
- |
void PepperMessageFilter::OnTCPServerListen(int32 routing_id, |
uint32 plugin_dispatcher_id, |
PP_Resource socket_resource, |
const PP_NetAddress_Private& addr, |
int32_t backlog) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- bool allowed = CanUseSocketAPIs(routing_id, CreateSocketPermissionRequest( |
- content::SocketPermissionRequest::TCP_LISTEN, addr)); |
+ bool allowed = CanUseSocketAPIs( |
+ routing_id, |
+ pepper_socket_utils::CreateSocketPermissionRequest( |
+ content::SocketPermissionRequest::TCP_LISTEN, addr)); |
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
base::Bind(&PepperMessageFilter::DoTCPServerListen, |
this, |
@@ -552,8 +421,10 @@ void PepperMessageFilter::OnHostResolverResolve( |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
content::SocketPermissionRequest request( |
content::SocketPermissionRequest::NONE, "", 0); |
- if (process_type_ == NACL && !CanUseSocketAPIs(routing_id, request)) |
+ if (process_type_ == PROCESS_TYPE_NACL_LOADER && |
+ !CanUseSocketAPIs(routing_id, request)) { |
return; |
+ } |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |
@@ -656,7 +527,7 @@ bool PepperMessageFilter::SendHostResolverResolveACKError( |
void PepperMessageFilter::OnNetworkMonitorStart(uint32 plugin_dispatcher_id) { |
// Support all in-process plugins, and ones with "private" permissions. |
- if (process_type_ != RENDERER && |
+ if (process_type_ != PROCESS_TYPE_RENDERER && |
!permissions_.HasPermission(ppapi::PERMISSION_PRIVATE)) |
return; |
@@ -669,7 +540,7 @@ void PepperMessageFilter::OnNetworkMonitorStart(uint32 plugin_dispatcher_id) { |
void PepperMessageFilter::OnNetworkMonitorStop(uint32 plugin_dispatcher_id) { |
// Support all in-process plugins, and ones with "private" permissions. |
- if (process_type_ != RENDERER && |
+ if (process_type_ != PROCESS_TYPE_RENDERER && |
!permissions_.HasPermission(ppapi::PERMISSION_PRIVATE)) |
return; |
@@ -698,10 +569,8 @@ uint32 PepperMessageFilter::GenerateSocketID() { |
// PepperSocketMessageHandler object, because for each plugin or renderer |
// process, there is at most one PepperMessageFilter (in other words, at most |
// one PepperSocketMessageHandler) talking to it. |
- if (tcp_sockets_.size() + udp_sockets_.size() + tcp_server_sockets_.size() >= |
- kMaxSocketsAllowed) { |
+ if (tcp_sockets_.size() + tcp_server_sockets_.size() >= kMaxSocketsAllowed) |
return kInvalidSocketID; |
- } |
uint32 socket_id = kInvalidSocketID; |
do { |
@@ -710,7 +579,6 @@ uint32 PepperMessageFilter::GenerateSocketID() { |
socket_id = next_socket_id_++; |
} while (socket_id == kInvalidSocketID || |
tcp_sockets_.find(socket_id) != tcp_sockets_.end() || |
- udp_sockets_.find(socket_id) != udp_sockets_.end() || |
tcp_server_sockets_.find(socket_id) != tcp_server_sockets_.end()); |
return socket_id; |
@@ -719,46 +587,19 @@ uint32 PepperMessageFilter::GenerateSocketID() { |
bool PepperMessageFilter::CanUseSocketAPIs(int32 render_id, |
const content::SocketPermissionRequest& params) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (process_type_ == PLUGIN) { |
- // Always allow socket APIs for out-process plugins (except NACL). |
- return true; |
- } |
+ |
// NACL plugins always get their own PepperMessageFilter, initialized with |
// a render view id. Use this instead of the one that came with the message, |
// which is actually an API ID. |
- if (process_type_ == NACL) |
+ if (process_type_ == PROCESS_TYPE_NACL_LOADER) |
render_id = nacl_render_view_id_; |
RenderViewHostImpl* render_view_host = |
RenderViewHostImpl::FromID(process_id_, render_id); |
- if (!render_view_host) |
- return false; |
- |
- SiteInstance* site_instance = render_view_host->GetSiteInstance(); |
- if (!site_instance) |
- return false; |
- |
- if (!GetContentClient()->browser()->AllowPepperSocketAPI( |
- site_instance->GetBrowserContext(), |
- site_instance->GetSiteURL(), |
- params)) { |
- LOG(ERROR) << "Host " << site_instance->GetSiteURL().host() |
- << " cannot use socket API or destination is not allowed"; |
- return false; |
- } |
- |
- return true; |
-} |
-content::SocketPermissionRequest |
-PepperMessageFilter::CreateSocketPermissionRequest( |
- content::SocketPermissionRequest::OperationType type, |
- const PP_NetAddress_Private& net_addr) { |
- std::string host = NetAddressPrivateImpl::DescribeNetAddress(net_addr, false); |
- int port = 0; |
- std::vector<unsigned char> address; |
- NetAddressPrivateImpl::NetAddressToIPEndPoint(net_addr, &address, &port); |
- return content::SocketPermissionRequest(type, host, port); |
+ return pepper_socket_utils::CanUseSocketAPIs(process_type_, |
+ params, |
+ render_view_host); |
} |
void PepperMessageFilter::GetAndSendNetworkList() { |