Chromium Code Reviews| Index: content/browser/renderer_host/pepper/pepper_network_monitor_host.cc |
| diff --git a/content/browser/renderer_host/pepper/pepper_network_monitor_host.cc b/content/browser/renderer_host/pepper/pepper_network_monitor_host.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e1169e92c73e811bc38b5e8228ee30c9ab16f2d9 |
| --- /dev/null |
| +++ b/content/browser/renderer_host/pepper/pepper_network_monitor_host.cc |
| @@ -0,0 +1,120 @@ |
| +// Copyright 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/browser/renderer_host/pepper/pepper_network_monitor_host.h" |
| + |
| +#include "content/browser/renderer_host/pepper/browser_ppapi_host_impl.h" |
| +#include "content/browser/renderer_host/pepper/pepper_socket_utils.h" |
| +#include "content/public/browser/browser_thread.h" |
| +#include "content/public/common/socket_permission_request.h" |
| +#include "ppapi/proxy/ppapi_messages.h" |
| +#include "ppapi/shared_impl/private/net_address_private_impl.h" |
| + |
| +namespace content { |
| + |
| +namespace { |
| + |
| +bool CanUseNetworkMonitor(bool external_plugin, |
| + int render_process_id, |
| + int render_view_id) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + |
| + SocketPermissionRequest request = |
| + SocketPermissionRequest(SocketPermissionRequest::NETWORK_STATE, |
| + std::string(), 0); |
| + return pepper_socket_utils::CanUseSocketAPIs( |
| + external_plugin, true /* private_api */, |
|
yzshen1
2013/09/11 22:51:26
wrong indent.
Sergey Ulanov
2013/09/12 07:01:51
Done.
|
| + request, render_process_id, render_view_id); |
| +} |
| + |
| +scoped_ptr<net::NetworkInterfaceList> GetNetworkList() { |
| + scoped_ptr<net::NetworkInterfaceList> list(new net::NetworkInterfaceList()); |
| + net::GetNetworkList(list.get()); |
| + return list.Pass(); |
| +} |
| + |
| +} // namespace |
| + |
| +PepperNetworkMonitorHost::PepperNetworkMonitorHost( |
| + BrowserPpapiHostImpl* host, |
| + PP_Instance instance, |
| + PP_Resource resource, |
| + const ppapi::host::HostMessageContext& context) |
| + : ResourceHost(host->GetPpapiHost(), instance, resource), |
| + reply_context_(context.MakeReplyMessageContext()), |
|
yzshen1
2013/09/11 22:51:26
This makes a "reply" for the Create message, which
Sergey Ulanov
2013/09/12 07:01:51
Done.
|
| + weak_factory_(this) { |
| + int render_process_id; |
| + int render_view_id; |
| + host->GetRenderViewIDsForInstance(instance, |
| + &render_process_id, |
| + &render_view_id); |
| + |
| + BrowserThread::PostTaskAndReplyWithResult( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&CanUseNetworkMonitor, host->external_plugin(), |
| + render_process_id, render_view_id), |
| + base::Bind(&PepperNetworkMonitorHost::OnPermissionCheckResult, |
| + weak_factory_.GetWeakPtr())); |
| +} |
| + |
| +PepperNetworkMonitorHost::~PepperNetworkMonitorHost() { |
| + net::NetworkChangeNotifier::RemoveIPAddressObserver(this); |
| +} |
| + |
| +void PepperNetworkMonitorHost::OnIPAddressChanged() { |
| + GetAndSendNetworkList(); |
| +} |
| + |
| +void PepperNetworkMonitorHost::OnPermissionCheckResult( |
| + bool can_use_network_monitor) { |
| + if (!can_use_network_monitor) { |
| + host()->SendReply(reply_context_, PpapiMsg_NetworkMonitor_Forbidden()); |
| + return; |
| + } |
| + |
| + net::NetworkChangeNotifier::AddIPAddressObserver(this); |
| + GetAndSendNetworkList(); |
| +} |
| + |
| +void PepperNetworkMonitorHost::GetAndSendNetworkList() { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + // Call GetNetworkList() on a thread that allows blocking IO. |
| + base::PostTaskAndReplyWithResult( |
| + BrowserThread::GetBlockingPool(), FROM_HERE, |
| + base::Bind(&GetNetworkList), |
| + base::Bind(&PepperNetworkMonitorHost::SendNetworkList, |
| + weak_factory_.GetWeakPtr())); |
| +} |
| + |
| +void PepperNetworkMonitorHost::SendNetworkList( |
| + scoped_ptr<net::NetworkInterfaceList> list) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + scoped_ptr< ::ppapi::NetworkList> list_copy( |
| + new ::ppapi::NetworkList(list->size())); |
| + for (size_t i = 0; i < list->size(); ++i) { |
| + const net::NetworkInterface& network = list->at(i); |
| + ::ppapi::NetworkInfo& network_copy = list_copy->at(i); |
| + network_copy.name = network.name; |
| + |
| + network_copy.addresses.resize( |
| + 1, ppapi::NetAddressPrivateImpl::kInvalidNetAddress); |
| + bool result = ppapi::NetAddressPrivateImpl::IPEndPointToNetAddress( |
| + network.address, 0, &(network_copy.addresses[0])); |
| + DCHECK(result); |
| + |
| + // TODO(sergeyu): Currently net::NetworkInterfaceList provides |
| + // only name and one IP address. Add all other fields and copy |
| + // them here. |
| + network_copy.type = PP_NETWORKLIST_UNKNOWN; |
| + network_copy.state = PP_NETWORKLIST_UP; |
| + network_copy.display_name = network.name; |
| + network_copy.mtu = 0; |
| + } |
| + host()->SendReply(reply_context_, |
| + PpapiMsg_NetworkMonitor_NetworkList(*list_copy)); |
| +} |
| + |
| +} // namespace content |