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

Side by Side Diff: chrome/browser/extensions/api/management/management_api.cc

Issue 10834160: Use JSON schema compiler in chrome.management code (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years, 4 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/common/extensions/api/api.gyp » ('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/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;
47 using extensions::Extension; 52 using extensions::Extension;
53 using extensions::ExtensionSystem;
48 using extensions::PermissionMessages; 54 using extensions::PermissionMessages;
49 55
50 namespace events = extensions::event_names; 56 namespace events = extensions::event_names;
51 namespace keys = extension_management_api_constants; 57 namespace keys = extension_management_api_constants;
58 namespace management = extensions::api::management;
52 59
53 namespace { 60 namespace {
54 61
62 typedef std::vector<linked_ptr<management::ExtensionInfo> > ExtensionInfoList;
63 typedef std::vector<linked_ptr<management::IconInfo> > IconInfoList;
64
55 enum AutoConfirmForTest { 65 enum AutoConfirmForTest {
56 DO_NOT_SKIP = 0, 66 DO_NOT_SKIP = 0,
57 PROCEED, 67 PROCEED,
58 ABORT 68 ABORT
59 }; 69 };
60 70
61 AutoConfirmForTest auto_confirm_for_test = DO_NOT_SKIP; 71 AutoConfirmForTest auto_confirm_for_test = DO_NOT_SKIP;
62 72
73 std::vector<std::string> CreateWarningsList(const Extension* extension) {
74 std::vector<std::string> warnings_list;
75 PermissionMessages warnings = extension->GetPermissionMessages();
76 for (PermissionMessages::const_iterator iter = warnings.begin();
77 iter != warnings.end(); ++iter) {
78 warnings_list.push_back(UTF16ToUTF8(iter->message()));
79 }
80
81 return warnings_list;
82 }
83
84 scoped_ptr<management::ExtensionInfo> CreateExtensionInfo(
85 const Extension& extension,
86 ExtensionSystem* system) {
87 scoped_ptr<management::ExtensionInfo> info(new management::ExtensionInfo());
88 ExtensionService* service = system->extension_service();
89
90 info->id = extension.id();
91 info->name = extension.name();
92 info->enabled = service->IsExtensionEnabled(info->id);
93 info->offline_enabled = extension.offline_enabled();
94 info->version = extension.VersionString();
95 info->description = extension.description();
96 info->options_url = extension.options_url().spec();
97 info->homepage_url.reset(new std::string(
98 extension.GetHomepageURL().spec()));
99 info->may_disable = system->management_policy()->
100 UserMayModifySettings(&extension, NULL);
101 info->is_app = extension.is_app();
102
103 if (info->enabled) {
104 info->disabled_reason = management::ExtensionInfo::DISABLED_REASON_NONE;
105 } else {
106 extensions::ExtensionPrefs* prefs = service->extension_prefs();
107 if (prefs->DidExtensionEscalatePermissions(extension.id())) {
108 info->disabled_reason =
109 management::ExtensionInfo::DISABLED_REASON_PERMISSIONS_INCREASE;
110 } else {
111 info->disabled_reason =
112 management::ExtensionInfo::DISABLED_REASON_UNKNOWN;
113 }
114 }
115
116 if (!extension.update_url().is_empty()) {
117 info->update_url.reset(new std::string(
118 extension.update_url().spec()));
119 }
120
121 if (extension.is_app()) {
122 info->app_launch_url.reset(new std::string(
123 extension.GetFullLaunchURL().spec()));
124 }
125
126 const ExtensionIconSet::IconMap& icons = extension.icons().map();
127 if (!icons.empty()) {
128 info->icons.reset(new IconInfoList());
129 std::map<ExtensionIconSet::Icons, std::string>::const_iterator icon_iter;
130 for (icon_iter = icons.begin(); icon_iter != icons.end(); ++icon_iter) {
131 management::IconInfo* icon_info = new management::IconInfo();
132 icon_info->size = icon_iter->first;
133 GURL url = ExtensionIconSource::GetIconURL(
134 &extension, icon_info->size, ExtensionIconSet::MATCH_EXACTLY, false,
135 NULL);
136 icon_info->url = url.spec();
137 info->icons->push_back(make_linked_ptr<management::IconInfo>(icon_info));
138 }
139 }
140
141 const std::set<std::string> perms =
142 extension.GetActivePermissions()->GetAPIsAsStrings();
143 if (!perms.empty()) {
144 std::set<std::string>::const_iterator perms_iter;
145 for (perms_iter = perms.begin(); perms_iter != perms.end(); ++perms_iter)
146 info->permissions.push_back(*perms_iter);
147 }
148
149 if (!extension.is_hosted_app()) {
150 // Skip host permissions for hosted apps.
151 const URLPatternSet host_perms =
152 extension.GetActivePermissions()->explicit_hosts();
153 if (!host_perms.is_empty()) {
154 for (URLPatternSet::const_iterator iter = host_perms.begin();
155 iter != host_perms.end(); ++iter) {
156 info->host_permissions.push_back(iter->GetAsString());
157 }
158 }
159 }
160
161 switch (extension.location()) {
162 case Extension::INTERNAL:
163 info->install_type = management::ExtensionInfo::INSTALL_TYPE_NORMAL;
164 break;
165 case Extension::LOAD:
166 info->install_type = management::ExtensionInfo::INSTALL_TYPE_DEVELOPMENT;
167 break;
168 case Extension::EXTERNAL_PREF:
169 case Extension::EXTERNAL_REGISTRY:
170 case Extension::EXTERNAL_PREF_DOWNLOAD:
171 info->install_type = management::ExtensionInfo::INSTALL_TYPE_SIDELOAD;
172 break;
173 case Extension::EXTERNAL_POLICY_DOWNLOAD:
174 info->install_type = management::ExtensionInfo::INSTALL_TYPE_ADMIN;
175 break;
176 default:
177 info->install_type = management::ExtensionInfo::INSTALL_TYPE_OTHER;
178 break;
179 }
180
181 return info.Pass();
182 }
183
184 void AddExtensionInfo(const ExtensionSet& extensions,
185 ExtensionSystem* system,
186 ExtensionInfoList* extension_list) {
187 for (ExtensionSet::const_iterator iter = extensions.begin();
188 iter != extensions.end(); ++iter) {
189 const Extension& extension = **iter;
190
191 if (extension.location() == Extension::COMPONENT)
192 continue; // Skip built-in extensions.
193
194 extension_list->push_back(make_linked_ptr<management::ExtensionInfo>(
195 CreateExtensionInfo(extension, system).release()));
196 }
197 }
198
63 } // namespace 199 } // namespace
64 200
65 ExtensionService* ExtensionManagementFunction::service() { 201 ExtensionService* ExtensionManagementFunction::service() {
66 return profile()->GetExtensionService(); 202 return profile()->GetExtensionService();
67 } 203 }
68 204
69 ExtensionService* AsyncExtensionManagementFunction::service() { 205 ExtensionService* AsyncExtensionManagementFunction::service() {
70 return profile()->GetExtensionService(); 206 return profile()->GetExtensionService();
71 } 207 }
72 208
73 static DictionaryValue* CreateExtensionInfo(const Extension& extension, 209 bool GetAllExtensionsFunction::RunImpl() {
74 ExtensionService* service) { 210 ExtensionInfoList extensions;
75 DictionaryValue* info = new DictionaryValue(); 211 ExtensionSystem* system = ExtensionSystem::Get(profile());
76 bool enabled = service->IsExtensionEnabled(extension.id());
77 extension.GetBasicInfo(enabled, info);
78 212
79 const extensions::ManagementPolicy* policy = extensions::ExtensionSystem::Get( 213 AddExtensionInfo(*service()->extensions(), system, &extensions);
80 service->profile())->management_policy(); 214 AddExtensionInfo(*service()->disabled_extensions(), system, &extensions);
81 info->SetBoolean(keys::kMayDisableKey,
82 policy->UserMayModifySettings(&extension, NULL));
83 215
84 info->SetBoolean(keys::kIsAppKey, extension.is_app()); 216 results_ = management::GetAll::Results::Create(extensions);
85
86 if (!enabled) {
87 extensions::ExtensionPrefs* prefs = service->extension_prefs();
88 bool permissions_escalated =
89 prefs->DidExtensionEscalatePermissions(extension.id());
90 const char* reason = permissions_escalated ?
91 keys::kDisabledReasonPermissionsIncrease : keys::kDisabledReasonUnknown;
92 info->SetString(keys::kDisabledReasonKey, reason);
93 }
94
95 if (!extension.update_url().is_empty())
96 info->SetString(keys::kUpdateUrlKey,
97 extension.update_url().possibly_invalid_spec());
98 if (extension.is_app())
99 info->SetString(keys::kAppLaunchUrlKey,
100 extension.GetFullLaunchURL().possibly_invalid_spec());
101
102 const ExtensionIconSet::IconMap& icons = extension.icons().map();
103 if (!icons.empty()) {
104 ListValue* icon_list = new ListValue();
105 std::map<ExtensionIconSet::Icons, std::string>::const_iterator icon_iter;
106 for (icon_iter = icons.begin(); icon_iter != icons.end(); ++icon_iter) {
107 DictionaryValue* icon_info = new DictionaryValue();
108 ExtensionIconSet::Icons size = icon_iter->first;
109 GURL url = ExtensionIconSource::GetIconURL(
110 &extension, size, ExtensionIconSet::MATCH_EXACTLY, false, NULL);
111 icon_info->SetInteger(keys::kSizeKey, icon_iter->first);
112 icon_info->SetString(keys::kUrlKey, url.spec());
113 icon_list->Append(icon_info);
114 }
115 info->Set(keys::kIconsKey, icon_list);
116 }
117
118 const std::set<std::string> perms =
119 extension.GetActivePermissions()->GetAPIsAsStrings();
120 ListValue* permission_list = new ListValue();
121 if (!perms.empty()) {
122 std::set<std::string>::const_iterator perms_iter;
123 for (perms_iter = perms.begin(); perms_iter != perms.end(); ++perms_iter) {
124 StringValue* permission_name = new StringValue(*perms_iter);
125 permission_list->Append(permission_name);
126 }
127 }
128 info->Set(keys::kPermissionsKey, permission_list);
129
130 ListValue* host_permission_list = new ListValue();
131 if (!extension.is_hosted_app()) {
132 // Skip host permissions for hosted apps.
133 const URLPatternSet host_perms =
134 extension.GetActivePermissions()->explicit_hosts();
135 if (!host_perms.is_empty()) {
136 URLPatternSet::const_iterator host_perms_iter;
137 for (host_perms_iter = host_perms.begin();
138 host_perms_iter != host_perms.end();
139 ++host_perms_iter) {
140 StringValue* name = new StringValue(host_perms_iter->GetAsString());
141 host_permission_list->Append(name);
142 }
143 }
144 }
145 info->Set(keys::kHostPermissionsKey, host_permission_list);
146
147 std::string install_type = keys::kInstallTypeOther;
148 switch (extension.location()) {
149 case Extension::INTERNAL:
150 install_type = keys::kInstallTypeNormal;
151 break;
152 case Extension::LOAD:
153 install_type = keys::kInstallTypeDevelopment;
154 break;
155 case Extension::EXTERNAL_PREF:
156 case Extension::EXTERNAL_REGISTRY:
157 case Extension::EXTERNAL_PREF_DOWNLOAD:
158 install_type = keys::kInstallTypeSideload;
159 break;
160 case Extension::EXTERNAL_POLICY_DOWNLOAD:
161 install_type = keys::kInstallTypeAdmin;
162 break;
163 default:
164 install_type = keys::kInstallTypeOther;
165 }
166 info->SetString(keys::kInstallTypeKey, install_type);
167
168 return info;
169 }
170
171 static void AddExtensionInfo(ListValue* list,
172 const ExtensionSet& extensions,
173 ExtensionService* service) {
174 for (ExtensionSet::const_iterator i = extensions.begin();
175 i != extensions.end(); ++i) {
176 const Extension& extension = **i;
177
178 if (extension.location() == Extension::COMPONENT)
179 continue; // Skip built-in extensions.
180
181 list->Append(CreateExtensionInfo(extension, service));
182 }
183 }
184
185 bool GetAllExtensionsFunction::RunImpl() {
186 ListValue* result = new ListValue();
187 SetResult(result);
188
189 AddExtensionInfo(result, *service()->extensions(), service());
190 AddExtensionInfo(result, *service()->disabled_extensions(), service());
191
192 return true; 217 return true;
193 } 218 }
194 219
195 bool GetExtensionByIdFunction::RunImpl() { 220 bool GetExtensionByIdFunction::RunImpl() {
196 std::string extension_id; 221 scoped_ptr<management::Get::Params> params(
197 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id)); 222 management::Get::Params::Create(*args_));
198 const Extension* extension = service()->GetExtensionById(extension_id, true); 223 EXTENSION_FUNCTION_VALIDATE(params.get());
224
225 const Extension* extension = service()->GetExtensionById(params->id, true);
199 if (!extension) { 226 if (!extension) {
200 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoExtensionError, 227 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoExtensionError,
201 extension_id); 228 params->id);
202 return false; 229 return false;
203 } 230 }
204 DictionaryValue* result = CreateExtensionInfo(*extension, service()); 231
205 SetResult(result); 232 scoped_ptr<management::ExtensionInfo> info = CreateExtensionInfo(
233 *extension, ExtensionSystem::Get(profile()));
234 results_ = management::Get::Results::Create(*info);
206 235
207 return true; 236 return true;
208 } 237 }
209 238
210 bool GetPermissionWarningsByIdFunction::RunImpl() { 239 bool GetPermissionWarningsByIdFunction::RunImpl() {
211 std::string ext_id; 240 scoped_ptr<management::GetPermissionWarningsById::Params> params(
212 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &ext_id)); 241 management::GetPermissionWarningsById::Params::Create(*args_));
242 EXTENSION_FUNCTION_VALIDATE(params.get());
213 243
214 const Extension* extension = service()->GetExtensionById(ext_id, true); 244 const Extension* extension = service()->GetExtensionById(params->id, true);
215 if (!extension) { 245 if (!extension) {
216 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoExtensionError, 246 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoExtensionError,
217 ext_id); 247 params->id);
218 return false; 248 return false;
219 } 249 }
220 250
221 PermissionMessages warnings = extension->GetPermissionMessages(); 251 std::vector<std::string> warnings = CreateWarningsList(extension);
222 ListValue* result = new ListValue(); 252 results_ = management::GetPermissionWarningsById::Results::Create(warnings);
223 for (PermissionMessages::const_iterator i = warnings.begin();
224 i < warnings.end(); ++i)
225 result->Append(Value::CreateStringValue(i->message()));
226 SetResult(result);
227 return true; 253 return true;
228 } 254 }
229 255
230 namespace { 256 namespace {
231 257
232 // This class helps GetPermissionWarningsByManifestFunction manage 258 // This class helps GetPermissionWarningsByManifestFunction manage
233 // sending manifest JSON strings to the utility process for parsing. 259 // sending manifest JSON strings to the utility process for parsing.
234 class SafeManifestJSONParser : public UtilityProcessHostClient { 260 class SafeManifestJSONParser : public UtilityProcessHostClient {
235 public: 261 public:
236 SafeManifestJSONParser(GetPermissionWarningsByManifestFunction* client, 262 SafeManifestJSONParser(GetPermissionWarningsByManifestFunction* client,
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 336
311 // Results of parsing. 337 // Results of parsing.
312 scoped_ptr<DictionaryValue> parsed_manifest_; 338 scoped_ptr<DictionaryValue> parsed_manifest_;
313 339
314 std::string error_; 340 std::string error_;
315 }; 341 };
316 342
317 } // namespace 343 } // namespace
318 344
319 bool GetPermissionWarningsByManifestFunction::RunImpl() { 345 bool GetPermissionWarningsByManifestFunction::RunImpl() {
320 std::string manifest_str; 346 scoped_ptr<management::GetPermissionWarningsByManifest::Params> params(
321 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &manifest_str)); 347 management::GetPermissionWarningsByManifest::Params::Create(*args_));
348 EXTENSION_FUNCTION_VALIDATE(params.get());
322 349
323 scoped_refptr<SafeManifestJSONParser> parser = 350 scoped_refptr<SafeManifestJSONParser> parser =
324 new SafeManifestJSONParser(this, manifest_str); 351 new SafeManifestJSONParser(this, params->manifest_str);
325 parser->Start(); 352 parser->Start();
326 353
327 // Matched with a Release() in OnParseSuccess/Failure(). 354 // Matched with a Release() in OnParseSuccess/Failure().
328 AddRef(); 355 AddRef();
329 356
330 // Response is sent async in OnParseSuccess/Failure(). 357 // Response is sent async in OnParseSuccess/Failure().
331 return true; 358 return true;
332 } 359 }
333 360
334 void GetPermissionWarningsByManifestFunction::OnParseSuccess( 361 void GetPermissionWarningsByManifestFunction::OnParseSuccess(
335 DictionaryValue* parsed_manifest) { 362 DictionaryValue* parsed_manifest) {
336 CHECK(parsed_manifest); 363 CHECK(parsed_manifest);
337 364
338 scoped_refptr<Extension> extension = Extension::Create( 365 scoped_refptr<Extension> extension = Extension::Create(
339 FilePath(), Extension::INVALID, *parsed_manifest, Extension::NO_FLAGS, 366 FilePath(), Extension::INVALID, *parsed_manifest, Extension::NO_FLAGS,
340 &error_); 367 &error_);
341 if (!extension.get()) { 368 if (!extension.get()) {
342 OnParseFailure(keys::kExtensionCreateError); 369 OnParseFailure(keys::kExtensionCreateError);
343 return; 370 return;
344 } 371 }
345 372
346 PermissionMessages warnings = extension->GetPermissionMessages(); 373 std::vector<std::string> warnings = CreateWarningsList(extension);
347 ListValue* result = new ListValue(); 374 results_ = management::GetPermissionWarningsByManifest::Results::Create(
348 for (PermissionMessages::const_iterator i = warnings.begin(); 375 warnings);
349 i < warnings.end(); ++i)
350 result->Append(Value::CreateStringValue(i->message()));
351 SetResult(result);
352 SendResponse(true); 376 SendResponse(true);
353 377
354 // Matched with AddRef() in RunImpl(). 378 // Matched with AddRef() in RunImpl().
355 Release(); 379 Release();
356 } 380 }
357 381
358 void GetPermissionWarningsByManifestFunction::OnParseFailure( 382 void GetPermissionWarningsByManifestFunction::OnParseFailure(
359 const std::string& error) { 383 const std::string& error) {
360 error_ = error; 384 error_ = error;
361 SendResponse(false); 385 SendResponse(false);
362 386
363 // Matched with AddRef() in RunImpl(). 387 // Matched with AddRef() in RunImpl().
364 Release(); 388 Release();
365 } 389 }
366 390
367 bool LaunchAppFunction::RunImpl() { 391 bool LaunchAppFunction::RunImpl() {
368 std::string extension_id; 392 scoped_ptr<management::LaunchApp::Params> params(
369 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id)); 393 management::LaunchApp::Params::Create(*args_));
370 const Extension* extension = service()->GetExtensionById(extension_id, true); 394 EXTENSION_FUNCTION_VALIDATE(params.get());
395 const Extension* extension = service()->GetExtensionById(params->id, true);
371 if (!extension) { 396 if (!extension) {
372 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoExtensionError, 397 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoExtensionError,
373 extension_id); 398 params->id);
374 return false; 399 return false;
375 } 400 }
376 if (!extension->is_app()) { 401 if (!extension->is_app()) {
377 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNotAnAppError, 402 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNotAnAppError,
378 extension_id); 403 params->id);
379 return false; 404 return false;
380 } 405 }
381 406
382 // Look at prefs to find the right launch container. 407 // Look at prefs to find the right launch container.
383 // |default_pref_value| is set to LAUNCH_REGULAR so that if 408 // |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. 409 // the user has not set a preference, we open the app in a tab.
385 extension_misc::LaunchContainer launch_container = 410 extension_misc::LaunchContainer launch_container =
386 service()->extension_prefs()->GetLaunchContainer( 411 service()->extension_prefs()->GetLaunchContainer(
387 extension, extensions::ExtensionPrefs::LAUNCH_DEFAULT); 412 extension, extensions::ExtensionPrefs::LAUNCH_DEFAULT);
388 application_launch::OpenApplication(application_launch::LaunchParams( 413 application_launch::OpenApplication(application_launch::LaunchParams(
389 profile(), extension, launch_container, NEW_FOREGROUND_TAB)); 414 profile(), extension, launch_container, NEW_FOREGROUND_TAB));
390 #if !defined(OS_ANDROID) 415 #if !defined(OS_ANDROID)
391 AppLauncherHandler::RecordAppLaunchType( 416 AppLauncherHandler::RecordAppLaunchType(
392 extension_misc::APP_LAUNCH_EXTENSION_API); 417 extension_misc::APP_LAUNCH_EXTENSION_API);
393 #endif 418 #endif
394 419
395 return true; 420 return true;
396 } 421 }
397 422
398 SetEnabledFunction::SetEnabledFunction() { 423 SetEnabledFunction::SetEnabledFunction() {
399 } 424 }
400 425
401 SetEnabledFunction::~SetEnabledFunction() { 426 SetEnabledFunction::~SetEnabledFunction() {
402 } 427 }
403 428
404 bool SetEnabledFunction::RunImpl() { 429 bool SetEnabledFunction::RunImpl() {
405 bool enable; 430 scoped_ptr<management::SetEnabled::Params> params(
406 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id_)); 431 management::SetEnabled::Params::Create(*args_));
407 EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(1, &enable)); 432 EXTENSION_FUNCTION_VALIDATE(params.get());
433
434 extension_id_ = params->id;
408 435
409 const Extension* extension = service()->GetExtensionById(extension_id_, true); 436 const Extension* extension = service()->GetExtensionById(extension_id_, true);
410 if (!extension) { 437 if (!extension) {
411 error_ = ExtensionErrorUtils::FormatErrorMessage( 438 error_ = ExtensionErrorUtils::FormatErrorMessage(
412 keys::kNoExtensionError, extension_id_); 439 keys::kNoExtensionError, extension_id_);
413 return false; 440 return false;
414 } 441 }
415 442
416 const extensions::ManagementPolicy* policy = extensions::ExtensionSystem::Get( 443 const extensions::ManagementPolicy* policy = extensions::ExtensionSystem::Get(
417 profile())->management_policy(); 444 profile())->management_policy();
418 if (!policy->UserMayModifySettings(extension, NULL)) { 445 if (!policy->UserMayModifySettings(extension, NULL)) {
419 error_ = ExtensionErrorUtils::FormatErrorMessage( 446 error_ = ExtensionErrorUtils::FormatErrorMessage(
420 keys::kUserCantModifyError, extension_id_); 447 keys::kUserCantModifyError, extension_id_);
421 return false; 448 return false;
422 } 449 }
423 450
424 bool currently_enabled = service()->IsExtensionEnabled(extension_id_); 451 bool currently_enabled = service()->IsExtensionEnabled(extension_id_);
425 452
426 if (!currently_enabled && enable) { 453 if (!currently_enabled && params->enabled) {
427 extensions::ExtensionPrefs* prefs = service()->extension_prefs(); 454 extensions::ExtensionPrefs* prefs = service()->extension_prefs();
428 if (prefs->DidExtensionEscalatePermissions(extension_id_)) { 455 if (prefs->DidExtensionEscalatePermissions(extension_id_)) {
429 if (!user_gesture()) { 456 if (!user_gesture()) {
430 error_ = keys::kGestureNeededForEscalationError; 457 error_ = keys::kGestureNeededForEscalationError;
431 return false; 458 return false;
432 } 459 }
433 AddRef(); // Matched in InstallUIProceed/InstallUIAbort 460 AddRef(); // Matched in InstallUIProceed/InstallUIAbort
434 install_prompt_.reset( 461 install_prompt_.reset(
435 chrome::CreateExtensionInstallPromptWithBrowser(GetCurrentBrowser())); 462 chrome::CreateExtensionInstallPromptWithBrowser(GetCurrentBrowser()));
436 install_prompt_->ConfirmReEnable(this, extension); 463 install_prompt_->ConfirmReEnable(this, extension);
437 return true; 464 return true;
438 } 465 }
439 service()->EnableExtension(extension_id_); 466 service()->EnableExtension(extension_id_);
440 } else if (currently_enabled && !enable) { 467 } else if (currently_enabled && !params->enabled) {
441 service()->DisableExtension(extension_id_, Extension::DISABLE_USER_ACTION); 468 service()->DisableExtension(extension_id_, Extension::DISABLE_USER_ACTION);
442 } 469 }
443 470
444 BrowserThread::PostTask( 471 BrowserThread::PostTask(
445 BrowserThread::UI, 472 BrowserThread::UI,
446 FROM_HERE, 473 FROM_HERE,
447 base::Bind(&SetEnabledFunction::SendResponse, this, true)); 474 base::Bind(&SetEnabledFunction::SendResponse, this, true));
448 475
449 return true; 476 return true;
450 } 477 }
(...skipping 10 matching lines...) Expand all
461 Release(); 488 Release();
462 } 489 }
463 490
464 UninstallFunction::UninstallFunction() { 491 UninstallFunction::UninstallFunction() {
465 } 492 }
466 493
467 UninstallFunction::~UninstallFunction() { 494 UninstallFunction::~UninstallFunction() {
468 } 495 }
469 496
470 bool UninstallFunction::RunImpl() { 497 bool UninstallFunction::RunImpl() {
498 scoped_ptr<management::Uninstall::Params> params(
499 management::Uninstall::Params::Create(*args_));
500 EXTENSION_FUNCTION_VALIDATE(params.get());
501
502 extension_id_ = params->id;
503
471 bool show_confirm_dialog = false; 504 bool show_confirm_dialog = false;
472 505 if (params->options.get() && params->options->show_confirm_dialog.get())
473 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id_)); 506 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 507
485 const Extension* extension = service()->GetExtensionById(extension_id_, true); 508 const Extension* extension = service()->GetExtensionById(extension_id_, true);
486 if (!extension) { 509 if (!extension) {
487 error_ = ExtensionErrorUtils::FormatErrorMessage( 510 error_ = ExtensionErrorUtils::FormatErrorMessage(
488 keys::kNoExtensionError, extension_id_); 511 keys::kNoExtensionError, extension_id_);
489 return false; 512 return false;
490 } 513 }
491 514
492 if (!extensions::ExtensionSystem::Get( 515 if (!extensions::ExtensionSystem::Get(
493 profile())->management_policy()->UserMayModifySettings(extension, NULL)) { 516 profile())->management_policy()->UserMayModifySettings(extension, NULL)) {
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 event_name = events::kOnExtensionDisabled; 611 event_name = events::kOnExtensionDisabled;
589 break; 612 break;
590 default: 613 default:
591 NOTREACHED(); 614 NOTREACHED();
592 return; 615 return;
593 } 616 }
594 617
595 scoped_ptr<ListValue> args(new ListValue()); 618 scoped_ptr<ListValue> args(new ListValue());
596 if (event_name == events::kOnExtensionUninstalled) { 619 if (event_name == events::kOnExtensionUninstalled) {
597 args->Append(Value::CreateStringValue( 620 args->Append(Value::CreateStringValue(
598 content::Details<const extensions::Extension>(details).ptr()->id())); 621 content::Details<const Extension>(details).ptr()->id()));
599 } else { 622 } else {
600 const Extension* extension = NULL; 623 const Extension* extension = NULL;
601 if (event_name == events::kOnExtensionDisabled) { 624 if (event_name == events::kOnExtensionDisabled) {
602 extension = content::Details<extensions::UnloadedExtensionInfo>( 625 extension = content::Details<extensions::UnloadedExtensionInfo>(
603 details)->extension; 626 details)->extension;
604 } else { 627 } else {
605 extension = content::Details<const Extension>(details).ptr(); 628 extension = content::Details<const Extension>(details).ptr();
606 } 629 }
607 CHECK(extension); 630 CHECK(extension);
608 ExtensionService* service = profile->GetExtensionService(); 631 scoped_ptr<management::ExtensionInfo> info = CreateExtensionInfo(
609 args->Append(CreateExtensionInfo(*extension, service)); 632 *extension, ExtensionSystem::Get(profile));
633 args->Append(info->ToValue().release());
610 } 634 }
611 635
612 profile->GetExtensionEventRouter()->DispatchEventToRenderers( 636 profile->GetExtensionEventRouter()->DispatchEventToRenderers(
613 event_name, args.Pass(), NULL, GURL(), extensions::EventFilteringInfo()); 637 event_name, args.Pass(), NULL, GURL(), extensions::EventFilteringInfo());
614 } 638 }
OLDNEW
« no previous file with comments | « no previous file | chrome/common/extensions/api/api.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698