summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoribraaaa@google.com <ibraaaa@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-08 15:02:20 +0000
committeribraaaa@google.com <ibraaaa@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-08 15:02:20 +0000
commitfa6ca6a247733c52b18ae4d9d70a825b77519550 (patch)
tree6c8066239a1354a664bcb9a9682d1061d7669bc9
parentf02b9a893b4fc46322e152fb7761b8e783b56518 (diff)
downloadchromium_src-fa6ca6a247733c52b18ae4d9d70a825b77519550.zip
chromium_src-fa6ca6a247733c52b18ae4d9d70a825b77519550.tar.gz
chromium_src-fa6ca6a247733c52b18ae4d9d70a825b77519550.tar.bz2
Using MIME types in addition to plugin name to differentiate between plugins.
BUG=108962 Review URL: https://chromiumcodereview.appspot.com/11016005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@160653 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/plugins/plugin_finder.cc97
-rw-r--r--chrome/browser/plugins/plugin_finder.h5
-rw-r--r--chrome/browser/plugins/plugin_finder_unittest.cc18
-rw-r--r--chrome/browser/plugins/plugin_metadata.cc34
-rw-r--r--chrome/browser/plugins/plugin_metadata.h16
-rw-r--r--chrome/browser/plugins/plugin_metadata_unittest.cc3
-rw-r--r--chrome/browser/resources/plugin_metadata/plugins_linux.json22
-rw-r--r--webkit/plugins/npapi/plugin_list.h12
8 files changed, 138 insertions, 69 deletions
diff --git a/chrome/browser/plugins/plugin_finder.cc b/chrome/browser/plugins/plugin_finder.cc
index 91345d2..d5ee101 100644
--- a/chrome/browser/plugins/plugin_finder.cc
+++ b/chrome/browser/plugins/plugin_finder.cc
@@ -31,6 +31,8 @@ using content::PluginService;
namespace {
+typedef std::map<std::string, PluginMetadata*> PluginMap;
+
// Gets the base name of the file path as the identifier.
static std::string GetIdentifier(const webkit::WebPluginInfo& plugin) {
#if defined(OS_POSIX)
@@ -54,6 +56,29 @@ static string16 GetGroupName(const webkit::WebPluginInfo& plugin) {
#endif
}
+void LoadMimeTypes(bool matching_mime_types,
+ const DictionaryValue* plugin_dict,
+ PluginMetadata* plugin) {
+ const ListValue* mime_types = NULL;
+ std::string list_key =
+ matching_mime_types ? "matching_mime_types" : "mime_types";
+ if (!plugin_dict->GetList(list_key, &mime_types))
+ return;
+
+ bool success = false;
+ 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 (matching_mime_types) {
+ plugin->AddMatchingMimeType(mime_type_str);
+ } else {
+ plugin->AddMimeType(mime_type_str);
+ }
+ }
+}
+
PluginMetadata* CreatePluginMetadata(
const std::string& identifier,
const DictionaryValue* plugin_dict) {
@@ -69,13 +94,16 @@ PluginMetadata* CreatePluginMetadata(
string16 group_name_matcher;
success = plugin_dict->GetString("group_name_matcher", &group_name_matcher);
DCHECK(success);
+ std::string language_str;
+ plugin_dict->GetString("lang", &language_str);
PluginMetadata* plugin = new PluginMetadata(identifier,
name,
display_url,
GURL(url),
GURL(help_url),
- group_name_matcher);
+ group_name_matcher,
+ language_str);
const ListValue* versions = NULL;
if (plugin_dict->GetList("versions", &versions)) {
for (ListValue::const_iterator it = versions->begin();
@@ -99,6 +127,8 @@ PluginMetadata* CreatePluginMetadata(
}
}
+ LoadMimeTypes(false, plugin_dict, plugin);
+ LoadMimeTypes(true, plugin_dict, plugin);
return plugin;
}
@@ -169,38 +199,18 @@ bool PluginFinder::FindPlugin(
base::AutoLock lock(mutex_);
if (g_browser_process->local_state()->GetBoolean(prefs::kDisablePluginFinder))
return false;
- 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);
- if (language_str != language)
- continue;
- const ListValue* mime_types = NULL;
- if (plugin->GetList("mime_types", &mime_types)) {
- 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 = plugin_it.key();
- std::map<std::string, PluginMetadata*>::const_iterator metadata_it =
- identifier_plugin_.find(identifier);
- DCHECK(metadata_it != identifier_plugin_.end());
- *plugin_metadata = metadata_it->second->Clone();
-
- std::map<std::string, PluginInstaller*>::const_iterator installer_it =
- installers_.find(identifier);
- DCHECK(installer_it != installers_.end());
- *installer = installer_it->second;
- return true;
- }
- }
+
+ PluginMap::const_iterator metadata_it = identifier_plugin_.begin();
+ for (; metadata_it != identifier_plugin_.end(); ++metadata_it) {
+ if (language == metadata_it->second->language() &&
+ metadata_it->second->HasMimeType(mime_type)) {
+ *plugin_metadata = metadata_it->second->Clone();
+
+ std::map<std::string, PluginInstaller*>::const_iterator installer_it =
+ installers_.find(metadata_it->second->identifier());
+ DCHECK(installer_it != installers_.end());
+ *installer = installer_it->second;
+ return true;
}
}
return false;
@@ -215,8 +225,7 @@ bool PluginFinder::FindPluginWithIdentifier(
installers_.find(identifier);
if (it != installers_.end()) {
*installer = it->second;
- std::map<std::string, PluginMetadata*>::const_iterator metadata_it =
- identifier_plugin_.find(identifier);
+ PluginMap::const_iterator metadata_it = identifier_plugin_.find(identifier);
DCHECK(metadata_it != identifier_plugin_.end());
*plugin_metadata = metadata_it->second->Clone();
return true;
@@ -230,7 +239,6 @@ void PluginFinder::ReinitializePlugins(
base::AutoLock lock(mutex_);
STLDeleteValues(&identifier_plugin_);
identifier_plugin_.clear();
- name_plugin_.clear();
plugin_list_.reset(json_metadata.DeepCopy());
InitInternal();
@@ -240,8 +248,7 @@ void PluginFinder::ReinitializePlugins(
string16 PluginFinder::FindPluginNameWithIdentifier(
const std::string& identifier) {
base::AutoLock lock(mutex_);
- std::map<std::string, PluginMetadata*>::const_iterator it =
- identifier_plugin_.find(identifier);
+ PluginMap::const_iterator it = identifier_plugin_.find(identifier);
string16 name;
if (it != identifier_plugin_.end())
name = it->second->name();
@@ -252,16 +259,11 @@ string16 PluginFinder::FindPluginNameWithIdentifier(
scoped_ptr<PluginMetadata> PluginFinder::GetPluginMetadata(
const webkit::WebPluginInfo& plugin) {
base::AutoLock lock(mutex_);
- if (name_plugin_.find(plugin.name) != name_plugin_.end())
- return name_plugin_[plugin.name]->Clone();
-
- // Use the group name matcher to find the plug-in metadata we want.
- for (std::map<std::string, PluginMetadata*>::const_iterator it =
- identifier_plugin_.begin(); it != identifier_plugin_.end(); ++it) {
+ for (PluginMap::const_iterator it = identifier_plugin_.begin();
+ it != identifier_plugin_.end(); ++it) {
if (!it->second->MatchesPlugin(plugin))
continue;
- name_plugin_[plugin.name] = it->second;
return it->second->Clone();
}
@@ -271,9 +273,8 @@ scoped_ptr<PluginMetadata> PluginFinder::GetPluginMetadata(
PluginMetadata* metadata = new PluginMetadata(identifier,
GetGroupName(plugin),
false, GURL(), GURL(),
- GetGroupName(plugin));
-
- name_plugin_[plugin.name] = metadata;
+ GetGroupName(plugin),
+ "");
identifier_plugin_[identifier] = metadata;
return metadata->Clone();
}
diff --git a/chrome/browser/plugins/plugin_finder.h b/chrome/browser/plugins/plugin_finder.h
index ef08867..3ee80ae 100644
--- a/chrome/browser/plugins/plugin_finder.h
+++ b/chrome/browser/plugins/plugin_finder.h
@@ -86,11 +86,6 @@ class PluginFinder {
std::map<std::string, PluginMetadata*> identifier_plugin_;
- // Note: Don't free memory for |name_plugin_| values
- // since it holds pointers to same instances
- // in |identifier_plugin_| (Double De-allocation).
- std::map<string16, PluginMetadata*> name_plugin_;
-
// Synchronization for the above member variables is
// required since multiple threads can be accessing them concurrently.
base::Lock mutex_;
diff --git a/chrome/browser/plugins/plugin_finder_unittest.cc b/chrome/browser/plugins/plugin_finder_unittest.cc
index df922a5..fc60576f 100644
--- a/chrome/browser/plugins/plugin_finder_unittest.cc
+++ b/chrome/browser/plugins/plugin_finder_unittest.cc
@@ -33,11 +33,21 @@ TEST(PluginFinderTest, JsonSyntax) {
if (plugin->HasKey("requires_authorization"))
EXPECT_TRUE(plugin->GetBoolean("requires_authorization", &dummy_bool));
const ListValue* mime_types = NULL;
- ASSERT_TRUE(plugin->GetList("mime_types", &mime_types));
- for (ListValue::const_iterator mime_type_it = mime_types->begin();
- mime_type_it != mime_types->end(); ++mime_type_it) {
- EXPECT_TRUE((*mime_type_it)->GetAsString(&dummy_str));
+ if (plugin->GetList("mime_types", &mime_types)) {
+ for (ListValue::const_iterator mime_type_it = mime_types->begin();
+ mime_type_it != mime_types->end(); ++mime_type_it) {
+ EXPECT_TRUE((*mime_type_it)->GetAsString(&dummy_str));
+ }
}
+
+ const ListValue* matching_mime_types = NULL;
+ if (plugin->GetList("matching_mime_types", &matching_mime_types)) {
+ for (ListValue::const_iterator it = matching_mime_types->begin();
+ it != matching_mime_types->end(); ++it) {
+ EXPECT_TRUE((*it)->GetAsString(&dummy_str));
+ }
+ }
+
const ListValue* versions = NULL;
if (!plugin->GetList("versions", &versions))
continue;
diff --git a/chrome/browser/plugins/plugin_metadata.cc b/chrome/browser/plugins/plugin_metadata.cc
index 5013c7f..7bef6c9 100644
--- a/chrome/browser/plugins/plugin_metadata.cc
+++ b/chrome/browser/plugins/plugin_metadata.cc
@@ -4,7 +4,10 @@
#include "chrome/browser/plugins/plugin_metadata.h"
+#include <algorithm>
+
#include "base/logging.h"
+#include "webkit/plugins/npapi/plugin_list.h"
#include "webkit/plugins/npapi/plugin_utils.h"
#include "webkit/plugins/webplugininfo.h"
@@ -23,13 +26,15 @@ PluginMetadata::PluginMetadata(const std::string& identifier,
bool url_for_display,
const GURL& plugin_url,
const GURL& help_url,
- const string16& group_name_matcher)
+ const string16& group_name_matcher,
+ const std::string& language)
: identifier_(identifier),
name_(name),
group_name_matcher_(group_name_matcher),
url_for_display_(url_for_display),
plugin_url_(plugin_url),
- help_url_(help_url) {
+ help_url_(help_url),
+ language_(language) {
}
PluginMetadata::~PluginMetadata() {
@@ -41,7 +46,29 @@ void PluginMetadata::AddVersion(const Version& version,
versions_[version] = status;
}
+void PluginMetadata::AddMimeType(const std::string& mime_type) {
+ all_mime_types_.push_back(mime_type);
+}
+
+void PluginMetadata::AddMatchingMimeType(const std::string& mime_type) {
+ matching_mime_types_.push_back(mime_type);
+}
+
+bool PluginMetadata::HasMimeType(const std::string& mime_type) const {
+ return std::find(all_mime_types_.begin(), all_mime_types_.end(), mime_type) !=
+ all_mime_types_.end();
+}
+
bool PluginMetadata::MatchesPlugin(const webkit::WebPluginInfo& plugin) {
+ using webkit::npapi::PluginList;
+
+ for (size_t i = 0; i < matching_mime_types_.size(); ++i) {
+ // To have a match, every one of the |matching_mime_types_|
+ // must be handled by the plug-in.
+ if (!PluginList::SupportsType(plugin, matching_mime_types_[i], false))
+ return false;
+ }
+
return plugin.name.find(group_name_matcher_) != string16::npos;
}
@@ -100,7 +127,8 @@ scoped_ptr<PluginMetadata> PluginMetadata::Clone() const {
url_for_display_,
plugin_url_,
help_url_,
- group_name_matcher_);
+ group_name_matcher_,
+ language_);
copy->versions_ = versions_;
return make_scoped_ptr(copy);
}
diff --git a/chrome/browser/plugins/plugin_metadata.h b/chrome/browser/plugins/plugin_metadata.h
index b8ca5e0..36ae7d1 100644
--- a/chrome/browser/plugins/plugin_metadata.h
+++ b/chrome/browser/plugins/plugin_metadata.h
@@ -40,7 +40,8 @@ class PluginMetadata {
bool url_for_display,
const GURL& plugin_url,
const GURL& help_url,
- const string16& group_name_matcher);
+ const string16& group_name_matcher,
+ const std::string& language);
~PluginMetadata();
// Unique identifier for the plug-in.
@@ -59,10 +60,18 @@ class PluginMetadata {
// URL to open when the user clicks on the "Problems installing?" link.
const GURL& help_url() const { return help_url_; }
+ const std::string& language() const { return language_; }
+
+ bool HasMimeType(const std::string& mime_type) const;
+ void AddMimeType(const std::string& mime_type);
+ void AddMatchingMimeType(const std::string& mime_type);
+
// Adds information about a plug-in version.
void AddVersion(const Version& version, SecurityStatus status);
- // Checks if the plug-in matches the group matcher.
+ // Checks if |plugin| mime types match all |matching_mime_types_|.
+ // If there is no |matching_mime_types_|, |group_name_matcher_| is used
+ // for matching.
bool MatchesPlugin(const webkit::WebPluginInfo& plugin);
// If |status_str| describes a valid security status, writes it to |status|
@@ -87,7 +96,10 @@ class PluginMetadata {
bool url_for_display_;
GURL plugin_url_;
GURL help_url_;
+ std::string language_;
std::map<Version, SecurityStatus, VersionComparator> versions_;
+ std::vector<std::string> all_mime_types_;
+ std::vector<std::string> matching_mime_types_;
DISALLOW_COPY_AND_ASSIGN(PluginMetadata);
};
diff --git a/chrome/browser/plugins/plugin_metadata_unittest.cc b/chrome/browser/plugins/plugin_metadata_unittest.cc
index 723886a..d168567 100644
--- a/chrome/browser/plugins/plugin_metadata_unittest.cc
+++ b/chrome/browser/plugins/plugin_metadata_unittest.cc
@@ -35,7 +35,8 @@ TEST(PluginMetadataTest, SecurityStatus) {
PluginMetadata plugin_metadata("claybrick-writer",
ASCIIToUTF16("ClayBrick Writer"),
true, GURL(), GURL(),
- ASCIIToUTF16("ClayBrick"));
+ ASCIIToUTF16("ClayBrick"),
+ "");
#if defined(OS_LINUX)
EXPECT_EQ(kRequiresAuthorization,
GetSecurityStatus(&plugin_metadata, "1.2.3"));
diff --git a/chrome/browser/resources/plugin_metadata/plugins_linux.json b/chrome/browser/resources/plugin_metadata/plugins_linux.json
index e3aad1c..9433f93 100644
--- a/chrome/browser/resources/plugin_metadata/plugins_linux.json
+++ b/chrome/browser/resources/plugin_metadata/plugins_linux.json
@@ -74,6 +74,9 @@
"application/futuresplash",
"application/x-shockwave-flash"
],
+ "matching_mime_types": [
+ "application/futuresplash"
+ ],
"versions": [
{
"version": "11.1.102",
@@ -88,6 +91,25 @@
"displayurl": true,
"group_name_matcher": "Shockwave Flash"
},
+ "lightspark": {
+ "mime_types": [
+ "application/x-lightspark"
+ ],
+ "matching_mime_types": [
+ "application/x-lightspark"
+ ],
+ "versions": [
+ {
+ "version": "0",
+ "status": "requires_authorization"
+ }
+ ],
+ "lang": "en-US",
+ "name": "Lightspark",
+ "displayurl": true,
+ "url": "https://launchpad.net/lightspark",
+ "group_name_matcher": "Shockwave Flash"
+ },
"redhat-icetea-java": {
"mime_types": [
],
diff --git a/webkit/plugins/npapi/plugin_list.h b/webkit/plugins/npapi/plugin_list.h
index 7de2951..6825538 100644
--- a/webkit/plugins/npapi/plugin_list.h
+++ b/webkit/plugins/npapi/plugin_list.h
@@ -59,6 +59,12 @@ class WEBKIT_PLUGINS_EXPORT PluginList {
// by a command line switch.
static bool DebugPluginLoading();
+ // Returns true if the plugin supports |mime_type|. |mime_type| should be all
+ // lower case.
+ static bool SupportsType(const webkit::WebPluginInfo& plugin,
+ const std::string& mime_type,
+ bool allow_wildcard);
+
// Cause the plugin list to refresh next time they are accessed, regardless
// of whether they are already loaded.
void RefreshPlugins();
@@ -203,12 +209,6 @@ class WEBKIT_PLUGINS_EXPORT PluginList {
const webkit::WebPluginInfo& info,
std::vector<webkit::WebPluginInfo>* plugins);
- // Returns true if the plugin supports |mime_type|. |mime_type| should be all
- // lower case.
- bool SupportsType(const webkit::WebPluginInfo& plugin,
- const std::string& mime_type,
- bool allow_wildcard);
-
// Returns true if the given plugin supports a given file extension.
// |extension| should be all lower case. If |mime_type| is not NULL, it will
// be set to the MIME type if found. The MIME type which corresponds to the