Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Side by Side Diff: chrome/browser/plugins/plugin_finder.cc

Issue 11016005: Using MIME types in addition to plugin name to differentiate between plugins. (Closed) Base URL: http://git.chromium.org/chromium/src.git@5_plugins_resource_service
Patch Set: .. Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 const char kMimeTypesListKey[] = "mime_types";
35 const char kMatchingMimeTypesListKey[] = "matching_mime_types";
36
34 // Gets the base name of the file path as the identifier. 37 // Gets the base name of the file path as the identifier.
35 static std::string GetIdentifier(const webkit::WebPluginInfo& plugin) { 38 static std::string GetIdentifier(const webkit::WebPluginInfo& plugin) {
36 #if defined(OS_POSIX) 39 #if defined(OS_POSIX)
37 return plugin.path.BaseName().value(); 40 return plugin.path.BaseName().value();
38 #elif defined(OS_WIN) 41 #elif defined(OS_WIN)
39 return base::SysWideToUTF8(plugin.path.BaseName().value()); 42 return base::SysWideToUTF8(plugin.path.BaseName().value());
40 #endif 43 #endif
41 } 44 }
42 45
43 // Gets the plug-in group name as the plug-in name if it is not empty or 46 // 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. 47 // the filename without extension if the name is empty.
45 static string16 GetGroupName(const webkit::WebPluginInfo& plugin) { 48 static string16 GetGroupName(const webkit::WebPluginInfo& plugin) {
46 if (!plugin.name.empty()) 49 if (!plugin.name.empty())
47 return plugin.name; 50 return plugin.name;
48 51
49 FilePath::StringType path = plugin.path.BaseName().RemoveExtension().value(); 52 FilePath::StringType path = plugin.path.BaseName().RemoveExtension().value();
50 #if defined(OS_POSIX) 53 #if defined(OS_POSIX)
51 return UTF8ToUTF16(path); 54 return UTF8ToUTF16(path);
52 #elif defined(OS_WIN) 55 #elif defined(OS_WIN)
53 return WideToUTF16(path); 56 return WideToUTF16(path);
54 #endif 57 #endif
55 } 58 }
56 59
60 void LoadMimeTypes(const std::string& mime_type_list_key,
61 const DictionaryValue* plugin_dict,
62 PluginMetadata* plugin) {
63 const ListValue* mime_types = NULL;
64 if (!plugin_dict->GetList(mime_type_list_key, &mime_types))
65 return;
66
67 bool success = false;
68 for (ListValue::const_iterator mime_type_it = mime_types->begin();
69 mime_type_it != mime_types->end(); ++mime_type_it) {
70 std::string mime_type_str;
71 success = (*mime_type_it)->GetAsString(&mime_type_str);
72 DCHECK(success);
73 if (mime_type_list_key == kMatchingMimeTypesListKey) {
Bernhard Bauer 2012/10/02 14:40:13 This might be a bit simpler if you create a method
ibraaaa 2012/10/02 16:14:53 Well, if I send a boolean value (actually that is
Bernhard Bauer 2012/10/04 11:37:19 Right, it just seems a bit more awkward to pass in
ibraaaa 2012/10/04 12:24:12 Done.
74 plugin->AddMatchingMimeType(mime_type_str);
75 } else if (mime_type_list_key == kMimeTypesListKey) {
76 plugin->AddMimeType(mime_type_str);
77 } else {
78 NOTREACHED();
79 return;
80 }
81 }
82 }
83
57 PluginMetadata* CreatePluginMetadata( 84 PluginMetadata* CreatePluginMetadata(
58 const std::string& identifier, 85 const std::string& identifier,
59 const DictionaryValue* plugin_dict) { 86 const DictionaryValue* plugin_dict) {
60 std::string url; 87 std::string url;
61 bool success = plugin_dict->GetString("url", &url); 88 bool success = plugin_dict->GetString("url", &url);
62 std::string help_url; 89 std::string help_url;
63 plugin_dict->GetString("help_url", &help_url); 90 plugin_dict->GetString("help_url", &help_url);
64 string16 name; 91 string16 name;
65 success = plugin_dict->GetString("name", &name); 92 success = plugin_dict->GetString("name", &name);
66 DCHECK(success); 93 DCHECK(success);
67 bool display_url = false; 94 bool display_url = false;
68 plugin_dict->GetBoolean("displayurl", &display_url); 95 plugin_dict->GetBoolean("displayurl", &display_url);
69 string16 group_name_matcher; 96 string16 group_name_matcher;
70 success = plugin_dict->GetString("group_name_matcher", &group_name_matcher); 97 success = plugin_dict->GetString("group_name_matcher", &group_name_matcher);
71 DCHECK(success); 98 DCHECK(success);
99 std::string language_str;
100 plugin_dict->GetString("lang", &language_str);
72 101
73 PluginMetadata* plugin = new PluginMetadata(identifier, 102 PluginMetadata* plugin = new PluginMetadata(identifier,
74 name, 103 name,
75 display_url, 104 display_url,
76 GURL(url), 105 GURL(url),
77 GURL(help_url), 106 GURL(help_url),
78 group_name_matcher); 107 group_name_matcher,
108 language_str);
79 const ListValue* versions = NULL; 109 const ListValue* versions = NULL;
80 if (plugin_dict->GetList("versions", &versions)) { 110 if (plugin_dict->GetList("versions", &versions)) {
81 for (ListValue::const_iterator it = versions->begin(); 111 for (ListValue::const_iterator it = versions->begin();
82 it != versions->end(); ++it) { 112 it != versions->end(); ++it) {
83 DictionaryValue* version_dict = NULL; 113 DictionaryValue* version_dict = NULL;
84 if (!(*it)->GetAsDictionary(&version_dict)) { 114 if (!(*it)->GetAsDictionary(&version_dict)) {
85 NOTREACHED(); 115 NOTREACHED();
86 continue; 116 continue;
87 } 117 }
88 std::string version; 118 std::string version;
89 success = version_dict->GetString("version", &version); 119 success = version_dict->GetString("version", &version);
90 DCHECK(success); 120 DCHECK(success);
91 std::string status_str; 121 std::string status_str;
92 success = version_dict->GetString("status", &status_str); 122 success = version_dict->GetString("status", &status_str);
93 DCHECK(success); 123 DCHECK(success);
94 PluginMetadata::SecurityStatus status = 124 PluginMetadata::SecurityStatus status =
95 PluginMetadata::SECURITY_STATUS_UP_TO_DATE; 125 PluginMetadata::SECURITY_STATUS_UP_TO_DATE;
96 success = PluginMetadata::ParseSecurityStatus(status_str, &status); 126 success = PluginMetadata::ParseSecurityStatus(status_str, &status);
97 DCHECK(success); 127 DCHECK(success);
98 plugin->AddVersion(Version(version), status); 128 plugin->AddVersion(Version(version), status);
99 } 129 }
100 } 130 }
101 131
132 LoadMimeTypes(kMimeTypesListKey, plugin_dict, plugin);
133 LoadMimeTypes(kMatchingMimeTypesListKey, plugin_dict, plugin);
102 return plugin; 134 return plugin;
103 } 135 }
104 136
105 } // namespace 137 } // namespace
106 138
107 // static 139 // static
108 PluginFinder* PluginFinder::GetInstance() { 140 PluginFinder* PluginFinder::GetInstance() {
109 // PluginFinder::GetInstance() is the only method that's allowed to call 141 // PluginFinder::GetInstance() is the only method that's allowed to call
110 // Singleton<PluginFinder>::get(). 142 // Singleton<PluginFinder>::get().
111 return Singleton<PluginFinder>::get(); 143 return Singleton<PluginFinder>::get();
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 192
161 #if defined(ENABLE_PLUGIN_INSTALLATION) 193 #if defined(ENABLE_PLUGIN_INSTALLATION)
162 bool PluginFinder::FindPlugin( 194 bool PluginFinder::FindPlugin(
163 const std::string& mime_type, 195 const std::string& mime_type,
164 const std::string& language, 196 const std::string& language,
165 PluginInstaller** installer, 197 PluginInstaller** installer,
166 scoped_ptr<PluginMetadata>* plugin_metadata) { 198 scoped_ptr<PluginMetadata>* plugin_metadata) {
167 base::AutoLock lock(mutex_); 199 base::AutoLock lock(mutex_);
168 if (g_browser_process->local_state()->GetBoolean(prefs::kDisablePluginFinder)) 200 if (g_browser_process->local_state()->GetBoolean(prefs::kDisablePluginFinder))
169 return false; 201 return false;
170 for (DictionaryValue::Iterator plugin_it(*plugin_list_);
171 plugin_it.HasNext(); plugin_it.Advance()) {
172 const DictionaryValue* plugin = NULL;
173 if (!plugin_it.value().GetAsDictionary(&plugin)) {
174 NOTREACHED();
175 continue;
176 }
177 std::string language_str;
178 bool success = plugin->GetString("lang", &language_str);
179 if (language_str != language)
180 continue;
181 const ListValue* mime_types = NULL;
182 plugin->GetList("mime_types", &mime_types);
183 DCHECK(success);
184 for (ListValue::const_iterator mime_type_it = mime_types->begin();
185 mime_type_it != mime_types->end(); ++mime_type_it) {
186 std::string mime_type_str;
187 success = (*mime_type_it)->GetAsString(&mime_type_str);
188 DCHECK(success);
189 if (mime_type_str == mime_type) {
190 std::string identifier = plugin_it.key();
191 std::map<std::string, PluginMetadata*>::const_iterator metadata_it =
192 identifier_plugin_.find(identifier);
193 DCHECK(metadata_it != identifier_plugin_.end());
194 *plugin_metadata = metadata_it->second->Clone();
195 202
196 std::map<std::string, PluginInstaller*>::const_iterator installer_it = 203 std::map<std::string, PluginMetadata*>::const_iterator metadata_it =
Bernhard Bauer 2012/10/02 14:40:13 You use this map type in a bunch of places. You co
ibraaaa 2012/10/02 16:14:53 Done.
197 installers_.find(identifier); 204 identifier_plugin_.begin();
198 DCHECK(installer_it != installers_.end()); 205 for (; metadata_it != identifier_plugin_.end(); ++metadata_it) {
199 *installer = installer_it->second; 206 if (language == metadata_it->second->language() &&
200 return true; 207 metadata_it->second->HasMimeType(mime_type)) {
201 } 208 *plugin_metadata = metadata_it->second->Clone();
209
210 std::map<std::string, PluginInstaller*>::const_iterator installer_it =
211 installers_.find(metadata_it->second->identifier());
212 DCHECK(installer_it != installers_.end());
213 *installer = installer_it->second;
214 return true;
202 } 215 }
203 } 216 }
204 return false; 217 return false;
205 } 218 }
206 219
207 bool PluginFinder::FindPluginWithIdentifier( 220 bool PluginFinder::FindPluginWithIdentifier(
208 const std::string& identifier, 221 const std::string& identifier,
209 PluginInstaller** installer, 222 PluginInstaller** installer,
210 scoped_ptr<PluginMetadata>* plugin_metadata) { 223 scoped_ptr<PluginMetadata>* plugin_metadata) {
211 base::AutoLock lock(mutex_); 224 base::AutoLock lock(mutex_);
(...skipping 20 matching lines...) Expand all
232 string16 name; 245 string16 name;
233 if (it != identifier_plugin_.end()) 246 if (it != identifier_plugin_.end())
234 name = it->second->name(); 247 name = it->second->name();
235 248
236 return name.empty() ? UTF8ToUTF16(identifier) : name; 249 return name.empty() ? UTF8ToUTF16(identifier) : name;
237 } 250 }
238 251
239 scoped_ptr<PluginMetadata> PluginFinder::GetPluginMetadata( 252 scoped_ptr<PluginMetadata> PluginFinder::GetPluginMetadata(
240 const webkit::WebPluginInfo& plugin) { 253 const webkit::WebPluginInfo& plugin) {
241 base::AutoLock lock(mutex_); 254 base::AutoLock lock(mutex_);
242 if (name_plugin_.find(plugin.name) != name_plugin_.end())
243 return name_plugin_[plugin.name]->Clone();
244
245 // Use the group name matcher to find the plug-in metadata we want.
246 for (std::map<std::string, PluginMetadata*>::const_iterator it = 255 for (std::map<std::string, PluginMetadata*>::const_iterator it =
247 identifier_plugin_.begin(); it != identifier_plugin_.end(); ++it) { 256 identifier_plugin_.begin(); it != identifier_plugin_.end(); ++it) {
248 if (!it->second->MatchesPlugin(plugin)) 257 string16 matching_name;
258 if (!it->second->MatchesPlugin(plugin, &matching_name))
249 continue; 259 continue;
250 260
251 name_plugin_[plugin.name] = it->second; 261 name_plugin_[matching_name] = it->second;
Bernhard Bauer 2012/10/02 14:40:13 You're never reading from |name_plugin_| anymore.
ibraaaa 2012/10/02 16:14:53 Done.
252 return it->second->Clone(); 262 return it->second->Clone();
253 } 263 }
254 264
255 // The plug-in metadata was not found, create a dummy one holding 265 // The plug-in metadata was not found, create a dummy one holding
256 // the name, identifier and group name only. 266 // the name, identifier and group name only.
257 std::string identifier = GetIdentifier(plugin); 267 std::string identifier = GetIdentifier(plugin);
258 PluginMetadata* metadata = new PluginMetadata(identifier, 268 PluginMetadata* metadata = new PluginMetadata(identifier,
259 GetGroupName(plugin), 269 GetGroupName(plugin),
260 false, GURL(), GURL(), 270 false, GURL(), GURL(),
261 GetGroupName(plugin)); 271 GetGroupName(plugin),
262 272 "");
263 name_plugin_[plugin.name] = metadata; 273 name_plugin_[plugin.name] = metadata;
264 identifier_plugin_[identifier] = metadata; 274 identifier_plugin_[identifier] = metadata;
265 return metadata->Clone(); 275 return metadata->Clone();
266 } 276 }
267 277
268 void PluginFinder::ReinitializePlugins( 278 void PluginFinder::ReinitializePlugins(
269 const base::DictionaryValue& json_metadata) { 279 const base::DictionaryValue& json_metadata) {
270 base::AutoLock lock(mutex_); 280 base::AutoLock lock(mutex_);
271 STLDeleteValues(&identifier_plugin_); 281 STLDeleteValues(&identifier_plugin_);
272 identifier_plugin_.clear(); 282 identifier_plugin_.clear();
(...skipping 12 matching lines...) Expand all
285 DCHECK(!identifier_plugin_[identifier]); 295 DCHECK(!identifier_plugin_[identifier]);
286 identifier_plugin_[identifier] = CreatePluginMetadata(identifier, plugin); 296 identifier_plugin_[identifier] = CreatePluginMetadata(identifier, plugin);
287 297
288 #if defined(ENABLE_PLUGIN_INSTALLATION) 298 #if defined(ENABLE_PLUGIN_INSTALLATION)
289 if (installers_.find(identifier) == installers_.end()) 299 if (installers_.find(identifier) == installers_.end())
290 installers_[identifier] = new PluginInstaller(); 300 installers_[identifier] = new PluginInstaller();
291 #endif 301 #endif
292 } 302 }
293 } 303 }
294 } 304 }
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/plugins/plugin_metadata.h » ('j') | chrome/browser/plugins/plugin_metadata.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698