pepper_network_monitor_host.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file. 4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_network_monitor_host.h" 6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/task_runner_util.h" 8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/threading/sequenced_worker_pool.h" 9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/renderer_host/pepper/browser_ppapi_host_impl.h" 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_socket_utils.h" 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/public/common/socket_permission_request.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ppapi/shared_impl/private/net_address_private_impl.h" 15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace content { 18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace { 20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool CanUseNetworkMonitor(bool external_plugin, 22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int render_process_id, 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_frame_id) { 24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::UI); 25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) SocketPermissionRequest request = SocketPermissionRequest( 27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) SocketPermissionRequest::NETWORK_STATE, std::string(), 0); 28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return pepper_socket_utils::CanUseSocketAPIs( 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) external_plugin, false /* private_api */, &request, render_process_id, 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_id); 31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)scoped_ptr<net::NetworkInterfaceList> GetNetworkList() { 34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<net::NetworkInterfaceList> list(new net::NetworkInterfaceList()); 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::GetNetworkList(list.get(), net::INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES); 36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return list.Pass(); 37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} // namespace 40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)PepperNetworkMonitorHost::PepperNetworkMonitorHost( 42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) BrowserPpapiHostImpl* host, 43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PP_Instance instance, 44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PP_Resource resource) 45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) : ResourceHost(host->GetPpapiHost(), instance, resource), 46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) weak_factory_(this) { 47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int render_process_id; 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_frame_id; 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host->GetRenderFrameIDsForInstance(instance, 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &render_process_id, 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &render_frame_id); 52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) BrowserThread::PostTaskAndReplyWithResult( 54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Bind(&CanUseNetworkMonitor, host->external_plugin(), 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_process_id, render_frame_id), 57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Bind(&PepperNetworkMonitorHost::OnPermissionCheckResult, 58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) weak_factory_.GetWeakPtr())); 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)PepperNetworkMonitorHost::~PepperNetworkMonitorHost() { 62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) net::NetworkChangeNotifier::RemoveIPAddressObserver(this); 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void PepperNetworkMonitorHost::OnIPAddressChanged() { 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetAndSendNetworkList(); 67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void PepperNetworkMonitorHost::OnPermissionCheckResult( 70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool can_use_network_monitor) { 71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!can_use_network_monitor) { 72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) host()->SendUnsolicitedReply(pp_resource(), 73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PpapiPluginMsg_NetworkMonitor_Forbidden()); 74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return; 75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) net::NetworkChangeNotifier::AddIPAddressObserver(this); 78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetAndSendNetworkList(); 79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void PepperNetworkMonitorHost::GetAndSendNetworkList() { 82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::IO); 83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Call GetNetworkList() on a thread that allows blocking IO. 85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::PostTaskAndReplyWithResult( 86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) BrowserThread::GetBlockingPool(), FROM_HERE, 87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Bind(&GetNetworkList), 88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Bind(&PepperNetworkMonitorHost::SendNetworkList, 89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) weak_factory_.GetWeakPtr())); 90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void PepperNetworkMonitorHost::SendNetworkList( 93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<net::NetworkInterfaceList> list) { 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::IO); 95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<ppapi::proxy::SerializedNetworkList> list_copy( 97d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) new ppapi::proxy::SerializedNetworkList(list->size())); 98d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (size_t i = 0; i < list->size(); ++i) { 99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const net::NetworkInterface& network = list->at(i); 100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ppapi::proxy::SerializedNetworkInfo& network_copy = list_copy->at(i); 101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) network_copy.name = network.name; 102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) network_copy.addresses.resize( 104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1, ppapi::NetAddressPrivateImpl::kInvalidNetAddress); 105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool result = ppapi::NetAddressPrivateImpl::IPEndPointToNetAddress( 106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) network.address, 0, &(network_copy.addresses[0])); 107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(result); 108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // TODO(sergeyu): Currently net::NetworkInterfaceList provides 110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // only name and one IP address. Add all other fields and copy 111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // them here. 11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) network_copy.type = PP_NETWORKLIST_TYPE_UNKNOWN; 11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) network_copy.state = PP_NETWORKLIST_STATE_UP; 114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) network_copy.display_name = network.name; 115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) network_copy.mtu = 0; 116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) host()->SendUnsolicitedReply( 118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) pp_resource(), PpapiPluginMsg_NetworkMonitor_NetworkList(*list_copy)); 119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} // namespace content 122