diff options
author | ibraaaa@google.com <ibraaaa@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-08 15:02:20 +0000 |
---|---|---|
committer | ibraaaa@google.com <ibraaaa@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-08 15:02:20 +0000 |
commit | fa6ca6a247733c52b18ae4d9d70a825b77519550 (patch) | |
tree | 6c8066239a1354a664bcb9a9682d1061d7669bc9 | |
parent | f02b9a893b4fc46322e152fb7761b8e783b56518 (diff) | |
download | chromium_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.cc | 97 | ||||
-rw-r--r-- | chrome/browser/plugins/plugin_finder.h | 5 | ||||
-rw-r--r-- | chrome/browser/plugins/plugin_finder_unittest.cc | 18 | ||||
-rw-r--r-- | chrome/browser/plugins/plugin_metadata.cc | 34 | ||||
-rw-r--r-- | chrome/browser/plugins/plugin_metadata.h | 16 | ||||
-rw-r--r-- | chrome/browser/plugins/plugin_metadata_unittest.cc | 3 | ||||
-rw-r--r-- | chrome/browser/resources/plugin_metadata/plugins_linux.json | 22 | ||||
-rw-r--r-- | webkit/plugins/npapi/plugin_list.h | 12 |
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 |