Skip to content

Commit

Permalink
Revert r223494 "Simplify PPB_NetworkMonitor proxy."
Browse files Browse the repository at this point in the history
TBR=sergeyu@chromium.org
BUG=281781

Review URL: https://codereview.chromium.org/23514062

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@223497 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
sergeyu@chromium.org committed Sep 17, 2013
1 parent 2cd8d64 commit 7008c98
Show file tree
Hide file tree
Showing 28 changed files with 611 additions and 509 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();
filter_ = new PepperMessageFilter(permissions_);
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());
new PepperMessageFilter(permissions));
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,7 +11,6 @@
#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 @@ -199,10 +198,6 @@ 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: 97 additions & 3 deletions content/browser/renderer_host/pepper/pepper_message_filter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,32 @@

#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"

namespace content {
using ppapi::NetAddressPrivateImpl;

PepperMessageFilter::PepperMessageFilter() {}
PepperMessageFilter::~PepperMessageFilter() {}
namespace content {

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 @@ -27,6 +39,41 @@ 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 @@ -37,4 +84,51 @@ 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: 33 additions & 3 deletions content/browser/renderer_host/pepper/pepper_message_filter.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,36 +5,66 @@
#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_X509Certificate_Private.
class PepperMessageFilter : public BrowserMessageFilter {
// Message filter that handles IPC for PPB_NetworkMonitor_Private and
// PPB_X509Certificate_Private.
class PepperMessageFilter
: public BrowserMessageFilter,
public net::NetworkChangeNotifier::IPAddressObserver {
public:
PepperMessageFilter();
explicit PepperMessageFilter(const ppapi::PpapiPermissions& permissions);

// 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: 0 additions & 118 deletions content/browser/renderer_host/pepper/pepper_network_monitor_host.cc

This file was deleted.

Loading

0 comments on commit 7008c98

Please sign in to comment.