| 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 8d85eea19ee4c02e7f30fc76e32168f7eb63e14c..940a53ce0c986776b59da4b762007a83c2ef0b23 100644
|
| --- a/chrome/browser/extensions/extension_special_storage_policy.cc
|
| +++ b/chrome/browser/extensions/extension_special_storage_policy.cc
|
| @@ -6,6 +6,7 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/logging.h"
|
| +#include "base/stl_util.h"
|
| #include "chrome/browser/content_settings/cookie_settings.h"
|
| #include "chrome/common/content_settings.h"
|
| #include "chrome/common/content_settings_types.h"
|
| @@ -66,10 +67,16 @@ bool ExtensionSpecialStoragePolicy::NeedsProtection(
|
| return extension->is_hosted_app() && !extension->from_bookmark();
|
| }
|
|
|
| +const ExtensionSet* ExtensionSpecialStoragePolicy::ExtensionsProtectingOrigin(
|
| + const GURL& origin) {
|
| + base::AutoLock locker(lock_);
|
| + return protected_apps_.ExtensionsContaining(origin);
|
| +}
|
| +
|
| void ExtensionSpecialStoragePolicy::GrantRightsForExtension(
|
| const extensions::Extension* extension) {
|
| DCHECK(extension);
|
| - if (!extension->is_hosted_app() &&
|
| + if (!NeedsProtection(extension) &&
|
| !extension->HasAPIPermission(
|
| APIPermission::kUnlimitedStorage) &&
|
| !extension->HasAPIPermission(
|
| @@ -93,7 +100,7 @@ void ExtensionSpecialStoragePolicy::GrantRightsForExtension(
|
| void ExtensionSpecialStoragePolicy::RevokeRightsForExtension(
|
| const extensions::Extension* extension) {
|
| DCHECK(extension);
|
| - if (!extension->is_hosted_app() &&
|
| + if (!NeedsProtection(extension) &&
|
| !extension->HasAPIPermission(
|
| APIPermission::kUnlimitedStorage) &&
|
| !extension->HasAPIPermission(
|
| @@ -102,14 +109,12 @@ void ExtensionSpecialStoragePolicy::RevokeRightsForExtension(
|
| }
|
| {
|
| base::AutoLock locker(lock_);
|
| - if (extension->is_hosted_app() && !extension->from_bookmark())
|
| + if (NeedsProtection(extension))
|
| protected_apps_.Remove(extension);
|
| if (extension->HasAPIPermission(APIPermission::kUnlimitedStorage))
|
| unlimited_extensions_.Remove(extension);
|
| - if (extension->HasAPIPermission(
|
| - APIPermission::kFileBrowserHandler)) {
|
| + if (extension->HasAPIPermission(APIPermission::kFileBrowserHandler))
|
| file_handler_extensions_.Remove(extension);
|
| - }
|
| }
|
| NotifyChanged();
|
| }
|
| @@ -139,43 +144,55 @@ void ExtensionSpecialStoragePolicy::NotifyChanged() {
|
|
|
| ExtensionSpecialStoragePolicy::SpecialCollection::SpecialCollection() {}
|
|
|
| -ExtensionSpecialStoragePolicy::SpecialCollection::~SpecialCollection() {}
|
| +ExtensionSpecialStoragePolicy::SpecialCollection::~SpecialCollection() {
|
| + STLDeleteValues(&cached_results_);
|
| +}
|
|
|
| bool ExtensionSpecialStoragePolicy::SpecialCollection::Contains(
|
| const GURL& origin) {
|
| + return !ExtensionsContaining(origin)->is_empty();
|
| +}
|
| +
|
| +const ExtensionSet*
|
| +ExtensionSpecialStoragePolicy::SpecialCollection::ExtensionsContaining(
|
| + const GURL& origin) {
|
| CachedResults::const_iterator found = cached_results_.find(origin);
|
| if (found != cached_results_.end())
|
| return found->second;
|
|
|
| - for (Extensions::const_iterator iter = extensions_.begin();
|
| + ExtensionSet* result = new ExtensionSet();
|
| + for (ExtensionSet::const_iterator iter = extensions_.begin();
|
| iter != extensions_.end(); ++iter) {
|
| - if (iter->second->OverlapsWithOrigin(origin)) {
|
| - cached_results_[origin] = true;
|
| - return true;
|
| - }
|
| + if ((*iter)->OverlapsWithOrigin(origin))
|
| + result->Insert(*iter);
|
| }
|
| - cached_results_[origin] = false;
|
| - return false;
|
| + cached_results_[origin] = result;
|
| + return result;
|
| }
|
|
|
| bool ExtensionSpecialStoragePolicy::SpecialCollection::ContainsExtension(
|
| const std::string& extension_id) {
|
| - return extensions_.find(extension_id) != extensions_.end();
|
| + return extensions_.Contains(extension_id);
|
| }
|
|
|
| void ExtensionSpecialStoragePolicy::SpecialCollection::Add(
|
| const extensions::Extension* extension) {
|
| - cached_results_.clear();
|
| - extensions_[extension->id()] = extension;
|
| + ClearCache();
|
| + extensions_.Insert(extension);
|
| }
|
|
|
| void ExtensionSpecialStoragePolicy::SpecialCollection::Remove(
|
| const extensions::Extension* extension) {
|
| - cached_results_.clear();
|
| - extensions_.erase(extension->id());
|
| + ClearCache();
|
| + extensions_.Remove(extension->id());
|
| }
|
|
|
| void ExtensionSpecialStoragePolicy::SpecialCollection::Clear() {
|
| + ClearCache();
|
| + extensions_.Clear();
|
| +}
|
| +
|
| +void ExtensionSpecialStoragePolicy::SpecialCollection::ClearCache() {
|
| + STLDeleteValues(&cached_results_);
|
| cached_results_.clear();
|
| - extensions_.clear();
|
| }
|
|
|