| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/plugin_updater.h" | 5 #include "chrome/browser/plugin_updater.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 return plugin_groups_data; | 57 return plugin_groups_data; |
| 58 } | 58 } |
| 59 | 59 |
| 60 void PluginUpdater::EnablePluginGroup(bool enable, const string16& group_name) { | 60 void PluginUpdater::EnablePluginGroup(bool enable, const string16& group_name) { |
| 61 if (webkit::npapi::PluginGroup::IsPluginNameDisabledByPolicy(group_name)) | 61 if (webkit::npapi::PluginGroup::IsPluginNameDisabledByPolicy(group_name)) |
| 62 enable = false; | 62 enable = false; |
| 63 webkit::npapi::PluginList::Singleton()->EnableGroup(enable, group_name); | 63 webkit::npapi::PluginList::Singleton()->EnableGroup(enable, group_name); |
| 64 NotifyPluginStatusChanged(); | 64 NotifyPluginStatusChanged(); |
| 65 } | 65 } |
| 66 | 66 |
| 67 void PluginUpdater::EnablePluginFile(bool enable, | 67 void PluginUpdater::EnablePlugin(bool enable, |
| 68 const FilePath::StringType& path) { | 68 const FilePath::StringType& path, |
| 69 const string16& name) { |
| 69 FilePath file_path(path); | 70 FilePath file_path(path); |
| 70 if (enable && | 71 if (enable) |
| 71 !webkit::npapi::PluginGroup::IsPluginPathDisabledByPolicy(file_path)) | 72 webkit::npapi::PluginList::Singleton()->EnablePlugin(file_path, name); |
| 72 webkit::npapi::PluginList::Singleton()->EnablePlugin(file_path); | |
| 73 else | 73 else |
| 74 webkit::npapi::PluginList::Singleton()->DisablePlugin(file_path); | 74 webkit::npapi::PluginList::Singleton()->DisablePlugin(file_path, name); |
| 75 | 75 |
| 76 NotifyPluginStatusChanged(); | 76 NotifyPluginStatusChanged(); |
| 77 } | 77 } |
| 78 | 78 |
| 79 void PluginUpdater::Observe(NotificationType type, | 79 void PluginUpdater::Observe(NotificationType type, |
| 80 const NotificationSource& source, | 80 const NotificationSource& source, |
| 81 const NotificationDetails& details) { | 81 const NotificationDetails& details) { |
| 82 DCHECK_EQ(NotificationType::PREF_CHANGED, type.value); | 82 DCHECK_EQ(NotificationType::PREF_CHANGED, type.value); |
| 83 const std::string* pref_name = Details<std::string>(details).ptr(); | 83 const std::string* pref_name = Details<std::string>(details).ptr(); |
| 84 if (!pref_name) { | 84 if (!pref_name) { |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 found_internal_pdf = true; | 185 found_internal_pdf = true; |
| 186 if (!enabled) { | 186 if (!enabled) { |
| 187 if (force_enable_internal_pdf) { | 187 if (force_enable_internal_pdf) { |
| 188 enabled = true; | 188 enabled = true; |
| 189 plugin->SetBoolean("enabled", true); | 189 plugin->SetBoolean("enabled", true); |
| 190 } else if (force_internal_pdf_for_this_run) { | 190 } else if (force_internal_pdf_for_this_run) { |
| 191 enabled = true; | 191 enabled = true; |
| 192 } | 192 } |
| 193 } | 193 } |
| 194 } | 194 } |
| 195 if (!enabled) | 195 if (!enabled) { |
| 196 webkit::npapi::PluginList::Singleton()->DisablePlugin(plugin_path); | 196 string16 name; |
| 197 plugin->GetString("name", &name); |
| 198 webkit::npapi::PluginList::Singleton()->DisablePlugin(plugin_path, |
| 199 name); |
| 200 } |
| 197 } else if (!enabled && plugin->GetString("name", &group_name)) { | 201 } else if (!enabled && plugin->GetString("name", &group_name)) { |
| 198 // Don't disable this group if it's for the pdf plugin and we just | 202 // Don't disable this group if it's for the pdf plugin and we just |
| 199 // forced it on. | 203 // forced it on. |
| 200 if (force_enable_internal_pdf && pdf_group_name == group_name) | 204 if (force_enable_internal_pdf && pdf_group_name == group_name) |
| 201 continue; | 205 continue; |
| 202 | 206 |
| 203 // Otherwise this is a list of groups. | 207 // Otherwise this is a list of groups. |
| 204 EnablePluginGroup(false, group_name); | 208 EnablePluginGroup(false, group_name); |
| 205 } | 209 } |
| 206 } | 210 } |
| 207 } | 211 } |
| 208 | 212 |
| 209 // Build the set of policy-disabled plugin patterns once and cache it. | 213 // Build the set of policy-disabled plugin patterns once and cache it. |
| 210 // Don't do this in the constructor, there's no profile available there. | 214 // Don't do this in the constructor, there's no profile available there. |
| 211 const ListValue* plugin_blacklist = | 215 const ListValue* plugin_blacklist = |
| 212 profile->GetPrefs()->GetList(prefs::kPluginsPluginsBlacklist); | 216 profile->GetPrefs()->GetList(prefs::kPluginsPluginsBlacklist); |
| 213 DisablePluginsFromPolicy(plugin_blacklist); | 217 DisablePluginsFromPolicy(plugin_blacklist); |
| 214 | 218 |
| 215 if ((!enable_internal_pdf_ && !found_internal_pdf) && | 219 if ((!enable_internal_pdf_ && !found_internal_pdf) && |
| 216 !force_internal_pdf_for_this_run) { | 220 !force_internal_pdf_for_this_run) { |
| 217 // The internal PDF plugin is disabled by default, and the user hasn't | 221 // The internal PDF plugin is disabled by default, and the user hasn't |
| 218 // overridden the default. | 222 // overridden the default. |
| 219 webkit::npapi::PluginList::Singleton()->DisablePlugin(pdf_path); | 223 webkit::npapi::PluginList::Singleton()->DisablePlugin(pdf_path, |
| 224 pdf_group_name); |
| 220 EnablePluginGroup(false, pdf_group_name); | 225 EnablePluginGroup(false, pdf_group_name); |
| 221 } | 226 } |
| 222 | 227 |
| 223 if (force_enable_internal_pdf) { | 228 if (force_enable_internal_pdf) { |
| 224 // See http://crbug.com/50105 for background. | 229 // See http://crbug.com/50105 for background. |
| 225 EnablePluginGroup(false, ASCIIToUTF16( | 230 EnablePluginGroup(false, ASCIIToUTF16( |
| 226 webkit::npapi::PluginGroup::kAdobeReaderGroupName)); | 231 webkit::npapi::PluginGroup::kAdobeReaderGroupName)); |
| 227 | 232 |
| 228 // We want to save this, but doing so requires loading the list of plugins, | 233 // We want to save this, but doing so requires loading the list of plugins, |
| 229 // so do it after a minute as to not impact startup performance. Note that | 234 // so do it after a minute as to not impact startup performance. Note that |
| (...skipping 13 matching lines...) Expand all Loading... |
| 243 void PluginUpdater::GetPreferencesDataOnFileThread(void* profile) { | 248 void PluginUpdater::GetPreferencesDataOnFileThread(void* profile) { |
| 244 std::vector<webkit::npapi::WebPluginInfo> plugins; | 249 std::vector<webkit::npapi::WebPluginInfo> plugins; |
| 245 webkit::npapi::PluginList::Singleton()->GetPlugins(false, &plugins); | 250 webkit::npapi::PluginList::Singleton()->GetPlugins(false, &plugins); |
| 246 | 251 |
| 247 std::vector<webkit::npapi::PluginGroup> groups; | 252 std::vector<webkit::npapi::PluginGroup> groups; |
| 248 webkit::npapi::PluginList::Singleton()->GetPluginGroups(false, &groups); | 253 webkit::npapi::PluginList::Singleton()->GetPluginGroups(false, &groups); |
| 249 | 254 |
| 250 BrowserThread::PostTask( | 255 BrowserThread::PostTask( |
| 251 BrowserThread::UI, | 256 BrowserThread::UI, |
| 252 FROM_HERE, | 257 FROM_HERE, |
| 253 NewRunnableFunction( | 258 NewRunnableFunction(&PluginUpdater::OnUpdatePreferences, |
| 254 &PluginUpdater::OnUpdatePreferences, | 259 static_cast<Profile*>(profile), |
| 255 static_cast<Profile*>(profile), plugins, groups)); | 260 plugins, groups)); |
| 256 } | 261 } |
| 257 | 262 |
| 258 void PluginUpdater::OnUpdatePreferences( | 263 void PluginUpdater::OnUpdatePreferences( |
| 259 Profile* profile, | 264 Profile* profile, |
| 260 const std::vector<webkit::npapi::WebPluginInfo>& plugins, | 265 const std::vector<webkit::npapi::WebPluginInfo>& plugins, |
| 261 const std::vector<webkit::npapi::PluginGroup>& groups) { | 266 const std::vector<webkit::npapi::PluginGroup>& groups) { |
| 262 ListValue* plugins_list = profile->GetPrefs()->GetMutableList( | 267 ListValue* plugins_list = profile->GetPrefs()->GetMutableList( |
| 263 prefs::kPluginsPluginsList); | 268 prefs::kPluginsPluginsList); |
| 264 plugins_list->Clear(); | 269 plugins_list->Clear(); |
| 265 | 270 |
| 266 FilePath internal_dir; | 271 FilePath internal_dir; |
| 267 if (PathService::Get(chrome::DIR_INTERNAL_PLUGINS, &internal_dir)) | 272 if (PathService::Get(chrome::DIR_INTERNAL_PLUGINS, &internal_dir)) |
| 268 profile->GetPrefs()->SetFilePath(prefs::kPluginsLastInternalDirectory, | 273 profile->GetPrefs()->SetFilePath(prefs::kPluginsLastInternalDirectory, |
| 269 internal_dir); | 274 internal_dir); |
| 270 | 275 |
| 271 // Add the plugin files. | 276 // Add the plugin files. |
| 272 for (std::vector<webkit::npapi::WebPluginInfo>::const_iterator it = | 277 for (size_t i = 0; i < plugins.size(); ++i) { |
| 273 plugins.begin(); | 278 DictionaryValue* summary = CreatePluginFileSummary(plugins[i]); |
| 274 it != plugins.end(); | 279 // If the plugin is disabled only by policy don't store this state in the |
| 275 ++it) { | 280 // user pref store. |
| 276 plugins_list->Append(CreatePluginFileSummary(*it)); | 281 if (!webkit::npapi::WebPluginInfoUtils::IsEnabled(plugins[i]) && |
| 282 plugins[i].reason == webkit::npapi::WebPluginInfo::MANAGED) |
| 283 summary->SetBoolean("enabled", true); |
| 284 plugins_list->Append(summary); |
| 277 } | 285 } |
| 278 | 286 |
| 279 // Add the groups as well. | 287 // Add the groups as well. |
| 280 for (size_t i = 0; i < groups.size(); ++i) { | 288 for (size_t i = 0; i < groups.size(); ++i) { |
| 281 plugins_list->Append(groups[i].GetSummary()); | 289 DictionaryValue* summary = groups[i].GetSummary(); |
| 290 // If the plugin is disabled only by policy don't store this state in the |
| 291 // user pref store. |
| 292 if (!groups[i].Enabled() && |
| 293 webkit::npapi::PluginGroup::IsPluginNameDisabledByPolicy( |
| 294 groups[i].GetGroupName())) |
| 295 summary->SetBoolean("enabled", true); |
| 296 plugins_list->Append(summary); |
| 282 } | 297 } |
| 283 } | 298 } |
| 284 | 299 |
| 285 void PluginUpdater::NotifyPluginStatusChanged() { | 300 void PluginUpdater::NotifyPluginStatusChanged() { |
| 286 if (notify_pending_) | 301 if (notify_pending_) |
| 287 return; | 302 return; |
| 288 notify_pending_ = true; | 303 notify_pending_ = true; |
| 289 MessageLoop::current()->PostTask( | 304 MessageLoop::current()->PostTask( |
| 290 FROM_HERE, | 305 FROM_HERE, |
| 291 NewRunnableFunction(&PluginUpdater::OnNotifyPluginStatusChanged)); | 306 NewRunnableFunction(&PluginUpdater::OnNotifyPluginStatusChanged)); |
| 292 } | 307 } |
| 293 | 308 |
| 294 void PluginUpdater::OnNotifyPluginStatusChanged() { | 309 void PluginUpdater::OnNotifyPluginStatusChanged() { |
| 295 GetInstance()->notify_pending_ = false; | 310 GetInstance()->notify_pending_ = false; |
| 296 NotificationService::current()->Notify( | 311 NotificationService::current()->Notify( |
| 297 NotificationType::PLUGIN_ENABLE_STATUS_CHANGED, | 312 NotificationType::PLUGIN_ENABLE_STATUS_CHANGED, |
| 298 Source<PluginUpdater>(GetInstance()), | 313 Source<PluginUpdater>(GetInstance()), |
| 299 NotificationService::NoDetails()); | 314 NotificationService::NoDetails()); |
| 300 } | 315 } |
| 301 | 316 |
| 302 /*static*/ | 317 /*static*/ |
| 303 PluginUpdater* PluginUpdater::GetInstance() { | 318 PluginUpdater* PluginUpdater::GetInstance() { |
| 304 return Singleton<PluginUpdater>::get(); | 319 return Singleton<PluginUpdater>::get(); |
| 305 } | 320 } |
| OLD | NEW |