| 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(
|
|
|