summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorbauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-23 17:10:42 +0000
committerbauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-23 17:10:42 +0000
commit3e31a0ada9e03e67f8a6fc74e6e750fe4fc61013 (patch)
tree0fba63f95cfe2d3cb20dbf5ec9156e6f223e66dc /chrome/browser
parenteec23bcdb7ac703c4c32f059b5871361f2bdd5e6 (diff)
downloadchromium_src-3e31a0ada9e03e67f8a6fc74e6e750fe4fc61013.zip
chromium_src-3e31a0ada9e03e67f8a6fc74e6e750fe4fc61013.tar.gz
chromium_src-3e31a0ada9e03e67f8a6fc74e6e750fe4fc61013.tar.bz2
Move version metadata from PluginGroup into PluginInstaller.
This also moves the plug-in information JSON files into their own subdirectory, so they can be changed without requiring OWNERS reviews for chrome/browser/resources (which is mostly WebUI otherwise). BUG=124396 TEST=PluginInstallerTest.SecurityStatus:PluginFinderTest.JsonSyntax Review URL: https://chromiumcodereview.appspot.com/10263022 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@138502 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/browser_resources.grd6
-rw-r--r--chrome/browser/extensions/api/content_settings/content_settings_apitest.cc2
-rw-r--r--chrome/browser/plugin_finder.cc31
-rw-r--r--chrome/browser/plugin_finder_unittest.cc30
-rw-r--r--chrome/browser/plugin_infobar_delegates.cc10
-rw-r--r--chrome/browser/plugin_installer.cc90
-rw-r--r--chrome/browser/plugin_installer.h63
-rw-r--r--chrome/browser/plugin_installer_unittest.cc53
-rw-r--r--chrome/browser/plugin_observer.cc4
-rw-r--r--chrome/browser/renderer_host/plugin_info_message_filter.cc23
-rw-r--r--chrome/browser/resources/plugin_metadata/OWNERS3
-rw-r--r--chrome/browser/resources/plugin_metadata/plugins_linux.json (renamed from chrome/browser/resources/plugins_linux.json)56
-rw-r--r--chrome/browser/resources/plugin_metadata/plugins_mac.json (renamed from chrome/browser/resources/plugins_mac.json)94
-rw-r--r--chrome/browser/resources/plugin_metadata/plugins_win.json (renamed from chrome/browser/resources/plugins_win.json)77
-rw-r--r--chrome/browser/ui/pdf/pdf_unsupported_feature.cc61
-rw-r--r--chrome/browser/ui/webui/plugins_ui.cc11
16 files changed, 475 insertions, 139 deletions
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index 28a9d02..9c24f53 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -90,13 +90,13 @@
<include name="IDR_PLUGINS_HTML" file="resources\plugins.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
<include name="IDR_PLUGINS_JS" file="resources\plugins.js" type="BINDATA" />
<if expr="is_win">
- <include name="IDR_PLUGIN_DB_JSON" file="resources\plugins_win.json" type="BINDATA" />
+ <include name="IDR_PLUGIN_DB_JSON" file="resources\plugin_metadata\plugins_win.json" type="BINDATA" />
</if>
<if expr="is_macosx">
- <include name="IDR_PLUGIN_DB_JSON" file="resources\plugins_mac.json" type="BINDATA" />
+ <include name="IDR_PLUGIN_DB_JSON" file="resources\plugin_metadata\plugins_mac.json" type="BINDATA" />
</if>
<if expr="is_linux">
- <include name="IDR_PLUGIN_DB_JSON" file="resources\plugins_linux.json" type="BINDATA" />
+ <include name="IDR_PLUGIN_DB_JSON" file="resources\plugin_metadata\plugins_linux.json" type="BINDATA" />
</if>
<include name="IDR_POLICY_CSS" file="resources\policy.css" type="BINDATA"/>
<include name="IDR_POLICY_HTML" file="resources\policy.html" flattenhtml="true" allowexternalscript="true" type="BINDATA"/>
diff --git a/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc b/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc
index c44e5a0..8dc534f 100644
--- a/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc
+++ b/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc
@@ -105,7 +105,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 },
+ { "foo", "Foo", kFooName },
};
webkit::npapi::MockPluginList plugin_list(kPluginDefinitions,
diff --git a/chrome/browser/plugin_finder.cc b/chrome/browser/plugin_finder.cc
index 2456169..a4609ed 100644
--- a/chrome/browser/plugin_finder.cc
+++ b/chrome/browser/plugin_finder.cc
@@ -130,14 +130,35 @@ PluginInstaller* PluginFinder::CreateInstaller(
DCHECK(success);
bool display_url = false;
plugin_dict->GetBoolean("displayurl", &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);
+ GURL(url),
+ GURL(help_url));
+ ListValue* versions = NULL;
+ if (plugin_dict->GetList("versions", &versions)) {
+ for (ListValue::const_iterator it = versions->begin();
+ it != versions->end(); ++it) {
+ DictionaryValue* version_dict = NULL;
+ if (!(*it)->GetAsDictionary(&version_dict)) {
+ NOTREACHED();
+ continue;
+ }
+ std::string version;
+ success = version_dict->GetString("version", &version);
+ DCHECK(success);
+ std::string status_str;
+ success = version_dict->GetString("status", &status_str);
+ DCHECK(success);
+ PluginInstaller::SecurityStatus status =
+ PluginInstaller::SECURITY_STATUS_UP_TO_DATE;
+ success = PluginInstaller::ParseSecurityStatus(status_str, &status);
+ DCHECK(success);
+ installer->AddVersion(Version(version), status);
+ }
+ }
+
installers_[identifier] = installer;
return installer;
}
diff --git a/chrome/browser/plugin_finder_unittest.cc b/chrome/browser/plugin_finder_unittest.cc
index fede022..d6afe1f 100644
--- a/chrome/browser/plugin_finder_unittest.cc
+++ b/chrome/browser/plugin_finder_unittest.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/plugin_finder.h"
#include "base/values.h"
+#include "chrome/browser/plugin_installer.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "webkit/plugins/npapi/plugin_list.h"
@@ -36,20 +37,21 @@ TEST(PluginFinderTest, JsonSyntax) {
mime_type_it != mime_types->end(); ++mime_type_it) {
EXPECT_TRUE((*mime_type_it)->GetAsString(&dummy_str));
}
- }
-}
-
-TEST(PluginFinderTest, PluginGroups) {
- PluginFinder plugin_finder;
- PluginList* plugin_list = PluginList::Singleton();
- const std::vector<PluginGroup*>& plugin_groups =
- plugin_list->GetHardcodedPluginGroups();
- for (std::vector<PluginGroup*>::const_iterator it = plugin_groups.begin();
- it != plugin_groups.end(); ++it) {
- if ((*it)->version_ranges().empty())
+ ListValue* versions = NULL;
+ if (!plugin->GetList("versions", &versions))
continue;
- std::string identifier = (*it)->identifier();
- EXPECT_TRUE(plugin_finder.FindPluginWithIdentifier(identifier)) <<
- "Couldn't find PluginInstaller for '" << identifier << "'";
+
+ for (ListValue::const_iterator it = versions->begin();
+ it != versions->end(); ++it) {
+ DictionaryValue* version_dict = NULL;
+ ASSERT_TRUE((*it)->GetAsDictionary(&version_dict));
+ EXPECT_TRUE(version_dict->GetString("version", &dummy_str));
+ std::string status_str;
+ EXPECT_TRUE(version_dict->GetString("status", &status_str));
+ PluginInstaller::SecurityStatus status =
+ PluginInstaller::SECURITY_STATUS_UP_TO_DATE;
+ EXPECT_TRUE(PluginInstaller::ParseSecurityStatus(status_str, &status))
+ << "Invalid security status \"" << status_str << "\"";
+ }
}
}
diff --git a/chrome/browser/plugin_infobar_delegates.cc b/chrome/browser/plugin_infobar_delegates.cc
index e8a94ba..59bf3a3 100644
--- a/chrome/browser/plugin_infobar_delegates.cc
+++ b/chrome/browser/plugin_infobar_delegates.cc
@@ -150,11 +150,11 @@ InfoBarDelegate* OutdatedPluginInfoBarDelegate::Create(
PluginInstaller* installer) {
string16 message;
switch (installer->state()) {
- case PluginInstaller::kStateIdle:
+ case PluginInstaller::INSTALLER_STATE_IDLE:
message = l10n_util::GetStringFUTF16(IDS_PLUGIN_OUTDATED_PROMPT,
installer->name());
break;
- case PluginInstaller::kStateDownloading:
+ case PluginInstaller::INSTALLER_STATE_DOWNLOADING:
message = l10n_util::GetStringFUTF16(IDS_PLUGIN_DOWNLOADING,
installer->name());
break;
@@ -216,7 +216,7 @@ string16 OutdatedPluginInfoBarDelegate::GetButtonLabel(
bool OutdatedPluginInfoBarDelegate::Accept() {
content::RecordAction(UserMetricsAction("OutdatedPluginInfobar.Update"));
- if (installer()->state() != PluginInstaller::kStateIdle) {
+ if (installer()->state() != PluginInstaller::INSTALLER_STATE_IDLE) {
NOTREACHED();
return false;
}
@@ -314,11 +314,11 @@ InfoBarDelegate* PluginInstallerInfoBarDelegate::Create(
string16 message;
const string16& plugin_name = installer->name();
switch (installer->state()) {
- case PluginInstaller::kStateIdle:
+ case PluginInstaller::INSTALLER_STATE_IDLE:
message = l10n_util::GetStringFUTF16(
IDS_PLUGININSTALLER_INSTALLPLUGIN_PROMPT, plugin_name);
break;
- case PluginInstaller::kStateDownloading:
+ case PluginInstaller::INSTALLER_STATE_DOWNLOADING:
message = l10n_util::GetStringFUTF16(IDS_PLUGIN_DOWNLOADING, plugin_name);
break;
}
diff --git a/chrome/browser/plugin_installer.cc b/chrome/browser/plugin_installer.cc
index 75e9cf2..8ba5853 100644
--- a/chrome/browser/plugin_installer.cc
+++ b/chrome/browser/plugin_installer.cc
@@ -25,6 +25,7 @@
#include "content/public/browser/resource_dispatcher_host.h"
#include "content/public/browser/web_contents.h"
#include "net/url_request/url_request.h"
+#include "webkit/plugins/npapi/plugin_group.h"
using content::BrowserThread;
using content::DownloadItem;
@@ -59,34 +60,83 @@ void BeginDownload(
}
}
-}
+} // namespace
PluginInstaller::PluginInstaller(const std::string& identifier,
- const GURL& plugin_url,
- const GURL& help_url,
const string16& name,
bool url_for_display,
- bool requires_authorization)
- : state_(kStateIdle),
- identifier_(identifier),
- plugin_url_(plugin_url),
- help_url_(help_url),
+ const GURL& plugin_url,
+ const GURL& help_url)
+ : identifier_(identifier),
name_(name),
url_for_display_(url_for_display),
- requires_authorization_(requires_authorization) {
+ plugin_url_(plugin_url),
+ help_url_(help_url),
+ state_(INSTALLER_STATE_IDLE) {
}
PluginInstaller::~PluginInstaller() {
}
+void PluginInstaller::AddVersion(const Version& version,
+ SecurityStatus status) {
+ DCHECK(versions_.find(version) == versions_.end());
+ versions_[version] = status;
+}
+
+PluginInstaller::SecurityStatus PluginInstaller::GetSecurityStatus(
+ const webkit::WebPluginInfo& plugin) const {
+ // If there are no versions defined, the plug-in is alway considered
+ // up-to-date.
+ if (versions_.empty())
+ return SECURITY_STATUS_UP_TO_DATE;
+
+ scoped_ptr<Version> version(
+ webkit::npapi::PluginGroup::CreateVersionFromString(plugin.version));
+ if (!version.get())
+ version.reset(new Version("0"));
+
+ // |lower_bound| returns the latest version that is not newer than |version|.
+ std::map<Version, SecurityStatus, VersionComparator>::const_iterator it =
+ versions_.lower_bound(*version);
+ // If there is at least one version defined, everything older than the oldest
+ // defined version is considered out-of-date.
+ if (it == versions_.end())
+ return SECURITY_STATUS_OUT_OF_DATE;
+
+ return it->second;
+}
+
+bool PluginInstaller::VersionComparator::operator() (const Version& lhs,
+ const Version& rhs) const {
+ // Keep versions ordered by newest (biggest) first.
+ return lhs.CompareTo(rhs) > 0;
+}
+
+// static
+bool PluginInstaller::ParseSecurityStatus(
+ const std::string& status_str,
+ PluginInstaller::SecurityStatus* status) {
+ if (status_str == "up_to_date")
+ *status = SECURITY_STATUS_UP_TO_DATE;
+ else if (status_str == "out_of_date")
+ *status = SECURITY_STATUS_OUT_OF_DATE;
+ else if (status_str == "requires_authorization")
+ *status = SECURITY_STATUS_REQUIRES_AUTHORIZATION;
+ else
+ return false;
+
+ return true;
+}
+
void PluginInstaller::OnDownloadUpdated(DownloadItem* download) {
DownloadItem::DownloadState state = download->GetState();
switch (state) {
case DownloadItem::IN_PROGRESS:
return;
case DownloadItem::COMPLETE: {
- DCHECK_EQ(kStateDownloading, state_);
- state_ = kStateIdle;
+ DCHECK_EQ(INSTALLER_STATE_DOWNLOADING, state_);
+ state_ = INSTALLER_STATE_IDLE;
FOR_EACH_OBSERVER(PluginInstallerObserver, observers_,
DownloadFinished());
break;
@@ -96,8 +146,8 @@ void PluginInstaller::OnDownloadUpdated(DownloadItem* download) {
break;
}
case DownloadItem::REMOVING: {
- DCHECK_EQ(kStateDownloading, state_);
- state_ = kStateIdle;
+ DCHECK_EQ(INSTALLER_STATE_DOWNLOADING, state_);
+ state_ = INSTALLER_STATE_IDLE;
break;
}
case DownloadItem::INTERRUPTED: {
@@ -138,9 +188,9 @@ void PluginInstaller::RemoveWeakObserver(
}
void PluginInstaller::StartInstalling(TabContentsWrapper* wrapper) {
- DCHECK(state_ == kStateIdle);
+ DCHECK_EQ(INSTALLER_STATE_IDLE, state_);
DCHECK(!url_for_display_);
- state_ = kStateDownloading;
+ state_ = INSTALLER_STATE_DOWNLOADING;
FOR_EACH_OBSERVER(PluginInstallerObserver, observers_, DownloadStarted());
content::WebContents* web_contents = wrapper->web_contents();
DownloadService* download_service =
@@ -177,7 +227,7 @@ void PluginInstaller::DownloadStarted(
}
void PluginInstaller::OpenDownloadURL(content::WebContents* web_contents) {
- DCHECK(state_ == kStateIdle);
+ DCHECK_EQ(INSTALLER_STATE_IDLE, state_);
DCHECK(url_for_display_);
web_contents->OpenURL(content::OpenURLParams(
plugin_url_,
@@ -188,13 +238,13 @@ void PluginInstaller::OpenDownloadURL(content::WebContents* web_contents) {
}
void PluginInstaller::DownloadError(const std::string& msg) {
- DCHECK(state_ == kStateDownloading);
- state_ = kStateIdle;
+ DCHECK_EQ(INSTALLER_STATE_DOWNLOADING, state_);
+ state_ = INSTALLER_STATE_IDLE;
FOR_EACH_OBSERVER(PluginInstallerObserver, observers_, DownloadError(msg));
}
void PluginInstaller::DownloadCancelled() {
- DCHECK(state_ == kStateDownloading);
- state_ = kStateIdle;
+ DCHECK_EQ(INSTALLER_STATE_DOWNLOADING, state_);
+ state_ = INSTALLER_STATE_IDLE;
FOR_EACH_OBSERVER(PluginInstallerObserver, observers_, DownloadCancelled());
}
diff --git a/chrome/browser/plugin_installer.h b/chrome/browser/plugin_installer.h
index b3a9f53..89cc7c7 100644
--- a/chrome/browser/plugin_installer.h
+++ b/chrome/browser/plugin_installer.h
@@ -8,6 +8,7 @@
#include "base/observer_list.h"
#include "base/string16.h"
+#include "base/version.h"
#include "googleurl/src/gurl.h"
#include "content/public/browser/download_id.h"
#include "content/public/browser/download_item.h"
@@ -22,19 +23,29 @@ namespace content {
class WebContents;
}
+namespace webkit {
+struct WebPluginInfo;
+}
+
class PluginInstaller : public content::DownloadItem::Observer {
public:
- enum State {
- kStateIdle,
- kStateDownloading,
+ enum InstallerState {
+ INSTALLER_STATE_IDLE,
+ INSTALLER_STATE_DOWNLOADING,
+ };
+
+ // Information about a certain version of the plug-in.
+ enum SecurityStatus {
+ SECURITY_STATUS_UP_TO_DATE,
+ SECURITY_STATUS_OUT_OF_DATE,
+ SECURITY_STATUS_REQUIRES_AUTHORIZATION,
};
PluginInstaller(const std::string& identifier,
- const GURL& plugin_url,
- const GURL& help_url,
const string16& name,
bool url_for_display,
- bool requires_authorization);
+ const GURL& plugin_url,
+ const GURL& help_url);
virtual ~PluginInstaller();
virtual void OnDownloadUpdated(content::DownloadItem* download) OVERRIDE;
@@ -47,18 +58,12 @@ class PluginInstaller : public content::DownloadItem::Observer {
void AddWeakObserver(WeakPluginInstallerObserver* observer);
void RemoveWeakObserver(WeakPluginInstallerObserver* observer);
- State state() const { return state_; }
-
- // Unique identifier for the plug-in. Should be kept in sync with the
- // identifier in plugin_list.cc.
+ // Unique identifier for the plug-in.
const std::string& identifier() const { return identifier_; }
// 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
@@ -69,6 +74,15 @@ class PluginInstaller : public content::DownloadItem::Observer {
// URL to open when the user clicks on the "Problems installing?" link.
const GURL& help_url() const { return help_url_; }
+ InstallerState state() const { return state_; }
+
+ // Adds information about a plug-in version.
+ void AddVersion(const Version& version, SecurityStatus status);
+
+ // Returns the security status for the given plug-in (i.e. whether it is
+ // considered out-of-date, etc.)
+ SecurityStatus GetSecurityStatus(const webkit::WebPluginInfo& plugin) const;
+
// Opens the download URL in a new tab. This method should only be called if
// |url_for_display| returns true.
void OpenDownloadURL(content::WebContents* web_contents);
@@ -78,23 +92,32 @@ class PluginInstaller : public content::DownloadItem::Observer {
// returns false.
void StartInstalling(TabContentsWrapper* wrapper);
+ // If |status_str| describes a valid security status, writes it to |status|
+ // and returns true, else returns false and leaves |status| unchanged.
+ static bool ParseSecurityStatus(const std::string& status_str,
+ SecurityStatus* status);
+
private:
+ struct VersionComparator {
+ bool operator() (const Version& lhs, const Version& rhs) const;
+ };
+
void DownloadStarted(scoped_refptr<content::DownloadManager> dlm,
content::DownloadId download_id,
net::Error error);
void DownloadError(const std::string& msg);
void DownloadCancelled();
- State state_;
- ObserverList<PluginInstallerObserver> observers_;
- ObserverList<WeakPluginInstallerObserver> weak_observers_;
-
std::string identifier_;
- GURL plugin_url_;
- GURL help_url_;
string16 name_;
bool url_for_display_;
- bool requires_authorization_;
+ GURL plugin_url_;
+ GURL help_url_;
+ std::map<Version, SecurityStatus, VersionComparator> versions_;
+
+ InstallerState state_;
+ ObserverList<PluginInstallerObserver> observers_;
+ ObserverList<WeakPluginInstallerObserver> weak_observers_;
DISALLOW_COPY_AND_ASSIGN(PluginInstaller);
};
diff --git a/chrome/browser/plugin_installer_unittest.cc b/chrome/browser/plugin_installer_unittest.cc
new file mode 100644
index 0000000..57bcf64
--- /dev/null
+++ b/chrome/browser/plugin_installer_unittest.cc
@@ -0,0 +1,53 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/plugin_installer.h"
+
+#include "base/utf_string_conversions.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "webkit/plugins/webplugininfo.h"
+
+using webkit::WebPluginInfo;
+
+namespace {
+
+PluginInstaller::SecurityStatus GetSecurityStatus(PluginInstaller* installer,
+ const char* version) {
+ WebPluginInfo plugin(ASCIIToUTF16("Foo plug-in"),
+ FilePath(FILE_PATH_LITERAL("/tmp/plugin.so")),
+ ASCIIToUTF16(version),
+ ASCIIToUTF16("Foo plug-in."));
+ return installer->GetSecurityStatus(plugin);
+}
+
+} // namespace
+
+TEST(PluginInstallerTest, SecurityStatus) {
+ const PluginInstaller::SecurityStatus kUpToDate =
+ PluginInstaller::SECURITY_STATUS_UP_TO_DATE;
+ const PluginInstaller::SecurityStatus kOutOfDate =
+ PluginInstaller::SECURITY_STATUS_OUT_OF_DATE;
+ const PluginInstaller::SecurityStatus kRequiresAuthorization =
+ PluginInstaller::SECURITY_STATUS_REQUIRES_AUTHORIZATION;
+
+ PluginInstaller installer("claybrick-writer",
+ ASCIIToUTF16("ClayBrick Writer"),
+ true, GURL(), GURL());
+ EXPECT_EQ(kUpToDate, GetSecurityStatus(&installer, "1.2.3"));
+
+ installer.AddVersion(Version("9.4.1"), kRequiresAuthorization);
+ installer.AddVersion(Version("10"), kOutOfDate);
+ installer.AddVersion(Version("10.2.1"), kUpToDate);
+
+ // Invalid version.
+ EXPECT_EQ(kOutOfDate, GetSecurityStatus(&installer, "foo"));
+
+ EXPECT_EQ(kOutOfDate, GetSecurityStatus(&installer, "0"));
+ EXPECT_EQ(kOutOfDate, GetSecurityStatus(&installer, "1.2.3"));
+ EXPECT_EQ(kRequiresAuthorization, GetSecurityStatus(&installer, "9.4.1"));
+ EXPECT_EQ(kRequiresAuthorization, GetSecurityStatus(&installer, "9.4.2"));
+ EXPECT_EQ(kOutOfDate, GetSecurityStatus(&installer, "10.2.0"));
+ EXPECT_EQ(kUpToDate, GetSecurityStatus(&installer, "10.2.1"));
+ EXPECT_EQ(kUpToDate, GetSecurityStatus(&installer, "11"));
+}
diff --git a/chrome/browser/plugin_observer.cc b/chrome/browser/plugin_observer.cc
index 1b3e333..094a9a5 100644
--- a/chrome/browser/plugin_observer.cc
+++ b/chrome/browser/plugin_observer.cc
@@ -123,12 +123,12 @@ class PluginObserver::PluginPlaceholderHost : public PluginInstallerObserver {
routing_id_(routing_id) {
DCHECK(installer);
switch (installer->state()) {
- case PluginInstaller::kStateIdle: {
+ case PluginInstaller::INSTALLER_STATE_IDLE: {
observer->Send(new ChromeViewMsg_FoundMissingPlugin(routing_id_,
installer->name()));
break;
}
- case PluginInstaller::kStateDownloading: {
+ case PluginInstaller::INSTALLER_STATE_DOWNLOADING: {
DownloadStarted();
break;
}
diff --git a/chrome/browser/renderer_host/plugin_info_message_filter.cc b/chrome/browser/renderer_host/plugin_info_message_filter.cc
index 5cc5178..f29c9ee 100644
--- a/chrome/browser/renderer_host/plugin_info_message_filter.cc
+++ b/chrome/browser/renderer_host/plugin_info_message_filter.cc
@@ -158,30 +158,33 @@ void PluginInfoMessageFilter::Context::DecidePluginStatus(
&uses_default_content_setting);
DCHECK(plugin_setting != CONTENT_SETTING_DEFAULT);
+#if defined(ENABLE_PLUGIN_INSTALLATION)
+ PluginInstaller::SecurityStatus plugin_status =
+ PluginInstaller::SECURITY_STATUS_UP_TO_DATE;
+ PluginInstaller* installer =
+ plugin_finder->FindPluginWithIdentifier(group->identifier());
+ if (installer)
+ plugin_status = installer->GetSecurityStatus(plugin);
// Check if the plug-in is outdated.
- if (group->IsVulnerable(plugin) && !allow_outdated_plugins_.GetValue()) {
+ if (plugin_status == PluginInstaller::SECURITY_STATUS_OUT_OF_DATE &&
+ !allow_outdated_plugins_.GetValue()) {
if (allow_outdated_plugins_.IsManaged()) {
status->value =
ChromeViewHostMsg_GetPluginInfo_Status::kOutdatedDisallowed;
} else {
- status->value =
- ChromeViewHostMsg_GetPluginInfo_Status::kOutdatedBlocked;
+ status->value = ChromeViewHostMsg_GetPluginInfo_Status::kOutdatedBlocked;
}
return;
}
-#if defined(ENABLE_PLUGIN_INSTALLATION)
// Check if the plug-in requires authorization.
- // 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()) ||
+ if ((plugin_status ==
+ PluginInstaller::SECURITY_STATUS_REQUIRES_AUTHORIZATION ||
PluginService::GetInstance()->IsPluginUnstable(plugin.path)) &&
!always_authorize_plugins_.GetValue() &&
plugin_setting != CONTENT_SETTING_BLOCK &&
uses_default_content_setting) {
- status->value =
- ChromeViewHostMsg_GetPluginInfo_Status::kUnauthorized;
+ status->value = ChromeViewHostMsg_GetPluginInfo_Status::kUnauthorized;
return;
}
#endif
diff --git a/chrome/browser/resources/plugin_metadata/OWNERS b/chrome/browser/resources/plugin_metadata/OWNERS
new file mode 100644
index 0000000..f8dfbbb
--- /dev/null
+++ b/chrome/browser/resources/plugin_metadata/OWNERS
@@ -0,0 +1,3 @@
+bauerb@chromium.org
+cevans@chromium.org
+jschuh@chromium.org
diff --git a/chrome/browser/resources/plugins_linux.json b/chrome/browser/resources/plugin_metadata/plugins_linux.json
index e56f226..244831c 100644
--- a/chrome/browser/resources/plugins_linux.json
+++ b/chrome/browser/resources/plugin_metadata/plugins_linux.json
@@ -33,6 +33,20 @@
"application/x-java-bean,version=1.6",
"application/x-java-vm"
],
+ "versions": [
+ {
+ "version": "1.6.0.31",
+ "status": "requires_authorization"
+ },
+ {
+ "version": "1.7",
+ "status": "out_of_date"
+ },
+ {
+ "version": "1.7.0.3",
+ "status": "requires_authorization"
+ }
+ ],
"lang": "en-US",
"name": "Java(TM)",
"help_url": "https://support.google.com/chrome/?p=plugin_java",
@@ -44,16 +58,56 @@
"application/futuresplash",
"application/x-shockwave-flash"
],
+ "versions": [
+ {
+ "version": "11.1.102",
+ "status": "up_to_date",
+ "reference": "http://www.adobe.com/support/security/bulletins/apsb12-03.html"
+ }
+ ],
"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": [
],
+ "versions": [
+ {
+ "version": "1.8.13",
+ "status": "requires_authorization",
+ "reference": "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/"
+ },
+ {
+ "version": "1.9",
+ "status": "out_of_date"
+ },
+ {
+ "version": "1.9.13",
+ "status": "requires_authorization",
+ "reference": "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/"
+ },
+ {
+ "version": "1.10",
+ "status": "out_of_date"
+ },
+ {
+ "version": "1.10.6",
+ "status": "requires_authorization",
+ "reference": "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/"
+ },
+ {
+ "version": "2",
+ "status": "out_of_date"
+ },
+ {
+ "version": "2.0.1",
+ "status": "requires_authorization",
+ "reference": "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/"
+ }
+ ],
"lang": "en-US",
"name": "IcedTea",
"url": "http://icedtea.classpath.org/",
diff --git a/chrome/browser/resources/plugins_mac.json b/chrome/browser/resources/plugin_metadata/plugins_mac.json
index 2465ece..e195e34 100644
--- a/chrome/browser/resources/plugins_mac.json
+++ b/chrome/browser/resources/plugin_metadata/plugins_mac.json
@@ -33,6 +33,31 @@
"application/x-java-bean,version=1.6",
"application/x-java-vm"
],
+ "versions": [
+ {
+ "version": "12.8.0",
+ "status": "requires_authorization",
+ "comment": "Leopard"
+ },
+ {
+ "version": "13",
+ "status": "out_of_date"
+ },
+ {
+ "version": "13.5.0",
+ "status": "requires_authorization",
+ "comment": "Snow Leopard"
+ },
+ {
+ "version": "14",
+ "status": "out_of_date"
+ },
+ {
+ "version": "14.0.3",
+ "status": "requires_authorization",
+ "comment": "Lion"
+ }
+ ],
"lang": "en-US",
"name": "Java(TM)",
"url": "http://java.com/en/download/apple_manual.jsp",
@@ -46,6 +71,13 @@
"audio/x-pn-realaudio-plugin",
"audio/x-pn-realaudio"
],
+ "versions": [
+ {
+ "version": "0",
+ "status": "requires_authorization",
+ "comment": "The Real Player plug-in for mac doesn't expose a version at all."
+ }
+ ],
"lang": "en-US",
"name": "RealPlayer",
"url": "http://director.real.com/realplayer?type=rpsp_mac",
@@ -56,38 +88,34 @@
"application/futuresplash",
"application/x-shockwave-flash"
],
+ "versions": [
+ {
+ "version": "11.1.102",
+ "status": "up_to_date",
+ "reference": "http://www.adobe.com/support/security/bulletins/apsb12-03.html"
+ }
+ ],
"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"
+ "versions": [
+ {
+ "version": "11.6.4.634",
+ "status": "requires_authorization",
+ "reference": "http://www.adobe.com/support/security/bulletins/apsb12-02.html"
+ }
],
"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
+ "name": "Adobe Shockwave Player",
+ "url": "http://fpdownload.macromedia.com/get/shockwave/default/english/macosx/latest/Shockwave_Installer_Full_64bit.dmg",
+ "help_url": "https://support.google.com/chrome/?p=plugin_shockwave"
},
"apple-quicktime": {
"mime_types": [
@@ -141,6 +169,12 @@
"video/x-m4v",
"video/x-mpeg"
],
+ "versions": [
+ {
+ "version": "7.6.6",
+ "status": "requires_authorization"
+ }
+ ],
"lang": "en-US",
"name": "QuickTime Player",
"url": "http://www.apple.com/quicktime/download/",
@@ -160,6 +194,12 @@
"video/x-ms-wmv",
"video/x-ms-wvx"
],
+ "versions": [
+ {
+ "version": "2.2.1",
+ "status": "requires_authorization"
+ }
+ ],
"lang": "en-US",
"name": "Flip4Mac",
"url": "http://www.microsoft.com/download/en/confirmation.aspx?id=9442",
@@ -171,6 +211,12 @@
"video/divx",
"video/x-matroska"
],
+ "versions": [
+ {
+ "version": "2.2",
+ "status": "requires_authorization"
+ }
+ ],
"lang": "en-US",
"name": "DivX Web Player",
"url": "http://www.divx.com/en/downloads/divx/mac",
@@ -181,10 +227,16 @@
"application/x-silverlight",
"application/x-silverlight-2"
],
+ "versions": [
+ {
+ "version": "4.1.10111.0",
+ "status": "up_to_date",
+ "reference": "http://support.microsoft.com/kb/2668562"
+ }
+ ],
"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/plugin_metadata/plugins_win.json
index 202bd62..c41cdd6 100644
--- a/chrome/browser/resources/plugins_win.json
+++ b/chrome/browser/resources/plugin_metadata/plugins_win.json
@@ -33,6 +33,20 @@
"application/x-java-bean,version=1.6",
"application/x-java-vm"
],
+ "versions": [
+ {
+ "version": "6.0.310",
+ "status": "requires_authorization"
+ },
+ {
+ "version": "7",
+ "status": "out_of_date"
+ },
+ {
+ "version": "10.3",
+ "status": "requires_authorization"
+ }
+ ],
"lang": "en-US",
"name": "Java(TM)",
"help_url": "https://support.google.com/chrome/?p=plugin_java",
@@ -46,6 +60,13 @@
"audio/x-pn-realaudio-plugin",
"audio/x-pn-realaudio"
],
+ "versions": [
+ {
+ "version": "15.0.2.71",
+ "status": "requires_authorization",
+ "reference": "http://service.real.com/realplayer/security/02062012_player/en/"
+ }
+ ],
"lang": "en-US",
"name": "RealPlayer",
"help_url": "https://support.google.com/chrome/?p=plugin_real",
@@ -56,17 +77,30 @@
"application/futuresplash",
"application/x-shockwave-flash"
],
+ "versions": [
+ {
+ "version": "11.1.102",
+ "status": "up_to_date",
+ "reference": "http://www.adobe.com/support/security/bulletins/apsb12-03.html"
+ }
+ ],
"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
},
"adobe-shockwave": {
"mime_types": [
"application/x-director"
],
+ "versions": [
+ {
+ "version": "11.6.4.634",
+ "status": "requires_authorization",
+ "reference": "http://www.adobe.com/support/security/bulletins/apsb12-02.html"
+ }
+ ],
"lang": "en-US",
"name": "Adobe Shockwave Player",
"help_url": "https://support.google.com/chrome/?p=plugin_shockwave",
@@ -81,11 +115,26 @@
"application/vnd.adobe.xfdf",
"application/vnd.fdf"
],
+ "versions": [
+ {
+ "version": "9.5.1",
+ "status": "requires_authorization",
+ "reference": "http://www.adobe.com/support/security/bulletins/apsb12-08.html"
+ },
+ {
+ "version": "10",
+ "status": "out_of_date"
+ },
+ {
+ "version": "10.1.3",
+ "status": "up_to_date",
+ "reference": "http://www.adobe.com/support/security/bulletins/apsb12-08.html"
+ }
+ ],
"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
+ "url": "http://ardownload.adobe.com/pub/adobe/reader/win/10.x/10.1.3/en_US/AdbeRdr1013_en_US.exe"
},
"apple-quicktime": {
"mime_types": [
@@ -139,6 +188,12 @@
"video/x-m4v",
"video/x-mpeg"
],
+ "versions": [
+ {
+ "version": "7.6.9",
+ "status": "requires_authorization"
+ }
+ ],
"lang": "en-US",
"name": "QuickTime Player",
"help_url": "https://support.google.com/chrome/?p=plugin_quicktime",
@@ -167,6 +222,12 @@
"video/divx",
"video/x-matroska"
],
+ "versions": [
+ {
+ "version": "1.4.3.4",
+ "status": "requires_authorization"
+ }
+ ],
"lang": "en-US",
"name": "DivX Web Player",
"help_url": "https://support.google.com/chrome/?p=plugin_divx",
@@ -177,9 +238,15 @@
"application/x-silverlight",
"application/x-silverlight-2"
],
+ "versions": [
+ {
+ "version": "4.1.10111.0",
+ "status": "up_to_date",
+ "reference": "http://support.microsoft.com/kb/2668562"
+ }
+ ],
"lang": "en-US",
"name": "Silverlight",
- "url": "http://go.microsoft.com/fwlink/?LinkID=149156",
- "requires_authorization": false
+ "url": "http://go.microsoft.com/fwlink/?LinkID=149156"
}
}
diff --git a/chrome/browser/ui/pdf/pdf_unsupported_feature.cc b/chrome/browser/ui/pdf/pdf_unsupported_feature.cc
index 340dba0..46c1b27 100644
--- a/chrome/browser/ui/pdf/pdf_unsupported_feature.cc
+++ b/chrome/browser/ui/pdf/pdf_unsupported_feature.cc
@@ -10,6 +10,8 @@
#include "base/version.h"
#include "chrome/browser/chrome_plugin_service_filter.h"
#include "chrome/browser/infobars/infobar_tab_helper.h"
+#include "chrome/browser/plugin_finder.h"
+#include "chrome/browser/plugin_installer.h"
#include "chrome/browser/plugin_prefs.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
@@ -46,9 +48,6 @@ using webkit::WebPluginInfo;
namespace {
-// Only launch Adobe Reader X or later.
-static const uint16 kMinReaderVersionToUse = 10;
-
static const char kReaderUpdateUrl[] =
"http://www.adobe.com/go/getreader_chrome";
@@ -250,9 +249,10 @@ class PDFUnsupportedFeatureInterstitial
// PDFEnableAdobeReaderInfoBarDelegate.
class PDFUnsupportedFeatureInfoBarDelegate : public ConfirmInfoBarDelegate {
public:
- // |reader_group| is NULL if Adobe Reader isn't installed.
+ // |reader| is NULL if Adobe Reader isn't installed.
PDFUnsupportedFeatureInfoBarDelegate(TabContentsWrapper* tab_contents,
- const PluginGroup* reader_group);
+ const webkit::WebPluginInfo* reader,
+ PluginFinder* plugin_finder);
virtual ~PDFUnsupportedFeatureInfoBarDelegate();
// ConfirmInfoBarDelegate
@@ -278,10 +278,11 @@ class PDFUnsupportedFeatureInfoBarDelegate : public ConfirmInfoBarDelegate {
PDFUnsupportedFeatureInfoBarDelegate::PDFUnsupportedFeatureInfoBarDelegate(
TabContentsWrapper* tab_contents,
- const PluginGroup* reader_group)
+ const webkit::WebPluginInfo* reader,
+ PluginFinder* plugin_finder)
: ConfirmInfoBarDelegate(tab_contents->infobar_tab_helper()),
tab_contents_(tab_contents),
- reader_installed_(!!reader_group),
+ reader_installed_(!!reader),
reader_vulnerable_(false) {
if (!reader_installed_) {
content::RecordAction(
@@ -290,18 +291,14 @@ PDFUnsupportedFeatureInfoBarDelegate::PDFUnsupportedFeatureInfoBarDelegate(
}
content::RecordAction(UserMetricsAction("PDF_UseReaderInfoBarShown"));
- const std::vector<WebPluginInfo>& plugins =
- reader_group->web_plugin_infos();
- DCHECK_EQ(plugins.size(), 1u);
- reader_webplugininfo_ = plugins[0];
-
- reader_vulnerable_ = reader_group->IsVulnerable(reader_webplugininfo_);
- if (!reader_vulnerable_) {
- scoped_ptr<Version> version(PluginGroup::CreateVersionFromString(
- reader_webplugininfo_.version));
- reader_vulnerable_ =
- version.get() && (version->components()[0] < kMinReaderVersionToUse);
- }
+ reader_webplugininfo_ = *reader;
+
+ PluginInstaller* installer =
+ plugin_finder->FindPluginWithIdentifier("adobe-reader");
+
+ reader_vulnerable_ =
+ installer->GetSecurityStatus(*reader) !=
+ PluginInstaller::SECURITY_STATUS_UP_TO_DATE;
}
PDFUnsupportedFeatureInfoBarDelegate::~PDFUnsupportedFeatureInfoBarDelegate() {
@@ -377,6 +374,7 @@ void PDFUnsupportedFeatureInfoBarDelegate::OnNo() {
void GotPluginGroupsCallback(int process_id,
int routing_id,
+ PluginFinder* plugin_finder,
const std::vector<PluginGroup>& groups) {
WebContents* web_contents =
tab_util::GetWebContentsByID(process_id, routing_id);
@@ -389,7 +387,6 @@ void GotPluginGroupsCallback(int process_id,
return;
string16 reader_group_name(ASCIIToUTF16(PluginGroup::kAdobeReaderGroupName));
-
// If the Reader plugin is disabled by policy, don't prompt them.
PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(tab->profile());
if (plugin_prefs->PolicyStatusForPlugin(reader_group_name) ==
@@ -397,16 +394,27 @@ void GotPluginGroupsCallback(int process_id,
return;
}
- const PluginGroup* reader_group = NULL;
+ const webkit::WebPluginInfo* reader = NULL;
for (size_t i = 0; i < groups.size(); ++i) {
if (groups[i].GetGroupName() == reader_group_name) {
- reader_group = &groups[i];
+ const std::vector<WebPluginInfo>& plugins =
+ groups[i].web_plugin_infos();
+ DCHECK_EQ(plugins.size(), 1u);
+ reader = &plugins[0];
break;
}
}
tab->infobar_tab_helper()->AddInfoBar(
- new PDFUnsupportedFeatureInfoBarDelegate(tab, reader_group));
+ new PDFUnsupportedFeatureInfoBarDelegate(tab, reader, plugin_finder));
+}
+
+void GotPluginFinderCallback(int process_id,
+ int routing_id,
+ PluginFinder* plugin_finder) {
+ PluginService::GetInstance()->GetPluginGroups(
+ base::Bind(&GotPluginGroupsCallback, process_id, routing_id,
+ base::Unretained(plugin_finder)));
}
} // namespace
@@ -418,8 +426,7 @@ void PDFHasUnsupportedFeature(TabContentsWrapper* tab) {
return;
#endif
- PluginService::GetInstance()->GetPluginGroups(
- base::Bind(&GotPluginGroupsCallback,
- tab->web_contents()->GetRenderProcessHost()->GetID(),
- tab->web_contents()->GetRenderViewHost()->GetRoutingID()));
+ PluginFinder::Get(base::Bind(&GotPluginFinderCallback,
+ tab->web_contents()->GetRenderProcessHost()->GetID(),
+ tab->web_contents()->GetRenderViewHost()->GetRoutingID()));
}
diff --git a/chrome/browser/ui/webui/plugins_ui.cc b/chrome/browser/ui/webui/plugins_ui.cc
index 34aef3c..a1aac36 100644
--- a/chrome/browser/ui/webui/plugins_ui.cc
+++ b/chrome/browser/ui/webui/plugins_ui.cc
@@ -426,16 +426,17 @@ void PluginsDOMHandler::PluginsLoaded(PluginFinder* plugin_finder,
group_data->SetString("id", group.identifier());
group_data->SetString("description", active_plugin->desc);
group_data->SetString("version", active_plugin->version);
- group_data->SetBoolean("critical", group.IsVulnerable(*active_plugin));
- std::string update_url;
#if defined(ENABLE_PLUGIN_INSTALLATION)
PluginInstaller* installer =
plugin_finder->FindPluginWithIdentifier(group.identifier());
- if (installer)
- update_url = installer->plugin_url().spec();
+ if (installer) {
+ bool out_of_date = installer->GetSecurityStatus(*active_plugin) ==
+ PluginInstaller::SECURITY_STATUS_OUT_OF_DATE;
+ group_data->SetBoolean("critical", out_of_date);
+ group_data->SetString("update_url", installer->plugin_url().spec());
+ }
#endif
- group_data->SetString("update_url", update_url);
std::string enabled_mode;
if (all_plugins_enabled_by_policy) {