diff options
Diffstat (limited to 'content/browser')
-rw-r--r-- | content/browser/pepper_flash_settings_helper_impl.cc | 2 | ||||
-rw-r--r-- | content/browser/plugin_data_remover_impl.cc | 2 | ||||
-rw-r--r-- | content/browser/plugin_service_impl.cc | 30 | ||||
-rw-r--r-- | content/browser/plugin_service_impl.h | 14 | ||||
-rw-r--r-- | content/browser/plugin_service_impl_browsertest.cc | 43 | ||||
-rw-r--r-- | content/browser/renderer_host/render_message_filter.cc | 12 |
6 files changed, 83 insertions, 20 deletions
diff --git a/content/browser/pepper_flash_settings_helper_impl.cc b/content/browser/pepper_flash_settings_helper_impl.cc index bd6af82..557a2d5 100644 --- a/content/browser/pepper_flash_settings_helper_impl.cc +++ b/content/browser/pepper_flash_settings_helper_impl.cc @@ -38,7 +38,7 @@ void PepperFlashSettingsHelperImpl::OpenChannelToBroker( callback_ = callback; PluginServiceImpl* plugin_service = PluginServiceImpl::GetInstance(); - plugin_service->OpenChannelToPpapiBroker(path, this); + plugin_service->OpenChannelToPpapiBroker(0, path, this); } void PepperFlashSettingsHelperImpl::GetPpapiChannelInfo( diff --git a/content/browser/plugin_data_remover_impl.cc b/content/browser/plugin_data_remover_impl.cc index 6b9ca8a..7b8effc 100644 --- a/content/browser/plugin_data_remover_impl.cc +++ b/content/browser/plugin_data_remover_impl.cc @@ -109,7 +109,7 @@ class PluginDataRemoverImpl::Context if (pepper_info) { plugin_name_ = pepper_info->name; // Use the broker since we run this function outside the sandbox. - plugin_service->OpenChannelToPpapiBroker(plugin_path, this); + plugin_service->OpenChannelToPpapiBroker(0, plugin_path, this); } else { plugin_service->OpenChannelToNpapiPlugin( 0, 0, GURL(), GURL(), mime_type, this); diff --git a/content/browser/plugin_service_impl.cc b/content/browser/plugin_service_impl.cc index 9b90fe0..47c3078 100644 --- a/content/browser/plugin_service_impl.cc +++ b/content/browser/plugin_service_impl.cc @@ -259,9 +259,13 @@ PpapiPluginProcessHost* PluginServiceImpl::FindPpapiBrokerProcess( } PluginProcessHost* PluginServiceImpl::FindOrStartNpapiPluginProcess( + int render_process_id, const FilePath& plugin_path) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); + if (filter_ && !filter_->CanLoadPlugin(render_process_id, plugin_path)) + return NULL; + PluginProcessHost* plugin_host = FindNpapiPluginProcess(plugin_path); if (plugin_host) return plugin_host; @@ -281,11 +285,15 @@ PluginProcessHost* PluginServiceImpl::FindOrStartNpapiPluginProcess( } PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiPluginProcess( + int render_process_id, const FilePath& plugin_path, const FilePath& profile_data_directory, PpapiPluginProcessHost::PluginClient* client) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); + if (filter_ && !filter_->CanLoadPlugin(render_process_id, plugin_path)) + return NULL; + PpapiPluginProcessHost* plugin_host = FindPpapiPluginProcess(plugin_path, profile_data_directory); if (plugin_host) @@ -303,9 +311,13 @@ PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiPluginProcess( } PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiBrokerProcess( + int render_process_id, const FilePath& plugin_path) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); + if (filter_ && !filter_->CanLoadPlugin(render_process_id, plugin_path)) + return NULL; + PpapiPluginProcessHost* plugin_host = FindPpapiBrokerProcess(plugin_path); if (plugin_host) return plugin_host; @@ -346,11 +358,12 @@ void PluginServiceImpl::OpenChannelToNpapiPlugin( } void PluginServiceImpl::OpenChannelToPpapiPlugin( + int render_process_id, const FilePath& plugin_path, const FilePath& profile_data_directory, PpapiPluginProcessHost::PluginClient* client) { PpapiPluginProcessHost* plugin_host = FindOrStartPpapiPluginProcess( - plugin_path, profile_data_directory, client); + render_process_id, plugin_path, profile_data_directory, client); if (plugin_host) { plugin_host->OpenChannelToPlugin(client); } else { @@ -360,9 +373,11 @@ void PluginServiceImpl::OpenChannelToPpapiPlugin( } void PluginServiceImpl::OpenChannelToPpapiBroker( + int render_process_id, const FilePath& path, PpapiPluginProcessHost::BrokerClient* client) { - PpapiPluginProcessHost* plugin_host = FindOrStartPpapiBrokerProcess(path); + PpapiPluginProcessHost* plugin_host = FindOrStartPpapiBrokerProcess( + render_process_id, path); if (plugin_host) { plugin_host->OpenChannelToPlugin(client); } else { @@ -411,10 +426,14 @@ void PluginServiceImpl::GetAllowedPluginForOpenChannelToPlugin( BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, base::Bind(&PluginServiceImpl::FinishOpenChannelToPlugin, - base::Unretained(this), plugin_path, client)); + base::Unretained(this), + render_process_id, + plugin_path, + client)); } void PluginServiceImpl::FinishOpenChannelToPlugin( + int render_process_id, const FilePath& plugin_path, PluginProcessHost::Client* client) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); @@ -424,7 +443,8 @@ void PluginServiceImpl::FinishOpenChannelToPlugin( return; pending_plugin_clients_.erase(client); - PluginProcessHost* plugin_host = FindOrStartNpapiPluginProcess(plugin_path); + PluginProcessHost* plugin_host = FindOrStartNpapiPluginProcess( + render_process_id, plugin_path); if (plugin_host) { client->OnFoundPluginProcessHost(plugin_host); plugin_host->OpenChannelToPlugin(client); @@ -463,7 +483,7 @@ bool PluginServiceImpl::GetPluginInfo(int render_process_id, *is_stale = stale; for (size_t i = 0; i < plugins.size(); ++i) { - if (!filter_ || filter_->ShouldUsePlugin(render_process_id, + if (!filter_ || filter_->IsPluginEnabled(render_process_id, render_view_id, context, url, diff --git a/content/browser/plugin_service_impl.h b/content/browser/plugin_service_impl.h index 8808c4b..5ad03ed 100644 --- a/content/browser/plugin_service_impl.h +++ b/content/browser/plugin_service_impl.h @@ -120,13 +120,14 @@ class CONTENT_EXPORT PluginServiceImpl // 'plugin_path' if needed. If the process fails to start, the return value // is NULL. Must be called on the IO thread. PluginProcessHost* FindOrStartNpapiPluginProcess( - const FilePath& plugin_path); + int render_process_id, const FilePath& plugin_path); PpapiPluginProcessHost* FindOrStartPpapiPluginProcess( + int render_process_id, const FilePath& plugin_path, const FilePath& profile_data_directory, PpapiPluginProcessHost::PluginClient* client); PpapiPluginProcessHost* FindOrStartPpapiBrokerProcess( - const FilePath& plugin_path); + int render_process_id, const FilePath& plugin_path); // Opens a channel to a plugin process for the given mime type, starting // a new plugin process if necessary. This must be called on the IO thread @@ -137,10 +138,12 @@ class CONTENT_EXPORT PluginServiceImpl const GURL& page_url, const std::string& mime_type, PluginProcessHost::Client* client); - void OpenChannelToPpapiPlugin(const FilePath& plugin_path, + void OpenChannelToPpapiPlugin(int render_process_id, + const FilePath& plugin_path, const FilePath& profile_data_directory, PpapiPluginProcessHost::PluginClient* client); - void OpenChannelToPpapiBroker(const FilePath& path, + void OpenChannelToPpapiBroker(int render_process_id, + const FilePath& path, PpapiPluginProcessHost::BrokerClient* client); // Cancels opening a channel to a NPAPI plugin. @@ -196,7 +199,8 @@ class CONTENT_EXPORT PluginServiceImpl // Helper so we can finish opening the channel after looking up the // plugin. - void FinishOpenChannelToPlugin(const FilePath& plugin_path, + void FinishOpenChannelToPlugin(int render_process_id, + const FilePath& plugin_path, PluginProcessHost::Client* client); #if defined(OS_POSIX) && !defined(OS_OPENBSD) && !defined(OS_ANDROID) diff --git a/content/browser/plugin_service_impl_browsertest.cc b/content/browser/plugin_service_impl_browsertest.cc index 18780355..0f25185 100644 --- a/content/browser/plugin_service_impl_browsertest.cc +++ b/content/browser/plugin_service_impl_browsertest.cc @@ -9,6 +9,7 @@ #include "base/command_line.h" #include "base/path_service.h" #include "content/public/browser/browser_context.h" +#include "content/public/browser/plugin_service_filter.h" #include "content/public/browser/resource_context.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_switches.h" @@ -36,10 +37,11 @@ void OpenChannel(PluginProcessHost::Client* client) { class MockPluginProcessHostClient : public PluginProcessHost::Client, public IPC::Listener { public: - MockPluginProcessHostClient(ResourceContext* context) + MockPluginProcessHostClient(ResourceContext* context, bool expect_fail) : context_(context), channel_(NULL), - set_plugin_info_called_(false) { + set_plugin_info_called_(false), + expect_fail_(expect_fail) { } virtual ~MockPluginProcessHostClient() { @@ -80,6 +82,8 @@ class MockPluginProcessHostClient : public PluginProcessHost::Client, return false; } virtual void OnChannelConnected(int32 peer_pid) OVERRIDE { + if (expect_fail_) + FAIL(); QuitMessageLoop(); } virtual void OnChannelError() OVERRIDE { @@ -96,7 +100,8 @@ class MockPluginProcessHostClient : public PluginProcessHost::Client, private: void Fail() { - FAIL(); + if (!expect_fail_) + FAIL(); QuitMessageLoop(); } @@ -108,9 +113,27 @@ class MockPluginProcessHostClient : public PluginProcessHost::Client, ResourceContext* context_; IPC::Channel* channel_; bool set_plugin_info_called_; + bool expect_fail_; DISALLOW_COPY_AND_ASSIGN(MockPluginProcessHostClient); }; +class MockPluginServiceFilter : public content::PluginServiceFilter { + public: + MockPluginServiceFilter() {} + + virtual bool IsPluginEnabled( + int render_process_id, + int render_view_id, + const void* context, + const GURL& url, + const GURL& policy_url, + webkit::WebPluginInfo* plugin) OVERRIDE { return true; } + + virtual bool CanLoadPlugin( + int render_process_id, + const FilePath& path) OVERRIDE { return false; } +}; + class PluginServiceTest : public ContentBrowserTest { public: PluginServiceTest() {} @@ -140,7 +163,19 @@ class PluginServiceTest : public ContentBrowserTest { IN_PROC_BROWSER_TEST_F(PluginServiceTest, OpenChannelToPlugin) { if (!webkit::npapi::NPAPIPluginsSupported()) return; - MockPluginProcessHostClient mock_client(GetResourceContext()); + MockPluginProcessHostClient mock_client(GetResourceContext(), false); + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::Bind(&OpenChannel, &mock_client)); + RunMessageLoop(); +} + +IN_PROC_BROWSER_TEST_F(PluginServiceTest, OpenChannelToDeniedPlugin) { + if (!webkit::npapi::NPAPIPluginsSupported()) + return; + MockPluginServiceFilter filter; + PluginServiceImpl::GetInstance()->SetFilter(&filter); + MockPluginProcessHostClient mock_client(GetResourceContext(), true); BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, base::Bind(&OpenChannel, &mock_client)); diff --git a/content/browser/renderer_host/render_message_filter.cc b/content/browser/renderer_host/render_message_filter.cc index aacc6e9..6f4ca95 100644 --- a/content/browser/renderer_host/render_message_filter.cc +++ b/content/browser/renderer_host/render_message_filter.cc @@ -657,7 +657,7 @@ void RenderMessageFilter::GetPluginsCallback( for (size_t i = 0; i < all_plugins.size(); ++i) { // Copy because the filter can mutate. webkit::WebPluginInfo plugin(all_plugins[i]); - if (!filter || filter->ShouldUsePlugin(child_process_id, + if (!filter || filter->IsPluginEnabled(child_process_id, routing_id, resource_context_, GURL(), @@ -704,8 +704,10 @@ void RenderMessageFilter::OnOpenChannelToPepperPlugin( const FilePath& path, IPC::Message* reply_msg) { plugin_service_->OpenChannelToPpapiPlugin( - path, profile_data_directory_, new OpenChannelToPpapiPluginCallback( - this, resource_context_, reply_msg)); + render_process_id_, + path, + profile_data_directory_, + new OpenChannelToPpapiPluginCallback(this, resource_context_, reply_msg)); } void RenderMessageFilter::OnDidCreateOutOfProcessPepperInstance( @@ -755,7 +757,9 @@ void RenderMessageFilter::OnOpenChannelToPpapiBroker(int routing_id, int request_id, const FilePath& path) { plugin_service_->OpenChannelToPpapiBroker( - path, new OpenChannelToPpapiBrokerCallback(this, routing_id, request_id)); + render_process_id_, + path, + new OpenChannelToPpapiBrokerCallback(this, routing_id, request_id)); } void RenderMessageFilter::OnGenerateRoutingID(int* route_id) { |