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/extensions/api/management/management_api.h" | 5 #include "chrome/browser/extensions/api/management/management_api.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | |
| 9 | 10 |
| 10 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
| 11 #include "base/bind.h" | 12 #include "base/bind.h" |
| 12 #include "base/json/json_writer.h" | 13 #include "base/json/json_writer.h" |
| 14 #include "base/memory/linked_ptr.h" | |
| 15 #include "base/memory/scoped_ptr.h" | |
| 13 #include "base/metrics/histogram.h" | 16 #include "base/metrics/histogram.h" |
| 14 #include "base/string_number_conversions.h" | 17 #include "base/string_number_conversions.h" |
| 15 #include "base/string_util.h" | 18 #include "base/string_util.h" |
| 19 #include "base/utf_string_conversions.h" | |
| 16 #include "chrome/browser/extensions/api/management/management_api_constants.h" | 20 #include "chrome/browser/extensions/api/management/management_api_constants.h" |
| 17 #include "chrome/browser/extensions/event_names.h" | 21 #include "chrome/browser/extensions/event_names.h" |
| 18 #include "chrome/browser/extensions/event_router.h" | 22 #include "chrome/browser/extensions/event_router.h" |
| 19 #include "chrome/browser/extensions/extension_service.h" | 23 #include "chrome/browser/extensions/extension_service.h" |
| 20 #include "chrome/browser/extensions/extension_system.h" | 24 #include "chrome/browser/extensions/extension_system.h" |
| 21 #include "chrome/browser/extensions/extension_uninstall_dialog.h" | 25 #include "chrome/browser/extensions/extension_uninstall_dialog.h" |
| 22 #include "chrome/browser/extensions/management_policy.h" | 26 #include "chrome/browser/extensions/management_policy.h" |
| 23 #include "chrome/browser/profiles/profile.h" | 27 #include "chrome/browser/profiles/profile.h" |
| 24 #include "chrome/browser/ui/extensions/application_launch.h" | 28 #include "chrome/browser/ui/extensions/application_launch.h" |
| 25 #include "chrome/browser/ui/webui/extensions/extension_icon_source.h" | 29 #include "chrome/browser/ui/webui/extensions/extension_icon_source.h" |
| 26 #include "chrome/common/chrome_notification_types.h" | 30 #include "chrome/common/chrome_notification_types.h" |
| 27 #include "chrome/common/chrome_utility_messages.h" | 31 #include "chrome/common/chrome_utility_messages.h" |
| 32 #include "chrome/common/extensions/api/management.h" | |
| 28 #include "chrome/common/extensions/extension.h" | 33 #include "chrome/common/extensions/extension.h" |
| 29 #include "chrome/common/extensions/extension_constants.h" | 34 #include "chrome/common/extensions/extension_constants.h" |
| 30 #include "chrome/common/extensions/extension_error_utils.h" | 35 #include "chrome/common/extensions/extension_error_utils.h" |
| 31 #include "chrome/common/extensions/extension_icon_set.h" | 36 #include "chrome/common/extensions/extension_icon_set.h" |
| 32 #include "chrome/common/extensions/permissions/permission_set.h" | 37 #include "chrome/common/extensions/permissions/permission_set.h" |
| 33 #include "chrome/common/extensions/url_pattern.h" | 38 #include "chrome/common/extensions/url_pattern.h" |
| 34 #include "content/public/browser/notification_details.h" | 39 #include "content/public/browser/notification_details.h" |
| 35 #include "content/public/browser/notification_source.h" | 40 #include "content/public/browser/notification_source.h" |
| 36 #include "content/public/browser/utility_process_host.h" | 41 #include "content/public/browser/utility_process_host.h" |
| 37 #include "content/public/browser/utility_process_host_client.h" | 42 #include "content/public/browser/utility_process_host_client.h" |
| 38 | 43 |
| 39 #if !defined(OS_ANDROID) | 44 #if !defined(OS_ANDROID) |
| 40 #include "chrome/browser/ui/webui/ntp/app_launcher_handler.h" | 45 #include "chrome/browser/ui/webui/ntp/app_launcher_handler.h" |
| 41 #endif | 46 #endif |
| 42 | 47 |
| 43 using base::IntToString; | 48 using base::IntToString; |
| 44 using content::BrowserThread; | 49 using content::BrowserThread; |
| 45 using content::UtilityProcessHost; | 50 using content::UtilityProcessHost; |
| 46 using content::UtilityProcessHostClient; | 51 using content::UtilityProcessHostClient; |
| 52 using extensions::api::management::ExtensionInfo; | |
| 53 using extensions::api::management::IconInfo; | |
| 47 using extensions::Extension; | 54 using extensions::Extension; |
| 55 using extensions::ExtensionSystem; | |
| 48 using extensions::PermissionMessages; | 56 using extensions::PermissionMessages; |
| 49 | 57 |
| 58 namespace Get = extensions::api::management::Get; | |
|
Aaron Boodman
2012/08/09 13:17:19
I think it would be more clear to just do:
using
mitchellwrosen
2012/08/09 18:15:41
Do you mean using namespace extensions::api::manag
Aaron Boodman
2012/08/10 06:12:36
I meant:
using extensions::management.
So you'd
mitchellwrosen
2012/08/10 18:10:13
Oh, I gotcha. namespace management = extensions::a
| |
| 59 namespace GetAll = extensions::api::management::GetAll; | |
| 60 namespace GetPermissionWarningsById = | |
| 61 extensions::api::management::GetPermissionWarningsById; | |
| 62 namespace GetPermissionWarningsByManifest = | |
| 63 extensions::api::management::GetPermissionWarningsByManifest; | |
| 64 namespace LaunchApp = extensions::api::management::LaunchApp; | |
| 65 namespace OnDisabled = extensions::api::management::OnDisabled; | |
| 66 namespace OnEnabled = extensions::api::management::OnEnabled; | |
| 67 namespace OnInstalled = extensions::api::management::OnInstalled; | |
| 68 namespace OnUninstalled = extensions::api::management::OnUninstalled; | |
| 69 namespace SetEnabled = extensions::api::management::SetEnabled; | |
| 70 namespace Uninstall = extensions::api::management::Uninstall; | |
| 71 | |
| 50 namespace events = extensions::event_names; | 72 namespace events = extensions::event_names; |
| 51 namespace keys = extension_management_api_constants; | 73 namespace keys = extension_management_api_constants; |
| 52 | 74 |
| 53 namespace { | 75 namespace { |
| 54 | 76 |
| 77 typedef std::vector<linked_ptr<ExtensionInfo> > ExtensionInfoList; | |
|
Aaron Boodman
2012/08/09 13:17:19
ScopedVector<T> is now preferred over std::vector<
mitchellwrosen
2012/08/09 18:15:41
Hm. For now, the JSC uses std::vector<std::linked_
Aaron Boodman
2012/08/10 06:12:36
Ah, makes sense. Nevermind.
| |
| 78 typedef std::vector<linked_ptr<IconInfo> > IconInfoList; | |
| 79 | |
| 55 enum AutoConfirmForTest { | 80 enum AutoConfirmForTest { |
| 56 DO_NOT_SKIP = 0, | 81 DO_NOT_SKIP = 0, |
| 57 PROCEED, | 82 PROCEED, |
| 58 ABORT | 83 ABORT |
| 59 }; | 84 }; |
| 60 | 85 |
| 61 AutoConfirmForTest auto_confirm_for_test = DO_NOT_SKIP; | 86 AutoConfirmForTest auto_confirm_for_test = DO_NOT_SKIP; |
| 62 | 87 |
| 88 void CreateWarningsList(const Extension* extension, | |
|
Aaron Boodman
2012/08/09 13:17:19
You can just return std::vector<std::string>. It's
mitchellwrosen
2012/08/09 18:15:41
Done.
| |
| 89 std::vector<std::string>* warnings_list) { | |
| 90 PermissionMessages warnings = extension->GetPermissionMessages(); | |
| 91 for (PermissionMessages::const_iterator iter = warnings.begin(); | |
| 92 iter != warnings.end(); ++iter) { | |
| 93 warnings_list->push_back(UTF16ToUTF8(iter->message())); | |
| 94 } | |
| 95 } | |
| 96 | |
| 63 } // namespace | 97 } // namespace |
| 64 | 98 |
| 65 ExtensionService* ExtensionManagementFunction::service() { | 99 ExtensionService* ExtensionManagementFunction::service() { |
| 66 return profile()->GetExtensionService(); | 100 return profile()->GetExtensionService(); |
| 67 } | 101 } |
| 68 | 102 |
| 69 ExtensionService* AsyncExtensionManagementFunction::service() { | 103 ExtensionService* AsyncExtensionManagementFunction::service() { |
| 70 return profile()->GetExtensionService(); | 104 return profile()->GetExtensionService(); |
| 71 } | 105 } |
| 72 | 106 |
| 73 static DictionaryValue* CreateExtensionInfo(const Extension& extension, | 107 static scoped_ptr<ExtensionInfo> CreateExtensionInfo( |
|
Aaron Boodman
2012/08/09 13:17:19
Can you move this into the anonymous namespace? We
mitchellwrosen
2012/08/09 18:15:41
Done.
| |
| 74 ExtensionService* service) { | 108 const Extension& extension, |
| 75 DictionaryValue* info = new DictionaryValue(); | 109 ExtensionService* service) { |
| 76 bool enabled = service->IsExtensionEnabled(extension.id()); | 110 scoped_ptr<ExtensionInfo> info(new ExtensionInfo()); |
| 77 extension.GetBasicInfo(enabled, info); | |
| 78 | 111 |
| 79 const extensions::ManagementPolicy* policy = extensions::ExtensionSystem::Get( | 112 info->id = extension.id(); |
| 80 service->profile())->management_policy(); | 113 info->name = extension.name(); |
| 81 info->SetBoolean(keys::kMayDisableKey, | 114 info->enabled = service->IsExtensionEnabled(info->id); |
| 82 policy->UserMayModifySettings(&extension, NULL)); | 115 info->offline_enabled = extension.offline_enabled(); |
| 116 info->version = extension.VersionString(); | |
| 117 info->description = extension.description(); | |
| 118 info->options_url = extension.options_url().possibly_invalid_spec(); | |
|
Aaron Boodman
2012/08/09 13:17:19
I think just spec() will do? Same thing below.
mitchellwrosen
2012/08/09 18:15:41
Done.
| |
| 119 info->homepage_url.reset(new std::string( | |
| 120 extension.GetHomepageURL().possibly_invalid_spec())); | |
| 121 info->may_disable = ExtensionSystem::Get(service->profile())-> | |
|
Aaron Boodman
2012/08/09 13:17:19
Pass ExtensionSystem* instead into this function.
mitchellwrosen
2012/08/09 18:15:41
Done.
| |
| 122 management_policy()->UserMayModifySettings(&extension, NULL); | |
| 123 info->is_app = extension.is_app(); | |
| 83 | 124 |
| 84 info->SetBoolean(keys::kIsAppKey, extension.is_app()); | 125 if (!info->enabled) { |
|
Aaron Boodman
2012/08/09 13:17:19
Flip this check to put the positive branch first.
mitchellwrosen
2012/08/09 18:15:41
Done.
| |
| 85 | |
| 86 if (!enabled) { | |
| 87 extensions::ExtensionPrefs* prefs = service->extension_prefs(); | 126 extensions::ExtensionPrefs* prefs = service->extension_prefs(); |
| 88 bool permissions_escalated = | 127 if (prefs->DidExtensionEscalatePermissions(extension.id())) { |
| 89 prefs->DidExtensionEscalatePermissions(extension.id()); | 128 info->disabled_reason = |
| 90 const char* reason = permissions_escalated ? | 129 ExtensionInfo::DISABLED_REASON_PERMISSIONS_INCREASE; |
| 91 keys::kDisabledReasonPermissionsIncrease : keys::kDisabledReasonUnknown; | 130 } else { |
| 92 info->SetString(keys::kDisabledReasonKey, reason); | 131 info->disabled_reason = ExtensionInfo::DISABLED_REASON_UNKNOWN; |
| 132 } | |
| 133 } else { | |
| 134 info->disabled_reason = ExtensionInfo::DISABLED_REASON_NONE; | |
| 93 } | 135 } |
| 94 | 136 |
| 95 if (!extension.update_url().is_empty()) | 137 if (!extension.update_url().is_empty()) { |
| 96 info->SetString(keys::kUpdateUrlKey, | 138 info->update_url.reset(new std::string( |
| 97 extension.update_url().possibly_invalid_spec()); | 139 extension.update_url().possibly_invalid_spec())); |
| 98 if (extension.is_app()) | 140 } |
| 99 info->SetString(keys::kAppLaunchUrlKey, | 141 |
| 100 extension.GetFullLaunchURL().possibly_invalid_spec()); | 142 if (extension.is_app()) { |
| 143 info->app_launch_url.reset(new std::string( | |
| 144 extension.GetFullLaunchURL().possibly_invalid_spec())); | |
| 145 } | |
| 101 | 146 |
| 102 const ExtensionIconSet::IconMap& icons = extension.icons().map(); | 147 const ExtensionIconSet::IconMap& icons = extension.icons().map(); |
| 103 if (!icons.empty()) { | 148 if (!icons.empty()) { |
| 104 ListValue* icon_list = new ListValue(); | 149 info->icons.reset(new IconInfoList()); |
| 105 std::map<ExtensionIconSet::Icons, std::string>::const_iterator icon_iter; | 150 std::map<ExtensionIconSet::Icons, std::string>::const_iterator icon_iter; |
| 106 for (icon_iter = icons.begin(); icon_iter != icons.end(); ++icon_iter) { | 151 for (icon_iter = icons.begin(); icon_iter != icons.end(); ++icon_iter) { |
| 107 DictionaryValue* icon_info = new DictionaryValue(); | 152 IconInfo* icon_info = new IconInfo(); |
| 108 ExtensionIconSet::Icons size = icon_iter->first; | 153 icon_info->size = icon_iter->first; |
| 109 GURL url = ExtensionIconSource::GetIconURL( | 154 GURL url = ExtensionIconSource::GetIconURL( |
| 110 &extension, size, ExtensionIconSet::MATCH_EXACTLY, false, NULL); | 155 &extension, |
|
Aaron Boodman
2012/08/09 13:17:19
Put multiple arguments on one line, so long as the
mitchellwrosen
2012/08/09 18:15:41
Agh, that's how I did it, but was told by another
Aaron Boodman
2012/08/10 06:12:36
Don't think so: http://google-styleguide.googlecod
| |
| 111 icon_info->SetInteger(keys::kSizeKey, icon_iter->first); | 156 icon_info->size, |
| 112 icon_info->SetString(keys::kUrlKey, url.spec()); | 157 ExtensionIconSet::MATCH_EXACTLY, |
| 113 icon_list->Append(icon_info); | 158 false, |
| 159 NULL); | |
| 160 icon_info->url = url.spec(); | |
| 161 info->icons->push_back(make_linked_ptr<IconInfo>(icon_info)); | |
| 114 } | 162 } |
| 115 info->Set(keys::kIconsKey, icon_list); | |
| 116 } | 163 } |
| 117 | 164 |
| 118 const std::set<std::string> perms = | 165 const std::set<std::string> perms = |
| 119 extension.GetActivePermissions()->GetAPIsAsStrings(); | 166 extension.GetActivePermissions()->GetAPIsAsStrings(); |
| 120 ListValue* permission_list = new ListValue(); | |
| 121 if (!perms.empty()) { | 167 if (!perms.empty()) { |
| 122 std::set<std::string>::const_iterator perms_iter; | 168 std::set<std::string>::const_iterator perms_iter; |
| 123 for (perms_iter = perms.begin(); perms_iter != perms.end(); ++perms_iter) { | 169 for (perms_iter = perms.begin(); perms_iter != perms.end(); ++perms_iter) |
| 124 StringValue* permission_name = new StringValue(*perms_iter); | 170 info->permissions.push_back(*perms_iter); |
| 125 permission_list->Append(permission_name); | |
| 126 } | |
| 127 } | 171 } |
| 128 info->Set(keys::kPermissionsKey, permission_list); | |
| 129 | 172 |
| 130 ListValue* host_permission_list = new ListValue(); | |
| 131 if (!extension.is_hosted_app()) { | 173 if (!extension.is_hosted_app()) { |
| 132 // Skip host permissions for hosted apps. | 174 // Skip host permissions for hosted apps. |
| 133 const URLPatternSet host_perms = | 175 const URLPatternSet host_perms = |
| 134 extension.GetActivePermissions()->explicit_hosts(); | 176 extension.GetActivePermissions()->explicit_hosts(); |
| 135 if (!host_perms.is_empty()) { | 177 if (!host_perms.is_empty()) { |
| 136 URLPatternSet::const_iterator host_perms_iter; | 178 for (URLPatternSet::const_iterator iter = host_perms.begin(); |
| 137 for (host_perms_iter = host_perms.begin(); | 179 iter != host_perms.end(); ++iter) { |
| 138 host_perms_iter != host_perms.end(); | 180 info->host_permissions.push_back(iter->GetAsString()); |
| 139 ++host_perms_iter) { | |
| 140 StringValue* name = new StringValue(host_perms_iter->GetAsString()); | |
| 141 host_permission_list->Append(name); | |
| 142 } | 181 } |
| 143 } | 182 } |
| 144 } | 183 } |
| 145 info->Set(keys::kHostPermissionsKey, host_permission_list); | |
| 146 | 184 |
| 147 std::string install_type = keys::kInstallTypeOther; | |
| 148 switch (extension.location()) { | 185 switch (extension.location()) { |
| 149 case Extension::INTERNAL: | 186 case Extension::INTERNAL: |
| 150 install_type = keys::kInstallTypeNormal; | 187 info->install_type = ExtensionInfo::INSTALL_TYPE_NORMAL; |
| 151 break; | 188 break; |
| 152 case Extension::LOAD: | 189 case Extension::LOAD: |
| 153 install_type = keys::kInstallTypeDevelopment; | 190 info->install_type = ExtensionInfo::INSTALL_TYPE_DEVELOPMENT; |
| 154 break; | 191 break; |
| 155 case Extension::EXTERNAL_PREF: | 192 case Extension::EXTERNAL_PREF: |
| 156 case Extension::EXTERNAL_REGISTRY: | 193 case Extension::EXTERNAL_REGISTRY: |
| 157 case Extension::EXTERNAL_PREF_DOWNLOAD: | 194 case Extension::EXTERNAL_PREF_DOWNLOAD: |
| 158 install_type = keys::kInstallTypeSideload; | 195 info->install_type = ExtensionInfo::INSTALL_TYPE_SIDELOAD; |
| 159 break; | 196 break; |
| 160 case Extension::EXTERNAL_POLICY_DOWNLOAD: | 197 case Extension::EXTERNAL_POLICY_DOWNLOAD: |
| 161 install_type = keys::kInstallTypeAdmin; | 198 info->install_type = ExtensionInfo::INSTALL_TYPE_ADMIN; |
| 162 break; | 199 break; |
| 163 default: | 200 default: |
| 164 install_type = keys::kInstallTypeOther; | 201 info->install_type = ExtensionInfo::INSTALL_TYPE_OTHER; |
| 202 break; | |
| 165 } | 203 } |
| 166 info->SetString(keys::kInstallTypeKey, install_type); | |
| 167 | 204 |
| 168 return info; | 205 return info.Pass(); |
| 169 } | 206 } |
| 170 | 207 |
| 171 static void AddExtensionInfo(ListValue* list, | 208 static void AddExtensionInfo(const ExtensionSet& extensions, |
|
Aaron Boodman
2012/08/09 13:17:19
Same comment as above about anon namespace.
mitchellwrosen
2012/08/09 18:15:41
Done.
| |
| 172 const ExtensionSet& extensions, | 209 ExtensionService* service, |
| 173 ExtensionService* service) { | 210 ExtensionInfoList* extension_list) { |
| 174 for (ExtensionSet::const_iterator i = extensions.begin(); | 211 for (ExtensionSet::const_iterator iter = extensions.begin(); |
| 175 i != extensions.end(); ++i) { | 212 iter != extensions.end(); ++iter) { |
| 176 const Extension& extension = **i; | 213 const Extension& extension = **iter; |
| 177 | 214 |
| 178 if (extension.location() == Extension::COMPONENT) | 215 if (extension.location() == Extension::COMPONENT) |
| 179 continue; // Skip built-in extensions. | 216 continue; // Skip built-in extensions. |
| 180 | 217 |
| 181 list->Append(CreateExtensionInfo(extension, service)); | 218 extension_list->push_back(make_linked_ptr<ExtensionInfo>( |
| 219 CreateExtensionInfo(extension, service).release())); | |
| 182 } | 220 } |
| 183 } | 221 } |
| 184 | 222 |
| 185 bool GetAllExtensionsFunction::RunImpl() { | 223 bool GetAllExtensionsFunction::RunImpl() { |
| 186 ListValue* result = new ListValue(); | 224 ExtensionInfoList extensions; |
| 187 SetResult(result); | |
| 188 | 225 |
| 189 AddExtensionInfo(result, *service()->extensions(), service()); | 226 AddExtensionInfo(*service()->extensions(), service(), &extensions); |
| 190 AddExtensionInfo(result, *service()->disabled_extensions(), service()); | 227 AddExtensionInfo(*service()->disabled_extensions(), service(), &extensions); |
| 191 | 228 |
| 229 results_ = GetAll::Results::Create(extensions); | |
| 192 return true; | 230 return true; |
| 193 } | 231 } |
| 194 | 232 |
| 195 bool GetExtensionByIdFunction::RunImpl() { | 233 bool GetExtensionByIdFunction::RunImpl() { |
| 196 std::string extension_id; | 234 scoped_ptr<Get::Params> params(Get::Params::Create(*args_)); |
| 197 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id)); | 235 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 198 const Extension* extension = service()->GetExtensionById(extension_id, true); | 236 |
| 237 const Extension* extension = service()->GetExtensionById(params->id, true); | |
| 199 if (!extension) { | 238 if (!extension) { |
| 200 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoExtensionError, | 239 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoExtensionError, |
| 201 extension_id); | 240 params->id); |
| 202 return false; | 241 return false; |
| 203 } | 242 } |
| 204 DictionaryValue* result = CreateExtensionInfo(*extension, service()); | 243 |
| 205 SetResult(result); | 244 scoped_ptr<ExtensionInfo> info = CreateExtensionInfo(*extension, service()); |
| 245 results_ = Get::Results::Create(*info); | |
| 206 | 246 |
| 207 return true; | 247 return true; |
| 208 } | 248 } |
| 209 | 249 |
| 210 bool GetPermissionWarningsByIdFunction::RunImpl() { | 250 bool GetPermissionWarningsByIdFunction::RunImpl() { |
| 211 std::string ext_id; | 251 scoped_ptr<GetPermissionWarningsById::Params> params( |
| 212 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &ext_id)); | 252 GetPermissionWarningsById::Params::Create(*args_)); |
| 253 EXTENSION_FUNCTION_VALIDATE(params.get()); | |
| 213 | 254 |
| 214 const Extension* extension = service()->GetExtensionById(ext_id, true); | 255 const Extension* extension = service()->GetExtensionById(params->id, true); |
| 215 if (!extension) { | 256 if (!extension) { |
| 216 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoExtensionError, | 257 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoExtensionError, |
| 217 ext_id); | 258 params->id); |
| 218 return false; | 259 return false; |
| 219 } | 260 } |
| 220 | 261 |
| 221 PermissionMessages warnings = extension->GetPermissionMessages(); | 262 std::vector<std::string> warnings; |
| 222 ListValue* result = new ListValue(); | 263 CreateWarningsList(extension, &warnings); |
| 223 for (PermissionMessages::const_iterator i = warnings.begin(); | 264 results_ = GetPermissionWarningsById::Results::Create(warnings); |
| 224 i < warnings.end(); ++i) | |
| 225 result->Append(Value::CreateStringValue(i->message())); | |
| 226 SetResult(result); | |
| 227 return true; | 265 return true; |
| 228 } | 266 } |
| 229 | 267 |
| 230 namespace { | 268 namespace { |
| 231 | 269 |
| 232 // This class helps GetPermissionWarningsByManifestFunction manage | 270 // This class helps GetPermissionWarningsByManifestFunction manage |
| 233 // sending manifest JSON strings to the utility process for parsing. | 271 // sending manifest JSON strings to the utility process for parsing. |
| 234 class SafeManifestJSONParser : public UtilityProcessHostClient { | 272 class SafeManifestJSONParser : public UtilityProcessHostClient { |
| 235 public: | 273 public: |
| 236 SafeManifestJSONParser(GetPermissionWarningsByManifestFunction* client, | 274 SafeManifestJSONParser(GetPermissionWarningsByManifestFunction* client, |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 310 | 348 |
| 311 // Results of parsing. | 349 // Results of parsing. |
| 312 scoped_ptr<DictionaryValue> parsed_manifest_; | 350 scoped_ptr<DictionaryValue> parsed_manifest_; |
| 313 | 351 |
| 314 std::string error_; | 352 std::string error_; |
| 315 }; | 353 }; |
| 316 | 354 |
| 317 } // namespace | 355 } // namespace |
| 318 | 356 |
| 319 bool GetPermissionWarningsByManifestFunction::RunImpl() { | 357 bool GetPermissionWarningsByManifestFunction::RunImpl() { |
| 320 std::string manifest_str; | 358 scoped_ptr<GetPermissionWarningsByManifest::Params> params( |
| 321 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &manifest_str)); | 359 GetPermissionWarningsByManifest::Params::Create(*args_)); |
| 360 EXTENSION_FUNCTION_VALIDATE(params.get()); | |
| 322 | 361 |
| 323 scoped_refptr<SafeManifestJSONParser> parser = | 362 scoped_refptr<SafeManifestJSONParser> parser = |
| 324 new SafeManifestJSONParser(this, manifest_str); | 363 new SafeManifestJSONParser(this, params->manifest_str); |
| 325 parser->Start(); | 364 parser->Start(); |
| 326 | 365 |
| 327 // Matched with a Release() in OnParseSuccess/Failure(). | 366 // Matched with a Release() in OnParseSuccess/Failure(). |
| 328 AddRef(); | 367 AddRef(); |
| 329 | 368 |
| 330 // Response is sent async in OnParseSuccess/Failure(). | 369 // Response is sent async in OnParseSuccess/Failure(). |
| 331 return true; | 370 return true; |
| 332 } | 371 } |
| 333 | 372 |
| 334 void GetPermissionWarningsByManifestFunction::OnParseSuccess( | 373 void GetPermissionWarningsByManifestFunction::OnParseSuccess( |
| 335 DictionaryValue* parsed_manifest) { | 374 DictionaryValue* parsed_manifest) { |
| 336 CHECK(parsed_manifest); | 375 CHECK(parsed_manifest); |
| 337 | 376 |
| 338 scoped_refptr<Extension> extension = Extension::Create( | 377 scoped_refptr<Extension> extension = Extension::Create( |
| 339 FilePath(), Extension::INVALID, *parsed_manifest, Extension::NO_FLAGS, | 378 FilePath(), Extension::INVALID, *parsed_manifest, Extension::NO_FLAGS, |
| 340 &error_); | 379 &error_); |
| 341 if (!extension.get()) { | 380 if (!extension.get()) { |
| 342 OnParseFailure(keys::kExtensionCreateError); | 381 OnParseFailure(keys::kExtensionCreateError); |
| 343 return; | 382 return; |
| 344 } | 383 } |
| 345 | 384 |
| 346 PermissionMessages warnings = extension->GetPermissionMessages(); | 385 std::vector<std::string> warnings; |
| 347 ListValue* result = new ListValue(); | 386 CreateWarningsList(extension, &warnings); |
| 348 for (PermissionMessages::const_iterator i = warnings.begin(); | 387 results_ = GetPermissionWarningsByManifest::Results::Create(warnings); |
| 349 i < warnings.end(); ++i) | |
| 350 result->Append(Value::CreateStringValue(i->message())); | |
| 351 SetResult(result); | |
| 352 SendResponse(true); | 388 SendResponse(true); |
| 353 | 389 |
| 354 // Matched with AddRef() in RunImpl(). | 390 // Matched with AddRef() in RunImpl(). |
| 355 Release(); | 391 Release(); |
| 356 } | 392 } |
| 357 | 393 |
| 358 void GetPermissionWarningsByManifestFunction::OnParseFailure( | 394 void GetPermissionWarningsByManifestFunction::OnParseFailure( |
| 359 const std::string& error) { | 395 const std::string& error) { |
| 360 error_ = error; | 396 error_ = error; |
| 361 SendResponse(false); | 397 SendResponse(false); |
| 362 | 398 |
| 363 // Matched with AddRef() in RunImpl(). | 399 // Matched with AddRef() in RunImpl(). |
| 364 Release(); | 400 Release(); |
| 365 } | 401 } |
| 366 | 402 |
| 367 bool LaunchAppFunction::RunImpl() { | 403 bool LaunchAppFunction::RunImpl() { |
| 368 std::string extension_id; | 404 scoped_ptr<LaunchApp::Params> params(LaunchApp::Params::Create(*args_)); |
| 369 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id)); | 405 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 370 const Extension* extension = service()->GetExtensionById(extension_id, true); | 406 const Extension* extension = service()->GetExtensionById(params->id, true); |
| 371 if (!extension) { | 407 if (!extension) { |
| 372 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoExtensionError, | 408 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoExtensionError, |
| 373 extension_id); | 409 params->id); |
| 374 return false; | 410 return false; |
| 375 } | 411 } |
| 376 if (!extension->is_app()) { | 412 if (!extension->is_app()) { |
| 377 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNotAnAppError, | 413 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNotAnAppError, |
| 378 extension_id); | 414 params->id); |
| 379 return false; | 415 return false; |
| 380 } | 416 } |
| 381 | 417 |
| 382 // Look at prefs to find the right launch container. | 418 // Look at prefs to find the right launch container. |
| 383 // |default_pref_value| is set to LAUNCH_REGULAR so that if | 419 // |default_pref_value| is set to LAUNCH_REGULAR so that if |
| 384 // the user has not set a preference, we open the app in a tab. | 420 // the user has not set a preference, we open the app in a tab. |
| 385 extension_misc::LaunchContainer launch_container = | 421 extension_misc::LaunchContainer launch_container = |
| 386 service()->extension_prefs()->GetLaunchContainer( | 422 service()->extension_prefs()->GetLaunchContainer( |
| 387 extension, extensions::ExtensionPrefs::LAUNCH_DEFAULT); | 423 extension, extensions::ExtensionPrefs::LAUNCH_DEFAULT); |
| 388 application_launch::OpenApplication(application_launch::LaunchParams( | 424 application_launch::OpenApplication(application_launch::LaunchParams( |
| 389 profile(), extension, launch_container, NEW_FOREGROUND_TAB)); | 425 profile(), extension, launch_container, NEW_FOREGROUND_TAB)); |
| 390 #if !defined(OS_ANDROID) | 426 #if !defined(OS_ANDROID) |
| 391 AppLauncherHandler::RecordAppLaunchType( | 427 AppLauncherHandler::RecordAppLaunchType( |
| 392 extension_misc::APP_LAUNCH_EXTENSION_API); | 428 extension_misc::APP_LAUNCH_EXTENSION_API); |
| 393 #endif | 429 #endif |
| 394 | 430 |
| 395 return true; | 431 return true; |
| 396 } | 432 } |
| 397 | 433 |
| 398 SetEnabledFunction::SetEnabledFunction() { | 434 SetEnabledFunction::SetEnabledFunction() { |
| 399 } | 435 } |
| 400 | 436 |
| 401 SetEnabledFunction::~SetEnabledFunction() { | 437 SetEnabledFunction::~SetEnabledFunction() { |
| 402 } | 438 } |
| 403 | 439 |
| 404 bool SetEnabledFunction::RunImpl() { | 440 bool SetEnabledFunction::RunImpl() { |
| 405 bool enable; | 441 scoped_ptr<SetEnabled::Params> params(SetEnabled::Params::Create(*args_)); |
| 406 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id_)); | 442 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 407 EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(1, &enable)); | 443 |
| 444 extension_id_ = params->id; | |
| 408 | 445 |
| 409 const Extension* extension = service()->GetExtensionById(extension_id_, true); | 446 const Extension* extension = service()->GetExtensionById(extension_id_, true); |
| 410 if (!extension) { | 447 if (!extension) { |
| 411 error_ = ExtensionErrorUtils::FormatErrorMessage( | 448 error_ = ExtensionErrorUtils::FormatErrorMessage( |
| 412 keys::kNoExtensionError, extension_id_); | 449 keys::kNoExtensionError, extension_id_); |
| 413 return false; | 450 return false; |
| 414 } | 451 } |
| 415 | 452 |
| 416 const extensions::ManagementPolicy* policy = extensions::ExtensionSystem::Get( | 453 const extensions::ManagementPolicy* policy = extensions::ExtensionSystem::Get( |
| 417 profile())->management_policy(); | 454 profile())->management_policy(); |
| 418 if (!policy->UserMayModifySettings(extension, NULL)) { | 455 if (!policy->UserMayModifySettings(extension, NULL)) { |
| 419 error_ = ExtensionErrorUtils::FormatErrorMessage( | 456 error_ = ExtensionErrorUtils::FormatErrorMessage( |
| 420 keys::kUserCantModifyError, extension_id_); | 457 keys::kUserCantModifyError, extension_id_); |
| 421 return false; | 458 return false; |
| 422 } | 459 } |
| 423 | 460 |
| 424 bool currently_enabled = service()->IsExtensionEnabled(extension_id_); | 461 bool currently_enabled = service()->IsExtensionEnabled(extension_id_); |
| 425 | 462 |
| 426 if (!currently_enabled && enable) { | 463 if (!currently_enabled && params->enabled) { |
| 427 extensions::ExtensionPrefs* prefs = service()->extension_prefs(); | 464 extensions::ExtensionPrefs* prefs = service()->extension_prefs(); |
| 428 if (prefs->DidExtensionEscalatePermissions(extension_id_)) { | 465 if (prefs->DidExtensionEscalatePermissions(extension_id_)) { |
| 429 if (!user_gesture()) { | 466 if (!user_gesture()) { |
| 430 error_ = keys::kGestureNeededForEscalationError; | 467 error_ = keys::kGestureNeededForEscalationError; |
| 431 return false; | 468 return false; |
| 432 } | 469 } |
| 433 AddRef(); // Matched in InstallUIProceed/InstallUIAbort | 470 AddRef(); // Matched in InstallUIProceed/InstallUIAbort |
| 434 install_prompt_.reset( | 471 install_prompt_.reset( |
| 435 chrome::CreateExtensionInstallPromptWithBrowser(GetCurrentBrowser())); | 472 chrome::CreateExtensionInstallPromptWithBrowser(GetCurrentBrowser())); |
| 436 install_prompt_->ConfirmReEnable(this, extension); | 473 install_prompt_->ConfirmReEnable(this, extension); |
| 437 return true; | 474 return true; |
| 438 } | 475 } |
| 439 service()->EnableExtension(extension_id_); | 476 service()->EnableExtension(extension_id_); |
| 440 } else if (currently_enabled && !enable) { | 477 } else if (currently_enabled && !params->enabled) { |
| 441 service()->DisableExtension(extension_id_, Extension::DISABLE_USER_ACTION); | 478 service()->DisableExtension(extension_id_, Extension::DISABLE_USER_ACTION); |
| 442 } | 479 } |
| 443 | 480 |
| 444 BrowserThread::PostTask( | 481 BrowserThread::PostTask( |
| 445 BrowserThread::UI, | 482 BrowserThread::UI, |
| 446 FROM_HERE, | 483 FROM_HERE, |
| 447 base::Bind(&SetEnabledFunction::SendResponse, this, true)); | 484 base::Bind(&SetEnabledFunction::SendResponse, this, true)); |
| 448 | 485 |
| 449 return true; | 486 return true; |
| 450 } | 487 } |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 461 Release(); | 498 Release(); |
| 462 } | 499 } |
| 463 | 500 |
| 464 UninstallFunction::UninstallFunction() { | 501 UninstallFunction::UninstallFunction() { |
| 465 } | 502 } |
| 466 | 503 |
| 467 UninstallFunction::~UninstallFunction() { | 504 UninstallFunction::~UninstallFunction() { |
| 468 } | 505 } |
| 469 | 506 |
| 470 bool UninstallFunction::RunImpl() { | 507 bool UninstallFunction::RunImpl() { |
| 508 scoped_ptr<Uninstall::Params> params(Uninstall::Params::Create(*args_)); | |
| 509 EXTENSION_FUNCTION_VALIDATE(params.get()); | |
| 510 | |
| 511 extension_id_ = params->id; | |
| 512 | |
| 471 bool show_confirm_dialog = false; | 513 bool show_confirm_dialog = false; |
| 472 | 514 if (params->options.get() && params->options->show_confirm_dialog.get()) |
| 473 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id_)); | 515 show_confirm_dialog = *params->options->show_confirm_dialog; |
| 474 | |
| 475 if (HasOptionalArgument(1)) { | |
| 476 DictionaryValue* options = NULL; | |
| 477 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &options)); | |
| 478 | |
| 479 if (options->HasKey(keys::kShowConfirmDialogKey)) { | |
| 480 EXTENSION_FUNCTION_VALIDATE(options->GetBoolean( | |
| 481 keys::kShowConfirmDialogKey, &show_confirm_dialog)); | |
| 482 } | |
| 483 } | |
| 484 | 516 |
| 485 const Extension* extension = service()->GetExtensionById(extension_id_, true); | 517 const Extension* extension = service()->GetExtensionById(extension_id_, true); |
| 486 if (!extension) { | 518 if (!extension) { |
| 487 error_ = ExtensionErrorUtils::FormatErrorMessage( | 519 error_ = ExtensionErrorUtils::FormatErrorMessage( |
| 488 keys::kNoExtensionError, extension_id_); | 520 keys::kNoExtensionError, extension_id_); |
| 489 return false; | 521 return false; |
| 490 } | 522 } |
| 491 | 523 |
| 492 if (!extensions::ExtensionSystem::Get( | 524 if (!extensions::ExtensionSystem::Get( |
| 493 profile())->management_policy()->UserMayModifySettings(extension, NULL)) { | 525 profile())->management_policy()->UserMayModifySettings(extension, NULL)) { |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 585 event_name = events::kOnExtensionEnabled; | 617 event_name = events::kOnExtensionEnabled; |
| 586 break; | 618 break; |
| 587 case chrome::NOTIFICATION_EXTENSION_UNLOADED: | 619 case chrome::NOTIFICATION_EXTENSION_UNLOADED: |
| 588 event_name = events::kOnExtensionDisabled; | 620 event_name = events::kOnExtensionDisabled; |
| 589 break; | 621 break; |
| 590 default: | 622 default: |
| 591 NOTREACHED(); | 623 NOTREACHED(); |
| 592 return; | 624 return; |
| 593 } | 625 } |
| 594 | 626 |
| 595 ListValue args; | 627 std::string json = ""; |
|
Aaron Boodman
2012/08/09 13:17:19
No need to initialize non-primitives.
mitchellwrosen
2012/08/09 18:15:41
Done.
| |
| 596 if (event_name == events::kOnExtensionUninstalled) { | 628 if (event_name == events::kOnExtensionUninstalled) { |
| 597 args.Append(Value::CreateStringValue( | 629 json = OnUninstalled::ToJson( |
| 598 content::Details<const extensions::Extension>(details).ptr()->id())); | 630 content::Details<const Extension>(details).ptr()->id()); |
| 599 } else { | 631 } else { |
| 600 const Extension* extension = NULL; | 632 const Extension* extension = NULL; |
| 601 if (event_name == events::kOnExtensionDisabled) { | 633 if (event_name == events::kOnExtensionDisabled) { |
| 602 extension = content::Details<extensions::UnloadedExtensionInfo>( | 634 extension = content::Details<extensions::UnloadedExtensionInfo>( |
| 603 details)->extension; | 635 details)->extension; |
| 604 } else { | 636 } else { |
| 605 extension = content::Details<const Extension>(details).ptr(); | 637 extension = content::Details<const Extension>(details).ptr(); |
| 606 } | 638 } |
| 607 CHECK(extension); | 639 CHECK(extension); |
| 608 ExtensionService* service = profile->GetExtensionService(); | 640 ExtensionService* service = profile->GetExtensionService(); |
| 609 args.Append(CreateExtensionInfo(*extension, service)); | 641 scoped_ptr<ExtensionInfo> info = CreateExtensionInfo(*extension, service); |
| 642 // OnInstalled::ToJson, OnEnabled::ToJson, and OnDisabled::ToJson are all | |
|
Aaron Boodman
2012/08/09 13:17:19
This is brittle - if one of these changed to be no
mitchellwrosen
2012/08/09 18:15:41
Good point. Done.
| |
| 643 // extensionally and intensionally equal, so pick one. | |
| 644 json = OnInstalled::ToJson(*info); | |
| 610 } | 645 } |
| 611 | 646 |
| 612 std::string args_json; | |
| 613 base::JSONWriter::Write(&args, &args_json); | |
| 614 | |
| 615 profile->GetExtensionEventRouter()->DispatchEventToRenderers( | 647 profile->GetExtensionEventRouter()->DispatchEventToRenderers( |
| 616 event_name, args_json, NULL, GURL(), extensions::EventFilteringInfo()); | 648 event_name, json, NULL, GURL(), extensions::EventFilteringInfo()); |
| 617 } | 649 } |
| OLD | NEW |