pepper_network_monitor_host.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
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,
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                          int render_view_id) {
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(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,
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      render_view_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());
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  net::GetNetworkList(list.get());
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;
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int render_view_id;
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  host->GetRenderViewIDsForInstance(instance,
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                    &render_process_id,
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                    &render_view_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(),
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                 render_process_id, render_view_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() {
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(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) {
94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(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