Commit df22562a authored by kinuko@chromium.org's avatar kinuko@chromium.org

Add SpecialStoragePolicy::HasIsolatedStorage

So that we can tell if the origin has isolated storage partition or not.

BUG=242272
TEST=ExtensionSpecialStoragePolicyTest.HasIsolatedStorage
R=asargent@chromium.org, michaeln@chromium.org

Review URL: https://codereview.chromium.org/15862008

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@203129 0039d316-1c4b-4281-b951-d872f2087c98
parent 1372053b
......@@ -14,6 +14,7 @@
#include "chrome/common/content_settings.h"
#include "chrome/common/content_settings_types.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/manifest_handlers/app_isolation_info.h"
#include "chrome/common/url_constants.h"
#include "content/public/browser/browser_thread.h"
#include "extensions/common/constants.h"
......@@ -75,6 +76,11 @@ bool ExtensionSpecialStoragePolicy::IsFileHandler(
return file_handler_extensions_.ContainsExtension(extension_id);
}
bool ExtensionSpecialStoragePolicy::HasIsolatedStorage(const GURL& origin) {
base::AutoLock locker(lock_);
return isolated_extensions_.Contains(origin);
}
bool ExtensionSpecialStoragePolicy::NeedsProtection(
const extensions::Extension* extension) {
return extension->is_hosted_app() && !extension->from_bookmark();
......@@ -92,6 +98,7 @@ void ExtensionSpecialStoragePolicy::GrantRightsForExtension(
if (!(NeedsProtection(extension) ||
extension->HasAPIPermission(APIPermission::kUnlimitedStorage) ||
extension->HasAPIPermission(APIPermission::kFileBrowserHandler) ||
extensions::AppIsolationInfo::HasIsolatedStorage(extension) ||
extension->is_app())) {
return;
}
......@@ -111,6 +118,9 @@ void ExtensionSpecialStoragePolicy::GrantRightsForExtension(
if (extension->HasAPIPermission(APIPermission::kFileBrowserHandler))
file_handler_extensions_.Add(extension);
if (extensions::AppIsolationInfo::HasIsolatedStorage(extension))
isolated_extensions_.Add(extension);
}
if (change_flags) {
......@@ -125,6 +135,7 @@ void ExtensionSpecialStoragePolicy::RevokeRightsForExtension(
if (!(NeedsProtection(extension) ||
extension->HasAPIPermission(APIPermission::kUnlimitedStorage) ||
extension->HasAPIPermission(APIPermission::kFileBrowserHandler) ||
extensions::AppIsolationInfo::HasIsolatedStorage(extension) ||
extension->is_app())) {
return;
}
......@@ -143,6 +154,9 @@ void ExtensionSpecialStoragePolicy::RevokeRightsForExtension(
if (extension->HasAPIPermission(APIPermission::kFileBrowserHandler))
file_handler_extensions_.Remove(extension);
if (extensions::AppIsolationInfo::HasIsolatedStorage(extension))
isolated_extensions_.Remove(extension);
}
if (change_flags) {
......@@ -158,6 +172,7 @@ void ExtensionSpecialStoragePolicy::RevokeRightsForAllExtensions() {
installed_apps_.Clear();
unlimited_extensions_.Clear();
file_handler_extensions_.Clear();
isolated_extensions_.Clear();
}
NotifyCleared();
......
......@@ -33,6 +33,7 @@ class ExtensionSpecialStoragePolicy : public quota::SpecialStoragePolicy {
virtual bool IsStorageSessionOnly(const GURL& origin) OVERRIDE;
virtual bool CanQueryDiskSize(const GURL& origin) OVERRIDE;
virtual bool IsFileHandler(const std::string& extension_id) OVERRIDE;
virtual bool HasIsolatedStorage(const GURL& origin) OVERRIDE;
virtual bool HasSessionOnlyOrigins() OVERRIDE;
// Methods used by the ExtensionService to populate this class.
......@@ -81,6 +82,7 @@ class ExtensionSpecialStoragePolicy : public quota::SpecialStoragePolicy {
SpecialCollection installed_apps_;
SpecialCollection unlimited_extensions_;
SpecialCollection file_handler_extensions_;
SpecialCollection isolated_extensions_;
scoped_refptr<CookieSettings> cookie_settings_;
};
......
......@@ -262,6 +262,17 @@ TEST_F(ExtensionSpecialStoragePolicyTest, CanQueryDiskSize) {
EXPECT_TRUE(policy_->CanQueryDiskSize(unlimited_app->url()));
}
TEST_F(ExtensionSpecialStoragePolicyTest, HasIsolatedStorage) {
const GURL kHttpUrl("http://foo");
const GURL kExtensionUrl("chrome-extension://bar");
scoped_refptr<Extension> app(CreateRegularApp());
policy_->GrantRightsForExtension(app);
EXPECT_FALSE(policy_->HasIsolatedStorage(kHttpUrl));
EXPECT_FALSE(policy_->HasIsolatedStorage(kExtensionUrl));
EXPECT_TRUE(policy_->HasIsolatedStorage(app->url()));
}
TEST_F(ExtensionSpecialStoragePolicyTest, OverlappingApps) {
scoped_refptr<Extension> protected_app(CreateProtectedApp());
scoped_refptr<Extension> unlimited_app(CreateUnlimitedApp());
......
......@@ -4,6 +4,8 @@
#include "webkit/browser/quota/mock_special_storage_policy.h"
#include "base/stl_util.h"
namespace quota {
MockSpecialStoragePolicy::MockSpecialStoragePolicy()
......@@ -11,25 +13,29 @@ MockSpecialStoragePolicy::MockSpecialStoragePolicy()
}
bool MockSpecialStoragePolicy::IsStorageProtected(const GURL& origin) {
return protected_.find(origin) != protected_.end();
return ContainsKey(protected_, origin);
}
bool MockSpecialStoragePolicy::IsStorageUnlimited(const GURL& origin) {
if (all_unlimited_)
return true;
return unlimited_.find(origin) != unlimited_.end();
return ContainsKey(unlimited_, origin);
}
bool MockSpecialStoragePolicy::IsStorageSessionOnly(const GURL& origin) {
return session_only_.find(origin) != session_only_.end();
return ContainsKey(session_only_, origin);
}
bool MockSpecialStoragePolicy::CanQueryDiskSize(const GURL& origin) {
return can_query_disk_size_.find(origin) != can_query_disk_size_.end();
return ContainsKey(can_query_disk_size_, origin);
}
bool MockSpecialStoragePolicy::IsFileHandler(const std::string& extension_id) {
return file_handlers_.find(extension_id) != file_handlers_.end();
return ContainsKey(file_handlers_, extension_id);
}
bool MockSpecialStoragePolicy::HasIsolatedStorage(const GURL& origin) {
return ContainsKey(isolated_, origin);
}
bool MockSpecialStoragePolicy::HasSessionOnlyOrigins() {
......
......@@ -22,6 +22,7 @@ class MockSpecialStoragePolicy : public quota::SpecialStoragePolicy {
virtual bool IsStorageSessionOnly(const GURL& origin) OVERRIDE;
virtual bool CanQueryDiskSize(const GURL& origin) OVERRIDE;
virtual bool IsFileHandler(const std::string& extension_id) OVERRIDE;
virtual bool HasIsolatedStorage(const GURL& origin) OVERRIDE;
virtual bool HasSessionOnlyOrigins() OVERRIDE;
void AddProtected(const GURL& origin) {
......@@ -48,6 +49,10 @@ class MockSpecialStoragePolicy : public quota::SpecialStoragePolicy {
file_handlers_.insert(id);
}
void AddIsolated(const GURL& origin) {
isolated_.insert(origin);
}
void SetAllUnlimited(bool all_unlimited) {
all_unlimited_ = all_unlimited;
}
......@@ -58,6 +63,7 @@ class MockSpecialStoragePolicy : public quota::SpecialStoragePolicy {
session_only_.clear();
can_query_disk_size_.clear();
file_handlers_.clear();
isolated_.clear();
all_unlimited_ = false;
}
......@@ -81,6 +87,7 @@ class MockSpecialStoragePolicy : public quota::SpecialStoragePolicy {
std::set<GURL> unlimited_;
std::set<GURL> session_only_;
std::set<GURL> can_query_disk_size_;
std::set<GURL> isolated_;
std::set<std::string> file_handlers_;
bool all_unlimited_;
......
......@@ -56,6 +56,9 @@ class WEBKIT_STORAGE_EXPORT SpecialStoragePolicy
// file handler.
virtual bool IsFileHandler(const std::string& extension_id) = 0;
// Checks if the origin contains per-site isolated storage.
virtual bool HasIsolatedStorage(const GURL& origin) = 0;
// Some origins are only allowed to store session-only data which is deleted
// when the session ends.
virtual bool IsStorageSessionOnly(const GURL& origin) = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment