Skip to content

Commit

Permalink
Simplify PPB_NetworkMonitor proxy.
Browse files Browse the repository at this point in the history
The new proxy is based on ppapi::proxy::PluginResource and 
ppapi::host::ResourceHost which simplifies code significantly. Also 
the permission check is consistent with socket APIs now.

BUG=281781

Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=223482

Review URL: https://chromiumcodereview.appspot.com/23819033

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@223494 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
sergeyu@chromium.org committed Sep 17, 2013
1 parent 6ab4a44 commit 2ff98b5
Show file tree
Hide file tree
Showing 28 changed files with 509 additions and 611 deletions.
2 changes: 1 addition & 1 deletion content/browser/ppapi_plugin_process_host.cc
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ PpapiPluginProcessHost::PpapiPluginProcessHost(
info.path, profile_data_directory,
false));

filter_ = new PepperMessageFilter(permissions_);
filter_ = new PepperMessageFilter();
process_->GetHost()->AddFilter(filter_.get());
process_->GetHost()->AddFilter(host_impl_->message_filter().get());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ BrowserPpapiHost* BrowserPpapiHost::CreateExternalPluginProcess(
browser_ppapi_host->set_plugin_process_handle(plugin_child_process);

scoped_refptr<PepperMessageFilter> pepper_message_filter(
new PepperMessageFilter(permissions));
new PepperMessageFilter());
channel->AddFilter(pepper_message_filter);
channel->AddFilter(browser_ppapi_host->message_filter().get());
channel->AddFilter(new TraceMessageFilter());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "content/browser/renderer_host/pepper/pepper_flash_file_message_filter.h"
#include "content/browser/renderer_host/pepper/pepper_gamepad_host.h"
#include "content/browser/renderer_host/pepper/pepper_host_resolver_message_filter.h"
#include "content/browser/renderer_host/pepper/pepper_network_monitor_host.h"
#include "content/browser/renderer_host/pepper/pepper_network_proxy_host.h"
#include "content/browser/renderer_host/pepper/pepper_print_settings_manager.h"
#include "content/browser/renderer_host/pepper/pepper_printing_host.h"
Expand Down Expand Up @@ -198,6 +199,10 @@ scoped_ptr<ResourceHost> ContentBrowserPepperHostFactory::CreateResourceHost(
return scoped_ptr<ResourceHost>();
}
}
if (message.type() == PpapiHostMsg_NetworkMonitor_Create::ID) {
return scoped_ptr<ResourceHost>(
new PepperNetworkMonitorHost(host_, instance, params.pp_resource()));
}

// Flash interfaces.
if (GetPermissions().HasPermission(ppapi::PERMISSION_FLASH)) {
Expand Down
100 changes: 3 additions & 97 deletions content/browser/renderer_host/pepper/pepper_message_filter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,20 @@

#include "content/browser/renderer_host/pepper/pepper_message_filter.h"

#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/logging.h"
#include "content/browser/renderer_host/pepper/pepper_socket_utils.h"
#include "content/browser/renderer_host/render_process_host_impl.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/common/content_client.h"
#include "ppapi/c/private/ppb_network_list_private.h"
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/shared_impl/api_id.h"
#include "ppapi/shared_impl/private/net_address_private_impl.h"

using ppapi::NetAddressPrivateImpl;

namespace content {

PepperMessageFilter::PepperMessageFilter() {}
PepperMessageFilter::~PepperMessageFilter() {}

bool PepperMessageFilter::OnMessageReceived(const IPC::Message& msg,
bool* message_was_ok) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP_EX(PepperMessageFilter, msg, *message_was_ok)
// NetworkMonitor messages.
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBNetworkMonitor_Start,
OnNetworkMonitorStart)
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBNetworkMonitor_Stop,
OnNetworkMonitorStop)

// X509 certificate messages.
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBX509Certificate_ParseDER,
OnX509CertificateParseDER);
Expand All @@ -39,41 +27,6 @@ bool PepperMessageFilter::OnMessageReceived(const IPC::Message& msg,
return handled;
}

void PepperMessageFilter::OnIPAddressChanged() {
GetAndSendNetworkList();
}

PepperMessageFilter::PepperMessageFilter(
const ppapi::PpapiPermissions& permissions)
: permissions_(permissions) {
}

PepperMessageFilter::~PepperMessageFilter() {
if (!network_monitor_ids_.empty())
net::NetworkChangeNotifier::RemoveIPAddressObserver(this);
}

void PepperMessageFilter::OnNetworkMonitorStart(uint32 plugin_dispatcher_id) {
// Support all in-process plugins, and ones with "private" permissions.
if (!permissions_.HasPermission(ppapi::PERMISSION_PRIVATE))
return;

if (network_monitor_ids_.empty())
net::NetworkChangeNotifier::AddIPAddressObserver(this);

network_monitor_ids_.insert(plugin_dispatcher_id);
GetAndSendNetworkList();
}

