Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/plugins/plugin_finder.h" | 5 #include "chrome/browser/plugins/plugin_finder.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 24 | 24 |
| 25 #if defined(ENABLE_PLUGIN_INSTALLATION) | 25 #if defined(ENABLE_PLUGIN_INSTALLATION) |
| 26 #include "chrome/browser/plugins/plugin_installer.h" | 26 #include "chrome/browser/plugins/plugin_installer.h" |
| 27 #endif | 27 #endif |
| 28 | 28 |
| 29 using base::DictionaryValue; | 29 using base::DictionaryValue; |
| 30 using content::PluginService; | 30 using content::PluginService; |
| 31 | 31 |
| 32 namespace { | 32 namespace { |
| 33 | 33 |
| 34 typedef std::map<std::string, PluginMetadata*> PluginMap; | |
| 35 | |
| 36 const char kMimeTypesListKey[] = "mime_types"; | |
| 37 const char kMatchingMimeTypesListKey[] = "matching_mime_types"; | |
| 38 | |
| 34 // Gets the base name of the file path as the identifier. | 39 // Gets the base name of the file path as the identifier. |
| 35 static std::string GetIdentifier(const webkit::WebPluginInfo& plugin) { | 40 static std::string GetIdentifier(const webkit::WebPluginInfo& plugin) { |
| 36 #if defined(OS_POSIX) | 41 #if defined(OS_POSIX) |
| 37 return plugin.path.BaseName().value(); | 42 return plugin.path.BaseName().value(); |
| 38 #elif defined(OS_WIN) | 43 #elif defined(OS_WIN) |
| 39 return base::SysWideToUTF8(plugin.path.BaseName().value()); | 44 return base::SysWideToUTF8(plugin.path.BaseName().value()); |
| 40 #endif | 45 #endif |
| 41 } | 46 } |
| 42 | 47 |
| 43 // Gets the plug-in group name as the plug-in name if it is not empty or | 48 // Gets the plug-in group name as the plug-in name if it is not empty or |
| 44 // the filename without extension if the name is empty. | 49 // the filename without extension if the name is empty. |
| 45 static string16 GetGroupName(const webkit::WebPluginInfo& plugin) { | 50 static string16 GetGroupName(const webkit::WebPluginInfo& plugin) { |
| 46 if (!plugin.name.empty()) | 51 if (!plugin.name.empty()) |
| 47 return plugin.name; | 52 return plugin.name; |
| 48 | 53 |
| 49 FilePath::StringType path = plugin.path.BaseName().RemoveExtension().value(); | 54 FilePath::StringType path = plugin.path.BaseName().RemoveExtension().value(); |
| 50 #if defined(OS_POSIX) | 55 #if defined(OS_POSIX) |
| 51 return UTF8ToUTF16(path); | 56 return UTF8ToUTF16(path); |
| 52 #elif defined(OS_WIN) | 57 #elif defined(OS_WIN) |
| 53 return WideToUTF16(path); | 58 return WideToUTF16(path); |
| 54 #endif | 59 #endif |
| 55 } | 60 } |
| 56 | 61 |
| 62 void LoadMimeTypes(const std::string& mime_type_list_key, | |
| 63 const DictionaryValue* plugin_dict, | |
| 64 PluginMetadata* plugin) { | |
| 65 const ListValue* mime_types = NULL; | |
| 66 if (!plugin_dict->GetList(mime_type_list_key, &mime_types)) | |
| 67 return; | |
| 68 | |
| 69 bool success = false; | |
| 70 for (ListValue::const_iterator mime_type_it = mime_types->begin(); | |
| 71 mime_type_it != mime_types->end(); ++mime_type_it) { | |
| 72 std::string mime_type_str; | |
| 73 success = (*mime_type_it)->GetAsString(&mime_type_str); | |
| 74 DCHECK(success); | |
| 75 if (mime_type_list_key == kMatchingMimeTypesListKey) { | |
| 76 plugin->AddMatchingMimeType(mime_type_str); | |
| 77 } else if (mime_type_list_key == kMimeTypesListKey) { | |
| 78 plugin->AddMimeType(mime_type_str); | |
| 79 } else { | |
| 80 NOTREACHED(); | |
| 81 return; | |
| 82 } | |
| 83 } | |
| 84 } | |
| 85 | |
| 57 PluginMetadata* CreatePluginMetadata( | 86 PluginMetadata* CreatePluginMetadata( |
| 58 const std::string& identifier, | 87 const std::string& identifier, |
| 59 const DictionaryValue* plugin_dict) { | 88 const DictionaryValue* plugin_dict) { |
| 60 std::string url; | 89 std::string url; |
| 61 bool success = plugin_dict->GetString("url", &url); | 90 bool success = plugin_dict->GetString("url", &url); |
| 62 std::string help_url; | 91 std::string help_url; |
| 63 plugin_dict->GetString("help_url", &help_url); | 92 plugin_dict->GetString("help_url", &help_url); |
| 64 string16 name; | 93 string16 name; |
| 65 success = plugin_dict->GetString("name", &name); | 94 success = plugin_dict->GetString("name", &name); |
| 66 DCHECK(success); | 95 DCHECK(success); |
| 67 bool display_url = false; | 96 bool display_url = false; |
| 68 plugin_dict->GetBoolean("displayurl", &display_url); | 97 plugin_dict->GetBoolean("displayurl", &display_url); |
| 69 string16 group_name_matcher; | 98 string16 group_name_matcher; |
| 70 success = plugin_dict->GetString("group_name_matcher", &group_name_matcher); | 99 success = plugin_dict->GetString("group_name_matcher", &group_name_matcher); |
| 71 DCHECK(success); | 100 DCHECK(success); |
| 101 std::string language_str; | |
| 102 plugin_dict->GetString("lang", &language_str); | |
| 72 | 103 |
| 73 PluginMetadata* plugin = new PluginMetadata(identifier, | 104 PluginMetadata* plugin = new PluginMetadata(identifier, |
| 74 name, | 105 name, |
| 75 display_url, | 106 display_url, |
| 76 GURL(url), | 107 GURL(url), |
| 77 GURL(help_url), | 108 GURL(help_url), |
| 78 group_name_matcher); | 109 group_name_matcher, |
| 110 language_str); | |
| 79 const ListValue* versions = NULL; | 111 const ListValue* versions = NULL; |
| 80 if (plugin_dict->GetList("versions", &versions)) { | 112 if (plugin_dict->GetList("versions", &versions)) { |
| 81 for (ListValue::const_iterator it = versions->begin(); | 113 for (ListValue::const_iterator it = versions->begin(); |
| 82 it != versions->end(); ++it) { | 114 it != versions->end(); ++it) { |
| 83 DictionaryValue* version_dict = NULL; | 115 DictionaryValue* version_dict = NULL; |
| 84 if (!(*it)->GetAsDictionary(&version_dict)) { | 116 if (!(*it)->GetAsDictionary(&version_dict)) { |
| 85 NOTREACHED(); | 117 NOTREACHED(); |
| 86 continue; | 118 continue; |
| 87 } | 119 } |
| 88 std::string version; | 120 std::string version; |
| 89 success = version_dict->GetString("version", &version); | 121 success = version_dict->GetString("version", &version); |
| 90 DCHECK(success); | 122 DCHECK(success); |
| 91 std::string status_str; | 123 std::string status_str; |
| 92 success = version_dict->GetString("status", &status_str); | 124 success = version_dict->GetString("status", &status_str); |
| 93 DCHECK(success); | 125 DCHECK(success); |
| 94 PluginMetadata::SecurityStatus status = | 126 PluginMetadata::SecurityStatus status = |
| 95 PluginMetadata::SECURITY_STATUS_UP_TO_DATE; | 127 PluginMetadata::SECURITY_STATUS_UP_TO_DATE; |
| 96 success = PluginMetadata::ParseSecurityStatus(status_str, &status); | 128 success = PluginMetadata::ParseSecurityStatus(status_str, &status); |
| 97 DCHECK(success); | 129 DCHECK(success); |
| 98 plugin->AddVersion(Version(version), status); | 130 plugin->AddVersion(Version(version), status); |
| 99 } | 131 } |
| 100 } | 132 } |
| 101 | 133 |
| 134 LoadMimeTypes(kMimeTypesListKey, plugin_dict, plugin); | |
| 135 LoadMimeTypes(kMatchingMimeTypesListKey, plugin_dict, plugin); | |
| 102 return plugin; | 136 return plugin; |
| 103 } | 137 } |
| 104 | 138 |
| 105 } // namespace | 139 } // namespace |
| 106 | 140 |
| 107 // static | 141 // static |
| 108 PluginFinder* PluginFinder::GetInstance() { | 142 PluginFinder* PluginFinder::GetInstance() { |
| 109 // PluginFinder::GetInstance() is the only method that's allowed to call | 143 // PluginFinder::GetInstance() is the only method that's allowed to call |
| 110 // Singleton<PluginFinder>::get(). | 144 // Singleton<PluginFinder>::get(). |
| 111 return Singleton<PluginFinder>::get(); | 145 return Singleton<PluginFinder>::get(); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 162 | 196 |
| 163 #if defined(ENABLE_PLUGIN_INSTALLATION) | 197 #if defined(ENABLE_PLUGIN_INSTALLATION) |
| 164 bool PluginFinder::FindPlugin( | 198 bool PluginFinder::FindPlugin( |
| 165 const std::string& mime_type, | 199 const std::string& mime_type, |
| 166 const std::string& language, | 200 const std::string& language, |
| 167 PluginInstaller** installer, | 201 PluginInstaller** installer, |
| 168 scoped_ptr<PluginMetadata>* plugin_metadata) { | 202 scoped_ptr<PluginMetadata>* plugin_metadata) { |
| 169 base::AutoLock lock(mutex_); | 203 base::AutoLock lock(mutex_); |
| 170 if (g_browser_process->local_state()->GetBoolean(prefs::kDisablePluginFinder)) | 204 if (g_browser_process->local_state()->GetBoolean(prefs::kDisablePluginFinder)) |
| 171 return false; | 205 return false; |
| 172 for (DictionaryValue::Iterator plugin_it(*plugin_list_); | |
| 173 plugin_it.HasNext(); plugin_it.Advance()) { | |
| 174 const DictionaryValue* plugin = NULL; | |
| 175 if (!plugin_it.value().GetAsDictionary(&plugin)) { | |
| 176 NOTREACHED(); | |
| 177 continue; | |
| 178 } | |
| 179 std::string language_str; | |
| 180 bool success = plugin->GetString("lang", &language_str); | |
| 181 if (language_str != language) | |
| 182 continue; | |
| 183 const ListValue* mime_types = NULL; | |
| 184 if (plugin->GetList("mime_types", &mime_types)) { | |
| 185 for (ListValue::const_iterator mime_type_it = mime_types->begin(); | |
| 186 mime_type_it != mime_types->end(); ++mime_type_it) { | |
| 187 std::string mime_type_str; | |
| 188 success = (*mime_type_it)->GetAsString(&mime_type_str); | |
| 189 DCHECK(success); | |
| 190 if (mime_type_str == mime_type) { | |
| 191 std::string identifier = plugin_it.key(); | |
| 192 std::map<std::string, PluginMetadata*>::const_iterator metadata_it = | |
| 193 identifier_plugin_.find(identifier); | |
| 194 DCHECK(metadata_it != identifier_plugin_.end()); | |
| 195 *plugin_metadata = metadata_it->second->Clone(); | |
| 196 | 206 |
| 197 std::map<std::string, PluginInstaller*>::const_iterator installer_it = | 207 PluginMap::const_iterator metadata_it = identifier_plugin_.begin(); |
| 198 installers_.find(identifier); | 208 for (; metadata_it != identifier_plugin_.end(); ++metadata_it) { |
| 199 DCHECK(installer_it != installers_.end()); | 209 if (language == metadata_it->second->language() && |
| 200 *installer = installer_it->second; | 210 metadata_it->second->HasMimeType(mime_type)) { |
| 201 return true; | 211 *plugin_metadata = metadata_it->second->Clone(); |
| 202 } | 212 |
| 203 } | 213 std::map<std::string, PluginInstaller*>::const_iterator installer_it = |
| 214 installers_.find(metadata_it->second->identifier()); | |
| 215 DCHECK(installer_it != installers_.end()); | |
| 216 *installer = installer_it->second; | |
| 217 return true; | |
| 204 } | 218 } |
| 205 } | 219 } |
| 206 return false; | 220 return false; |
| 207 } | 221 } |
| 208 | 222 |
| 209 bool PluginFinder::FindPluginWithIdentifier( | 223 bool PluginFinder::FindPluginWithIdentifier( |
| 210 const std::string& identifier, | 224 const std::string& identifier, |
| 211 PluginInstaller** installer, | 225 PluginInstaller** installer, |
| 212 scoped_ptr<PluginMetadata>* plugin_metadata) { | 226 scoped_ptr<PluginMetadata>* plugin_metadata) { |
| 213 base::AutoLock lock(mutex_); | 227 base::AutoLock lock(mutex_); |
| 214 std::map<std::string, PluginInstaller*>::const_iterator it = | 228 std::map<std::string, PluginInstaller*>::const_iterator it = |
| 215 installers_.find(identifier); | 229 installers_.find(identifier); |
| 216 if (it != installers_.end()) { | 230 if (it != installers_.end()) { |
| 217 *installer = it->second; | 231 *installer = it->second; |
| 218 std::map<std::string, PluginMetadata*>::const_iterator metadata_it = | 232 PluginMap::const_iterator metadata_it = identifier_plugin_.find(identifier); |
| 219 identifier_plugin_.find(identifier); | |
| 220 DCHECK(metadata_it != identifier_plugin_.end()); | 233 DCHECK(metadata_it != identifier_plugin_.end()); |
| 221 *plugin_metadata = metadata_it->second->Clone(); | 234 *plugin_metadata = metadata_it->second->Clone(); |
| 222 return true; | 235 return true; |
| 223 } | 236 } |
| 224 | 237 |
| 225 return false; | 238 return false; |
| 226 } | 239 } |
| 227 | 240 |
| 228 void PluginFinder::ReinitializePlugins( | 241 void PluginFinder::ReinitializePlugins( |
| 229 const base::DictionaryValue& json_metadata) { | 242 const base::DictionaryValue& json_metadata) { |
| 230 base::AutoLock lock(mutex_); | 243 base::AutoLock lock(mutex_); |
| 231 STLDeleteValues(&identifier_plugin_); | 244 STLDeleteValues(&identifier_plugin_); |
| 232 identifier_plugin_.clear(); | 245 identifier_plugin_.clear(); |
| 233 name_plugin_.clear(); | |
| 234 | 246 |
| 235 plugin_list_.reset(json_metadata.DeepCopy()); | 247 plugin_list_.reset(json_metadata.DeepCopy()); |
| 236 InitInternal(); | 248 InitInternal(); |
| 237 } | 249 } |
| 238 #endif | 250 #endif |
| 239 | 251 |
| 240 string16 PluginFinder::FindPluginNameWithIdentifier( | 252 string16 PluginFinder::FindPluginNameWithIdentifier( |
| 241 const std::string& identifier) { | 253 const std::string& identifier) { |
| 242 base::AutoLock lock(mutex_); | 254 base::AutoLock lock(mutex_); |
| 243 std::map<std::string, PluginMetadata*>::const_iterator it = | 255 PluginMap::const_iterator it = identifier_plugin_.find(identifier); |
| 244 identifier_plugin_.find(identifier); | |
| 245 string16 name; | 256 string16 name; |
| 246 if (it != identifier_plugin_.end()) | 257 if (it != identifier_plugin_.end()) |
| 247 name = it->second->name(); | 258 name = it->second->name(); |
| 248 | 259 |
| 249 return name.empty() ? UTF8ToUTF16(identifier) : name; | 260 return name.empty() ? UTF8ToUTF16(identifier) : name; |
| 250 } | 261 } |
| 251 | 262 |
| 252 scoped_ptr<PluginMetadata> PluginFinder::GetPluginMetadata( | 263 scoped_ptr<PluginMetadata> PluginFinder::GetPluginMetadata( |
| 253 const webkit::WebPluginInfo& plugin) { | 264 const webkit::WebPluginInfo& plugin) { |
| 254 base::AutoLock lock(mutex_); | 265 base::AutoLock lock(mutex_); |
| 255 if (name_plugin_.find(plugin.name) != name_plugin_.end()) | 266 for (PluginMap::const_iterator it = identifier_plugin_.begin(); |
| 256 return name_plugin_[plugin.name]->Clone(); | 267 it != identifier_plugin_.end(); ++it) { |
| 257 | 268 string16 matching_name; |
|
Bernhard Bauer
2012/10/04 11:37:19
Ok, now you're not using |matching_name| anymore.
ibraaaa
2012/10/04 12:24:12
Done.
| |
| 258 // Use the group name matcher to find the plug-in metadata we want. | 269 if (!it->second->MatchesPlugin(plugin, &matching_name)) |
| 259 for (std::map<std::string, PluginMetadata*>::const_iterator it = | |
| 260 identifier_plugin_.begin(); it != identifier_plugin_.end(); ++it) { | |
| 261 if (!it->second->MatchesPlugin(plugin)) | |
| 262 continue; | 270 continue; |
| 263 | 271 |
| 264 name_plugin_[plugin.name] = it->second; | |
| 265 return it->second->Clone(); | 272 return it->second->Clone(); |
| 266 } | 273 } |
| 267 | 274 |
| 268 // The plug-in metadata was not found, create a dummy one holding | 275 // The plug-in metadata was not found, create a dummy one holding |
| 269 // the name, identifier and group name only. | 276 // the name, identifier and group name only. |
| 270 std::string identifier = GetIdentifier(plugin); | 277 std::string identifier = GetIdentifier(plugin); |
| 271 PluginMetadata* metadata = new PluginMetadata(identifier, | 278 PluginMetadata* metadata = new PluginMetadata(identifier, |
| 272 GetGroupName(plugin), | 279 GetGroupName(plugin), |
| 273 false, GURL(), GURL(), | 280 false, GURL(), GURL(), |
| 274 GetGroupName(plugin)); | 281 GetGroupName(plugin), |
| 275 | 282 ""); |
| 276 name_plugin_[plugin.name] = metadata; | |
| 277 identifier_plugin_[identifier] = metadata; | 283 identifier_plugin_[identifier] = metadata; |
| 278 return metadata->Clone(); | 284 return metadata->Clone(); |
| 279 } | 285 } |
| 280 | 286 |
| 281 void PluginFinder::InitInternal() { | 287 void PluginFinder::InitInternal() { |
| 282 for (DictionaryValue::Iterator plugin_it(*plugin_list_); | 288 for (DictionaryValue::Iterator plugin_it(*plugin_list_); |
| 283 plugin_it.HasNext(); plugin_it.Advance()) { | 289 plugin_it.HasNext(); plugin_it.Advance()) { |
| 284 DictionaryValue* plugin = NULL; | 290 DictionaryValue* plugin = NULL; |
| 285 const std::string& identifier = plugin_it.key(); | 291 const std::string& identifier = plugin_it.key(); |
| 286 if (plugin_list_->GetDictionaryWithoutPathExpansion(identifier, &plugin)) { | 292 if (plugin_list_->GetDictionaryWithoutPathExpansion(identifier, &plugin)) { |
| 287 DCHECK(!identifier_plugin_[identifier]); | 293 DCHECK(!identifier_plugin_[identifier]); |
| 288 identifier_plugin_[identifier] = CreatePluginMetadata(identifier, plugin); | 294 identifier_plugin_[identifier] = CreatePluginMetadata(identifier, plugin); |
| 289 | 295 |
| 290 #if defined(ENABLE_PLUGIN_INSTALLATION) | 296 #if defined(ENABLE_PLUGIN_INSTALLATION) |
| 291 if (installers_.find(identifier) == installers_.end()) | 297 if (installers_.find(identifier) == installers_.end()) |
| 292 installers_[identifier] = new PluginInstaller(); | 298 installers_[identifier] = new PluginInstaller(); |
| 293 #endif | 299 #endif |
| 294 } | 300 } |
| 295 } | 301 } |
| 296 } | 302 } |
| OLD | NEW |