Index: chrome/browser/plugins/chrome_plugin_service_filter.cc |
=================================================================== |
--- chrome/browser/plugins/chrome_plugin_service_filter.cc (revision 180039) |
+++ chrome/browser/plugins/chrome_plugin_service_filter.cc (working copy) |
@@ -44,13 +44,13 @@ |
int render_view_id, |
const GURL& url, |
const webkit::WebPluginInfo& plugin) { |
+ base::AutoLock auto_lock(lock_); |
+ ProcessDetails* details = GetOrRegisterProcess(render_process_id); |
OverriddenPlugin overridden_plugin; |
- overridden_plugin.render_process_id = render_process_id; |
overridden_plugin.render_view_id = render_view_id; |
overridden_plugin.url = url; |
overridden_plugin.plugin = plugin; |
- base::AutoLock auto_lock(lock_); |
- overridden_plugins_.push_back(overridden_plugin); |
+ details->overridden_plugins.push_back(overridden_plugin); |
} |
void ChromePluginServiceFilter::RestrictPluginToProfileAndOrigin( |
@@ -69,7 +69,7 @@ |
restricted_plugins_.erase(plugin_path); |
} |
-bool ChromePluginServiceFilter::ShouldUsePlugin( |
+bool ChromePluginServiceFilter::IsPluginEnabled( |
int render_process_id, |
int render_view_id, |
const void* context, |
@@ -77,17 +77,21 @@ |
const GURL& policy_url, |
webkit::WebPluginInfo* plugin) { |
base::AutoLock auto_lock(lock_); |
+ const ProcessDetails* details = GetProcess(render_process_id); |
+ |
// Check whether the plugin is overridden. |
- for (size_t i = 0; i < overridden_plugins_.size(); ++i) { |
- if (overridden_plugins_[i].render_process_id == render_process_id && |
- overridden_plugins_[i].render_view_id == render_view_id && |
- (overridden_plugins_[i].url == url || |
- overridden_plugins_[i].url.is_empty())) { |
+ if (details) { |
+ for (size_t i = 0; i < details->overridden_plugins.size(); ++i) { |
+ if (details->overridden_plugins[i].render_view_id == render_view_id && |
+ (details->overridden_plugins[i].url == url || |
+ details->overridden_plugins[i].url.is_empty())) { |
- bool use = overridden_plugins_[i].plugin.path == plugin->path; |
- if (use) |
- *plugin = overridden_plugins_[i].plugin; |
- return use; |
+ bool use = details->overridden_plugins[i].plugin.path == plugin->path; |
+ if (!use) |
+ return false; |
+ *plugin = details->overridden_plugins[i].plugin; |
+ break; |
Bernhard Bauer
2013/02/04 13:58:53
Wait, this might not be quite right. If |use| is t
|
+ } |
} |
} |
@@ -119,6 +123,39 @@ |
return true; |
} |
+bool ChromePluginServiceFilter::CanLoadPlugin(int render_process_id, |
+ const FilePath& path) { |
+ // The browser itself sometimes loads plug-ins to e.g. clear plug-in data. |
+ // We always grant the browser permission. |
+ if (!render_process_id) |
+ return true; |
+ |
+ base::AutoLock auto_lock(lock_); |
+ const ProcessDetails* details = GetProcess(render_process_id); |
+ if (!details) |
+ return false; |
+ |
+ if (details->authorized_plugins.find(path) == |
+ details->authorized_plugins.end() && |
+ details->authorized_plugins.find(FilePath()) == |
+ details->authorized_plugins.end()) { |
+ return false; |
+ } |
+ |
+ return true; |
+} |
+ |
+void ChromePluginServiceFilter::AuthorizePlugin(int render_process_id, |
+ const FilePath& plugin_path) { |
+ base::AutoLock auto_lock(lock_); |
+ ProcessDetails* details = GetOrRegisterProcess(render_process_id); |
+ details->authorized_plugins.insert(plugin_path); |
+} |
+ |
+void ChromePluginServiceFilter::AuthorizeAllPlugins(int render_process_id) { |
+ AuthorizePlugin(render_process_id, FilePath()); |
+} |
+ |
ChromePluginServiceFilter::ChromePluginServiceFilter() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, |
@@ -141,12 +178,7 @@ |
content::Source<content::RenderProcessHost>(source).ptr()->GetID(); |
base::AutoLock auto_lock(lock_); |
- for (size_t i = 0; i < overridden_plugins_.size(); ++i) { |
- if (overridden_plugins_[i].render_process_id == render_process_id) { |
- overridden_plugins_.erase(overridden_plugins_.begin() + i); |
- break; |
- } |
- } |
+ plugin_details_.erase(render_process_id); |
break; |
} |
case chrome::NOTIFICATION_PLUGIN_ENABLE_STATUS_CHANGED: { |
@@ -163,3 +195,33 @@ |
} |
} |
} |
+ |
+ChromePluginServiceFilter::ProcessDetails* |
+ChromePluginServiceFilter::GetOrRegisterProcess( |
+ int render_process_id) { |
+ return &plugin_details_[render_process_id]; |
+} |
+ |
+const ChromePluginServiceFilter::ProcessDetails* |
+ChromePluginServiceFilter::GetProcess( |
+ int render_process_id) const { |
+ std::map<int, ProcessDetails>::const_iterator it = |
+ plugin_details_.find(render_process_id); |
+ if (it == plugin_details_.end()) |
+ return NULL; |
+ return &it->second; |
+} |
+ |
+ChromePluginServiceFilter::OverriddenPlugin::OverriddenPlugin() |
+ : render_view_id(MSG_ROUTING_NONE) { |
+} |
+ |
+ChromePluginServiceFilter::OverriddenPlugin::~OverriddenPlugin() { |
+} |
+ |
+ChromePluginServiceFilter::ProcessDetails::ProcessDetails() { |
+} |
+ |
+ChromePluginServiceFilter::ProcessDetails::~ProcessDetails() { |
+} |
+ |