| Index: chrome/common/extensions/extension.cc
|
| diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc
|
| index 73c2d524faed6fde21c75e510c223050629e0ac2..9b7eabfc39d6767b2c32714d5cd17001d03ce105 100644
|
| --- a/chrome/common/extensions/extension.cc
|
| +++ b/chrome/common/extensions/extension.cc
|
| @@ -39,6 +39,7 @@
|
| #include "chrome/common/extensions/manifest_handler.h"
|
| #include "chrome/common/extensions/manifest_handler_helpers.h"
|
| #include "chrome/common/extensions/manifest_url_handler.h"
|
| +#include "chrome/common/extensions/permissions/api_permission_set.h"
|
| #include "chrome/common/extensions/permissions/permission_set.h"
|
| #include "chrome/common/extensions/permissions/permissions_info.h"
|
| #include "chrome/common/extensions/user_script.h"
|
| @@ -1406,18 +1407,18 @@ bool Extension::InitFromValue(int flags, string16* error) {
|
| if (is_app() && !LoadAppFeatures(error))
|
| return false;
|
|
|
| - APIPermissionSet api_permissions;
|
| + initial_api_permissions_.reset(new APIPermissionSet);
|
| URLPatternSet host_permissions;
|
| if (!ParsePermissions(keys::kPermissions,
|
| error,
|
| - &api_permissions,
|
| + initial_api_permissions_.get(),
|
| &host_permissions)) {
|
| return false;
|
| }
|
|
|
| // Check for any permissions that are optional only.
|
| - for (APIPermissionSet::const_iterator i = api_permissions.begin();
|
| - i != api_permissions.end(); ++i) {
|
| + for (APIPermissionSet::const_iterator i = initial_api_permissions_->begin();
|
| + i != initial_api_permissions_->end(); ++i) {
|
| if ((*i)->info()->must_be_optional()) {
|
| *error = ErrorUtils::FormatErrorMessageUTF16(
|
| errors::kPermissionMustBeOptional, (*i)->info()->name());
|
| @@ -1429,9 +1430,9 @@ bool Extension::InitFromValue(int flags, string16* error) {
|
| // app.window API to platform apps, with no dependency on any permissions.
|
| // See http://crbug.com/120069.
|
| if (is_platform_app()) {
|
| - api_permissions.insert(APIPermission::kAppCurrentWindowInternal);
|
| - api_permissions.insert(APIPermission::kAppRuntime);
|
| - api_permissions.insert(APIPermission::kAppWindow);
|
| + initial_api_permissions_->insert(APIPermission::kAppCurrentWindowInternal);
|
| + initial_api_permissions_->insert(APIPermission::kAppRuntime);
|
| + initial_api_permissions_->insert(APIPermission::kAppWindow);
|
| }
|
|
|
| APIPermissionSet optional_api_permissions;
|
| @@ -1443,18 +1444,18 @@ bool Extension::InitFromValue(int flags, string16* error) {
|
| return false;
|
| }
|
|
|
| - if (ContainsManifestForbiddenPermission(api_permissions, error) ||
|
| + if (ContainsManifestForbiddenPermission(*initial_api_permissions_, error) ||
|
| ContainsManifestForbiddenPermission(optional_api_permissions, error)) {
|
| return false;
|
| }
|
|
|
| - if (!LoadAppIsolation(api_permissions, error))
|
| + if (!LoadAppIsolation(error))
|
| return false;
|
|
|
| - if (!LoadSharedFeatures(api_permissions, error))
|
| + if (!LoadSharedFeatures(error))
|
| return false;
|
|
|
| - if (!LoadExtensionFeatures(&api_permissions, error))
|
| + if (!LoadExtensionFeatures(error))
|
| return false;
|
|
|
| if (!LoadManagedModeFeatures(error))
|
| @@ -1468,17 +1469,17 @@ bool Extension::InitFromValue(int flags, string16* error) {
|
| finished_parsing_manifest_ = true;
|
|
|
| runtime_data_.SetActivePermissions(new PermissionSet(
|
| - this, api_permissions, host_permissions));
|
| + this, *initial_api_permissions_, host_permissions));
|
| required_permission_set_ = new PermissionSet(
|
| - this, api_permissions, host_permissions);
|
| + this, *initial_api_permissions_, host_permissions);
|
| optional_permission_set_ = new PermissionSet(
|
| optional_api_permissions, optional_host_permissions, URLPatternSet());
|
| + initial_api_permissions_.reset();
|
|
|
| return true;
|
| }
|
|
|
| -bool Extension::LoadAppIsolation(const APIPermissionSet& api_permissions,
|
| - string16* error) {
|
| +bool Extension::LoadAppIsolation(string16* error) {
|
| // Platform apps always get isolated storage.
|
| if (is_platform_app()) {
|
| is_storage_isolated_ = true;
|
| @@ -1487,7 +1488,8 @@ bool Extension::LoadAppIsolation(const APIPermissionSet& api_permissions,
|
|
|
| // Other apps only get it if it is requested _and_ experimental APIs are
|
| // enabled.
|
| - if (!api_permissions.count(APIPermission::kExperimental) || !is_app())
|
| + if (!initial_api_permissions()->count(APIPermission::kExperimental)
|
| + || !is_app())
|
| return true;
|
|
|
| Value* tmp_isolation = NULL;
|
| @@ -1808,9 +1810,7 @@ bool Extension::LoadLaunchURL(string16* error) {
|
| return true;
|
| }
|
|
|
| -bool Extension::LoadSharedFeatures(
|
| - const APIPermissionSet& api_permissions,
|
| - string16* error) {
|
| +bool Extension::LoadSharedFeatures(string16* error) {
|
| if (!LoadDescription(error) ||
|
| !LoadIcons(error) ||
|
| !ManifestHandler::ParseExtension(this, error) ||
|
| @@ -1821,9 +1821,9 @@ bool Extension::LoadSharedFeatures(
|
| !LoadOfflineEnabled(error) ||
|
| // LoadBackgroundScripts() must be called before LoadBackgroundPage().
|
| !LoadBackgroundScripts(error) ||
|
| - !LoadBackgroundPage(api_permissions, error) ||
|
| - !LoadBackgroundPersistent(api_permissions, error) ||
|
| - !LoadBackgroundAllowJSAccess(api_permissions, error))
|
| + !LoadBackgroundPage(error) ||
|
| + !LoadBackgroundPersistent(error) ||
|
| + !LoadBackgroundAllowJSAccess(error))
|
| return false;
|
|
|
| return true;
|
| @@ -2147,27 +2147,21 @@ bool Extension::LoadBackgroundScripts(const std::string& key, string16* error) {
|
| return true;
|
| }
|
|
|
| -bool Extension::LoadBackgroundPage(
|
| - const APIPermissionSet& api_permissions,
|
| - string16* error) {
|
| +bool Extension::LoadBackgroundPage(string16* error) {
|
| if (is_platform_app()) {
|
| - return LoadBackgroundPage(
|
| - keys::kPlatformAppBackgroundPage, api_permissions, error);
|
| + return LoadBackgroundPage(keys::kPlatformAppBackgroundPage, error);
|
| }
|
|
|
| - if (!LoadBackgroundPage(keys::kBackgroundPage, api_permissions, error))
|
| + if (!LoadBackgroundPage(keys::kBackgroundPage, error))
|
| return false;
|
| if (background_url_.is_empty()) {
|
| return LoadBackgroundPage(
|
| - keys::kBackgroundPageLegacy, api_permissions, error);
|
| + keys::kBackgroundPageLegacy, error);
|
| }
|
| return true;
|
| }
|
|
|
| -bool Extension::LoadBackgroundPage(
|
| - const std::string& key,
|
| - const APIPermissionSet& api_permissions,
|
| - string16* error) {
|
| +bool Extension::LoadBackgroundPage(const std::string& key, string16* error) {
|
| base::Value* background_page_value = NULL;
|
| if (!manifest_->Get(key, &background_page_value))
|
| return true;
|
| @@ -2188,7 +2182,7 @@ bool Extension::LoadBackgroundPage(
|
| background_url_ = GURL(background_str);
|
|
|
| // Make sure "background" permission is set.
|
| - if (!api_permissions.count(APIPermission::kBackground)) {
|
| + if (!initial_api_permissions()->count(APIPermission::kBackground)) {
|
| *error = ASCIIToUTF16(errors::kBackgroundPermissionNeeded);
|
| return false;
|
| }
|
| @@ -2212,9 +2206,7 @@ bool Extension::LoadBackgroundPage(
|
| return true;
|
| }
|
|
|
| -bool Extension::LoadBackgroundPersistent(
|
| - const APIPermissionSet& api_permissions,
|
| - string16* error) {
|
| +bool Extension::LoadBackgroundPersistent(string16* error) {
|
| if (is_platform_app()) {
|
| background_page_is_persistent_ = false;
|
| return true;
|
| @@ -2237,9 +2229,7 @@ bool Extension::LoadBackgroundPersistent(
|
| return true;
|
| }
|
|
|
| -bool Extension::LoadBackgroundAllowJSAccess(
|
| - const APIPermissionSet& api_permissions,
|
| - string16* error) {
|
| +bool Extension::LoadBackgroundAllowJSAccess(string16* error) {
|
| Value* allow_js_access = NULL;
|
| if (!manifest_->Get(keys::kBackgroundAllowJsAccess, &allow_js_access))
|
| return true;
|
| @@ -2253,14 +2243,13 @@ bool Extension::LoadBackgroundAllowJSAccess(
|
| return true;
|
| }
|
|
|
| -bool Extension::LoadExtensionFeatures(APIPermissionSet* api_permissions,
|
| - string16* error) {
|
| +bool Extension::LoadExtensionFeatures(string16* error) {
|
| if (manifest_->HasKey(keys::kConvertedFromUserScript))
|
| manifest_->GetBoolean(keys::kConvertedFromUserScript,
|
| &converted_from_user_script_);
|
|
|
| if (!LoadContentScripts(error) ||
|
| - !LoadSystemIndicator(api_permissions, error) ||
|
| + !LoadSystemIndicator(error) ||
|
| !LoadIncognitoMode(error) ||
|
| !LoadContentSecurityPolicy(error))
|
| return false;
|
| @@ -2298,8 +2287,7 @@ bool Extension::LoadContentScripts(string16* error) {
|
| return true;
|
| }
|
|
|
| -bool Extension::LoadSystemIndicator(APIPermissionSet* api_permissions,
|
| - string16* error) {
|
| +bool Extension::LoadSystemIndicator(string16* error) {
|
| if (!manifest_->HasKey(keys::kSystemIndicator)) {
|
| // There was no manifest entry for the system indicator.
|
| return true;
|
| @@ -2321,7 +2309,7 @@ bool Extension::LoadSystemIndicator(APIPermissionSet* api_permissions,
|
|
|
| // Because the manifest was successfully parsed, auto-grant the permission.
|
| // TODO(dewittj) Add this for all extension action APIs.
|
| - api_permissions->insert(APIPermission::kSystemIndicator);
|
| + initial_api_permissions()->insert(APIPermission::kSystemIndicator);
|
|
|
| return true;
|
| }
|
|
|