Chromium Code Reviews| Index: chrome/browser/extensions/extension_special_storage_policy.cc |
| diff --git a/chrome/browser/extensions/extension_special_storage_policy.cc b/chrome/browser/extensions/extension_special_storage_policy.cc |
| index 79d06547fd0cb242787cb8fe637ae4b7dd8a28fd..c1eddb6c7d4805aa9d3d3a5718506b5330cc9a67 100644 |
| --- a/chrome/browser/extensions/extension_special_storage_policy.cc |
| +++ b/chrome/browser/extensions/extension_special_storage_policy.cc |
| @@ -25,6 +25,7 @@ |
| #include "extensions/common/constants.h" |
| #include "extensions/common/extension.h" |
| #include "extensions/common/extension_set.h" |
| +#include "extensions/common/manifest_handlers/content_capabilities_handler.h" |
| #include "extensions/common/permissions/permissions_data.h" |
| #include "storage/browser/quota/quota_manager.h" |
| #include "storage/common/quota/quota_status_code.h" |
| @@ -96,7 +97,9 @@ bool ExtensionSpecialStoragePolicy::IsStorageUnlimited(const GURL& origin) { |
| return true; |
| base::AutoLock locker(lock_); |
| - return unlimited_extensions_.Contains(origin); |
| + return unlimited_extensions_.Contains(origin) || |
| + content_capabilities_unlimited_extensions_.GrantsCapabilitiesTo( |
| + origin); |
| } |
| bool ExtensionSpecialStoragePolicy::IsStorageSessionOnly(const GURL& origin) { |
| @@ -151,20 +154,23 @@ ExtensionSpecialStoragePolicy::ExtensionsProtectingOrigin( |
| void ExtensionSpecialStoragePolicy::GrantRightsForExtension( |
| const extensions::Extension* extension, |
| content::BrowserContext* browser_context) { |
| + base::AutoLock locker(lock_); |
| DCHECK(extension); |
| - if (!(NeedsProtection(extension) || |
| - extension->permissions_data()->HasAPIPermission( |
| - APIPermission::kUnlimitedStorage) || |
| - extension->permissions_data()->HasAPIPermission( |
| - APIPermission::kFileBrowserHandler) || |
| - extensions::AppIsolationInfo::HasIsolatedStorage(extension) || |
| - extension->is_app())) { |
| - return; |
| - } |
| int change_flags = 0; |
| - { |
| - base::AutoLock locker(lock_); |
| + if (extensions::ContentCapabilitiesInfo::Get(extension) |
| + .permissions.count(APIPermission::kUnlimitedStorage) > 0) { |
| + content_capabilities_unlimited_extensions_.Add(extension); |
| + change_flags |= SpecialStoragePolicy::STORAGE_UNLIMITED; |
| + } |
| + |
| + if (NeedsProtection(extension) || |
| + extension->permissions_data()->HasAPIPermission( |
| + APIPermission::kUnlimitedStorage) || |
| + extension->permissions_data()->HasAPIPermission( |
| + APIPermission::kFileBrowserHandler) || |
| + extensions::AppIsolationInfo::HasIsolatedStorage(extension) || |
| + extension->is_app()) { |
|
not at google - send to devlin
2014/12/12 23:10:13
(note that with the locking change I'm pretty sure
|
| if (NeedsProtection(extension) && protected_apps_.Add(extension)) |
| change_flags |= SpecialStoragePolicy::STORAGE_PROTECTED; |
| // FIXME: Does GrantRightsForExtension imply |extension| is installed? |
| @@ -176,7 +182,6 @@ void ExtensionSpecialStoragePolicy::GrantRightsForExtension( |
| unlimited_extensions_.Add(extension)) { |
| if (extension->is_hosted_app()) |
| LogHostedAppUnlimitedStorageUsage(extension, browser_context); |
| - |
| change_flags |= SpecialStoragePolicy::STORAGE_UNLIMITED; |
| } |
| @@ -196,19 +201,23 @@ void ExtensionSpecialStoragePolicy::GrantRightsForExtension( |
| void ExtensionSpecialStoragePolicy::RevokeRightsForExtension( |
| const extensions::Extension* extension) { |
| + base::AutoLock locker(lock_); |
| DCHECK(extension); |
| - if (!(NeedsProtection(extension) || |
| - extension->permissions_data()->HasAPIPermission( |
| - APIPermission::kUnlimitedStorage) || |
| - extension->permissions_data()->HasAPIPermission( |
| - APIPermission::kFileBrowserHandler) || |
| - extensions::AppIsolationInfo::HasIsolatedStorage(extension) || |
| - extension->is_app())) { |
| - return; |
| - } |
| + |
| int change_flags = 0; |
| - { |
| - base::AutoLock locker(lock_); |
| + if (extensions::ContentCapabilitiesInfo::Get(extension) |
| + .permissions.count(APIPermission::kUnlimitedStorage) > 0) { |
| + content_capabilities_unlimited_extensions_.Remove(extension); |
| + change_flags |= SpecialStoragePolicy::STORAGE_UNLIMITED; |
| + } |
| + |
| + if (NeedsProtection(extension) || |
| + extension->permissions_data()->HasAPIPermission( |
| + APIPermission::kUnlimitedStorage) || |
| + extension->permissions_data()->HasAPIPermission( |
| + APIPermission::kFileBrowserHandler) || |
| + extensions::AppIsolationInfo::HasIsolatedStorage(extension) || |
| + extension->is_app()) { |
| if (NeedsProtection(extension) && protected_apps_.Remove(extension)) |
| change_flags |= SpecialStoragePolicy::STORAGE_PROTECTED; |
| @@ -242,6 +251,7 @@ void ExtensionSpecialStoragePolicy::RevokeRightsForAllExtensions() { |
| unlimited_extensions_.Clear(); |
| file_handler_extensions_.Clear(); |
| isolated_extensions_.Clear(); |
| + content_capabilities_unlimited_extensions_.Clear(); |
| } |
| NotifyCleared(); |
| @@ -298,6 +308,17 @@ bool ExtensionSpecialStoragePolicy::SpecialCollection::Contains( |
| return !ExtensionsContaining(origin)->is_empty(); |
| } |
| +bool ExtensionSpecialStoragePolicy::SpecialCollection::GrantsCapabilitiesTo( |
| + const GURL& origin) { |
| + for (scoped_refptr<const Extension> extension : extensions_) { |
| + if (extensions::ContentCapabilitiesInfo::Get(extension.get()) |
| + .url_patterns.MatchesURL(origin)) { |
| + return true; |
| + } |
| + } |
| + return false; |
| +} |
| + |
| const extensions::ExtensionSet* |
| ExtensionSpecialStoragePolicy::SpecialCollection::ExtensionsContaining( |
| const GURL& origin) { |