void PepperMessageFilter::OnNetworkMonitorStop(uint32 plugin_dispatcher_id) {
if (!permissions_.HasPermission(ppapi::PERMISSION_PRIVATE))
return;

network_monitor_ids_.erase(plugin_dispatcher_id);
if (network_monitor_ids_.empty())
net::NetworkChangeNotifier::RemoveIPAddressObserver(this);
}

void PepperMessageFilter::OnX509CertificateParseDER(
const std::vector<char>& der,
bool* succeeded,
Expand All @@ -84,51 +37,4 @@ void PepperMessageFilter::OnX509CertificateParseDER(
pepper_socket_utils::GetCertificateFields(&der[0], der.size(), result);
}

void PepperMessageFilter::GetAndSendNetworkList() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));

BrowserThread::PostBlockingPoolTask(
FROM_HERE, base::Bind(&PepperMessageFilter::DoGetNetworkList, this));
}

void PepperMessageFilter::DoGetNetworkList() {
scoped_ptr<net::NetworkInterfaceList> list(new net::NetworkInterfaceList());
net::GetNetworkList(list.get());
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::Bind(&PepperMessageFilter::SendNetworkList,
this, base::Passed(&list)));
}

void PepperMessageFilter::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, NetAddressPrivateImpl::kInvalidNetAddress);
bool result = 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;
}
for (NetworkMonitorIdSet::iterator it = network_monitor_ids_.begin();
it != network_monitor_ids_.end(); ++it) {
Send(new PpapiMsg_PPBNetworkMonitor_NetworkList(
ppapi::API_ID_PPB_NETWORKMANAGER_PRIVATE, *it, *list_copy));
}
}

} // namespace content
36 changes: 3 additions & 33 deletions content/browser/renderer_host/pepper/pepper_message_filter.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,66 +5,36 @@
#ifndef CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_MESSAGE_FILTER_H_
#define CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_MESSAGE_FILTER_H_

#include <set>
#include <vector>

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/files/file_path.h"
#include "base/memory/scoped_ptr.h"
#include "content/public/browser/browser_message_filter.h"
#include "net/base/net_util.h"
#include "net/base/network_change_notifier.h"
#include "ppapi/shared_impl/ppapi_permissions.h"

namespace ppapi {
class PPB_X509Certificate_Fields;
}

namespace content {

// Message filter that handles IPC for PPB_NetworkMonitor_Private and
// PPB_X509Certificate_Private.
class PepperMessageFilter
: public BrowserMessageFilter,
public net::NetworkChangeNotifier::IPAddressObserver {
// Message filter that handles IPC for PPB_X509Certificate_Private.
class PepperMessageFilter : public BrowserMessageFilter {
public:
explicit PepperMessageFilter(const ppapi::PpapiPermissions& permissions);
PepperMessageFilter();

// BrowserMessageFilter methods.
virtual bool OnMessageReceived(const IPC::Message& message,
bool* message_was_ok) OVERRIDE;

// net::NetworkChangeNotifier::IPAddressObserver interface.
virtual void OnIPAddressChanged() OVERRIDE;

protected:
virtual ~PepperMessageFilter();

private:
// Set of disptachers ID's that have subscribed for NetworkMonitor
// notifications.
typedef std::set<uint32> NetworkMonitorIdSet;

void OnNetworkMonitorStart(uint32 plugin_dispatcher_id);
void OnNetworkMonitorStop(uint32 plugin_dispatcher_id);

void OnX509CertificateParseDER(const std::vector<char>& der,
bool* succeeded,
ppapi::PPB_X509Certificate_Fields* result);

void GetAndSendNetworkList();
void DoGetNetworkList();
void SendNetworkList(scoped_ptr<net::NetworkInterfaceList> list);

// When attached to an out-of-process plugin (be it native or NaCl) this
// will have the Pepper permissions for the plugin. When attached to the
// renderer channel, this will have no permissions listed (since there may
// be many plugins sharing this channel).
ppapi::PpapiPermissions permissions_;

NetworkMonitorIdSet network_monitor_ids_;

DISALLOW_COPY_AND_ASSIGN(PepperMessageFilter);
};

Expand Down
118 changes: 118 additions & 0 deletions content/browser/renderer_host/pepper/pepper_network_monitor_host.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
// 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 */, 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)
: ResourceHost(host->GetPpapiHost(), instance, resource),
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()->SendUnsolicitedReply(pp_resource(),
PpapiPluginMsg_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::proxy::SerializedNetworkList> list_copy(
new ppapi::proxy::SerializedNetworkList(list->size()));
for (size_t i = 0; i < list->size(); ++i) {
const net::NetworkInterface& network = list->at(i);
ppapi::proxy::SerializedNetworkInfo& 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()->SendUnsolicitedReply(
pp_resource(), PpapiPluginMsg_NetworkMonitor_NetworkList(*list_copy));
}

} // namespace content
Loading

0 comments on commit 2ff98b5

Please sign in to comment.