| Index: chrome/browser/extensions/extension_content_settings_api.cc | 
| diff --git a/chrome/browser/extensions/extension_content_settings_api.cc b/chrome/browser/extensions/extension_content_settings_api.cc | 
| index 0013b20241cb0600d18de44678bd61da90a56c06..6e531cacbf8f35de3235e0d7245f17d3fe7995f4 100644 | 
| --- a/chrome/browser/extensions/extension_content_settings_api.cc | 
| +++ b/chrome/browser/extensions/extension_content_settings_api.cc | 
| @@ -4,6 +4,10 @@ | 
|  | 
| #include "chrome/browser/extensions/extension_content_settings_api.h" | 
|  | 
| +#include <vector> | 
| + | 
| +#include "base/bind.h" | 
| +#include "base/command_line.h" | 
| #include "base/values.h" | 
| #include "chrome/browser/content_settings/host_content_settings_map.h" | 
| #include "chrome/browser/extensions/extension_content_settings_api_constants.h" | 
| @@ -13,13 +17,22 @@ | 
| #include "chrome/browser/extensions/extension_preference_helpers.h" | 
| #include "chrome/browser/extensions/extension_service.h" | 
| #include "chrome/browser/profiles/profile.h" | 
| +#include "chrome/common/chrome_switches.h" | 
| #include "chrome/common/extensions/extension_error_utils.h" | 
| +#include "webkit/plugins/npapi/plugin_group.h" | 
| +#include "webkit/plugins/npapi/plugin_list.h" | 
|  | 
| namespace helpers = extension_content_settings_helpers; | 
| namespace keys = extension_content_settings_api_constants; | 
| namespace pref_helpers = extension_preference_helpers; | 
| namespace pref_keys = extension_preference_api_constants; | 
|  | 
| +namespace { | 
| + | 
| +webkit::npapi::PluginList* g_plugin_list = NULL; | 
| + | 
| +}  // namespace | 
| + | 
| bool ClearContentSettingsFunction::RunImpl() { | 
| std::string content_type_str; | 
| EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &content_type_str)); | 
| @@ -241,3 +254,54 @@ bool SetContentSettingFunction::RunImpl() { | 
| resource_identifier, setting, scope); | 
| return true; | 
| } | 
| + | 
| +bool GetResourceIdentifiersFunction::RunImpl() { | 
| +  std::string content_type_str; | 
| +  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &content_type_str)); | 
| +  ContentSettingsType content_type = | 
| +      helpers::StringToContentSettingsType(content_type_str); | 
| +  EXTENSION_FUNCTION_VALIDATE(content_type != CONTENT_SETTINGS_TYPE_DEFAULT); | 
| + | 
| +  if (content_type == CONTENT_SETTINGS_TYPE_PLUGINS && | 
| +      CommandLine::ForCurrentProcess()->HasSwitch( | 
| +          switches::kEnableResourceContentSettings)) { | 
| +    BrowserThread::PostTask( | 
| +        BrowserThread::FILE, FROM_HERE, | 
| +        base::Bind(&GetResourceIdentifiersFunction::GetPluginsOnFileThread, | 
| +                   this)); | 
| +  } else { | 
| +    SendResponse(true); | 
| +  } | 
| + | 
| +  return true; | 
| +} | 
| + | 
| +void GetResourceIdentifiersFunction::GetPluginsOnFileThread() { | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 
| +  webkit::npapi::PluginList* plugin_list = g_plugin_list; | 
| +  if (!plugin_list) { | 
| +    plugin_list = webkit::npapi::PluginList::Singleton(); | 
| +  } | 
| + | 
| +  std::vector<webkit::npapi::PluginGroup> groups; | 
| +  plugin_list->GetPluginGroups(true, &groups); | 
| + | 
| +  ListValue* list = new ListValue(); | 
| +  for (std::vector<webkit::npapi::PluginGroup>::iterator it = groups.begin(); | 
| +       it != groups.end(); ++it) { | 
| +    DictionaryValue* dict = new DictionaryValue(); | 
| +    dict->SetString(keys::kIdKey, it->identifier()); | 
| +    dict->SetString(keys::kDescriptionKey, it->GetGroupName()); | 
| +    list->Append(dict); | 
| +  } | 
| +  result_.reset(list); | 
| +  BrowserThread::PostTask( | 
| +      BrowserThread::UI, FROM_HERE, base::Bind( | 
| +          &GetResourceIdentifiersFunction::SendResponse, this, true)); | 
| +} | 
| + | 
| +// static | 
| +void GetResourceIdentifiersFunction::SetPluginList( | 
| +    webkit::npapi::PluginList* plugin_list) { | 
| +  g_plugin_list = plugin_list; | 
| +} | 
|  |