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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/common/extensions/api/api.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/extensions/api/management/management_api.cc
diff --git a/chrome/browser/extensions/api/management/management_api.cc b/chrome/browser/extensions/api/management/management_api.cc
index 667b9e4526e5ffaedcce9c58d1c1c8d0e8764d43..07c3455d542ce56fda1635274e06d7b5cca375d4 100644
--- a/chrome/browser/extensions/api/management/management_api.cc
+++ b/chrome/browser/extensions/api/management/management_api.cc
@@ -6,13 +6,17 @@
#include <map>
#include <string>
+#include <vector>
#include "base/basictypes.h"
#include "base/bind.h"
#include "base/json/json_writer.h"
+#include "base/memory/linked_ptr.h"
+#include "base/memory/scoped_ptr.h"
#include "base/metrics/histogram.h"
#include "base/string_number_conversions.h"
#include "base/string_util.h"
+#include "base/utf_string_conversions.h"
#include "chrome/browser/extensions/api/management/management_api_constants.h"
#include "chrome/browser/extensions/event_names.h"
#include "chrome/browser/extensions/event_router.h"
@@ -25,6 +29,7 @@
#include "chrome/browser/ui/webui/extensions/extension_icon_source.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/chrome_utility_messages.h"
+#include "chrome/common/extensions/api/management.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_constants.h"
#include "chrome/common/extensions/extension_error_utils.h"
@@ -45,13 +50,18 @@ using content::BrowserThread;
using content::UtilityProcessHost;
using content::UtilityProcessHostClient;
using extensions::Extension;
+using extensions::ExtensionSystem;
using extensions::PermissionMessages;
namespace events = extensions::event_names;
namespace keys = extension_management_api_constants;
+namespace management = extensions::api::management;
namespace {
+typedef std::vector<linked_ptr<management::ExtensionInfo> > ExtensionInfoList;
+typedef std::vector<linked_ptr<management::IconInfo> > IconInfoList;
+
enum AutoConfirmForTest {
DO_NOT_SKIP = 0,
PROCEED,
@@ -60,170 +70,186 @@ enum AutoConfirmForTest {
AutoConfirmForTest auto_confirm_for_test = DO_NOT_SKIP;
-} // namespace
-
-ExtensionService* ExtensionManagementFunction::service() {
- return profile()->GetExtensionService();
-}
+std::vector<std::string> CreateWarningsList(const Extension* extension) {
+ std::vector<std::string> warnings_list;
+ PermissionMessages warnings = extension->GetPermissionMessages();
+ for (PermissionMessages::const_iterator iter = warnings.begin();
+ iter != warnings.end(); ++iter) {
+ warnings_list.push_back(UTF16ToUTF8(iter->message()));
+ }
-ExtensionService* AsyncExtensionManagementFunction::service() {
- return profile()->GetExtensionService();
+ return warnings_list;
}
-static DictionaryValue* CreateExtensionInfo(const Extension& extension,
- ExtensionService* service) {
- DictionaryValue* info = new DictionaryValue();
- bool enabled = service->IsExtensionEnabled(extension.id());
- extension.GetBasicInfo(enabled, info);
-
- const extensions::ManagementPolicy* policy = extensions::ExtensionSystem::Get(
- service->profile())->management_policy();
- info->SetBoolean(keys::kMayDisableKey,
- policy->UserMayModifySettings(&extension, NULL));
-
- info->SetBoolean(keys::kIsAppKey, extension.is_app());
-
- if (!enabled) {
+scoped_ptr<management::ExtensionInfo> CreateExtensionInfo(
+ const Extension& extension,
+ ExtensionSystem* system) {
+ scoped_ptr<management::ExtensionInfo> info(new management::ExtensionInfo());
+ ExtensionService* service = system->extension_service();
+
+ info->id = extension.id();
+ info->name = extension.name();
+ info->enabled = service->IsExtensionEnabled(info->id);
+ info->offline_enabled = extension.offline_enabled();
+ info->version = extension.VersionString();
+ info->description = extension.description();
+ info->options_url = extension.options_url().spec();
+ info->homepage_url.reset(new std::string(
+ extension.GetHomepageURL().spec()));
+ info->may_disable = system->management_policy()->
+ UserMayModifySettings(&extension, NULL);
+ info->is_app = extension.is_app();
+
+ if (info->enabled) {
+ info->disabled_reason = management::ExtensionInfo::DISABLED_REASON_NONE;
+ } else {
extensions::ExtensionPrefs* prefs = service->extension_prefs();
- bool permissions_escalated =
- prefs->DidExtensionEscalatePermissions(extension.id());
- const char* reason = permissions_escalated ?
- keys::kDisabledReasonPermissionsIncrease : keys::kDisabledReasonUnknown;
- info->SetString(keys::kDisabledReasonKey, reason);
+ if (prefs->DidExtensionEscalatePermissions(extension.id())) {
+ info->disabled_reason =
+ management::ExtensionInfo::DISABLED_REASON_PERMISSIONS_INCREASE;
+ } else {
+ info->disabled_reason =
+ management::ExtensionInfo::DISABLED_REASON_UNKNOWN;
+ }
}
- if (!extension.update_url().is_empty())
- info->SetString(keys::kUpdateUrlKey,
- extension.update_url().possibly_invalid_spec());
- if (extension.is_app())
- info->SetString(keys::kAppLaunchUrlKey,
- extension.GetFullLaunchURL().possibly_invalid_spec());
+ if (!extension.update_url().is_empty()) {
+ info->update_url.reset(new std::string(
+ extension.update_url().spec()));
+ }
+
+ if (extension.is_app()) {
+ info->app_launch_url.reset(new std::string(
+ extension.GetFullLaunchURL().spec()));
+ }
const ExtensionIconSet::IconMap& icons = extension.icons().map();
if (!icons.empty()) {
- ListValue* icon_list = new ListValue();
+ info->icons.reset(new IconInfoList());
std::map<ExtensionIconSet::Icons, std::string>::const_iterator icon_iter;
for (icon_iter = icons.begin(); icon_iter != icons.end(); ++icon_iter) {
- DictionaryValue* icon_info = new DictionaryValue();
- ExtensionIconSet::Icons size = icon_iter->first;
+ management::IconInfo* icon_info = new management::IconInfo();
+ icon_info->size = icon_iter->first;
GURL url = ExtensionIconSource::GetIconURL(
- &extension, size, ExtensionIconSet::MATCH_EXACTLY, false, NULL);
- icon_info->SetInteger(keys::kSizeKey, icon_iter->first);
- icon_info->SetString(keys::kUrlKey, url.spec());
- icon_list->Append(icon_info);
+ &extension, icon_info->size, ExtensionIconSet::MATCH_EXACTLY, false,
+ NULL);
+ icon_info->url = url.spec();
+ info->icons->push_back(make_linked_ptr<management::IconInfo>(icon_info));
}
- info->Set(keys::kIconsKey, icon_list);
}
const std::set<std::string> perms =
extension.GetActivePermissions()->GetAPIsAsStrings();
- ListValue* permission_list = new ListValue();
if (!perms.empty()) {
std::set<std::string>::const_iterator perms_iter;
- for (perms_iter = perms.begin(); perms_iter != perms.end(); ++perms_iter) {
- StringValue* permission_name = new StringValue(*perms_iter);
- permission_list->Append(permission_name);
- }
+ for (perms_iter = perms.begin(); perms_iter != perms.end(); ++perms_iter)
+ info->permissions.push_back(*perms_iter);
}
- info->Set(keys::kPermissionsKey, permission_list);
- ListValue* host_permission_list = new ListValue();
if (!extension.is_hosted_app()) {
// Skip host permissions for hosted apps.
const URLPatternSet host_perms =
extension.GetActivePermissions()->explicit_hosts();
if (!host_perms.is_empty()) {
- URLPatternSet::const_iterator host_perms_iter;
- for (host_perms_iter = host_perms.begin();
- host_perms_iter != host_perms.end();
- ++host_perms_iter) {
- StringValue* name = new StringValue(host_perms_iter->GetAsString());
- host_permission_list->Append(name);
+ for (URLPatternSet::const_iterator iter = host_perms.begin();
+ iter != host_perms.end(); ++iter) {
+ info->host_permissions.push_back(iter->GetAsString());
}
}
}
- info->Set(keys::kHostPermissionsKey, host_permission_list);
- std::string install_type = keys::kInstallTypeOther;
switch (extension.location()) {
case Extension::INTERNAL:
- install_type = keys::kInstallTypeNormal;
+ info->install_type = management::ExtensionInfo::INSTALL_TYPE_NORMAL;
break;
case Extension::LOAD:
- install_type = keys::kInstallTypeDevelopment;
+ info->install_type = management::ExtensionInfo::INSTALL_TYPE_DEVELOPMENT;
break;
case Extension::EXTERNAL_PREF:
case Extension::EXTERNAL_REGISTRY:
case Extension::EXTERNAL_PREF_DOWNLOAD:
- install_type = keys::kInstallTypeSideload;
+ info->install_type = management::ExtensionInfo::INSTALL_TYPE_SIDELOAD;
break;
case Extension::EXTERNAL_POLICY_DOWNLOAD:
- install_type = keys::kInstallTypeAdmin;
+ info->install_type = management::ExtensionInfo::INSTALL_TYPE_ADMIN;
break;
default:
- install_type = keys::kInstallTypeOther;
+ info->install_type = management::ExtensionInfo::INSTALL_TYPE_OTHER;
+ break;
}
- info->SetString(keys::kInstallTypeKey, install_type);
- return info;
+ return info.Pass();
}
-static void AddExtensionInfo(ListValue* list,
- const ExtensionSet& extensions,
- ExtensionService* service) {
- for (ExtensionSet::const_iterator i = extensions.begin();
- i != extensions.end(); ++i) {
- const Extension& extension = **i;
+void AddExtensionInfo(const ExtensionSet& extensions,
+ ExtensionSystem* system,
+ ExtensionInfoList* extension_list) {
+ for (ExtensionSet::const_iterator iter = extensions.begin();
+ iter != extensions.end(); ++iter) {
+ const Extension& extension = **iter;
if (extension.location() == Extension::COMPONENT)
continue; // Skip built-in extensions.
- list->Append(CreateExtensionInfo(extension, service));
+ extension_list->push_back(make_linked_ptr<management::ExtensionInfo>(
+ CreateExtensionInfo(extension, system).release()));
}
}
+} // namespace
+
+ExtensionService* ExtensionManagementFunction::service() {
+ return profile()->GetExtensionService();
+}
+
+ExtensionService* AsyncExtensionManagementFunction::service() {
+ return profile()->GetExtensionService();
+}
+
bool GetAllExtensionsFunction::RunImpl() {
- ListValue* result = new ListValue();
- SetResult(result);
+ ExtensionInfoList extensions;
+ ExtensionSystem* system = ExtensionSystem::Get(profile());
- AddExtensionInfo(result, *service()->extensions(), service());
- AddExtensionInfo(result, *service()->disabled_extensions(), service());
+ AddExtensionInfo(*service()->extensions(), system, &extensions);
+ AddExtensionInfo(*service()->disabled_extensions(), system, &extensions);
+ results_ = management::GetAll::Results::Create(extensions);
return true;
}
bool GetExtensionByIdFunction::RunImpl() {
- std::string extension_id;
- EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id));
- const Extension* extension = service()->GetExtensionById(extension_id, true);
+ scoped_ptr<management::Get::Params> params(
+ management::Get::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+
+ const Extension* extension = service()->GetExtensionById(params->id, true);
if (!extension) {
error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoExtensionError,
- extension_id);
+ params->id);
return false;
}
- DictionaryValue* result = CreateExtensionInfo(*extension, service());
- SetResult(result);
+
+ scoped_ptr<management::ExtensionInfo> info = CreateExtensionInfo(
+ *extension, ExtensionSystem::Get(profile()));
+ results_ = management::Get::Results::Create(*info);
return true;
}
bool GetPermissionWarningsByIdFunction::RunImpl() {
- std::string ext_id;
- EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &ext_id));
+ scoped_ptr<management::GetPermissionWarningsById::Params> params(
+ management::GetPermissionWarningsById::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
- const Extension* extension = service()->GetExtensionById(ext_id, true);
+ const Extension* extension = service()->GetExtensionById(params->id, true);
if (!extension) {
error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoExtensionError,
- ext_id);
+ params->id);
return false;
}
- PermissionMessages warnings = extension->GetPermissionMessages();
- ListValue* result = new ListValue();
- for (PermissionMessages::const_iterator i = warnings.begin();
- i < warnings.end(); ++i)
- result->Append(Value::CreateStringValue(i->message()));
- SetResult(result);
+ std::vector<std::string> warnings = CreateWarningsList(extension);
+ results_ = management::GetPermissionWarningsById::Results::Create(warnings);
return true;
}
@@ -317,11 +343,12 @@ class SafeManifestJSONParser : public UtilityProcessHostClient {
} // namespace
bool GetPermissionWarningsByManifestFunction::RunImpl() {
- std::string manifest_str;
- EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &manifest_str));
+ scoped_ptr<management::GetPermissionWarningsByManifest::Params> params(
+ management::GetPermissionWarningsByManifest::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
scoped_refptr<SafeManifestJSONParser> parser =
- new SafeManifestJSONParser(this, manifest_str);
+ new SafeManifestJSONParser(this, params->manifest_str);
parser->Start();
// Matched with a Release() in OnParseSuccess/Failure().
@@ -343,12 +370,9 @@ void GetPermissionWarningsByManifestFunction::OnParseSuccess(
return;
}
- PermissionMessages warnings = extension->GetPermissionMessages();
- ListValue* result = new ListValue();
- for (PermissionMessages::const_iterator i = warnings.begin();
- i < warnings.end(); ++i)
- result->Append(Value::CreateStringValue(i->message()));
- SetResult(result);
+ std::vector<std::string> warnings = CreateWarningsList(extension);
+ results_ = management::GetPermissionWarningsByManifest::Results::Create(
+ warnings);
SendResponse(true);
// Matched with AddRef() in RunImpl().
@@ -365,17 +389,18 @@ void GetPermissionWarningsByManifestFunction::OnParseFailure(
}
bool LaunchAppFunction::RunImpl() {
- std::string extension_id;
- EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id));
- const Extension* extension = service()->GetExtensionById(extension_id, true);
+ scoped_ptr<management::LaunchApp::Params> params(
+ management::LaunchApp::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+ const Extension* extension = service()->GetExtensionById(params->id, true);
if (!extension) {
error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoExtensionError,
- extension_id);
+ params->id);
return false;
}
if (!extension->is_app()) {
error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNotAnAppError,
- extension_id);
+ params->id);
return false;
}
@@ -402,9 +427,11 @@ SetEnabledFunction::~SetEnabledFunction() {
}
bool SetEnabledFunction::RunImpl() {
- bool enable;
- EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id_));
- EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(1, &enable));
+ scoped_ptr<management::SetEnabled::Params> params(
+ management::SetEnabled::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+
+ extension_id_ = params->id;
const Extension* extension = service()->GetExtensionById(extension_id_, true);
if (!extension) {
@@ -423,7 +450,7 @@ bool SetEnabledFunction::RunImpl() {
bool currently_enabled = service()->IsExtensionEnabled(extension_id_);
- if (!currently_enabled && enable) {
+ if (!currently_enabled && params->enabled) {
extensions::ExtensionPrefs* prefs = service()->extension_prefs();
if (prefs->DidExtensionEscalatePermissions(extension_id_)) {
if (!user_gesture()) {
@@ -437,7 +464,7 @@ bool SetEnabledFunction::RunImpl() {
return true;
}
service()->EnableExtension(extension_id_);
- } else if (currently_enabled && !enable) {
+ } else if (currently_enabled && !params->enabled) {
service()->DisableExtension(extension_id_, Extension::DISABLE_USER_ACTION);
}
@@ -468,19 +495,15 @@ UninstallFunction::~UninstallFunction() {
}
bool UninstallFunction::RunImpl() {
- bool show_confirm_dialog = false;
-
- EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id_));
+ scoped_ptr<management::Uninstall::Params> params(
+ management::Uninstall::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
- if (HasOptionalArgument(1)) {
- DictionaryValue* options = NULL;
- EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &options));
+ extension_id_ = params->id;
- if (options->HasKey(keys::kShowConfirmDialogKey)) {
- EXTENSION_FUNCTION_VALIDATE(options->GetBoolean(
- keys::kShowConfirmDialogKey, &show_confirm_dialog));
- }
- }
+ bool show_confirm_dialog = false;
+ if (params->options.get() && params->options->show_confirm_dialog.get())
+ show_confirm_dialog = *params->options->show_confirm_dialog;
const Extension* extension = service()->GetExtensionById(extension_id_, true);
if (!extension) {
@@ -595,7 +618,7 @@ void ExtensionManagementEventRouter::Observe(
scoped_ptr<ListValue> args(new ListValue());
if (event_name == events::kOnExtensionUninstalled) {
args->Append(Value::CreateStringValue(
- content::Details<const extensions::Extension>(details).ptr()->id()));
+ content::Details<const Extension>(details).ptr()->id()));
} else {
const Extension* extension = NULL;
if (event_name == events::kOnExtensionDisabled) {
@@ -605,8 +628,9 @@ void ExtensionManagementEventRouter::Observe(
extension = content::Details<const Extension>(details).ptr();
}
CHECK(extension);
- ExtensionService* service = profile->GetExtensionService();
- args->Append(CreateExtensionInfo(*extension, service));
+ scoped_ptr<management::ExtensionInfo> info = CreateExtensionInfo(
+ *extension, ExtensionSystem::Get(profile));
+ args->Append(info->ToValue().release());
}
profile->GetExtensionEventRouter()->DispatchEventToRenderers(
« 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