From 79fa3363afd7282bcde23b532b95e93e46eb55f3 Mon Sep 17 00:00:00 2001
From: "bauerb@chromium.org"
 <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>
Date: Wed, 28 Mar 2012 16:21:11 +0000
Subject: Revert 129322 - revert 128949 (and dependent 129252)

Original review URL: http://codereview.chromium.org/9874001

BUG=120273
TEST=none
TBR=thakis@chromium.org
Review URL: https://chromiumcodereview.appspot.com/9844016

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@129423 0039d316-1c4b-4281-b951-d872f2087c98
---
 .../extension_content_settings_apitest.cc          |   3 +-
 chrome/browser/plugin_finder.cc                    | 159 ++++-----
 chrome/browser/plugin_finder.h                     |  30 +-
 chrome/browser/plugin_finder_unittest.cc           |  17 +-
 chrome/browser/plugin_installer.cc                 |   6 +-
 chrome/browser/plugin_installer.h                  |   7 +-
 chrome/browser/plugin_observer.cc                  |  33 +-
 chrome/browser/plugin_observer.h                   |  13 +-
 .../renderer_host/plugin_info_message_filter.cc    |  68 ++--
 .../renderer_host/plugin_info_message_filter.h     |  21 +-
 .../plugin_info_message_filter_unittest.cc         |   8 +-
 chrome/browser/resources/plugins_linux.json        | 124 ++++---
 chrome/browser/resources/plugins_mac.json          | 384 ++++++++++-----------
 chrome/browser/resources/plugins_win.json          | 374 ++++++++++----------
 chrome/browser/ui/webui/plugins_ui.cc              |  52 ++-
 content/utility/utility_thread_impl.cc             |  19 +-
 webkit/plugins/npapi/plugin_group.cc               |  27 +-
 webkit/plugins/npapi/plugin_group.h                |  33 +-
 webkit/plugins/npapi/plugin_group_unittest.cc      |  38 +-
 webkit/plugins/npapi/plugin_list.cc                | 146 ++++----
 webkit/plugins/npapi/plugin_list.h                 |   9 +-
 webkit/plugins/npapi/plugin_list_unittest.cc       |   3 +-
 22 files changed, 772 insertions(+), 802 deletions(-)

