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 @@ ...@@ -14,6 +14,7 @@
#include "chrome/common/content_settings.h" #include "chrome/common/content_settings.h"
#include "chrome/common/content_settings_types.h" #include "chrome/common/content_settings_types.h"
#include "chrome/common/extensions/extension.h" #include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/manifest_handlers/app_isolation_info.h"
#include "chrome/common/url_constants.h" #include "chrome/common/url_constants.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "extensions/common/constants.h" #include "extensions/common/constants.h"
...@@ -75,6 +76,11 @@ bool ExtensionSpecialStoragePolicy::IsFileHandler( ...@@ -75,6 +76,11 @@ bool ExtensionSpecialStoragePolicy::IsFileHandler(
return file_handler_extensions_.ContainsExtension(extension_id); 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( bool ExtensionSpecialStoragePolicy::NeedsProtection(
const extensions::Extension* extension) { const extensions::Extension* extension) {
return extension->is_hosted_app() && !extension->from_bookmark(); return extension->is_hosted_app() && !extension->from_bookmark();
...@@ -92,6 +98,7 @@ void ExtensionSpecialStoragePolicy::GrantRightsForExtension( ...@@ -92,6 +98,7 @@ void ExtensionSpecialStoragePolicy::GrantRightsForExtension(
if (!(NeedsProtection(extension) || if (!(NeedsProtection(extension) ||
extension->HasAPIPermission(APIPermission::kUnlimitedStorage) || extension->HasAPIPermission(APIPermission::kUnlimitedStorage) ||
extension->HasAPIPermission(APIPermission::kFileBrowserHandler) || extension->HasAPIPermission(APIPermission::kFileBrowserHandler) ||
extensions::AppIsolationInfo::HasIsolatedStorage(extension) ||
extension->is_app())) { extension->is_app())) {
return; return;
} }
...@@ -111,6 +118,9 @@ void ExtensionSpecialStoragePolicy::GrantRightsForExtension( ...@@ -111,6 +118,9 @@ void ExtensionSpecialStoragePolicy::GrantRightsForExtension(
if (extension->HasAPIPermission(APIPermission::kFileBrowserHandler)) if (extension->HasAPIPermission(APIPermission::kFileBrowserHandler))
file_handler_extensions_.Add(extension); file_handler_extensions_.Add(extension);
if (extensions::AppIsolationInfo::HasIsolatedStorage(extension))
isolated_extensions_.Add(extension);
} }
if (change_flags) { if (change_flags) {
...@@ -125,6 +135,7 @@ void ExtensionSpecialStoragePolicy::RevokeRightsForExtension( ...@@ -125,6 +135,7 @@ void ExtensionSpecialStoragePolicy::RevokeRightsForExtension(
if (!(NeedsProtection(extension) || if (!(NeedsProtection(extension) ||
extension->HasAPIPermission(APIPermission::kUnlimitedStorage) || extension->HasAPIPermission(APIPermission::kUnlimitedStorage) ||
extension->HasAPIPermission(APIPermission::kFileBrowserHandler) || extension->HasAPIPermission(APIPermission::kFileBrowserHandler) ||
extensions::AppIsolationInfo::HasIsolatedStorage(extension) ||
extension->is_app())) { extension->is_app())) {
return; return;
} }
...@@ -143,6 +154,9 @@ void ExtensionSpecialStoragePolicy::RevokeRightsForExtension( ...@@ -143,6 +154,9 @@ void ExtensionSpecialStoragePolicy::RevokeRightsForExtension(
if (extension->HasAPIPermission(APIPermission::kFileBrowserHandler)) if (extension->HasAPIPermission(APIPermission::kFileBrowserHandler))
file_handler_extensions_.Remove(extension); file_handler_extensions_.Remove(extension);
if (extensions::AppIsolationInfo::HasIsolatedStorage(extension))
isolated_extensions_.Remove(extension);
} }
if (change_flags) { if (change_flags) {
...@@ -158,6 +172,7 @@ void ExtensionSpecialStoragePolicy::RevokeRightsForAllExtensions() { ...@@ -158,6 +172,7 @@ void ExtensionSpecialStoragePolicy::RevokeRightsForAllExtensions() {
installed_apps_.Clear(); installed_apps_.Clear();
unlimited_extensions_.Clear(); unlimited_extensions_.Clear();
file_handler_extensions_.Clear(); file_handler_extensions_.Clear();
isolated_extensions_.Clear();
} }
NotifyCleared(); NotifyCleared();
......
...@@ -33,6 +33,7 @@ class ExtensionSpecialStoragePolicy : public quota::SpecialStoragePolicy { ...@@ -33,6 +33,7 @@ class ExtensionSpecialStoragePolicy : public quota::SpecialStoragePolicy {
virtual bool IsStorageSessionOnly(const GURL& origin) OVERRIDE; virtual bool IsStorageSessionOnly(const GURL& origin) OVERRIDE;
virtual bool CanQueryDiskSize(const GURL& origin) OVERRIDE; virtual bool CanQueryDiskSize(const GURL& origin) OVERRIDE;
virtual bool IsFileHandler(const std::string& extension_id) OVERRIDE; virtual bool IsFileHandler(const std::string& extension_id) OVERRIDE;
virtual bool HasIsolatedStorage(const GURL& origin) OVERRIDE;
virtual bool HasSessionOnlyOrigins() OVERRIDE; virtual bool HasSessionOnlyOrigins() OVERRIDE;
// Methods used by the ExtensionService to populate this class. // Methods used by the ExtensionService to populate this class.
...@@ -81,6 +82,7 @@ class ExtensionSpecialStoragePolicy : public quota::SpecialStoragePolicy { ...@@ -81,6 +82,7 @@ class ExtensionSpecialStoragePolicy : public quota::SpecialStoragePolicy {
SpecialCollection installed_apps_; SpecialCollection installed_apps_;
SpecialCollection unlimited_extensions_; SpecialCollection unlimited_extensions_;
SpecialCollection file_handler_extensions_; SpecialCollection file_handler_extensions_;
SpecialCollection isolated_extensions_;
scoped_refptr<CookieSettings> cookie_settings_; scoped_refptr<CookieSettings> cookie_settings_;
}; };
......
...@@ -262,6 +262,17 @@ TEST_F(ExtensionSpecialStoragePolicyTest, CanQueryDiskSize) { ...@@ -262,6 +262,17 @@ TEST_F(ExtensionSpecialStoragePolicyTest, CanQueryDiskSize) {
EXPECT_TRUE(policy_->CanQueryDiskSize(unlimited_app->url())); 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) { TEST_F(ExtensionSpecialStoragePolicyTest, OverlappingApps) {
scoped_refptr<Extension> protected_app(CreateProtectedApp()); scoped_refptr<Extension> protected_app(CreateProtectedApp());
scoped_refptr<Extension> unlimited_app(CreateUnlimitedApp()); scoped_refptr<Extension> unlimited_app(CreateUnlimitedApp());
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#include "webkit/browser/quota/mock_special_storage_policy.h" #include "webkit/browser/quota/mock_special_storage_policy.h"
#include "base/stl_util.h"
namespace quota { namespace quota {
MockSpecialStoragePolicy::MockSpecialStoragePolicy() MockSpecialStoragePolicy::MockSpecialStoragePolicy()
...@@ -11,25 +13,29 @@ MockSpecialStoragePolicy::MockSpecialStoragePolicy() ...@@ -11,25 +13,29 @@ MockSpecialStoragePolicy::MockSpecialStoragePolicy()
} }
bool MockSpecialStoragePolicy::IsStorageProtected(const GURL& origin) { bool MockSpecialStoragePolicy::IsStorageProtected(const GURL& origin) {
return protected_.find(origin) != protected_.end(); return ContainsKey(protected_, origin);
} }
bool MockSpecialStoragePolicy::IsStorageUnlimited(const GURL& origin) { bool MockSpecialStoragePolicy::IsStorageUnlimited(const GURL& origin) {
if (all_unlimited_) if (all_unlimited_)
return true; return true;
return unlimited_.find(origin) != unlimited_.end(); return ContainsKey(unlimited_, origin);
} }
bool MockSpecialStoragePolicy::IsStorageSessionOnly(const GURL& 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) { 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) { 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() { bool MockSpecialStoragePolicy::HasSessionOnlyOrigins() {
......
...@@ -22,6 +22,7 @@ class MockSpecialStoragePolicy : public quota::SpecialStoragePolicy { ...@@ -22,6 +22,7 @@ class MockSpecialStoragePolicy : public quota::SpecialStoragePolicy {
virtual bool IsStorageSessionOnly(const GURL& origin) OVERRIDE; virtual bool IsStorageSessionOnly(const GURL& origin) OVERRIDE;
virtual bool CanQueryDiskSize(const GURL& origin) OVERRIDE; virtual bool CanQueryDiskSize(const GURL& origin) OVERRIDE;
virtual bool IsFileHandler(const std::string& extension_id) OVERRIDE; virtual bool IsFileHandler(const std::string& extension_id) OVERRIDE;
virtual bool HasIsolatedStorage(const GURL& origin) OVERRIDE;
virtual bool HasSessionOnlyOrigins() OVERRIDE; virtual bool HasSessionOnlyOrigins() OVERRIDE;
void AddProtected(const GURL& origin) { void AddProtected(const GURL& origin) {
...@@ -48,6 +49,10 @@ class MockSpecialStoragePolicy : public quota::SpecialStoragePolicy { ...@@ -48,6 +49,10 @@ class MockSpecialStoragePolicy : public quota::SpecialStoragePolicy {
file_handlers_.insert(id); file_handlers_.insert(id);
} }
void AddIsolated(const GURL& origin) {
isolated_.insert(origin);
}
void SetAllUnlimited(bool all_unlimited) { void SetAllUnlimited(bool all_unlimited) {
all_unlimited_ = all_unlimited; all_unlimited_ = all_unlimited;
} }
...@@ -58,6 +63,7 @@ class MockSpecialStoragePolicy : public quota::SpecialStoragePolicy { ...@@ -58,6 +63,7 @@ class MockSpecialStoragePolicy : public quota::SpecialStoragePolicy {
session_only_.clear(); session_only_.clear();
can_query_disk_size_.clear(); can_query_disk_size_.clear();
file_handlers_.clear(); file_handlers_.clear();
isolated_.clear();
all_unlimited_ = false; all_unlimited_ = false;
} }
...@@ -81,6 +87,7 @@ class MockSpecialStoragePolicy : public quota::SpecialStoragePolicy { ...@@ -81,6 +87,7 @@ class MockSpecialStoragePolicy : public quota::SpecialStoragePolicy {
std::set<GURL> unlimited_; std::set<GURL> unlimited_;
std::set<GURL> session_only_; std::set<GURL> session_only_;
std::set<GURL> can_query_disk_size_; std::set<GURL> can_query_disk_size_;
std::set<GURL> isolated_;
std::set<std::string> file_handlers_; std::set<std::string> file_handlers_;
bool all_unlimited_; bool all_unlimited_;
......
...@@ -56,6 +56,9 @@ class WEBKIT_STORAGE_EXPORT SpecialStoragePolicy ...@@ -56,6 +56,9 @@ class WEBKIT_STORAGE_EXPORT SpecialStoragePolicy
// file handler. // file handler.
virtual bool IsFileHandler(const std::string& extension_id) = 0; 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 // Some origins are only allowed to store session-only data which is deleted
// when the session ends. // when the session ends.
virtual bool IsStorageSessionOnly(const GURL& origin) = 0; 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