plugin_info_message_filter.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/plugins/plugin_info_message_filter.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_utils.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/plugins/chrome_plugin_service_filter.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_finder.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_metadata.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_content_client.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/content_settings.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_service.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_service_filter.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/plugins/npapi/plugin_list.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "widevine_cdm_version.h"  // In SHARED_INTERMEDIATE_DIR.
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/metro.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::PluginService;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using webkit::WebPluginInfo;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// For certain sandboxed Pepper plugins, use the JavaScript Content Settings.
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldUseJavaScriptSettingForPlugin(const WebPluginInfo& plugin) {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (plugin.type != WebPluginInfo::PLUGIN_TYPE_PEPPER_IN_PROCESS &&
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      plugin.type != WebPluginInfo::PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS) {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Treat Native Client invocations like JavaScript.
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (plugin.name == ASCIIToUTF16(chrome::ChromeContentClient::kNaClPluginName))
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Treat CDM invocations like JavaScript.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (plugin.name == ASCIIToUTF16(kWidevineCdmPluginName)) {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(plugin.type == WebPluginInfo::PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // WIDEVINE_CDM_AVAILABLE
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginInfoMessageFilter::Context::Context(int render_process_id,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          Profile* profile)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : render_process_id_(render_process_id),
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_context_(profile->GetResourceContext()),
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_content_settings_map_(profile->GetHostContentSettingsMap()) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allow_outdated_plugins_.Init(prefs::kPluginsAllowOutdated,
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               profile->GetPrefs());
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allow_outdated_plugins_.MoveToThread(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::BrowserThread::GetMessageLoopProxyForThread(
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::BrowserThread::IO));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  always_authorize_plugins_.Init(prefs::kPluginsAlwaysAuthorize,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 profile->GetPrefs());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  always_authorize_plugins_.MoveToThread(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::BrowserThread::GetMessageLoopProxyForThread(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::BrowserThread::IO));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginInfoMessageFilter::Context::Context()
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : render_process_id_(0),
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_context_(NULL),
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_content_settings_map_(NULL) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginInfoMessageFilter::Context::~Context() {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginInfoMessageFilter::PluginInfoMessageFilter(
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int render_process_id,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : context_(render_process_id, profile),
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PluginInfoMessageFilter::OnMessageReceived(const IPC::Message& message,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                bool* message_was_ok) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP_EX(PluginInfoMessageFilter, message, *message_was_ok)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(ChromeViewHostMsg_GetPluginInfo,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    OnGetPluginInfo)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(return false)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginInfoMessageFilter::OnDestruct() const {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const_cast<PluginInfoMessageFilter*>(this)->
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      weak_ptr_factory_.DetachFromThread();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const_cast<PluginInfoMessageFilter*>(this)->
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      weak_ptr_factory_.InvalidateWeakPtrs();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Destroy on the UI thread because we contain a |PrefMember|.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::BrowserThread::DeleteOnUIThread::Destruct(this);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginInfoMessageFilter::~PluginInfoMessageFilter() {}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PluginInfoMessageFilter::GetPluginInfo_Params {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int render_view_id;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL top_origin_url;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mime_type;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginInfoMessageFilter::OnGetPluginInfo(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int render_view_id,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& top_origin_url,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& mime_type,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_msg) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPluginInfo_Params params = {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    render_view_id,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    top_origin_url,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mime_type
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginService::GetInstance()->GetPlugins(
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PluginInfoMessageFilter::PluginsLoaded,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr(),
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 params, reply_msg));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginInfoMessageFilter::PluginsLoaded(
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GetPluginInfo_Params& params,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_msg,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<WebPluginInfo>& plugins) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeViewHostMsg_GetPluginInfo_Output output;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This also fills in |actual_mime_type|.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PluginMetadata> plugin_metadata;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (context_.FindEnabledPlugin(params.render_view_id, params.url,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 params.top_origin_url, params.mime_type,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 &output.status, &output.plugin,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 &output.actual_mime_type,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 &plugin_metadata)) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context_.DecidePluginStatus(params, output.plugin, plugin_metadata.get(),
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                &output.status);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (plugin_metadata) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.group_identifier = plugin_metadata->identifier();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.group_name = plugin_metadata->name();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_.MaybeGrantAccess(output.status, output.plugin.path);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeViewHostMsg_GetPluginInfo::WriteReplyParams(reply_msg, output);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(reply_msg);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginInfoMessageFilter::Context::DecidePluginStatus(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GetPluginInfo_Params& params,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebPluginInfo& plugin,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PluginMetadata* plugin_metadata,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeViewHostMsg_GetPluginInfo_Status* status) const {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (plugin.type == WebPluginInfo::PLUGIN_TYPE_NPAPI &&
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::win::IsMetroProcess()) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status->value =
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ChromeViewHostMsg_GetPluginInfo_Status::kNPAPINotSupported;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSetting plugin_setting = CONTENT_SETTING_DEFAULT;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool uses_default_content_setting = true;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check plug-in content settings. The primary URL is the top origin URL and
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the secondary URL is the plug-in URL.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPluginContentSetting(plugin, params.top_origin_url, params.url,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          plugin_metadata->identifier(), &plugin_setting,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          &uses_default_content_setting);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(plugin_setting != CONTENT_SETTING_DEFAULT);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginMetadata::SecurityStatus plugin_status =
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin_metadata->GetSecurityStatus(plugin);
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGIN_INSTALLATION)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if the plug-in is outdated.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (plugin_status == PluginMetadata::SECURITY_STATUS_OUT_OF_DATE &&
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !allow_outdated_plugins_.GetValue()) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (allow_outdated_plugins_.IsManaged()) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status->value =
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ChromeViewHostMsg_GetPluginInfo_Status::kOutdatedDisallowed;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status->value = ChromeViewHostMsg_GetPluginInfo_Status::kOutdatedBlocked;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if the plug-in requires authorization.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (plugin_status ==
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PluginMetadata::SECURITY_STATUS_REQUIRES_AUTHORIZATION &&
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin.type != WebPluginInfo::PLUGIN_TYPE_PEPPER_IN_PROCESS &&
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin.type != WebPluginInfo::PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS &&
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !always_authorize_plugins_.GetValue() &&
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin_setting != CONTENT_SETTING_BLOCK &&
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uses_default_content_setting) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status->value = ChromeViewHostMsg_GetPluginInfo_Status::kUnauthorized;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if the plug-in is crashing too much.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (PluginService::GetInstance()->IsPluginUnstable(plugin.path) &&
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !always_authorize_plugins_.GetValue() &&
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin_setting != CONTENT_SETTING_BLOCK &&
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uses_default_content_setting) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status->value = ChromeViewHostMsg_GetPluginInfo_Status::kUnauthorized;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (plugin_setting == CONTENT_SETTING_ASK)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status->value = ChromeViewHostMsg_GetPluginInfo_Status::kClickToPlay;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (plugin_setting == CONTENT_SETTING_BLOCK)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status->value = ChromeViewHostMsg_GetPluginInfo_Status::kBlocked;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PluginInfoMessageFilter::Context::FindEnabledPlugin(
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int render_view_id,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& top_origin_url,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& mime_type,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeViewHostMsg_GetPluginInfo_Status* status,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebPluginInfo* plugin,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* actual_mime_type,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<PluginMetadata>* plugin_metadata) const {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow_wildcard = true;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<WebPluginInfo> matching_plugins;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> mime_types;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginService::GetInstance()->GetPluginInfoArray(
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url, mime_type, allow_wildcard, &matching_plugins, &mime_types);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (matching_plugins.empty()) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status->value = ChromeViewHostMsg_GetPluginInfo_Status::kNotFound;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::PluginServiceFilter* filter =
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PluginService::GetInstance()->GetFilter();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t i = 0;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; i < matching_plugins.size(); ++i) {
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!filter || filter->IsPluginAvailable(render_process_id_,
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             render_view_id,
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             resource_context_,
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             url,
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             top_origin_url,
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             &matching_plugins[i])) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we broke out of the loop, we have found an enabled plug-in.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool enabled = i < matching_plugins.size();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!enabled) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Otherwise, we only found disabled plug-ins, so we take the first one.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i = 0;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status->value = ChromeViewHostMsg_GetPluginInfo_Status::kDisabled;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *plugin = matching_plugins[i];
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *actual_mime_type = mime_types[i];
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (plugin_metadata)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *plugin_metadata = PluginFinder::GetInstance()->GetPluginMetadata(*plugin);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enabled;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginInfoMessageFilter::Context::GetPluginContentSetting(
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebPluginInfo& plugin,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& policy_url,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& plugin_url,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& resource,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSetting* setting,
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool* uses_default_content_setting) const {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> value;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings::SettingInfo info;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool uses_plugin_specific_setting = false;
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShouldUseJavaScriptSettingForPlugin(plugin)) {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value.reset(
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host_content_settings_map_->GetWebsiteSetting(
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            policy_url, policy_url, CONTENT_SETTINGS_TYPE_JAVASCRIPT,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            std::string(), &info));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value.reset(
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        host_content_settings_map_->GetWebsiteSetting(
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            policy_url, plugin_url, CONTENT_SETTINGS_TYPE_PLUGINS, resource,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            &info));
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value.get()) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uses_plugin_specific_setting = true;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value.reset(host_content_settings_map_->GetWebsiteSetting(
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          policy_url, plugin_url, CONTENT_SETTINGS_TYPE_PLUGINS, std::string(),
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &info));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *setting = content_settings::ValueToContentSetting(value.get());
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *uses_default_content_setting =
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !uses_plugin_specific_setting &&
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      info.primary_pattern == ContentSettingsPattern::Wildcard() &&
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      info.secondary_pattern == ContentSettingsPattern::Wildcard();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PluginInfoMessageFilter::Context::MaybeGrantAccess(
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ChromeViewHostMsg_GetPluginInfo_Status& status,
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& path) const {
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (status.value == ChromeViewHostMsg_GetPluginInfo_Status::kAllowed ||
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      status.value == ChromeViewHostMsg_GetPluginInfo_Status::kClickToPlay) {
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ChromePluginServiceFilter::GetInstance()->AuthorizePlugin(
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_process_id_, path);
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
331