diff --git a/chrome/browser/extensions/extension_content_settings_apitest.cc b/chrome/browser/extensions/extension_content_settings_apitest.cc
index 6938c12..a593fa7 100644
--- a/chrome/browser/extensions/extension_content_settings_apitest.cc
+++ b/chrome/browser/extensions/extension_content_settings_apitest.cc
@@ -103,8 +103,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest,
   const char* kFooName = "Foo Plugin";
   const char* kBarName = "Bar Plugin";
   const webkit::npapi::PluginGroupDefinition kPluginDefinitions[] = {
-    { "foo", "Foo", kFooName, NULL, 0,
-      "http://example.com/foo" },
+    { "foo", "Foo", kFooName, NULL, 0 },
   };
 
   webkit::npapi::MockPluginList plugin_list(kPluginDefinitions,
diff --git a/chrome/browser/plugin_finder.cc b/chrome/browser/plugin_finder.cc
index 2e90b54..2b66754 100644
--- a/chrome/browser/plugin_finder.cc
+++ b/chrome/browser/plugin_finder.cc
@@ -18,24 +18,35 @@
 #include "grit/browser_resources.h"
 #include "ui/base/resource/resource_bundle.h"
 
+using base::DictionaryValue;
+
+// static
+void PluginFinder::Get(const base::Callback<void(PluginFinder*)>& cb) {
+  // At a later point we might want to do intialization here that needs to be
+  // done asynchronously, like loading the plug-in list from disk or from a URL.
+  MessageLoop::current()->PostTask(FROM_HERE, base::Bind(cb, GetInstance()));
+}
+
 // static
 PluginFinder* PluginFinder::GetInstance() {
+  // PluginFinder::GetInstance() is the only method that's allowed to call
+  // Singleton<PluginFinder>::get().
   return Singleton<PluginFinder>::get();
 }
 
 PluginFinder::PluginFinder() : plugin_list_(LoadPluginList()) {
   if (!plugin_list_.get()) {
     NOTREACHED();
-    plugin_list_.reset(new base::ListValue());
+    plugin_list_.reset(new DictionaryValue());
   }
 }
 
 // static
-scoped_ptr<base::ListValue> PluginFinder::LoadPluginList() {
-  return scoped_ptr<base::ListValue>(LoadPluginListInternal()).Pass();
+scoped_ptr<DictionaryValue> PluginFinder::LoadPluginList() {
+  return scoped_ptr<DictionaryValue>(LoadPluginListInternal());
 }
 
-base::ListValue* PluginFinder::LoadPluginListInternal() {
+DictionaryValue* PluginFinder::LoadPluginListInternal() {
 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
   base::StringPiece json_resource(
       ResourceBundle::GetSharedInstance().GetRawDataResource(
@@ -51,15 +62,11 @@ base::ListValue* PluginFinder::LoadPluginListInternal() {
     DLOG(ERROR) << error_str;
     return NULL;
   }
-  base::DictionaryValue* dict = NULL;
-  if (!value->GetAsDictionary(&dict))
+  if (value->GetType() != base::Value::TYPE_DICTIONARY)
     return NULL;
-  base::ListValue* list = NULL;
-  if (!dict->GetList("plugins", &list))
-    return NULL;
-  return list->DeepCopy();
+  return static_cast<base::DictionaryValue*>(value.release());
 #else
-  return new base::ListValue();
+  return new DictionaryValue();
 #endif
 }
 
@@ -67,46 +74,58 @@ PluginFinder::~PluginFinder() {
   STLDeleteValues(&installers_);
 }
 
-void PluginFinder::FindPlugin(
-    const std::string& mime_type,
-    const std::string& language,
-    const FindPluginCallback& callback) {
-  PluginInstaller* installer = FindPluginInternal(mime_type, language);
-  MessageLoop::current()->PostTask(FROM_HERE, base::Bind(callback, installer));
-}
-
-void PluginFinder::FindPluginWithIdentifier(
-    const std::string& identifier,
-    const FindPluginCallback& found_callback) {
-  PluginInstaller* installer = NULL;
-  std::map<std::string, PluginInstaller*>::const_iterator it =
-      installers_.find(identifier);
-  if (it != installers_.end()) {
-    installer = it->second;
-  } else {
-    for (ListValue::const_iterator plugin_it = plugin_list_->begin();
-         plugin_it != plugin_list_->end(); ++plugin_it) {
-      const base::DictionaryValue* plugin = NULL;
-      if (!(*plugin_it)->GetAsDictionary(&plugin)) {
-        NOTREACHED();
-        continue;
-      }
-      std::string id;
-      bool success = plugin->GetString("identifier", &id);
+PluginInstaller* PluginFinder::FindPlugin(const std::string& mime_type,
+                                          const std::string& language) {
+  if (g_browser_process->local_state()->GetBoolean(prefs::kDisablePluginFinder))
+    return NULL;
+  for (DictionaryValue::Iterator plugin_it(*plugin_list_);
+       plugin_it.HasNext(); plugin_it.Advance()) {
+    const DictionaryValue* plugin = NULL;
+    if (!plugin_it.value().GetAsDictionary(&plugin)) {
+      NOTREACHED();
+      continue;
+    }
+    std::string language_str;
+    bool success = plugin->GetString("lang", &language_str);
+    DCHECK(success);
+    if (language_str != language)
+      continue;
+    ListValue* mime_types = NULL;
+    plugin->GetList("mime_types", &mime_types);
+    DCHECK(success);
+    for (ListValue::const_iterator mime_type_it = mime_types->begin();
+         mime_type_it != mime_types->end(); ++mime_type_it) {
+      std::string mime_type_str;
+      success = (*mime_type_it)->GetAsString(&mime_type_str);
       DCHECK(success);
-      if (id == identifier) {
-        installer = CreateInstaller(identifier, plugin);
-        break;
+      if (mime_type_str == mime_type) {
+        std::string identifier = plugin_it.key();
+        std::map<std::string, PluginInstaller*>::const_iterator installer =
+            installers_.find(identifier);
+        if (installer != installers_.end())
+          return installer->second;
+        return CreateInstaller(identifier, plugin);
       }
     }
   }
-  MessageLoop::current()->PostTask(FROM_HERE,
-                                   base::Bind(found_callback, installer));
+  return NULL;
+}
+
+PluginInstaller* PluginFinder::FindPluginWithIdentifier(
+    const std::string& identifier) {
+  std::map<std::string, PluginInstaller*>::const_iterator it =
+      installers_.find(identifier);
+  if (it != installers_.end())
+    return it->second;
+  DictionaryValue* plugin = NULL;
+  if (plugin_list_->GetDictionaryWithoutPathExpansion(identifier, &plugin))
+    return CreateInstaller(identifier, plugin);
+  return NULL;
 }
 
 PluginInstaller* PluginFinder::CreateInstaller(
     const std::string& identifier,
-    const base::DictionaryValue* plugin_dict) {
+    const DictionaryValue* plugin_dict) {
   DCHECK(!installers_[identifier]);
   std::string url;
   bool success = plugin_dict->GetString("url", &url);
@@ -118,52 +137,14 @@ PluginInstaller* PluginFinder::CreateInstaller(
   DCHECK(success);
   bool display_url = false;
   plugin_dict->GetBoolean("displayurl", &display_url);
-  PluginInstaller*installer = new PluginInstaller(identifier,
-                                                  GURL(url),
-                                                  GURL(help_url),
-                                                  name,
-                                                  display_url);
+  bool requires_authorization = true;
+  plugin_dict->GetBoolean("requires_authorization", &requires_authorization);
+  PluginInstaller* installer = new PluginInstaller(identifier,
+                                                   GURL(url),
+                                                   GURL(help_url),
+                                                   name,
+                                                   display_url,
+                                                   requires_authorization);
   installers_[identifier] = installer;
   return installer;
 }
-
-PluginInstaller* PluginFinder::FindPluginInternal(
-    const std::string& mime_type,
-    const std::string& language) {
-  if (!g_browser_process->local_state()->GetBoolean(
-          prefs::kDisablePluginFinder)) {
-    for (ListValue::const_iterator plugin_it = plugin_list_->begin();
-         plugin_it != plugin_list_->end(); ++plugin_it) {
-      const base::DictionaryValue* plugin = NULL;
-      if (!(*plugin_it)->GetAsDictionary(&plugin)) {
-        NOTREACHED();
-        continue;
-      }
-      std::string language_str;
-      bool success = plugin->GetString("lang", &language_str);
-      DCHECK(success);
-      if (language_str != language)
-        continue;
-      ListValue* mime_types = NULL;
-      success = plugin->GetList("mime_types", &mime_types);
-      DCHECK(success);
-      for (ListValue::const_iterator mime_type_it = mime_types->begin();
-           mime_type_it != mime_types->end(); ++mime_type_it) {
-        std::string mime_type_str;
-        success = (*mime_type_it)->GetAsString(&mime_type_str);
-        DCHECK(success);
-        if (mime_type_str == mime_type) {
-          std::string identifier;
-          bool success = plugin->GetString("identifier", &identifier);
-          DCHECK(success);
-          std::map<std::string, PluginInstaller*>::const_iterator it =
-              installers_.find(identifier);
-          if (it != installers_.end())
-            return it->second;
-          return CreateInstaller(identifier, plugin);
-        }
-      }
-    }
-  }
-  return NULL;
-}
diff --git a/chrome/browser/plugin_finder.h b/chrome/browser/plugin_finder.h
index 2b1bd49..1667411e 100644
--- a/chrome/browser/plugin_finder.h
+++ b/chrome/browser/plugin_finder.h
@@ -16,7 +16,6 @@
 
 namespace base {
 class DictionaryValue;
-class ListValue;
 }
 
 class GURL;
@@ -24,39 +23,36 @@ class PluginInstaller;
 
 class PluginFinder {
  public:
-  typedef base::Callback<void(PluginInstaller*)> FindPluginCallback;
-
-  static PluginFinder* GetInstance();
+  static void Get(const base::Callback<void(PluginFinder*)>& cb);
 
   // Loads the plug-in information from the browser resources and parses it.
   // Returns NULL if the plug-in list couldn't be parsed.
-  static scoped_ptr<base::ListValue> LoadPluginList();
+  static scoped_ptr<base::DictionaryValue> LoadPluginList();
 
   // Finds a plug-in for the given MIME type and language (specified as an IETF
-  // language tag, i.e. en-US) and calls the callback with the PluginInstaller
-  // for the plug-in, or NULL if no plug-in is found.
-  void FindPlugin(const std::string& mime_type,
-                  const std::string& language,
-                  const FindPluginCallback& callback);
+  // language tag, i.e. en-US) and returns the PluginInstaller for the plug-in,
+  // or NULL if no plug-in is found.
+  PluginInstaller* FindPlugin(const std::string& mime_type,
+                              const std::string& language);
 
-  // Finds the plug-in with the given identifier and calls the callback.
-  void FindPluginWithIdentifier(const std::string& identifier,
-                                const FindPluginCallback& callback);
+  // Returns the plug-in with the given identifier.
+  PluginInstaller* FindPluginWithIdentifier(const std::string& identifier);
 
  private:
   friend struct DefaultSingletonTraits<PluginFinder>;
+  friend class Singleton<PluginFinder>;
+
+  static PluginFinder* GetInstance();
 
   PluginFinder();
   ~PluginFinder();
 
-  static base::ListValue* LoadPluginListInternal();
+  static base::DictionaryValue* LoadPluginListInternal();
 
   PluginInstaller* CreateInstaller(const std::string& identifier,
                                    const base::DictionaryValue* plugin_dict);
-  PluginInstaller* FindPluginInternal(const std::string& mime_type,
-                                      const std::string& language);
 
-  scoped_ptr<base::ListValue> plugin_list_;
+  scoped_ptr<base::DictionaryValue> plugin_list_;
   std::map<std::string, PluginInstaller*> installers_;
 
   DISALLOW_COPY_AND_ASSIGN(PluginFinder);
diff --git a/chrome/browser/plugin_finder_unittest.cc b/chrome/browser/plugin_finder_unittest.cc
index e69036d..8a07769 100644
--- a/chrome/browser/plugin_finder_unittest.cc
+++ b/chrome/browser/plugin_finder_unittest.cc
@@ -8,20 +8,25 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 using base::DictionaryValue;
-using base::ListValue;
 
 TEST(PluginFinderTest, JsonSyntax) {
-  scoped_ptr<ListValue> plugin_list(PluginFinder::LoadPluginList());
+  scoped_ptr<DictionaryValue> plugin_list(PluginFinder::LoadPluginList());
   ASSERT_TRUE(plugin_list.get());
-  for (ListValue::const_iterator plugin_it = plugin_list->begin();
-       plugin_it != plugin_list->end(); ++plugin_it) {
+  for (DictionaryValue::Iterator plugin_it(*plugin_list);
+       plugin_it.HasNext(); plugin_it.Advance()) {
     const DictionaryValue* plugin = NULL;
-    ASSERT_TRUE((*plugin_it)->GetAsDictionary(&plugin));
+    ASSERT_TRUE(plugin_it.value().GetAsDictionary(&plugin));
     std::string dummy_str;
+    bool dummy_bool;
     EXPECT_TRUE(plugin->GetString("lang", &dummy_str));
-    EXPECT_TRUE(plugin->GetString("identifier", &dummy_str));
     EXPECT_TRUE(plugin->GetString("url", &dummy_str));
     EXPECT_TRUE(plugin->GetString("name", &dummy_str));
+    if (plugin->HasKey("help_url"))
+      EXPECT_TRUE(plugin->GetString("help_url", &dummy_str));
+    if (plugin->HasKey("displayurl"))
+      EXPECT_TRUE(plugin->GetBoolean("displayurl", &dummy_bool));
+    if (plugin->HasKey("requires_authorization"))
+      EXPECT_TRUE(plugin->GetBoolean("requires_authorization", &dummy_bool));
     ListValue* mime_types = NULL;
     ASSERT_TRUE(plugin->GetList("mime_types", &mime_types));
     for (ListValue::const_iterator mime_type_it = mime_types->begin();
diff --git a/chrome/browser/plugin_installer.cc b/chrome/browser/plugin_installer.cc
index 80c45c9..7f2f66a 100644
--- a/chrome/browser/plugin_installer.cc
+++ b/chrome/browser/plugin_installer.cc
@@ -64,13 +64,15 @@ PluginInstaller::PluginInstaller(const std::string& identifier,
                                  const GURL& plugin_url,
                                  const GURL& help_url,
                                  const string16& name,
-                                 bool url_for_display)
+                                 bool url_for_display,
+                                 bool requires_authorization)
     : state_(kStateIdle),
       identifier_(identifier),
       plugin_url_(plugin_url),
       help_url_(help_url),
       name_(name),
-      url_for_display_(url_for_display) {
+      url_for_display_(url_for_display),
+      requires_authorization_(requires_authorization) {
 }
 
 PluginInstaller::~PluginInstaller() {
diff --git a/chrome/browser/plugin_installer.h b/chrome/browser/plugin_installer.h
index 0b43113..b3a9f53 100644
--- a/chrome/browser/plugin_installer.h
+++ b/chrome/browser/plugin_installer.h
@@ -33,7 +33,8 @@ class PluginInstaller : public content::DownloadItem::Observer {
                   const GURL& plugin_url,
                   const GURL& help_url,
                   const string16& name,
-                  bool url_for_display);
+                  bool url_for_display,
+                  bool requires_authorization);
   virtual ~PluginInstaller();
 
   virtual void OnDownloadUpdated(content::DownloadItem* download) OVERRIDE;
@@ -55,6 +56,9 @@ class PluginInstaller : public content::DownloadItem::Observer {
   // Human-readable name of the plug-in.
   const string16& name() const { return name_; }
 
+  // Whether the plug-in requires user authorization to run.
+  bool requires_authorization() const { return requires_authorization_; }
+
   // If |url_for_display| is false, |plugin_url| is the URL of the download page
   // for the plug-in, which should be opened in a new tab. If it is true,
   // |plugin_url| is the URL of the plug-in installer binary, which can be
@@ -90,6 +94,7 @@ class PluginInstaller : public content::DownloadItem::Observer {
   GURL help_url_;
   string16 name_;
   bool url_for_display_;
+  bool requires_authorization_;
 
   DISALLOW_COPY_AND_ASSIGN(PluginInstaller);
 };
diff --git a/chrome/browser/plugin_observer.cc b/chrome/browser/plugin_observer.cc
index 3660d2f..25fd4af 100644
--- a/chrome/browser/plugin_observer.cc
+++ b/chrome/browser/plugin_observer.cc
@@ -118,6 +118,7 @@ class PluginObserver::PluginPlaceholderHost : public PluginInstallerObserver {
       : PluginInstallerObserver(installer),
         observer_(observer),
         routing_id_(routing_id) {
+    DCHECK(installer);
     switch (installer->state()) {
       case PluginInstaller::kStateIdle: {
         observer->Send(new ChromeViewMsg_FoundMissingPlugin(routing_id_,
@@ -201,11 +202,9 @@ void PluginObserver::OnBlockedUnauthorizedPlugin(const string16& name) {
 void PluginObserver::OnBlockedOutdatedPlugin(int placeholder_id,
                                              const std::string& identifier) {
 #if defined(ENABLE_PLUGIN_INSTALLATION)
-  PluginFinder* plugin_finder = PluginFinder::GetInstance();
-  plugin_finder->FindPluginWithIdentifier(
-      identifier,
-      base::Bind(&PluginObserver::FoundPluginToUpdate,
-                 weak_ptr_factory_.GetWeakPtr(), placeholder_id));
+  PluginFinder::Get(base::Bind(&PluginObserver::FindPluginToUpdate,
+                               weak_ptr_factory_.GetWeakPtr(),
+                               placeholder_id, identifier));
 #else
   // If we don't support third-party plug-in installation, we shouldn't have
   // outdated plug-ins.
@@ -214,8 +213,11 @@ void PluginObserver::OnBlockedOutdatedPlugin(int placeholder_id,
 }
 
 #if defined(ENABLE_PLUGIN_INSTALLATION)
-void PluginObserver::FoundPluginToUpdate(int placeholder_id,
-                                         PluginInstaller* installer) {
+void PluginObserver::FindPluginToUpdate(int placeholder_id,
+                                        const std::string& identifier,
+                                        PluginFinder* plugin_finder) {
+  PluginInstaller* installer =
+      plugin_finder->FindPluginWithIdentifier(identifier);
   plugin_placeholders_[placeholder_id] =
       new PluginPlaceholderHost(this, placeholder_id, installer);
   InfoBarTabHelper* infobar_helper = tab_contents_->infobar_tab_helper();
@@ -225,17 +227,16 @@ void PluginObserver::FoundPluginToUpdate(int placeholder_id,
 
 void PluginObserver::OnFindMissingPlugin(int placeholder_id,
                                          const std::string& mime_type) {
-  PluginFinder* plugin_finder = PluginFinder::GetInstance();
-  std::string lang = "en-US";  // Oh yes.
-  plugin_finder->FindPlugin(
-      mime_type, lang,
-      base::Bind(&PluginObserver::FoundMissingPlugin,
-                 weak_ptr_factory_.GetWeakPtr(), placeholder_id, mime_type));
+PluginFinder::Get(base::Bind(&PluginObserver::FindMissingPlugin,
+                             weak_ptr_factory_.GetWeakPtr(),
+                             placeholder_id, mime_type));
 }
 
-void PluginObserver::FoundMissingPlugin(int placeholder_id,
-                                        const std::string& mime_type,
-                                        PluginInstaller* installer) {
+void PluginObserver::FindMissingPlugin(int placeholder_id,
+                                       const std::string& mime_type,
+                                       PluginFinder* plugin_finder) {
+  std::string lang = "en-US";  // Oh yes.
+  PluginInstaller* installer = plugin_finder->FindPlugin(mime_type, lang);
   if (!installer) {
     Send(new ChromeViewMsg_DidNotFindMissingPlugin(placeholder_id));
     return;
diff --git a/chrome/browser/plugin_observer.h b/chrome/browser/plugin_observer.h
index 44f7b03..4cce117 100644
--- a/chrome/browser/plugin_observer.h
+++ b/chrome/browser/plugin_observer.h
@@ -15,7 +15,7 @@
 
 class GURL;
 class InfoBarDelegate;
-class PluginInstaller;
+class PluginFinder;
 class TabContentsWrapper;
 
 #if defined(ENABLE_PLUGIN_INSTALLATION)
@@ -46,11 +46,12 @@ class PluginObserver : public content::WebContentsObserver {
 #if defined(ENABLE_PLUGIN_INSTALLATION)
   void OnFindMissingPlugin(int placeholder_id, const std::string& mime_type);
 
-  void FoundMissingPlugin(int placeholder_id,
-                          const std::string& mime_type,
-                          PluginInstaller* installer);
-  void FoundPluginToUpdate(int placeholder_id,
-                           PluginInstaller* installer);
+  void FindMissingPlugin(int placeholder_id,
+                         const std::string& mime_type,
+                         PluginFinder* plugin_finder);
+  void FindPluginToUpdate(int placeholder_id,
+                          const std::string& identifier,
+                          PluginFinder* plugin_finder);
   void OnRemovePluginPlaceholderHost(int placeholder_id);
 #endif
   void OnOpenAboutPlugins();
diff --git a/chrome/browser/renderer_host/plugin_info_message_filter.cc b/chrome/browser/renderer_host/plugin_info_message_filter.cc
index cc13c86..11864a7 100644
--- a/chrome/browser/renderer_host/plugin_info_message_filter.cc
+++ b/chrome/browser/renderer_host/plugin_info_message_filter.cc
@@ -21,6 +21,11 @@
 #include "webkit/plugins/npapi/plugin_group.h"
 #include "webkit/plugins/npapi/plugin_list.h"
 
+#if defined(ENABLE_PLUGIN_INSTALLATION)
+#include "chrome/browser/plugin_finder.h"
+#include "chrome/browser/plugin_installer.h"
+#endif
+
 #if defined(OS_WIN)
 // These includes are only necessary for the PluginInfobarExperiment.
 #include "chrome/common/attrition_experiments.h"
@@ -143,7 +148,31 @@ void PluginInfoMessageFilter::PluginsLoaded(
   ChromeViewHostMsg_GetPluginInfo_Status status;
   webkit::WebPluginInfo plugin;
   std::string actual_mime_type;
-  context_.DecidePluginStatus(params, &status, &plugin, &actual_mime_type);
+  // This also fills in |actual_mime_type|.
+  if (!context_.FindEnabledPlugin(params.render_view_id, params.url,
+                                  params.top_origin_url, params.mime_type,
+                                  &status, &plugin, &actual_mime_type)) {
+    ChromeViewHostMsg_GetPluginInfo::WriteReplyParams(
+        reply_msg, status, plugin, actual_mime_type);
+    Send(reply_msg);
+    return;
+  }
+#if defined(ENABLE_PLUGIN_INSTALLATION)
+  PluginFinder::Get(base::Bind(&PluginInfoMessageFilter::GotPluginFinder, this,
+                               params, reply_msg, plugin, actual_mime_type));
+#else
+  GotPluginFinder(params, reply_msg, plugin, actual_mime_type, NULL);
+#endif
+}
+
+void PluginInfoMessageFilter::GotPluginFinder(
+    const GetPluginInfo_Params& params,
+    IPC::Message* reply_msg,
+    const webkit::WebPluginInfo& plugin,
+    const std::string& actual_mime_type,
+    PluginFinder* plugin_finder) {
+  ChromeViewHostMsg_GetPluginInfo_Status status;
+  context_.DecidePluginStatus(params, plugin, plugin_finder, &status);
   ChromeViewHostMsg_GetPluginInfo::WriteReplyParams(
       reply_msg, status, plugin, actual_mime_type);
   Send(reply_msg);
@@ -151,24 +180,16 @@ void PluginInfoMessageFilter::PluginsLoaded(
 
 void PluginInfoMessageFilter::Context::DecidePluginStatus(
     const GetPluginInfo_Params& params,
-    ChromeViewHostMsg_GetPluginInfo_Status* status,
-    webkit::WebPluginInfo* plugin,
-    std::string* actual_mime_type) const {
-  status->value = ChromeViewHostMsg_GetPluginInfo_Status::kAllowed;
-  // This also fills in |actual_mime_type|.
-  if (FindEnabledPlugin(params.render_view_id, params.url,
-                        params.top_origin_url, params.mime_type,
-                        status, plugin, actual_mime_type)) {
-    return;
-  }
+    const webkit::WebPluginInfo& plugin,
+    PluginFinder* plugin_finder,
+    ChromeViewHostMsg_GetPluginInfo_Status* status) const {
+  scoped_ptr<webkit::npapi::PluginGroup> group(
+      webkit::npapi::PluginList::Singleton()->GetPluginGroup(plugin));
 
   ContentSetting plugin_setting = CONTENT_SETTING_DEFAULT;
   bool uses_default_content_setting = true;
   // Check plug-in content settings. The primary URL is the top origin URL and
   // the secondary URL is the plug-in URL.
-  scoped_ptr<webkit::npapi::PluginGroup> group(
-      webkit::npapi::PluginList::Singleton()->GetPluginGroup(*plugin));
-
   GetPluginContentSetting(plugin, params.top_origin_url, params.url,
                           group->identifier(), &plugin_setting,
                           &uses_default_content_setting);
@@ -180,7 +201,7 @@ void PluginInfoMessageFilter::Context::DecidePluginStatus(
   PluginInfobarExperiment(&allow_outdated, &always_authorize);
 
   // Check if the plug-in is outdated.
-  if (group->IsVulnerable(*plugin) && !allow_outdated) {
+  if (group->IsVulnerable(plugin) && !allow_outdated) {
     if (allow_outdated_plugins_.IsManaged()) {
       status->value =
           ChromeViewHostMsg_GetPluginInfo_Status::kOutdatedDisallowed;
@@ -191,9 +212,13 @@ void PluginInfoMessageFilter::Context::DecidePluginStatus(
     return;
   }
 
+#if defined(ENABLE_PLUGIN_INSTALLATION)
   // Check if the plug-in requires authorization.
-  if ((group->RequiresAuthorization(*plugin) ||
-       PluginService::GetInstance()->IsPluginUnstable(plugin->path)) &&
+  // TODO(bauerb): This should be a plain struct with the plug-in information.
+  PluginInstaller* installer =
+      plugin_finder->FindPluginWithIdentifier(group->identifier());
+  if (((installer && installer->requires_authorization()) ||
+       PluginService::GetInstance()->IsPluginUnstable(plugin.path)) &&
       !always_authorize &&
       plugin_setting != CONTENT_SETTING_BLOCK &&
       uses_default_content_setting) {
@@ -201,6 +226,7 @@ void PluginInfoMessageFilter::Context::DecidePluginStatus(
        ChromeViewHostMsg_GetPluginInfo_Status::kUnauthorized;
     return;
   }
+#endif
 
   if (plugin_setting == CONTENT_SETTING_ASK)
     status->value = ChromeViewHostMsg_GetPluginInfo_Status::kClickToPlay;
@@ -236,7 +262,7 @@ bool PluginInfoMessageFilter::Context::FindEnabledPlugin(
       *actual_mime_type = mime_types[i];
       if (enabled) {
         // We have found an enabled plug-in. Return immediately.
-        return false;
+        return true;
       }
       // We have found a plug-in, but it's disabled. Keep looking for an
       // enabled one.
@@ -250,18 +276,18 @@ bool PluginInfoMessageFilter::Context::FindEnabledPlugin(
     status->value = ChromeViewHostMsg_GetPluginInfo_Status::kDisabled;
   else
     status->value = ChromeViewHostMsg_GetPluginInfo_Status::kNotFound;
-  return true;
+  return false;
 }
 
 void PluginInfoMessageFilter::Context::GetPluginContentSetting(
-    const webkit::WebPluginInfo* plugin,
+    const webkit::WebPluginInfo& plugin,
     const GURL& policy_url,
     const GURL& plugin_url,
     const std::string& resource,
     ContentSetting* setting,
     bool* uses_default_content_setting) const {
   // Treat Native Client invocations like Javascript.
-  bool is_nacl_plugin = (plugin->name == ASCIIToUTF16(
+  bool is_nacl_plugin = (plugin.name == ASCIIToUTF16(
       chrome::ChromeContentClient::kNaClPluginName));
 
   scoped_ptr<base::Value> value;
diff --git a/chrome/browser/renderer_host/plugin_info_message_filter.h b/chrome/browser/renderer_host/plugin_info_message_filter.h
index 8cade72..f0f6e35 100644
--- a/chrome/browser/renderer_host/plugin_info_message_filter.h
+++ b/chrome/browser/renderer_host/plugin_info_message_filter.h
@@ -18,6 +18,7 @@
 struct ChromeViewHostMsg_GetPluginInfo_Status;
 class GURL;
 class HostContentSettingsMap;
+class PluginFinder;
 class Profile;
 
 namespace content {
@@ -26,6 +27,9 @@ class ResourceContext;
 
 namespace webkit {
 struct WebPluginInfo;
+namespace npapi {
+class PluginGroup;
+}
 }
 
 // This class filters out incoming IPC messages requesting plug-in information.
@@ -41,10 +45,11 @@ class PluginInfoMessageFilter : public content::BrowserMessageFilter {
     Context();
     ~Context();
 
-    void DecidePluginStatus(const GetPluginInfo_Params& params,
-                            ChromeViewHostMsg_GetPluginInfo_Status* status,
-                            webkit::WebPluginInfo* plugin,
-                            std::string* actual_mime_type) const;
+    void DecidePluginStatus(
+        const GetPluginInfo_Params& params,
+        const webkit::WebPluginInfo& plugin,
+        PluginFinder* plugin_finder,
+        ChromeViewHostMsg_GetPluginInfo_Status* status) const;
     bool FindEnabledPlugin(int render_view_id,
                            const GURL& url,
                            const GURL& top_origin_url,
@@ -52,7 +57,7 @@ class PluginInfoMessageFilter : public content::BrowserMessageFilter {
                            ChromeViewHostMsg_GetPluginInfo_Status* status,
                            webkit::WebPluginInfo* plugin,
                            std::string* actual_mime_type) const;
-    void GetPluginContentSetting(const webkit::WebPluginInfo* plugin,
+    void GetPluginContentSetting(const webkit::WebPluginInfo& plugin,
                                  const GURL& policy_url,
                                  const GURL& plugin_url,
                                  const std::string& resource,
@@ -89,6 +94,12 @@ class PluginInfoMessageFilter : public content::BrowserMessageFilter {
                      IPC::Message* reply_msg,
                      const std::vector<webkit::WebPluginInfo>& plugins);
 
+  void GotPluginFinder(const GetPluginInfo_Params& params,
+                       IPC::Message* reply_msg,
+                       const webkit::WebPluginInfo& plugin,
+                       const std::string& actual_mime_type,
+                       PluginFinder* plugin_finder);
+
   Context context_;
 
   base::WeakPtrFactory<PluginInfoMessageFilter> weak_ptr_factory_;
diff --git a/chrome/browser/renderer_host/plugin_info_message_filter_unittest.cc b/chrome/browser/renderer_host/plugin_info_message_filter_unittest.cc
index 9950e4f..b822dd1 100644
--- a/chrome/browser/renderer_host/plugin_info_message_filter_unittest.cc
+++ b/chrome/browser/renderer_host/plugin_info_message_filter_unittest.cc
@@ -120,7 +120,7 @@ TEST_F(PluginInfoMessageFilterTest, FindEnabledPlugin) {
     ChromeViewHostMsg_GetPluginInfo_Status status;
     webkit::WebPluginInfo plugin;
     std::string actual_mime_type;
-    EXPECT_FALSE(context_.FindEnabledPlugin(
+    EXPECT_TRUE(context_.FindEnabledPlugin(
         0, GURL(), GURL(), "foo/bar", &status, &plugin, &actual_mime_type));
     EXPECT_EQ(ChromeViewHostMsg_GetPluginInfo_Status::kAllowed, status.value);
     EXPECT_EQ(foo_plugin_path_.value(), plugin.path.value());
@@ -131,7 +131,7 @@ TEST_F(PluginInfoMessageFilterTest, FindEnabledPlugin) {
     ChromeViewHostMsg_GetPluginInfo_Status status;
     webkit::WebPluginInfo plugin;
     std::string actual_mime_type;
-    EXPECT_FALSE(context_.FindEnabledPlugin(
+    EXPECT_TRUE(context_.FindEnabledPlugin(
         0, GURL(), GURL(), "foo/bar", &status, &plugin, &actual_mime_type));
     EXPECT_EQ(ChromeViewHostMsg_GetPluginInfo_Status::kAllowed, status.value);
     EXPECT_EQ(bar_plugin_path_.value(), plugin.path.value());
@@ -142,7 +142,7 @@ TEST_F(PluginInfoMessageFilterTest, FindEnabledPlugin) {
     ChromeViewHostMsg_GetPluginInfo_Status status;
     webkit::WebPluginInfo plugin;
     std::string actual_mime_type;
-    EXPECT_TRUE(context_.FindEnabledPlugin(
+    EXPECT_FALSE(context_.FindEnabledPlugin(
         0, GURL(), GURL(), "foo/bar", &status, &plugin, &actual_mime_type));
     EXPECT_EQ(ChromeViewHostMsg_GetPluginInfo_Status::kDisabled, status.value);
     EXPECT_EQ(foo_plugin_path_.value(), plugin.path.value());
@@ -151,7 +151,7 @@ TEST_F(PluginInfoMessageFilterTest, FindEnabledPlugin) {
     ChromeViewHostMsg_GetPluginInfo_Status status;
     webkit::WebPluginInfo plugin;
     std::string actual_mime_type;
-    EXPECT_TRUE(context_.FindEnabledPlugin(
+    EXPECT_FALSE(context_.FindEnabledPlugin(
         0, GURL(), GURL(), "baz/blurp", &status, &plugin, &actual_mime_type));
     EXPECT_EQ(ChromeViewHostMsg_GetPluginInfo_Status::kNotFound, status.value);
     EXPECT_EQ(FILE_PATH_LITERAL(""), plugin.path.value());
diff --git a/chrome/browser/resources/plugins_linux.json b/chrome/browser/resources/plugins_linux.json
index d410de0..e56f226 100644
--- a/chrome/browser/resources/plugins_linux.json
+++ b/chrome/browser/resources/plugins_linux.json
@@ -1,66 +1,62 @@
 {
-  "plugins": [
-    {
-      "mime_types": [
-        "application/x-java-applet",
-        "application/x-java-applet,version=1.1",
-        "application/x-java-applet,version=1.1.1",
-        "application/x-java-applet,version=1.1.2",
-        "application/x-java-applet,version=1.1.3",
-        "application/x-java-applet,version=1.2",
-        "application/x-java-applet,version=1.2.1",
-        "application/x-java-applet,version=1.2.2",
-        "application/x-java-applet,version=1.3",
-        "application/x-java-applet,version=1.3.1",
-        "application/x-java-applet,version=1.4",
-        "application/x-java-applet,version=1.4.1",
-        "application/x-java-applet,version=1.4.2",
-        "application/x-java-applet,version=1.5",
-        "application/x-java-applet,version=1.6",
-        "application/x-java-bean",
-        "application/x-java-bean,version=1.1",
-        "application/x-java-bean,version=1.1.1",
-        "application/x-java-bean,version=1.1.2",
-        "application/x-java-bean,version=1.1.3",
-        "application/x-java-bean,version=1.2",
-        "application/x-java-bean,version=1.2.1",
-        "application/x-java-bean,version=1.2.2",
-        "application/x-java-bean,version=1.3",
-        "application/x-java-bean,version=1.3.1",
-        "application/x-java-bean,version=1.4",
-        "application/x-java-bean,version=1.4.1",
-        "application/x-java-bean,version=1.4.2",
-        "application/x-java-bean,version=1.5",
-        "application/x-java-bean,version=1.6",
-        "application/x-java-vm"
-      ],
-      "lang": "en-US",
-      "name": "Java(TM)",
-      "identifier": "java-runtime-environment",
-      "help_url": "https://support.google.com/chrome/?p=plugin_java",
-      "url": "http://java.com/download",
-      "displayurl": true
-    },
-    {
-      "mime_types": [
-        "application/futuresplash",
-        "application/x-shockwave-flash"
-      ],
-      "lang": "en-US",
-      "name": "Adobe Flash Player",
-      "identifier": "adobe-flash-player",
-      "help_url": "https://support.google.com/chrome/?p=plugin_flash",
-      "url": "http://get.adobe.com/flashplayer/",
-      "displayurl": true
-    },
-    {
-      "mime_types": [
-      ],
-      "lang": "en-US",
-      "name": "IcedTea",
-      "identifier": "redhat-icetea-java",
-      "url": "http://icedtea.classpath.org/",
-      "displayurl": true
-    }
-  ]
+  "java-runtime-environment": {
+    "mime_types": [
+      "application/x-java-applet",
+      "application/x-java-applet,version=1.1",
+      "application/x-java-applet,version=1.1.1",
+      "application/x-java-applet,version=1.1.2",
+      "application/x-java-applet,version=1.1.3",
+      "application/x-java-applet,version=1.2",
+      "application/x-java-applet,version=1.2.1",
+      "application/x-java-applet,version=1.2.2",
+      "application/x-java-applet,version=1.3",
+      "application/x-java-applet,version=1.3.1",
+      "application/x-java-applet,version=1.4",
+      "application/x-java-applet,version=1.4.1",
+      "application/x-java-applet,version=1.4.2",
+      "application/x-java-applet,version=1.5",
+      "application/x-java-applet,version=1.6",
+      "application/x-java-bean",
+      "application/x-java-bean,version=1.1",
+      "application/x-java-bean,version=1.1.1",
+      "application/x-java-bean,version=1.1.2",
+      "application/x-java-bean,version=1.1.3",
+      "application/x-java-bean,version=1.2",
+      "application/x-java-bean,version=1.2.1",
+      "application/x-java-bean,version=1.2.2",
+      "application/x-java-bean,version=1.3",
+      "application/x-java-bean,version=1.3.1",
+      "application/x-java-bean,version=1.4",
+      "application/x-java-bean,version=1.4.1",
+      "application/x-java-bean,version=1.4.2",
+      "application/x-java-bean,version=1.5",
+      "application/x-java-bean,version=1.6",
+      "application/x-java-vm"
+    ],
+    "lang": "en-US",
+    "name": "Java(TM)",
+    "help_url": "https://support.google.com/chrome/?p=plugin_java",
+    "url": "http://java.com/download",
+    "displayurl": true
+  },
+  "adobe-flash-player": {
+    "mime_types": [
+      "application/futuresplash",
+      "application/x-shockwave-flash"
+    ],
+    "lang": "en-US",
+    "name": "Adobe Flash Player",
+    "help_url": "https://support.google.com/chrome/?p=plugin_flash",
+    "url": "http://get.adobe.com/flashplayer/",
+    "requires_authorization": false,
+    "displayurl": true
+  },
+  "redhat-icetea-java": {
+    "mime_types": [
+    ],
+    "lang": "en-US",
+    "name": "IcedTea",
+    "url": "http://icedtea.classpath.org/",
+    "displayurl": true
+  }
 }
diff --git a/chrome/browser/resources/plugins_mac.json b/chrome/browser/resources/plugins_mac.json
index ad1f70d..2465ece 100644
--- a/chrome/browser/resources/plugins_mac.json
+++ b/chrome/browser/resources/plugins_mac.json
@@ -1,198 +1,190 @@
 {
-  "plugins": [
-    {
-      "mime_types": [
-        "application/x-java-applet",
-        "application/x-java-applet,version=1.1",
-        "application/x-java-applet,version=1.1.1",
-        "application/x-java-applet,version=1.1.2",
-        "application/x-java-applet,version=1.1.3",
-        "application/x-java-applet,version=1.2",
-        "application/x-java-applet,version=1.2.1",
-        "application/x-java-applet,version=1.2.2",
-        "application/x-java-applet,version=1.3",
-        "application/x-java-applet,version=1.3.1",
-        "application/x-java-applet,version=1.4",
-        "application/x-java-applet,version=1.4.1",
-        "application/x-java-applet,version=1.4.2",
-        "application/x-java-applet,version=1.5",
-        "application/x-java-applet,version=1.6",
-        "application/x-java-bean",
-        "application/x-java-bean,version=1.1",
-        "application/x-java-bean,version=1.1.1",
-        "application/x-java-bean,version=1.1.2",
-        "application/x-java-bean,version=1.1.3",
-        "application/x-java-bean,version=1.2",
-        "application/x-java-bean,version=1.2.1",
-        "application/x-java-bean,version=1.2.2",
-        "application/x-java-bean,version=1.3",
-        "application/x-java-bean,version=1.3.1",
-        "application/x-java-bean,version=1.4",
-        "application/x-java-bean,version=1.4.1",
-        "application/x-java-bean,version=1.4.2",
-        "application/x-java-bean,version=1.5",
-        "application/x-java-bean,version=1.6",
-        "application/x-java-vm"
-      ],
-      "lang": "en-US",
-      "name": "Java(TM)",
-      "identifier": "java-runtime-environment",
-      "url": "http://java.com/en/download/apple_manual.jsp",
-      "help_url": "https://support.google.com/chrome/?p=plugin_java",
-      "displayurl": true
-    },
-    {
-      "mime_types": [
-        "audio/vnd.rn-realaudio",
-        "video/vnd.rn-realvideo",
-        "audio/x-pn-realaudio-plugin",
-        "audio/x-pn-realaudio"
-      ],
-      "lang": "en-US",
-      "name": "RealPlayer",
-      "identifier": "realplayer",
-      "url": "http://director.real.com/realplayer?type=rpsp_mac",
-      "help_url": "https://support.google.com/chrome/?p=plugin_real"
-    },
-    {
-      "mime_types": [
-        "application/futuresplash",
-        "application/x-shockwave-flash"
-      ],
-      "lang": "en-US",
-      "name": "Adobe Flash Player",
-      "identifier": "adobe-flash-player",
-      "url": "http://get.adobe.com/flashplayer/",
-      "help_url": "https://support.google.com/chrome/?p=plugin_flash",
-      "displayurl": true
-    },
-    {
-      "mime_types": [
-        "application/x-director"
-      ],
-      "lang": "en-US",
-      "name": "Adobe Shockwave Player",
-      "identifier": "shockwave",
-      "url": "http://www.adobe.com/shockwave/download/",
-      "help_url": "https://support.google.com/chrome/?p=plugin_shockwave",
-      "displayurl": true
-    },
-    {
-      "mime_types": [
-        "application/pdf",
-        "application/vnd.adobe.x-mars",
-        "application/vnd.adobe.xdp+xml",
-        "application/vnd.adobe.xfd+xml",
-        "application/vnd.adobe.xfdf",
-        "application/vnd.fdf"
-      ],
-      "lang": "en-US",
-      "name": "Adobe Reader",
-      "identifier": "adobe-reader",
-      "url": "http://get.adobe.com/reader/",
-      "help_url": "https://support.google.com/chrome/?p=plugin_pdf",
-      "displayurl": true
-    },
-    {
-      "mime_types": [
-        "application/sdp",
-        "application/x-mpeg",
-        "application/x-rtsp",
-        "application/x-sdp",
-        "audio/3ggp",
-        "audio/3ggp2",
-        "audio/aac",
-        "audio/ac3",
-        "audio/aiff",
-        "audio/amr",
-        "audio/basic",
-        "audio/mid",
-        "audio/midi",
-        "audio/mp4",
-        "audio/mpeg",
-        "audio/vnd.qcelp",
-        "audio/wav",
-        "audio/x-aac",
-        "audio/x-ac3",
-        "audio/x-aiff",
-        "audio/x-caf",
-        "audio/x-gsm",
-        "audio/x-m4a",
-        "audio/x-m4b",
-        "audio/x-m4p",
-        "audio/x-midi",
-        "audio/x-mpeg",
-        "audio/x-wav",
-        "image/jp2",
-        "image/jpeg2000",
-        "image/jpeg2000-image",
-        "image/pict",
-        "image/png",
-        "image/x-jpeg2000-image",
-        "image/x-macpaint",
-        "image/x-pict",
-        "image/x-png",
-        "image/x-quicktime",
-        "image/x-sgi",
-        "image/x-targa",
-        "video/3ggp",
-        "video/3ggp2",
-        "video/flc",
-        "video/mp4",
-        "video/mpeg",
-        "video/quicktime",
-        "video/sd-video",
-        "video/x-m4v",
-        "video/x-mpeg"
-      ],
-      "lang": "en-US",
-      "name": "QuickTime Player",
-      "identifier": "apple-quicktime",
-      "url": "http://www.apple.com/quicktime/download/",
-      "help_url": "https://support.google.com/chrome/?p=plugin_quicktime",
-      "displayurl": true
-    },
-    {
-      "mime_types": [
-        "application/asx",
-        "application/x-mplayer2",
-        "application/x-ms-wmp",
-        "audio/x-ms-wax",
-        "audio/x-ms-wma",
-        "video/x-ms-asf",
-        "video/x-ms-asf-plugin",
-        "video/x-ms-wm",
-        "video/x-ms-wmv",
-        "video/x-ms-wvx"
-      ],
-      "lang": "en-US",
-      "name": "Flip4Mac",
-      "identifier": "flip4mac",
-      "url": "http://www.microsoft.com/download/en/confirmation.aspx?id=9442",
-      "help_url": "https://support.google.com/chrome/?p=plugin_wmp",
-      "displayurl": true
-    },
-    {
-      "mime_types": [
-        "video/divx",
-        "video/x-matroska"
-      ],
-      "lang": "en-US",
-      "name": "DivX Web Player",
-      "identifier": "divx-player",
-      "url": "http://www.divx.com/en/downloads/divx/mac",
-      "help_url": "https://support.google.com/chrome/?p=plugin_divx"
-    },
-    {
-      "mime_types": [
-        "application/x-silverlight",
-        "application/x-silverlight-2"
-      ],
-      "lang": "en-US",
-      "name": "Silverlight",
-      "identifier": "silverlight",
-      "url": "http://go.microsoft.com/fwlink/?LinkID=149156",
-      "displayurl": true
-    }
-  ]
+  "java-runtime-environment": {
+    "mime_types": [
+      "application/x-java-applet",
+      "application/x-java-applet,version=1.1",
+      "application/x-java-applet,version=1.1.1",
+      "application/x-java-applet,version=1.1.2",
+      "application/x-java-applet,version=1.1.3",
+      "application/x-java-applet,version=1.2",
+      "application/x-java-applet,version=1.2.1",
+      "application/x-java-applet,version=1.2.2",
+      "application/x-java-applet,version=1.3",
+      "application/x-java-applet,version=1.3.1",
+      "application/x-java-applet,version=1.4",
+      "application/x-java-applet,version=1.4.1",
+      "application/x-java-applet,version=1.4.2",
+      "application/x-java-applet,version=1.5",
+      "application/x-java-applet,version=1.6",
+      "application/x-java-bean",
+      "application/x-java-bean,version=1.1",
+      "application/x-java-bean,version=1.1.1",
+      "application/x-java-bean,version=1.1.2",
+      "application/x-java-bean,version=1.1.3",
+      "application/x-java-bean,version=1.2",
+      "application/x-java-bean,version=1.2.1",
+      "application/x-java-bean,version=1.2.2",
+      "application/x-java-bean,version=1.3",
+      "application/x-java-bean,version=1.3.1",
+      "application/x-java-bean,version=1.4",
+      "application/x-java-bean,version=1.4.1",
+      "application/x-java-bean,version=1.4.2",
+      "application/x-java-bean,version=1.5",
+      "application/x-java-bean,version=1.6",
+      "application/x-java-vm"
+    ],
+    "lang": "en-US",
+    "name": "Java(TM)",
+    "url": "http://java.com/en/download/apple_manual.jsp",
+    "help_url": "https://support.google.com/chrome/?p=plugin_java",
+    "displayurl": true
+  },
+  "realplayer": {
+    "mime_types": [
+      "audio/vnd.rn-realaudio",
+      "video/vnd.rn-realvideo",
+      "audio/x-pn-realaudio-plugin",
+      "audio/x-pn-realaudio"
+    ],
+    "lang": "en-US",
+    "name": "RealPlayer",
+    "url": "http://director.real.com/realplayer?type=rpsp_mac",
+    "help_url": "https://support.google.com/chrome/?p=plugin_real"
+  },
+  "adobe-flash-player": {
+    "mime_types": [
+      "application/futuresplash",
+      "application/x-shockwave-flash"
+    ],
+    "lang": "en-US",
+    "name": "Adobe Flash Player",
+    "url": "http://get.adobe.com/flashplayer/",
+    "help_url": "https://support.google.com/chrome/?p=plugin_flash",
+    "requires_authorization": false,
+    "displayurl": true
+  },
+  "adobe-shockwave": {
+    "mime_types": [
+      "application/x-director"
+    ],
+    "lang": "en-US",
+    "name": "Adobe Shockwave Player",
+    "url": "http://www.adobe.com/shockwave/download/",
+    "help_url": "https://support.google.com/chrome/?p=plugin_shockwave",
+    "displayurl": true
+  },
+  "adobe-reader": {
+    "mime_types": [
+      "application/pdf",
+      "application/vnd.adobe.x-mars",
+      "application/vnd.adobe.xdp+xml",
+      "application/vnd.adobe.xfd+xml",
+      "application/vnd.adobe.xfdf",
+      "application/vnd.fdf"
+    ],
+    "lang": "en-US",
+    "name": "Adobe Reader",
+    "url": "http://get.adobe.com/reader/",
+    "help_url": "https://support.google.com/chrome/?p=plugin_pdf",
+    "requires_authorization": false,
+    "displayurl": true
+  },
+  "apple-quicktime": {
+    "mime_types": [
+      "application/sdp",
+      "application/x-mpeg",
+      "application/x-rtsp",
+      "application/x-sdp",
+      "audio/3ggp",
+      "audio/3ggp2",
+      "audio/aac",
+      "audio/ac3",
+      "audio/aiff",
+      "audio/amr",
+      "audio/basic",
+      "audio/mid",
+      "audio/midi",
+      "audio/mp4",
+      "audio/mpeg",
+      "audio/vnd.qcelp",
+      "audio/wav",
+      "audio/x-aac",
+      "audio/x-ac3",
+      "audio/x-aiff",
+      "audio/x-caf",
+      "audio/x-gsm",
+      "audio/x-m4a",
+      "audio/x-m4b",
+      "audio/x-m4p",
+      "audio/x-midi",
+      "audio/x-mpeg",
+      "audio/x-wav",
+      "image/jp2",
+      "image/jpeg2000",
+      "image/jpeg2000-image",
+      "image/pict",
+      "image/png",
+      "image/x-jpeg2000-image",
+      "image/x-macpaint",
+      "image/x-pict",
+      "image/x-png",
+      "image/x-quicktime",
+      "image/x-sgi",
+      "image/x-targa",
+      "video/3ggp",
+      "video/3ggp2",
+      "video/flc",
+      "video/mp4",
+      "video/mpeg",
+      "video/quicktime",
+      "video/sd-video",
+      "video/x-m4v",
+      "video/x-mpeg"
+    ],
+    "lang": "en-US",
+    "name": "QuickTime Player",
+    "url": "http://www.apple.com/quicktime/download/",
+    "help_url": "https://support.google.com/chrome/?p=plugin_quicktime",
+    "displayurl": true
+  },
+  "flip4mac": {
+    "mime_types": [
+      "application/asx",
+      "application/x-mplayer2",
+      "application/x-ms-wmp",
+      "audio/x-ms-wax",
+      "audio/x-ms-wma",
+      "video/x-ms-asf",
+      "video/x-ms-asf-plugin",
+      "video/x-ms-wm",
+      "video/x-ms-wmv",
+      "video/x-ms-wvx"
+    ],
+    "lang": "en-US",
+    "name": "Flip4Mac",
+    "url": "http://www.microsoft.com/download/en/confirmation.aspx?id=9442",
+    "help_url": "https://support.google.com/chrome/?p=plugin_wmp",
+    "displayurl": true
+  },
+  "divx-player": {
+    "mime_types": [
+      "video/divx",
+      "video/x-matroska"
+    ],
+    "lang": "en-US",
+    "name": "DivX Web Player",
+    "url": "http://www.divx.com/en/downloads/divx/mac",
+    "help_url": "https://support.google.com/chrome/?p=plugin_divx"
+  },
+  "silverlight": {
+    "mime_types": [
+      "application/x-silverlight",
+      "application/x-silverlight-2"
+    ],
+    "lang": "en-US",
+    "name": "Silverlight",
+    "url": "http://go.microsoft.com/fwlink/?LinkID=149156",
+    "requires_authorization": false,
+    "displayurl": true
+  }
 }
diff --git a/chrome/browser/resources/plugins_win.json b/chrome/browser/resources/plugins_win.json
index 7820ae3..a0ad3dd 100644
--- a/chrome/browser/resources/plugins_win.json
+++ b/chrome/browser/resources/plugins_win.json
@@ -1,193 +1,185 @@
 {
-  "plugins": [
-    {
-      "mime_types": [
-        "application/x-java-applet",
-        "application/x-java-applet,version=1.1",
-        "application/x-java-applet,version=1.1.1",
-        "application/x-java-applet,version=1.1.2",
-        "application/x-java-applet,version=1.1.3",
-        "application/x-java-applet,version=1.2",
-        "application/x-java-applet,version=1.2.1",
-        "application/x-java-applet,version=1.2.2",
-        "application/x-java-applet,version=1.3",
-        "application/x-java-applet,version=1.3.1",
-        "application/x-java-applet,version=1.4",
-        "application/x-java-applet,version=1.4.1",
-        "application/x-java-applet,version=1.4.2",
-        "application/x-java-applet,version=1.5",
-        "application/x-java-applet,version=1.6",
-        "application/x-java-bean",
-        "application/x-java-bean,version=1.1",
-        "application/x-java-bean,version=1.1.1",
-        "application/x-java-bean,version=1.1.2",
-        "application/x-java-bean,version=1.1.3",
-        "application/x-java-bean,version=1.2",
-        "application/x-java-bean,version=1.2.1",
-        "application/x-java-bean,version=1.2.2",
-        "application/x-java-bean,version=1.3",
-        "application/x-java-bean,version=1.3.1",
-        "application/x-java-bean,version=1.4",
-        "application/x-java-bean,version=1.4.1",
-        "application/x-java-bean,version=1.4.2",
-        "application/x-java-bean,version=1.5",
-        "application/x-java-bean,version=1.6",
-        "application/x-java-vm"
-      ],
-      "lang": "en-US",
-      "name": "Java(TM)",
-      "identifier": "java-runtime-environment",
-      "help_url": "https://support.google.com/chrome/?p=plugin_java",
-      "url": "http://java.com/download",
-      "displayurl": true
-    },
-    {
-      "mime_types": [
-        "audio/vnd.rn-realaudio",
-        "video/vnd.rn-realvideo",
-        "audio/x-pn-realaudio-plugin",
-        "audio/x-pn-realaudio"
-      ],
-      "lang": "en-US",
-      "name": "RealPlayer",
-      "identifier": "realplayer",
-      "help_url": "https://support.google.com/chrome/?p=plugin_real",
-      "url": "http://forms.real.com/real/realone/download.html?type=rpsp_us"
-    },
-    {
-      "mime_types": [
-        "application/futuresplash",
-        "application/x-shockwave-flash"
-      ],
-      "lang": "en-US",
-      "name": "Adobe Flash Player",
-      "identifier": "adobe-flash-player",
-      "help_url": "https://support.google.com/chrome/?p=plugin_flash",
-      "url": "http://get.adobe.com/flashplayer/",
-      "displayurl": true
-    },
-    {
-      "mime_types": [
-        "application/x-director"
-      ],
-      "lang": "en-US",
-      "name": "Adobe Shockwave Player",
-      "identifier": "shockwave",
-      "help_url": "https://support.google.com/chrome/?p=plugin_shockwave",
-      "url": "http://fpdownload.macromedia.com/get/shockwave/default/english/win95nt/latest/Shockwave_Installer_Slim.exe"
-    },
-    {
-      "mime_types": [
-        "application/pdf",
-        "application/vnd.adobe.x-mars",
-        "application/vnd.adobe.xdp+xml",
-        "application/vnd.adobe.xfd+xml",
-        "application/vnd.adobe.xfdf",
-        "application/vnd.fdf"
-      ],
-      "lang": "en-US",
-      "name": "Adobe Reader",
-      "identifier": "adobe-reader",
-      "help_url": "https://support.google.com/chrome/?p=plugin_pdf",
-      "url": "http://ardownload.adobe.com/pub/adobe/reader/win/10.x/10.1.2/en_US/AdbeRdr1012_en_US.exe"
-    },
-    {
-      "mime_types": [
-        "application/sdp",
-        "application/x-mpeg",
-        "application/x-rtsp",
-        "application/x-sdp",
-        "audio/3ggp",
-        "audio/3ggp2",
-        "audio/aac",
-        "audio/ac3",
-        "audio/aiff",
-        "audio/amr",
-        "audio/basic",
-        "audio/mid",
-        "audio/midi",
-        "audio/mp4",
-        "audio/mpeg",
-        "audio/vnd.qcelp",
-        "audio/wav",
-        "audio/x-aac",
-        "audio/x-ac3",
-        "audio/x-aiff",
-        "audio/x-caf",
-        "audio/x-gsm",
-        "audio/x-m4a",
-        "audio/x-m4b",
-        "audio/x-m4p",
-        "audio/x-midi",
-        "audio/x-mpeg",
-        "audio/x-wav",
-        "image/jp2",
-        "image/jpeg2000",
-        "image/jpeg2000-image",
-        "image/pict",
-        "image/png",
-        "image/x-jpeg2000-image",
-        "image/x-macpaint",
-        "image/x-pict",
-        "image/x-png",
-        "image/x-quicktime",
-        "image/x-sgi",
-        "image/x-targa",
-        "video/3ggp",
-        "video/3ggp2",
-        "video/flc",
-        "video/mp4",
-        "video/mpeg",
-        "video/quicktime",
-        "video/sd-video",
-        "video/x-m4v",
-        "video/x-mpeg"
-      ],
-      "lang": "en-US",
-      "name": "QuickTime Player",
-      "identifier": "apple-quicktime",
-      "help_url": "https://support.google.com/chrome/?p=plugin_quicktime",
-      "url": "http://appldnld.apple.com/QuickTime/041-3089.20111026.Sxpr4/QuickTimeInstaller.exe"
-    },
-    {
-      "mime_types": [
-        "application/asx",
-        "application/x-mplayer2",
-        "application/x-ms-wmp",
-        "audio/x-ms-wax",
-        "audio/x-ms-wma",
-        "video/x-ms-asf",
-        "video/x-ms-asf-plugin",
-        "video/x-ms-wm",
-        "video/x-ms-wmv",
-        "video/x-ms-wvx"
-      ],
-      "lang": "en-US",
-      "name": "Windows Media Player",
-      "identifier": "windows-media-player",
-      "help_url": "https://support.google.com/chrome/?p=plugin_wmp",
-      "url": "http://interoplabs.blob.core.windows.net/wmpff/wmpfirefoxplugin.exe"
-    },
-    {
-      "mime_types": [
-        "video/divx",
-        "video/x-matroska"
-      ],
-      "lang": "en-US",
-      "name": "DivX Web Player",
-      "identifier": "divx-player",
-      "help_url": "https://support.google.com/chrome/?p=plugin_divx",
-      "url": "http://download.divx.com/player/divxdotcom/DivXWebPlayerInstaller.exe"
-    },
-    {
-      "mime_types": [
-        "application/x-silverlight",
-        "application/x-silverlight-2"
-      ],
-      "lang": "en-US",
-      "name": "Silverlight",
-      "identifier": "silverlight",
-      "url": "http://go.microsoft.com/fwlink/?LinkID=149156"
-    }
-  ]
+  "java-runtime-environment": {
+    "mime_types": [
+      "application/x-java-applet",
+      "application/x-java-applet,version=1.1",
+      "application/x-java-applet,version=1.1.1",
+      "application/x-java-applet,version=1.1.2",
+      "application/x-java-applet,version=1.1.3",
+      "application/x-java-applet,version=1.2",
+      "application/x-java-applet,version=1.2.1",
+      "application/x-java-applet,version=1.2.2",
+      "application/x-java-applet,version=1.3",
+      "application/x-java-applet,version=1.3.1",
+      "application/x-java-applet,version=1.4",
+      "application/x-java-applet,version=1.4.1",
+      "application/x-java-applet,version=1.4.2",
+      "application/x-java-applet,version=1.5",
+      "application/x-java-applet,version=1.6",
+      "application/x-java-bean",
+      "application/x-java-bean,version=1.1",
+      "application/x-java-bean,version=1.1.1",
+      "application/x-java-bean,version=1.1.2",
+      "application/x-java-bean,version=1.1.3",
+      "application/x-java-bean,version=1.2",
+      "application/x-java-bean,version=1.2.1",
+      "application/x-java-bean,version=1.2.2",
+      "application/x-java-bean,version=1.3",
+      "application/x-java-bean,version=1.3.1",
+      "application/x-java-bean,version=1.4",
+      "application/x-java-bean,version=1.4.1",
+      "application/x-java-bean,version=1.4.2",
+      "application/x-java-bean,version=1.5",
+      "application/x-java-bean,version=1.6",
+      "application/x-java-vm"
+    ],
+    "lang": "en-US",
+    "name": "Java(TM)",
+    "help_url": "https://support.google.com/chrome/?p=plugin_java",
+    "url": "http://java.com/download",
+    "displayurl": true
+  },
+  "realplayer": {
+    "mime_types": [
+      "audio/vnd.rn-realaudio",
+      "video/vnd.rn-realvideo",
+      "audio/x-pn-realaudio-plugin",
+      "audio/x-pn-realaudio"
+    ],
+    "lang": "en-US",
+    "name": "RealPlayer",
+    "help_url": "https://support.google.com/chrome/?p=plugin_real",
+    "url": "http://forms.real.com/real/realone/download.html?type=rpsp_us"
+  },
+  "adobe-flash-player": {
+    "mime_types": [
+      "application/futuresplash",
+      "application/x-shockwave-flash"
+    ],
+    "lang": "en-US",
+    "name": "Adobe Flash Player",
+    "help_url": "https://support.google.com/chrome/?p=plugin_flash",
+    "url": "http://get.adobe.com/flashplayer/",
+    "requires_authorization": false,
+    "displayurl": true
+  },
+  "shockwave": {
+    "mime_types": [
+      "application/x-director"
+    ],
+    "lang": "en-US",
+    "name": "Adobe Shockwave Player",
+    "help_url": "https://support.google.com/chrome/?p=plugin_shockwave",
+    "url": "http://fpdownload.macromedia.com/get/shockwave/default/english/win95nt/latest/Shockwave_Installer_Slim.exe"
+  },
+  "adobe-reader": {
+    "mime_types": [
+      "application/pdf",
+      "application/vnd.adobe.x-mars",
+      "application/vnd.adobe.xdp+xml",
+      "application/vnd.adobe.xfd+xml",
+      "application/vnd.adobe.xfdf",
+      "application/vnd.fdf"
+    ],
+    "lang": "en-US",
+    "name": "Adobe Reader",
+    "help_url": "https://support.google.com/chrome/?p=plugin_pdf",
+    "url": "http://ardownload.adobe.com/pub/adobe/reader/win/10.x/10.1.2/en_US/AdbeRdr1012_en_US.exe",
+    "requires_authorization": false
+  },
+  "apple-quicktime": {
+    "mime_types": [
+      "application/sdp",
+      "application/x-mpeg",
+      "application/x-rtsp",
+      "application/x-sdp",
+      "audio/3ggp",
+      "audio/3ggp2",
+      "audio/aac",
+      "audio/ac3",
+      "audio/aiff",
+      "audio/amr",
+      "audio/basic",
+      "audio/mid",
+      "audio/midi",
+      "audio/mp4",
+      "audio/mpeg",
+      "audio/vnd.qcelp",
+      "audio/wav",
+      "audio/x-aac",
+      "audio/x-ac3",
+      "audio/x-aiff",
+      "audio/x-caf",
+      "audio/x-gsm",
+      "audio/x-m4a",
+      "audio/x-m4b",
+      "audio/x-m4p",
+      "audio/x-midi",
+      "audio/x-mpeg",
+      "audio/x-wav",
+      "image/jp2",
+      "image/jpeg2000",
+      "image/jpeg2000-image",
+      "image/pict",
+      "image/png",
+      "image/x-jpeg2000-image",
+      "image/x-macpaint",
+      "image/x-pict",
+      "image/x-png",
+      "image/x-quicktime",
+      "image/x-sgi",
+      "image/x-targa",
+      "video/3ggp",
+      "video/3ggp2",
+      "video/flc",
+      "video/mp4",
+      "video/mpeg",
+      "video/quicktime",
+      "video/sd-video",
+      "video/x-m4v",
+      "video/x-mpeg"
+    ],
+    "lang": "en-US",
+    "name": "QuickTime Player",
+    "help_url": "https://support.google.com/chrome/?p=plugin_quicktime",
+    "url": "http://appldnld.apple.com/QuickTime/041-3089.20111026.Sxpr4/QuickTimeInstaller.exe"
+  },
+  "windows-media-player": {
+    "mime_types": [
+      "application/asx",
+      "application/x-mplayer2",
+      "application/x-ms-wmp",
+      "audio/x-ms-wax",
+      "audio/x-ms-wma",
+      "video/x-ms-asf",
+      "video/x-ms-asf-plugin",
+      "video/x-ms-wm",
+      "video/x-ms-wmv",
+      "video/x-ms-wvx"
+    ],
+    "lang": "en-US",
+    "name": "Windows Media Player",
+    "help_url": "https://support.google.com/chrome/?p=plugin_wmp",
+    "url": "http://interoplabs.blob.core.windows.net/wmpff/wmpfirefoxplugin.exe"
+  },
+  "divx-player": {
+    "mime_types": [
+      "video/divx",
+      "video/x-matroska"
+    ],
+    "lang": "en-US",
+    "name": "DivX Web Player",
+    "help_url": "https://support.google.com/chrome/?p=plugin_divx",
+    "url": "http://download.divx.com/player/divxdotcom/DivXWebPlayerInstaller.exe"
+  },
+  "silverlight": {
+    "mime_types": [
+      "application/x-silverlight",
+      "application/x-silverlight-2"
+    ],
+    "lang": "en-US",
+    "name": "Silverlight",
+    "url": "http://go.microsoft.com/fwlink/?LinkID=149156",
+    "requires_authorization": false
+  }
 }
diff --git a/chrome/browser/ui/webui/plugins_ui.cc b/chrome/browser/ui/webui/plugins_ui.cc
index a2f46aa..c1340a0 100644
--- a/chrome/browser/ui/webui/plugins_ui.cc
+++ b/chrome/browser/ui/webui/plugins_ui.cc
@@ -44,6 +44,15 @@
 #include "ui/base/resource/resource_bundle.h"
 #include "webkit/plugins/npapi/plugin_group.h"
 
+#if defined(ENABLE_PLUGIN_INSTALLATION)
+#include "chrome/browser/plugin_finder.h"
+#include "chrome/browser/plugin_installer.h"
+#else
+// Forward-declare PluginFinder. It's never actually used, but we pass a NULL
+// pointer instead.
+class PluginFinder;
+#endif
+
 using content::PluginService;
 using content::WebContents;
 using content::WebUIMessageHandler;
@@ -149,10 +158,14 @@ class PluginsDOMHandler : public WebUIMessageHandler,
 
  private:
   // Call this to start getting the plugins on the UI thread.
-  void LoadPlugins();
+  void GetPluginFinder();
+
+  // Called when we have a PluginFinder and need to load the list of plug-ins.
+  void LoadPlugins(PluginFinder* plugin_finder);
 
   // Called on the UI thread when the plugin information is ready.
-  void PluginsLoaded(const std::vector<PluginGroup>& groups);
+  void PluginsLoaded(PluginFinder* plugin_finder,
+                     const std::vector<PluginGroup>& groups);
 
   content::NotificationRegistrar registrar_;
 
@@ -197,7 +210,7 @@ void PluginsDOMHandler::RegisterMessages() {
 }
 
 void PluginsDOMHandler::HandleRequestPluginsData(const ListValue* args) {
-  LoadPlugins();
+  GetPluginFinder();
 }
 
 void PluginsDOMHandler::HandleEnablePluginMessage(const ListValue* args) {
@@ -295,22 +308,31 @@ void PluginsDOMHandler::Observe(int type,
                                 const content::NotificationSource& source,
                                 const content::NotificationDetails& details) {
   DCHECK_EQ(chrome::NOTIFICATION_PLUGIN_ENABLE_STATUS_CHANGED, type);
-  LoadPlugins();
+  GetPluginFinder();
 }
 
-void PluginsDOMHandler::LoadPlugins() {
+void PluginsDOMHandler::GetPluginFinder() {
   if (weak_ptr_factory_.HasWeakPtrs())
     return;
 
+#if defined(ENABLE_PLUGIN_INSTALLATION)
+  PluginFinder::Get(base::Bind(&PluginsDOMHandler::LoadPlugins,
+                               weak_ptr_factory_.GetWeakPtr()));
+#else
+  LoadPlugins(NULL);
+#endif
+}
+
+void PluginsDOMHandler::LoadPlugins(PluginFinder* plugin_finder) {
   PluginService::GetInstance()->GetPluginGroups(
       base::Bind(&PluginsDOMHandler::PluginsLoaded,
-          weak_ptr_factory_.GetWeakPtr()));
+          weak_ptr_factory_.GetWeakPtr(), plugin_finder));
 }
 
-void PluginsDOMHandler::PluginsLoaded(const std::vector<PluginGroup>& groups) {
+void PluginsDOMHandler::PluginsLoaded(PluginFinder* plugin_finder,
+                                      const std::vector<PluginGroup>& groups) {
   Profile* profile = Profile::FromWebUI(web_ui());
-  PluginPrefs* plugin_prefs =
-      PluginPrefs::GetForProfile(profile);
+  PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile);
 
   HostContentSettingsMap* map = profile->GetHostContentSettingsMap();
   ContentSettingsPattern wildcard = ContentSettingsPattern::Wildcard();
@@ -396,7 +418,15 @@ void PluginsDOMHandler::PluginsLoaded(const std::vector<PluginGroup>& groups) {
     group_data->SetString("description", active_plugin->desc);
     group_data->SetString("version", active_plugin->version);
     group_data->SetBoolean("critical", group.IsVulnerable(*active_plugin));
-    group_data->SetString("update_url", group.GetUpdateURL());
+
+    std::string update_url;
+#if defined(ENABLE_PLUGIN_INSTALLATION)
+    PluginInstaller* installer =
+        plugin_finder->FindPluginWithIdentifier(group.identifier());
+    if (installer)
+      update_url = installer->plugin_url().spec();
+#endif
+    group_data->SetString("update_url", update_url);
 
     std::string enabled_mode;
     if (all_plugins_enabled_by_policy) {
@@ -410,7 +440,7 @@ void PluginsDOMHandler::PluginsLoaded(const std::vector<PluginGroup>& groups) {
     }
     group_data->SetString("enabledMode", enabled_mode);
 
-    // TODO(bauerb): We should have a method on HostContentSettinsMap for this.
+    // TODO(bauerb): We should have a method on HostContentSettingsMap for this.
     bool always_allowed = false;
     ContentSettingsForOneType settings;
     map->GetSettingsForOneType(CONTENT_SETTINGS_TYPE_PLUGINS,
diff --git a/content/utility/utility_thread_impl.cc b/content/utility/utility_thread_impl.cc
index 4887b57..cf85fbd 100644
--- a/content/utility/utility_thread_impl.cc
+++ b/content/utility/utility_thread_impl.cc
@@ -147,19 +147,16 @@ void UtilityThreadImpl::OnLoadPlugins(
   gfx::GtkInitFromCommandLine(*CommandLine::ForCurrentProcess());
 #endif
 
+  ScopedVector<webkit::npapi::PluginGroup> plugin_groups;
+  // TODO(bauerb): If we restart loading plug-ins, we might mess up the logic in
+  // PluginList::ShouldLoadPlugin due to missing the previously loaded plug-ins
+  // in |plugin_groups|.
   for (size_t i = 0; i < plugin_paths.size(); ++i) {
-    ScopedVector<webkit::npapi::PluginGroup> plugin_groups;
-    plugin_list->LoadPlugin(plugin_paths[i], &plugin_groups);
-
-    if (plugin_groups.empty()) {
+    webkit::WebPluginInfo plugin;
+    if (!plugin_list->LoadPlugin(plugin_paths[i], &plugin_groups, &plugin))
       Send(new UtilityHostMsg_LoadPluginFailed(i, plugin_paths[i]));
-      continue;
-    }
-
-    const webkit::npapi::PluginGroup* group = plugin_groups[0];
-    DCHECK_EQ(group->web_plugin_infos().size(), 1u);
-
-    Send(new UtilityHostMsg_LoadedPlugin(i, group->web_plugin_infos().front()));
+    else
+      Send(new UtilityHostMsg_LoadedPlugin(i, plugin));
   }
 
   ReleaseProcessIfNeeded();
diff --git a/webkit/plugins/npapi/plugin_group.cc b/webkit/plugins/npapi/plugin_group.cc
index 0309dd7..aa8be2f 100644
--- a/webkit/plugins/npapi/plugin_group.cc
+++ b/webkit/plugins/npapi/plugin_group.cc
@@ -20,8 +20,6 @@ namespace npapi {
 
 // static
 const char PluginGroup::kAdobeReaderGroupName[] = "Adobe Acrobat";
-const char PluginGroup::kAdobeReaderUpdateURL[] =
-    "http://get.adobe.com/reader/";
 const char PluginGroup::kJavaGroupName[] = "Java";
 const char PluginGroup::kQuickTimeGroupName[] = "QuickTime";
 const char PluginGroup::kShockwaveGroupName[] = "Shockwave";
@@ -32,8 +30,7 @@ const char PluginGroup::kWindowsMediaPlayerGroupName[] = "Windows Media Player";
 VersionRange::VersionRange(const VersionRangeDefinition& definition)
     : low_str(definition.version_matcher_low),
       high_str(definition.version_matcher_high),
-      min_str(definition.min_version),
-      requires_authorization(definition.requires_authorization) {
+      min_str(definition.min_version) {
   if (!low_str.empty())
     low.reset(Version::GetVersionFromString(low_str));
   if (!high_str.empty())
@@ -60,24 +57,20 @@ void VersionRange::InitFrom(const VersionRange& other) {
   low.reset(Version::GetVersionFromString(other.low_str));
   high.reset(Version::GetVersionFromString(other.high_str));
   min.reset(Version::GetVersionFromString(other.min_str));
-  requires_authorization = other.requires_authorization;
 }
 
 PluginGroup::PluginGroup(const string16& group_name,
                          const string16& name_matcher,
-                         const std::string& update_url,
                          const std::string& identifier)
     : identifier_(identifier),
       group_name_(group_name),
-      name_matcher_(name_matcher),
-      update_url_(update_url) {
+      name_matcher_(name_matcher) {
 }
 
 void PluginGroup::InitFrom(const PluginGroup& other) {
   identifier_ = other.identifier_;
   group_name_ = other.group_name_;
   name_matcher_ = other.name_matcher_;
-  update_url_ = other.update_url_;
   version_ranges_ = other.version_ranges_;
   web_plugin_infos_ = other.web_plugin_infos_;
 }
@@ -96,7 +89,6 @@ PluginGroup* PluginGroup::FromPluginGroupDefinition(
     const PluginGroupDefinition& definition) {
   PluginGroup* group = new PluginGroup(ASCIIToUTF16(definition.name),
                                        ASCIIToUTF16(definition.name_matcher),
-                                       definition.update_url,
                                        definition.identifier);
   for (size_t i = 0; i < definition.num_versions; ++i)
     group->version_ranges_.push_back(VersionRange(definition.versions[i]));
@@ -126,7 +118,7 @@ std::string PluginGroup::GetLongIdentifier(const WebPluginInfo& wpi) {
 /*static*/
 PluginGroup* PluginGroup::FromWebPluginInfo(const WebPluginInfo& wpi) {
   // Create a matcher from the name of this plugin.
-  return new PluginGroup(wpi.name, wpi.name, std::string(),
+  return new PluginGroup(wpi.name, wpi.name,
                          GetIdentifier(wpi));
 }
 
@@ -256,19 +248,6 @@ bool PluginGroup::IsVulnerable(const WebPluginInfo& plugin) const {
   return false;
 }
 
-bool PluginGroup::RequiresAuthorization(const WebPluginInfo& plugin) const {
-  scoped_ptr<Version> version(CreateVersionFromString(plugin.version));
-  if (!version.get())
-    return false;
-
-  for (size_t i = 0; i < version_ranges_.size(); ++i) {
-    if (IsVersionInRange(*version, version_ranges_[i]) &&
-        version_ranges_[i].requires_authorization)
-      return true;
-  }
-  return false;
-}
-
 bool PluginGroup::IsEmpty() const {
   return web_plugin_infos_.empty();
 }
diff --git a/webkit/plugins/npapi/plugin_group.h b/webkit/plugins/npapi/plugin_group.h
index 91ce596..8cb0815 100644
--- a/webkit/plugins/npapi/plugin_group.h
+++ b/webkit/plugins/npapi/plugin_group.h
@@ -34,17 +34,20 @@ struct VersionRangeDefinition {
   // to match anything higher than |version_matcher_low|.
   const char* version_matcher_high;
   const char* min_version;  // Minimum secure version.
-  bool requires_authorization;  // If this range needs user permission to run.
 };
 
 // Hard-coded definitions of plugin groups.
 struct PluginGroupDefinition {
-  const char* identifier;  // Unique identifier for this group.
-  const char* name;  // Name of this group.
-  const char* name_matcher;  // Substring matcher for the plugin name.
-  const VersionRangeDefinition* versions;  // List of version ranges.
-  size_t num_versions;  // Size of the array |versions| points to.
-  const char* update_url;  // Location of latest secure version.
+  // Unique identifier for this group.
+  const char* identifier;
+  // Name of this group.
+  const char* name;
+  // Substring matcher for the plugin name.
+  const char* name_matcher;
+  // List of version ranges.
+  const VersionRangeDefinition* versions;
+  // Size of the array |versions| points to.
+  size_t num_versions;
 };
 
 // Run-time structure to hold version range information.
@@ -61,7 +64,6 @@ struct VersionRange {
   scoped_ptr<Version> low;
   scoped_ptr<Version> high;
   scoped_ptr<Version> min;
-  bool requires_authorization;
  private:
   void InitFrom(const VersionRange& other);
 };
@@ -78,7 +80,6 @@ class WEBKIT_PLUGINS_EXPORT PluginGroup {
   // Used by about:plugins to disable Reader plugin when internal PDF viewer is
   // enabled.
   static const char kAdobeReaderGroupName[];
-  static const char kAdobeReaderUpdateURL[];
   static const char kJavaGroupName[];
   static const char kQuickTimeGroupName[];
   static const char kShockwaveGroupName[];
@@ -117,19 +118,9 @@ class WEBKIT_PLUGINS_EXPORT PluginGroup {
   // Checks whether a plugin exists in the group with the given path.
   bool ContainsPlugin(const FilePath& path) const;
 
-  // Returns the update URL.
-  std::string GetUpdateURL() const { return update_url_; }
-
-  // Returns true if this plugin group is whitelisted.
-  bool IsWhitelisted() const;
-
   // Returns true if |plugin| in this group has known security problems.
   bool IsVulnerable(const WebPluginInfo& plugin) const;
 
-  // Returns true if |plugin| in this plug-in group always requires user
-  // authorization to run.
-  bool RequiresAuthorization(const WebPluginInfo& plugin) const;
-
   // Check if the group has no plugins. Could happen after a reload if the plug-
   // in has disappeared from the pc (or in the process of updating).
   bool IsEmpty() const;
@@ -143,9 +134,9 @@ class WEBKIT_PLUGINS_EXPORT PluginGroup {
   }
 
  private:
-  friend class PluginList;
   friend class MockPluginList;
   friend class PluginGroupTest;
+  friend class PluginList;
   friend class ::PluginExceptionsTableModelTest;
   FRIEND_TEST_ALL_PREFIXES(PluginListTest, DisableOutdated);
 
@@ -176,7 +167,6 @@ class WEBKIT_PLUGINS_EXPORT PluginGroup {
 
   PluginGroup(const string16& group_name,
               const string16& name_matcher,
-              const std::string& update_url,
               const std::string& identifier);
 
   void InitFrom(const PluginGroup& other);
@@ -190,7 +180,6 @@ class WEBKIT_PLUGINS_EXPORT PluginGroup {
   std::string identifier_;
   string16 group_name_;
   string16 name_matcher_;
-  std::string update_url_;
   std::vector<VersionRange> version_ranges_;
   std::vector<webkit::WebPluginInfo> web_plugin_infos_;
 };
diff --git a/webkit/plugins/npapi/plugin_group_unittest.cc b/webkit/plugins/npapi/plugin_group_unittest.cc
index 4a0a991..2033296 100644
--- a/webkit/plugins/npapi/plugin_group_unittest.cc
+++ b/webkit/plugins/npapi/plugin_group_unittest.cc
@@ -20,33 +20,33 @@ namespace webkit {
 namespace npapi {
 
 static const VersionRangeDefinition kPluginVersionRange[] = {
-    { "", "", "3.0.44", false }
+    { "", "", "3.0.44" }
 };
 static const VersionRangeDefinition kPlugin3VersionRange[] = {
-    { "0", "4", "3.0.44", false }
+    { "0", "4", "3.0.44" }
 };
 static const VersionRangeDefinition kPlugin4VersionRange[] = {
-    { "4", "5", "4.0.44", false }
+    { "4", "5", "4.0.44" }
 };
 static const VersionRangeDefinition kPlugin34VersionRange[] = {
-    { "0", "4", "3.0.44", false },
-    { "4", "5", "", false }
+    { "0", "4", "3.0.44" },
+    { "4", "5", "" }
 };
 
 static const PluginGroupDefinition kPluginDef = {
     "myplugin", "MyPlugin", "MyPlugin", kPluginVersionRange,
-    arraysize(kPluginVersionRange), "http://latest/" };
+    arraysize(kPluginVersionRange) };
 static const PluginGroupDefinition kPluginDef3 = {
     "myplugin-3", "MyPlugin 3", "MyPlugin", kPlugin3VersionRange,
-    arraysize(kPlugin3VersionRange), "http://latest" };
+    arraysize(kPlugin3VersionRange) };
 static const PluginGroupDefinition kPluginDef4 = {
     "myplugin-4", "MyPlugin 4", "MyPlugin", kPlugin4VersionRange,
-    arraysize(kPlugin4VersionRange), "http://latest" };
+    arraysize(kPlugin4VersionRange) };
 static const PluginGroupDefinition kPluginDef34 = {
     "myplugin-34", "MyPlugin 3/4", "MyPlugin", kPlugin34VersionRange,
-    arraysize(kPlugin34VersionRange), "http://latest" };
+    arraysize(kPlugin34VersionRange) };
 static const PluginGroupDefinition kPluginDefNotVulnerable = {
-    "myplugin-latest", "MyPlugin", "MyPlugin", NULL, 0, "http://latest" };
+    "myplugin-latest", "MyPlugin", "MyPlugin", NULL, 0 };
 
 const PluginGroupDefinition kPluginDefinitions[] = {
   kPluginDef,
@@ -153,14 +153,13 @@ TEST_F(PluginGroupTest, VersionExtraction) {
 TEST_F(PluginGroupTest, IsVulnerable) {
   // Adobe Reader 10
   VersionRangeDefinition adobe_reader_version_range[] = {
-      { "10", "11", "", false },
-      { "9", "10", "9.4.1", false },
-      { "0", "9", "8.2.5", false }
+      { "10", "11", "" },
+      { "9", "10", "9.4.1" },
+      { "0", "9", "8.2.5" }
   };
   PluginGroupDefinition adobe_reader_plugin_def = {
       "adobe-reader", "Adobe Reader", "Adobe Acrobat",
-      adobe_reader_version_range, arraysize(adobe_reader_version_range),
-      "http://get.adobe.com/reader/" };
+      adobe_reader_version_range, arraysize(adobe_reader_version_range) };
   WebPluginInfo adobe_reader_plugin(ASCIIToUTF16("Adobe Reader"),
                                     FilePath(FILE_PATH_LITERAL("/reader.so")),
                                     ASCIIToUTF16("10.0.0.396"),
@@ -170,17 +169,15 @@ TEST_F(PluginGroupTest, IsVulnerable) {
   group->AddPlugin(adobe_reader_plugin);
   PluginGroup group_copy(*group);  // Exercise the copy constructor.
   EXPECT_FALSE(group_copy.IsVulnerable(adobe_reader_plugin));
-  EXPECT_FALSE(group_copy.RequiresAuthorization(adobe_reader_plugin));
 
   // Silverlight 4
   VersionRangeDefinition silverlight_version_range[] = {
-      { "0", "4", "3.0.50106.0", false },
-      { "4", "5", "", true }
+      { "0", "4", "3.0.50106.0" },
+      { "4", "5", "" }
   };
   PluginGroupDefinition silverlight_plugin_def = {
       "silverlight", "Silverlight", "Silverlight", silverlight_version_range,
-      arraysize(silverlight_version_range),
-      "http://www.microsoft.com/getsilverlight/" };
+      arraysize(silverlight_version_range) };
   WebPluginInfo silverlight_plugin(ASCIIToUTF16("Silverlight"),
                                    FilePath(FILE_PATH_LITERAL("/silver.so")),
                                    ASCIIToUTF16("4.0.50917.0"),
@@ -188,7 +185,6 @@ TEST_F(PluginGroupTest, IsVulnerable) {
   group.reset(PluginGroupTest::CreatePluginGroup(silverlight_plugin_def));
   group->AddPlugin(silverlight_plugin);
   EXPECT_FALSE(PluginGroup(*group).IsVulnerable(silverlight_plugin));
-  EXPECT_TRUE(PluginGroup(*group).RequiresAuthorization(silverlight_plugin));
 }
 
 }  // namespace npapi
diff --git a/webkit/plugins/npapi/plugin_list.cc b/webkit/plugins/npapi/plugin_list.cc
index 2d70c01..260fadf 100644
--- a/webkit/plugins/npapi/plugin_list.cc
+++ b/webkit/plugins/npapi/plugin_list.cc
@@ -53,99 +53,81 @@ bool AllowMimeTypeMismatch(const std::string& orig_mime_type,
 namespace webkit {
 namespace npapi {
 
+// Note: If you change the plug-in definitions here, also update
+// chrome/browser/resources/plugins_*.json correspondingly!
+// In particular, the identifier and the update URLs need to be kept in sync.
+
 // Some version ranges can be shared across operating systems. This should be
 // done where possible to avoid duplication.
-// TODO(bauerb): The |requires_authorization| flag should be part of
-// PluginGroupDefinition, not VersionRangeDefinition.
-static const VersionRangeDefinition kAllVersionsInfobarVersionRange[] = {
-    { "", "", "", true }
-};
-
-static const VersionRangeDefinition kAllVersionsNoInfobarVersionRange[] = {
-    { "", "", "", false }
-};
 
 // This is up to date with
 // http://www.adobe.com/support/security/bulletins/apsb12-03.html
 // NOTE: We would like to go to the 4th component value but we cannot because
 // on some platforms, such as Linux, it is not available.
 static const VersionRangeDefinition kFlashVersionRange[] = {
-    { "", "", "11.1.102", false }
+    { "", "", "11.1.102" }
 };
 // This is up to date with
 // http://www.adobe.com/support/security/bulletins/apsb12-02.html
 static const VersionRangeDefinition kShockwaveVersionRange[] = {
-    { "",  "", "11.6.4.634", true }
+    { "",  "", "11.6.4.634" }
 };
 // This is up to date with
 // http://support.microsoft.com/kb/2668562
 // http://technet.microsoft.com/en-us/security/Bulletin/MS12-016
 static const VersionRangeDefinition kSilverlightVersionRange[] = {
-    { "0", "5", "4.1.10111.0", false },
-    { "5", "6", "", false },
+    { "0", "5", "4.1.10111.0" },
+    { "5", "6", "" },
 };
 
 // Similarly, try and share the group definition for plug-ins that are
 // very consistent across OS'es.
 #define kFlashDefinition { \
     "adobe-flash-player", "Flash", "Shockwave Flash", kFlashVersionRange,\
-    arraysize(kFlashVersionRange), "http://get.adobe.com/flashplayer/" }
+    arraysize(kFlashVersionRange) }
 
 #define kShockwaveDefinition { \
     "shockwave", PluginGroup::kShockwaveGroupName, "Shockwave for Director", \
-    kShockwaveVersionRange, arraysize(kShockwaveVersionRange), \
-    "http://www.adobe.com/shockwave/download/" }
+    kShockwaveVersionRange, arraysize(kShockwaveVersionRange) }
 
 #define kSilverlightDefinition { \
     "silverlight", PluginGroup::kSilverlightGroupName, "Silverlight", \
-    kSilverlightVersionRange, arraysize(kSilverlightVersionRange), \
-    "http://www.microsoft.com/getsilverlight/" }
+    kSilverlightVersionRange, arraysize(kSilverlightVersionRange) }
 
 #define kChromePdfDefinition { \
-    "google-chrome-pdf", "Chrome PDF Viewer", "Chrome PDF Viewer", \
-    kAllVersionsNoInfobarVersionRange, \
-    arraysize(kAllVersionsNoInfobarVersionRange), "" }
+    "google-chrome-pdf", "Chrome PDF Viewer", "Chrome PDF Viewer", NULL, 0 }
 
 #define kGoogleTalkDefinition { \
-    "google-talk", "Google Talk", "Google Talk", \
-    kAllVersionsNoInfobarVersionRange, \
-    arraysize(kAllVersionsNoInfobarVersionRange), ""}
+    "google-talk", "Google Talk", "Google Talk", NULL, 0 }
 
 #if defined(OS_MACOSX)
 // Plugin Groups for Mac.
 // Plugins are listed here as soon as vulnerabilities and solutions
 // (new versions) are published.
 static const VersionRangeDefinition kQuicktimeVersionRange[] = {
-    { "", "", "7.6.6", true }
+    { "", "", "7.6.6" }
 };
 static const VersionRangeDefinition kJavaVersionRange[] = {
-    { "0", "13.0", "12.8.0", true },  // Leopard
-    { "13.0", "14.0", "13.5.0", true },  // Snow Leopard
-    { "14.0", "", "14.0.3", true }  // Lion
+    { "0", "13.0", "12.8.0" },  // Leopard
+    { "13.0", "14.0", "13.5.0" },  // Snow Leopard
+    { "14.0", "", "14.0.3" }  // Lion
 };
 static const VersionRangeDefinition kFlip4MacVersionRange[] = {
-    { "", "", "2.2.1", true }
-};
-static const VersionRangeDefinition kDivXVersionRange[] = {
-    { "", "", "", true }
+    { "", "", "2.2.1" }
 };
 // Note: The Adobe Reader browser plug-in is not supported in Chrome.
 // Note: The Real Player plugin for mac doesn't expose a version at all.
 static const PluginGroupDefinition kGroupDefinitions[] = {
   kFlashDefinition,
   { "apple-quicktime", PluginGroup::kQuickTimeGroupName, "QuickTime Plug-in",
-    kQuicktimeVersionRange, arraysize(kQuicktimeVersionRange),
-    "http://www.apple.com/quicktime/download/" },
+    kQuicktimeVersionRange, arraysize(kQuicktimeVersionRange) },
   { "java-runtime-environment", PluginGroup::kJavaGroupName, "Java",
-    kJavaVersionRange, arraysize(kJavaVersionRange),
-    "http://support.apple.com/kb/HT1338" },
+    kJavaVersionRange, arraysize(kJavaVersionRange) },
   kSilverlightDefinition,
   { "flip4mac", "Flip4Mac", "Flip4Mac", kFlip4MacVersionRange,
-    arraysize(kFlip4MacVersionRange),
-    "http://www.telestream.net/flip4mac-wmv/overview.htm" },
+    arraysize(kFlip4MacVersionRange) },
   { "divx-player", "DivX Plus Web Player", "DivX Plus Web Player",
-    kDivXVersionRange, arraysize(kDivXVersionRange),
-    "http://www.divx.com/en/software/divx-plus/web-player" },
+    NULL, 0 },
   kShockwaveDefinition,
   kChromePdfDefinition,
   kGoogleTalkDefinition,
@@ -155,54 +137,46 @@ static const PluginGroupDefinition kGroupDefinitions[] = {
 // TODO(panayiotis): We should group "RealJukebox NS Plugin" with the rest of
 // the RealPlayer files.
 static const VersionRangeDefinition kQuicktimeVersionRange[] = {
-    { "", "", "7.6.9", true }
+    { "", "", "7.6.9" }
 };
 static const VersionRangeDefinition kJavaVersionRange[] = {
-    { "0", "7", "6.0.310", true },  // "310" is not a typo.
-    { "7", "", "10.3", true }  // JDK7u3 identifies itself as 10.3
+    { "0", "7", "6.0.310" },  // "310" is not a typo.
+    { "7", "", "10.3" }  // JDK7u3 identifies itself as 10.3
 };
 // This is up to date with
 // http://www.adobe.com/support/security/bulletins/apsb12-01.html
 static const VersionRangeDefinition kAdobeReaderVersionRange[] = {
-    { "10", "11", "10.1.2", false },
-    { "0", "10", "9.5", false }
+    { "10", "11", "10.1.2" },
+    { "0", "10", "9.5" }
 };
 static const VersionRangeDefinition kDivXVersionRange[] = {
-    { "", "", "1.4.3.4", true }
+    { "", "", "1.4.3.4" }
 };
 // This is up to date with
 // http://service.real.com/realplayer/security/02062012_player/en/
 static const VersionRangeDefinition kRealPlayerVersionRange[] = {
-    { "", "", "15.0.2.71", true }
+    { "", "", "15.0.2.71" }
 };
 static const PluginGroupDefinition kGroupDefinitions[] = {
   kFlashDefinition,
   { "apple-quicktime", PluginGroup::kQuickTimeGroupName, "QuickTime Plug-in",
-    kQuicktimeVersionRange, arraysize(kQuicktimeVersionRange),
-    "http://www.apple.com/quicktime/download/" },
+    kQuicktimeVersionRange, arraysize(kQuicktimeVersionRange) },
   { "java-runtime-environment", PluginGroup::kJavaGroupName, "Java",
-    kJavaVersionRange, arraysize(kJavaVersionRange),
-    "http://www.java.com/download" },
+    kJavaVersionRange, arraysize(kJavaVersionRange) },
   { "adobe-reader", PluginGroup::kAdobeReaderGroupName, "Adobe Acrobat",
-    kAdobeReaderVersionRange, arraysize(kAdobeReaderVersionRange),
-    "http://get.adobe.com/reader/" },
+    kAdobeReaderVersionRange, arraysize(kAdobeReaderVersionRange) },
   kSilverlightDefinition,
   kShockwaveDefinition,
   { "divx-player", "DivX Player", "DivX Web Player", kDivXVersionRange,
-    arraysize(kDivXVersionRange),
-    "http://download.divx.com/divx/autoupdate/player/"
-    "DivXWebPlayerInstaller.exe" },
+    arraysize(kDivXVersionRange) },
   { "realplayer", PluginGroup::kRealPlayerGroupName, "RealPlayer",
-    kRealPlayerVersionRange, arraysize(kRealPlayerVersionRange),
-    "http://www.real.com/realplayer/download" },
+    kRealPlayerVersionRange, arraysize(kRealPlayerVersionRange) },
   // These are here for grouping, no vulnerabilities known.
   { "windows-media-player", PluginGroup::kWindowsMediaPlayerGroupName,
-    "Windows Media Player", kAllVersionsInfobarVersionRange,
-    arraysize(kAllVersionsInfobarVersionRange), "" },
+    "Windows Media Player", NULL, 0 },
   { "microsoft-office", "Microsoft Office", "Microsoft Office",
-    NULL, 0, "" },
-  { "nvidia-3d", "NVIDIA 3D", "NVIDIA 3D", kAllVersionsInfobarVersionRange,
-    arraysize(kAllVersionsInfobarVersionRange), "" },
+    NULL, 0 },
+  { "nvidia-3d", "NVIDIA 3D", "NVIDIA 3D", NULL, 0 },
   kChromePdfDefinition,
   kGoogleTalkDefinition,
 };
@@ -217,18 +191,18 @@ static const PluginGroupDefinition kGroupDefinitions[] = {
 
 #else  // Most importantly, covers desktop Linux.
 static const VersionRangeDefinition kJavaVersionRange[] = {
-    { "0", "1.7", "1.6.0.31", true },
-    { "1.7", "", "1.7.0.3", true }
+    { "0", "1.7", "1.6.0.31" },
+    { "1.7", "", "1.7.0.3" }
 };
 
 // Up to date with:
 // http://blog.fuseyism.com/index.php/2012/02/15/
 // security-icedtea6-1-8-13-1-9-13-1-10-6-and-icedtea-2-0-1-released/
 static const VersionRangeDefinition kRedhatIcedTeaVersionRange[] = {
-    { "0", "1.9", "1.8.13", true },
-    { "1.9", "1.10", "1.9.13", true },
-    { "1.10", "2", "1.10.6", true },
-    { "2", "", "2.0.1", true }
+    { "0", "1.9", "1.8.13" },
+    { "1.9", "1.10", "1.9.13" },
+    { "1.10", "2", "1.10.6" },
+    { "2", "", "2.0.1" }
 };
 
 static const PluginGroupDefinition kGroupDefinitions[] = {
@@ -236,11 +210,9 @@ static const PluginGroupDefinition kGroupDefinitions[] = {
   // plug-in on the Linux 64-bit version of Chrome.
   kFlashDefinition,
   { "java-runtime-environment", PluginGroup::kJavaGroupName, "Java",
-    kJavaVersionRange, arraysize(kJavaVersionRange),
-    "http://www.java.com/en/download/manual.jsp" },
+    kJavaVersionRange, arraysize(kJavaVersionRange) },
   { "redhat-icetea-java", "IcedTea", "IcedTea",
-    kRedhatIcedTeaVersionRange, arraysize(kRedhatIcedTeaVersionRange),
-    "http://www.linuxsecurity.com/content/section/3/170/" },
+    kRedhatIcedTeaVersionRange, arraysize(kRedhatIcedTeaVersionRange) },
   kChromePdfDefinition,
   kGoogleTalkDefinition,
 };
@@ -440,7 +412,8 @@ void PluginList::LoadPluginsInternal(ScopedVector<PluginGroup>* plugin_groups) {
   for (std::vector<FilePath>::const_iterator it = plugin_paths.begin();
        it != plugin_paths.end();
        ++it) {
-    LoadPlugin(*it, plugin_groups);
+    WebPluginInfo plugin_info;
+    LoadPlugin(*it, plugin_groups, &plugin_info);
   }
 }
 
@@ -459,35 +432,34 @@ void PluginList::LoadPlugins() {
   plugin_groups_.swap(new_plugin_groups);
 }
 
-void PluginList::LoadPlugin(const FilePath& path,
-                            ScopedVector<PluginGroup>* plugin_groups) {
+bool PluginList::LoadPlugin(const FilePath& path,
+                            ScopedVector<PluginGroup>* plugin_groups,
+                            WebPluginInfo* plugin_info) {
   LOG_IF(ERROR, PluginList::DebugPluginLoading())
       << "Loading plugin " << path.value();
-  WebPluginInfo plugin_info;
   const PluginEntryPoints* entry_points;
 
-  if (!ReadPluginInfo(path, &plugin_info, &entry_points))
-    return;
+  if (!ReadPluginInfo(path, plugin_info, &entry_points))
+    return false;
 
-  if (!ShouldLoadPlugin(plugin_info, plugin_groups))
-    return;
+  if (!ShouldLoadPlugin(*plugin_info, plugin_groups))
+    return false;
 
 #if defined(OS_WIN) && !defined(NDEBUG)
   if (path.BaseName().value() != L"npspy.dll")  // Make an exception for NPSPY
 #endif
   {
-    for (size_t i = 0; i < plugin_info.mime_types.size(); ++i) {
+    for (size_t i = 0; i < plugin_info->mime_types.size(); ++i) {
       // TODO: don't load global handlers for now.
       // WebKit hands to the Plugin before it tries
       // to handle mimeTypes on its own.
-      const std::string &mime_type = plugin_info.mime_types[i].mime_type;
+      const std::string &mime_type = plugin_info->mime_types[i].mime_type;
       if (mime_type == "*")
-        return;
+        return false;
     }
   }
-
-  base::AutoLock lock(lock_);
-  AddToPluginGroups(plugin_info, plugin_groups);
+  AddToPluginGroups(*plugin_info, plugin_groups);
+  return true;
 }
 
 void PluginList::GetPluginPathsToLoad(std::vector<FilePath>* plugin_paths) {
diff --git a/webkit/plugins/npapi/plugin_list.h b/webkit/plugins/npapi/plugin_list.h
index bff39c4..87ea02d 100644
--- a/webkit/plugins/npapi/plugin_list.h
+++ b/webkit/plugins/npapi/plugin_list.h
@@ -162,9 +162,11 @@ class WEBKIT_PLUGINS_EXPORT PluginList {
   // If no such group exists, an empty string is returned.
   string16 GetPluginGroupName(const std::string& identifier);
 
-  // Load a specific plugin with full path.
-  void LoadPlugin(const FilePath& filename,
-                  ScopedVector<PluginGroup>* plugin_groups);
+  // Load a specific plugin with full path. Return true iff loading the plug-in
+  // was successful.
+  bool LoadPlugin(const FilePath& filename,
+                  ScopedVector<PluginGroup>* plugin_groups,
+                  webkit::WebPluginInfo* plugin_info);
 
   // The following functions are used to support probing for WebPluginInfo
   // using a different instance of this class.
@@ -186,7 +188,6 @@ class WEBKIT_PLUGINS_EXPORT PluginList {
 
   // Adds the given WebPluginInfo to its corresponding group, creating it if
   // necessary, and returns the group.
-  // Callers need to protect calls to this method by a lock themselves.
   PluginGroup* AddToPluginGroups(const webkit::WebPluginInfo& web_plugin_info,
                                  ScopedVector<PluginGroup>* plugin_groups);
 
diff --git a/webkit/plugins/npapi/plugin_list_unittest.cc b/webkit/plugins/npapi/plugin_list_unittest.cc
index 3aa75b5..a58d06b 100644
--- a/webkit/plugins/npapi/plugin_list_unittest.cc
+++ b/webkit/plugins/npapi/plugin_list_unittest.cc
@@ -37,8 +37,7 @@ const char* kFooIdentifier = "foo";
 const char* kFooGroupName = "Foo";
 const char* kFooName = "Foo Plugin";
 const PluginGroupDefinition kPluginDefinitions[] = {
-  { kFooIdentifier, kFooGroupName, kFooName, NULL, 0,
-    "http://example.com/foo" },
+  { kFooIdentifier, kFooGroupName, kFooName, NULL, 0 },
 };
 
 }  // namespace
-- 
cgit v1.1