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

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
« no previous file with comments | « no previous file | chrome/browser/plugins/plugin_metadata.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 std::string help_url; 62 std::string help_url;
63 plugin_dict->GetString("help_url", &help_url); 63 plugin_dict->GetString("help_url", &help_url);
64 string16 name; 64 string16 name;
65 success = plugin_dict->GetString("name", &name); 65 success = plugin_dict->GetString("name", &name);
66 DCHECK(success); 66 DCHECK(success);
67 bool display_url = false; 67 bool display_url = false;
68 plugin_dict->GetBoolean("displayurl", &display_url); 68 plugin_dict->GetBoolean("displayurl", &display_url);
69 string16 group_name_matcher; 69 string16 group_name_matcher;
70 success = plugin_dict->GetString("group_name_matcher", &group_name_matcher); 70 success = plugin_dict->GetString("group_name_matcher", &group_name_matcher);
71 DCHECK(success); 71 DCHECK(success);
72 std::string language_str;
73 plugin_dict->GetString("lang", &language_str);
72 74
73 PluginMetadata* plugin = new PluginMetadata(identifier, 75 PluginMetadata* plugin = new PluginMetadata(identifier,
74 name, 76 name,
75 display_url, 77 display_url,
76 GURL(url), 78 GURL(url),
77 GURL(help_url), 79 GURL(help_url),
78 group_name_matcher); 80 group_name_matcher,
81 language_str);
79 const ListValue* versions = NULL; 82 const ListValue* versions = NULL;
80 if (plugin_dict->GetList("versions", &versions)) { 83 if (plugin_dict->GetList("versions", &versions)) {
81 for (ListValue::const_iterator it = versions->begin(); 84 for (ListValue::const_iterator it = versions->begin();
82 it != versions->end(); ++it) { 85 it != versions->end(); ++it) {
83 DictionaryValue* version_dict = NULL; 86 DictionaryValue* version_dict = NULL;
84 if (!(*it)->GetAsDictionary(&version_dict)) { 87 if (!(*it)->GetAsDictionary(&version_dict)) {
85 NOTREACHED(); 88 NOTREACHED();
86 continue; 89 continue;
87 } 90 }
88 std::string version; 91 std::string version;
89 success = version_dict->GetString("version", &version); 92 success = version_dict->GetString("version", &version);
90 DCHECK(success); 93 DCHECK(success);
91 std::string status_str; 94 std::string status_str;
92 success = version_dict->GetString("status", &status_str); 95 success = version_dict->GetString("status", &status_str);
93 DCHECK(success); 96 DCHECK(success);
94 PluginMetadata::SecurityStatus status = 97 PluginMetadata::SecurityStatus status =
95 PluginMetadata::SECURITY_STATUS_UP_TO_DATE; 98 PluginMetadata::SECURITY_STATUS_UP_TO_DATE;
96 success = PluginMetadata::ParseSecurityStatus(status_str, &status); 99 success = PluginMetadata::ParseSecurityStatus(status_str, &status);
97 DCHECK(success); 100 DCHECK(success);
98 plugin->AddVersion(Version(version), status); 101 plugin->AddVersion(Version(version), status);
99 } 102 }
100 } 103 }
101 104
105 const ListValue* mime_types = NULL;
106 if (plugin_dict->GetList("mime_types", &mime_types)) {
107 for (ListValue::const_iterator mime_type_it = mime_types->begin();
108 mime_type_it != mime_types->end(); ++mime_type_it) {
109 DictionaryValue* mime_types_dict = NULL;
110 if (!(*mime_type_it)->GetAsDictionary(&mime_types_dict)) {
111 NOTREACHED();
112 continue;
113 }
114 std::string mime_type;
115 success = mime_types_dict->GetString("mime_type", &mime_type);
116 DCHECK(success);
117 bool used_in_matching = false;
118 mime_types_dict->GetBoolean("used_in_matching", &used_in_matching);
119 plugin->AddMimeType(mime_type, used_in_matching);
120 }
121 }
102 return plugin; 122 return plugin;
103 } 123 }
104 124
105 } // namespace 125 } // namespace
106 126
107 // static 127 // static
108 PluginFinder* PluginFinder::GetInstance() { 128 PluginFinder* PluginFinder::GetInstance() {
109 // PluginFinder::GetInstance() is the only method that's allowed to call 129 // PluginFinder::GetInstance() is the only method that's allowed to call
110 // Singleton<PluginFinder>::get(). 130 // Singleton<PluginFinder>::get().
111 return Singleton<PluginFinder>::get(); 131 return Singleton<PluginFinder>::get();
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 180
161 #if defined(ENABLE_PLUGIN_INSTALLATION) 181 #if defined(ENABLE_PLUGIN_INSTALLATION)
162 bool PluginFinder::FindPlugin( 182 bool PluginFinder::FindPlugin(
163 const std::string& mime_type, 183 const std::string& mime_type,
164 const std::string& language, 184 const std::string& language,
165 PluginInstaller** installer, 185 PluginInstaller** installer,
166 scoped_ptr<PluginMetadata>* plugin_metadata) { 186 scoped_ptr<PluginMetadata>* plugin_metadata) {
167 base::AutoLock lock(mutex_); 187 base::AutoLock lock(mutex_);
168 if (g_browser_process->local_state()->GetBoolean(prefs::kDisablePluginFinder)) 188 if (g_browser_process->local_state()->GetBoolean(prefs::kDisablePluginFinder))
169 return false; 189 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 190
196 std::map<std::string, PluginInstaller*>::const_iterator installer_it = 191 std::map<std::string, PluginMetadata*>::const_iterator metadata_it =
197 installers_.find(identifier); 192 identifier_plugin_.begin();
198 DCHECK(installer_it != installers_.end()); 193 for (; metadata_it != identifier_plugin_.end(); ++metadata_it) {
199 *installer = installer_it->second; 194 if (language == metadata_it->second->language() &&
200 return true; 195 metadata_it->second->HasMimeType(mime_type)) {
201 } 196 *plugin_metadata = metadata_it->second->Clone();
197
198 std::map<std::string, PluginInstaller*>::const_iterator installer_it =
199 installers_.find(metadata_it->second->identifier());
200 DCHECK(installer_it != installers_.end());
201 *installer = installer_it->second;
202 return true;
202 } 203 }
203 } 204 }
204 return false; 205 return false;
205 } 206 }
206 207
207 bool PluginFinder::FindPluginWithIdentifier( 208 bool PluginFinder::FindPluginWithIdentifier(
208 const std::string& identifier, 209 const std::string& identifier,
209 PluginInstaller** installer, 210 PluginInstaller** installer,
210 scoped_ptr<PluginMetadata>* plugin_metadata) { 211 scoped_ptr<PluginMetadata>* plugin_metadata) {
211 base::AutoLock lock(mutex_); 212 base::AutoLock lock(mutex_);
(...skipping 20 matching lines...) Expand all
232 string16 name; 233 string16 name;
233 if (it != identifier_plugin_.end()) 234 if (it != identifier_plugin_.end())
234 name = it->second->name(); 235 name = it->second->name();
235 236
236 return name.empty() ? UTF8ToUTF16(identifier) : name; 237 return name.empty() ? UTF8ToUTF16(identifier) : name;
237 } 238 }
238 239
239 scoped_ptr<PluginMetadata> PluginFinder::GetPluginMetadata( 240 scoped_ptr<PluginMetadata> PluginFinder::GetPluginMetadata(
240 const webkit::WebPluginInfo& plugin) { 241 const webkit::WebPluginInfo& plugin) {
241 base::AutoLock lock(mutex_); 242 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. 243 // Use the group name matcher to find the plug-in metadata we want.
246 for (std::map<std::string, PluginMetadata*>::const_iterator it = 244 for (std::map<std::string, PluginMetadata*>::const_iterator it =
247 identifier_plugin_.begin(); it != identifier_plugin_.end(); ++it) { 245 identifier_plugin_.begin(); it != identifier_plugin_.end(); ++it) {
248 if (!it->second->MatchesPlugin(plugin)) 246 string16 matching_name;
247 if (!it->second->MatchesPlugin(plugin, &matching_name))
249 continue; 248 continue;
250 249
251 name_plugin_[plugin.name] = it->second; 250 name_plugin_[matching_name] = it->second;
252 return it->second->Clone(); 251 return it->second->Clone();
253 } 252 }
254 253
255 // The plug-in metadata was not found, create a dummy one holding 254 // The plug-in metadata was not found, create a dummy one holding
256 // the name, identifier and group name only. 255 // the name, identifier and group name only.
257 std::string identifier = GetIdentifier(plugin); 256 std::string identifier = GetIdentifier(plugin);
258 PluginMetadata* metadata = new PluginMetadata(identifier, 257 PluginMetadata* metadata = new PluginMetadata(identifier,
259 GetGroupName(plugin), 258 GetGroupName(plugin),
260 false, GURL(), GURL(), 259 false, GURL(), GURL(),
261 GetGroupName(plugin)); 260 GetGroupName(plugin),
262 261 "");
263 name_plugin_[plugin.name] = metadata; 262 name_plugin_[plugin.name] = metadata;
264 identifier_plugin_[identifier] = metadata; 263 identifier_plugin_[identifier] = metadata;
265 return metadata->Clone(); 264 return metadata->Clone();
266 } 265 }
267 266
268 void PluginFinder::ReinitializePlugins( 267 void PluginFinder::ReinitializePlugins(
269 const base::DictionaryValue& json_metadata) { 268 const base::DictionaryValue& json_metadata) {
270 base::AutoLock lock(mutex_); 269 base::AutoLock lock(mutex_);
271 STLDeleteValues(&identifier_plugin_); 270 STLDeleteValues(&identifier_plugin_);
272 identifier_plugin_.clear(); 271 identifier_plugin_.clear();
(...skipping 12 matching lines...) Expand all
285 DCHECK(!identifier_plugin_[identifier]); 284 DCHECK(!identifier_plugin_[identifier]);
286 identifier_plugin_[identifier] = CreatePluginMetadata(identifier, plugin); 285 identifier_plugin_[identifier] = CreatePluginMetadata(identifier, plugin);
287 286
288 #if defined(ENABLE_PLUGIN_INSTALLATION) 287 #if defined(ENABLE_PLUGIN_INSTALLATION)
289 if (installers_.find(identifier) == installers_.end()) 288 if (installers_.find(identifier) == installers_.end())
290 installers_[identifier] = new PluginInstaller(); 289 installers_[identifier] = new PluginInstaller();
291 #endif 290 #endif
292 } 291 }
293 } 292 }
294 } 293 }
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/plugins/plugin_metadata.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698