| Index: chrome/browser/extensions/extension_permissions_api.cc
|
| diff --git a/chrome/browser/extensions/extension_permissions_api.cc b/chrome/browser/extensions/extension_permissions_api.cc
|
| index 2b8be58f369339e0d645c6b17211a60ac7d60457..cbaa7192d5f3a6cef743893e8c98144dc404ef3d 100644
|
| --- a/chrome/browser/extensions/extension_permissions_api.cc
|
| +++ b/chrome/browser/extensions/extension_permissions_api.cc
|
| @@ -5,7 +5,6 @@
|
| #include "chrome/browser/extensions/extension_permissions_api.h"
|
|
|
| #include "base/json/json_writer.h"
|
| -#include "base/stringprintf.h"
|
| #include "base/values.h"
|
| #include "chrome/browser/extensions/extension_event_router.h"
|
| #include "chrome/browser/extensions/extension_permissions_api_constants.h"
|
| @@ -14,6 +13,7 @@
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/common/chrome_notification_types.h"
|
| #include "chrome/common/extensions/extension.h"
|
| +#include "chrome/common/extensions/extension_error_utils.h"
|
| #include "chrome/common/extensions/extension_messages.h"
|
| #include "chrome/common/extensions/extension_permission_set.h"
|
| #include "chrome/common/extensions/url_pattern_set.h"
|
| @@ -42,11 +42,14 @@ DictionaryValue* PackPermissionsToValue(const ExtensionPermissionSet* set) {
|
| i != set->apis().end(); ++i)
|
| apis->Append(Value::CreateStringValue(info->GetByID(*i)->name()));
|
|
|
| - // TODO(jstritar): Include hosts once the API supports them. At that point,
|
| - // we could also shared this code with ExtensionPermissionSet methods in
|
| - // ExtensionPrefs.
|
| + // Generate the list of origin permissions.
|
| + URLPatternSet hosts = set->explicit_hosts();
|
| + ListValue* origins = new ListValue();
|
| + for (URLPatternSet::const_iterator i = hosts.begin(); i != hosts.end(); ++i)
|
| + origins->Append(Value::CreateStringValue(i->GetAsString()));
|
|
|
| value->Set(keys::kApisKey, apis);
|
| + value->Set(keys::kOriginsKey, origins);
|
| return value;
|
| }
|
|
|
| @@ -74,17 +77,43 @@ bool UnpackPermissionsFromValue(DictionaryValue* value,
|
|
|
| ExtensionAPIPermission* permission = info->GetByName(api_name);
|
| if (!permission) {
|
| - *error = base::StringPrintf(
|
| - keys::kUnknownPermissionError, api_name.c_str());
|
| + *error = ExtensionErrorUtils::FormatErrorMessage(
|
| + keys::kUnknownPermissionError, api_name);
|
| return false;
|
| }
|
| apis.insert(permission->id());
|
| }
|
| }
|
|
|
| - // Ignore host permissions for now.
|
| - URLPatternSet empty_set;
|
| - *ptr = new ExtensionPermissionSet(apis, empty_set, empty_set);
|
| + URLPatternSet origins;
|
| + if (value->HasKey(keys::kOriginsKey)) {
|
| + ListValue* origin_list = NULL;
|
| + if (!value->GetList(keys::kOriginsKey, &origin_list)) {
|
| + *bad_message = true;
|
| + return false;
|
| + }
|
| + for (size_t i = 0; i < origin_list->GetSize(); ++i) {
|
| + std::string pattern;
|
| + if (!origin_list->GetString(i, &pattern)) {
|
| + *bad_message = true;
|
| + return false;
|
| + }
|
| +
|
| + URLPattern origin(Extension::kValidHostPermissionSchemes);
|
| + URLPattern::ParseResult parse_result =
|
| + origin.Parse(pattern, URLPattern::IGNORE_PORTS);
|
| + if (URLPattern::PARSE_SUCCESS != parse_result) {
|
| + *error = ExtensionErrorUtils::FormatErrorMessage(
|
| + keys::kInvalidOrigin,
|
| + pattern,
|
| + URLPattern::GetParseResultString(parse_result));
|
| + return false;
|
| + }
|
| + origins.AddPattern(origin);
|
| + }
|
| + }
|
| +
|
| + *ptr = new ExtensionPermissionSet(apis, origins, URLPatternSet());
|
| return true;
|
| }
|
|
|
| @@ -110,7 +139,7 @@ void ExtensionPermissionsManager::AddPermissions(
|
| // Update the granted permissions so we don't auto-disable the extension.
|
| extension_service_->GrantPermissions(extension);
|
|
|
| - NotifyPermissionsUpdated(extension, total.get(), added.get(), ADDED);
|
| + NotifyPermissionsUpdated(ADDED, extension, added.get());
|
| }
|
|
|
| void ExtensionPermissionsManager::RemovePermissions(
|
| @@ -127,7 +156,7 @@ void ExtensionPermissionsManager::RemovePermissions(
|
| // extension to add them again without prompting the user.
|
| extension_service_->UpdateActivePermissions(extension, total.get());
|
|
|
| - NotifyPermissionsUpdated(extension, total.get(), removed.get(), REMOVED);
|
| + NotifyPermissionsUpdated(REMOVED, extension, removed.get());
|
| }
|
|
|
| void ExtensionPermissionsManager::DispatchEvent(
|
| @@ -146,10 +175,9 @@ void ExtensionPermissionsManager::DispatchEvent(
|
| }
|
|
|
| void ExtensionPermissionsManager::NotifyPermissionsUpdated(
|
| + EventType event_type,
|
| const Extension* extension,
|
| - const ExtensionPermissionSet* active,
|
| - const ExtensionPermissionSet* changed,
|
| - EventType event_type) {
|
| + const ExtensionPermissionSet* changed) {
|
| if (!changed || changed->IsEmpty())
|
| return;
|
|
|
| @@ -183,10 +211,11 @@ void ExtensionPermissionsManager::NotifyPermissionsUpdated(
|
| Profile* profile = Profile::FromBrowserContext(host->browser_context());
|
| if (extension_service_->profile()->IsSameProfile(profile))
|
| host->Send(new ExtensionMsg_UpdatePermissions(
|
| + static_cast<int>(reason),
|
| extension->id(),
|
| - active->apis(),
|
| - active->explicit_hosts(),
|
| - active->scriptable_hosts()));
|
| + changed->apis(),
|
| + changed->explicit_hosts(),
|
| + changed->scriptable_hosts()));
|
| }
|
| }
|
|
|
| @@ -235,7 +264,8 @@ bool RemovePermissionsFunction::RunImpl() {
|
| i != apis.end(); ++i) {
|
| const ExtensionAPIPermission* api = info->GetByID(*i);
|
| if (!api->supports_optional()) {
|
| - error_ = base::StringPrintf(keys::kNotWhitelistedError, api->name());
|
| + error_ = ExtensionErrorUtils::FormatErrorMessage(
|
| + keys::kNotWhitelistedError, api->name());
|
| return false;
|
| }
|
| }
|
| @@ -286,7 +316,8 @@ bool RequestPermissionsFunction::RunImpl() {
|
| i != apis.end(); ++i) {
|
| const ExtensionAPIPermission* api = info->GetByID(*i);
|
| if (!api->supports_optional()) {
|
| - error_ = base::StringPrintf(keys::kNotWhitelistedError, api->name());
|
| + error_ = ExtensionErrorUtils::FormatErrorMessage(
|
| + keys::kNotWhitelistedError, api->name());
|
| return false;
|
| }
|
| }
|
|
|