Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3406)

Unified Diff: chrome/browser/extensions/settings/settings_frontend.cc

Issue 9284013: Extension Storage API: expose storage quota information to extensions, via: (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: with use-after-free fixed Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/settings/settings_frontend.cc
diff --git a/chrome/browser/extensions/settings/settings_frontend.cc b/chrome/browser/extensions/settings/settings_frontend.cc
index 8d7d914cff0d9cfaa6eddd268a89a3dc7f529eb5..6c5fbedf04e1f0785175002333943ab5e6c24e0c 100644
--- a/chrome/browser/extensions/settings/settings_frontend.cc
+++ b/chrome/browser/extensions/settings/settings_frontend.cc
@@ -6,6 +6,7 @@
#include "base/bind.h"
#include "base/file_path.h"
+#include "base/string_number_conversions.h"
#include "chrome/browser/extensions/extension_event_names.h"
#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/extensions/extension_service.h"
@@ -14,6 +15,7 @@
#include "chrome/browser/extensions/settings/settings_leveldb_storage.h"
#include "chrome/browser/extensions/settings/weak_unlimited_settings_storage.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/extensions/api/extension_api.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_service.h"
@@ -23,29 +25,6 @@ namespace extensions {
namespace {
-const SettingsStorageQuotaEnforcer::Limits kSyncQuota = {
- // 100K should be enough for simple use, but this can be increased as demand
- // increases.
- 100 * 1024,
-
- // Sync supports 5k per settings, so be a bit more restrictive than that.
- 2048,
-
- // Keep low for sync.
- 512
-};
-
-const SettingsStorageQuotaEnforcer::Limits kLocalQuota = {
- // Same as localStorage (5MB).
- 5 * 1000 * 1024,
-
- // No need to be restrictive per key here.
- UINT_MAX,
-
- // Ditto.
- UINT_MAX
-};
-
// Settings change Observer which forwards changes on to the extension
// processes for |profile| and its incognito partner if it exists.
class DefaultObserver : public SettingsObserver {
@@ -109,6 +88,40 @@ void CallbackWithUnlimitedStorage(
callback.Run(&unlimited_storage);
}
+// Returns the integer at |path| in |dict| as a size_t, or a default value if
+// there's nothing found at that path.
+size_t GetStringAsInteger(
+ const DictionaryValue& dict, const std::string& path, size_t default_size) {
+ std::string as_string;
+ if (!dict.GetString(path, &as_string))
+ return default_size;
+ size_t as_integer = default_size;
+ CHECK(base::StringToSizeT(as_string, &as_integer));
+ return as_integer;
+}
+
+// Constructs a |Limits| configuration by looking up the QUOTA_BYTES,
+// QUOTA_BYTES_PER_ITEM, and MAX_ITEMS properties of a storage area defined
+// in chrome/common/extensions/api/storage.json (via ExtensionAPI).
+SettingsStorageQuotaEnforcer::Limits GetLimitsFromExtensionAPI(
+ const std::string& storage_area_id) {
+ const DictionaryValue* storage_schema =
+ ExtensionAPI::GetInstance()->GetSchema("storage");
+ CHECK(storage_schema);
+
+ DictionaryValue* properties = NULL;
+ storage_schema->GetDictionary(
+ "properties." + storage_area_id + ".properties", &properties);
+ CHECK(properties);
+
+ SettingsStorageQuotaEnforcer::Limits limits = {
+ GetStringAsInteger(*properties, "QUOTA_BYTES.value", UINT_MAX),
+ GetStringAsInteger(*properties, "QUOTA_BYTES_PER_ITEM.value", UINT_MAX),
+ GetStringAsInteger(*properties, "MAX_ITEMS.value", UINT_MAX),
+ };
+ return limits;
+}
+
} // namespace
// Ref-counted container for a SettingsBackend object.
@@ -188,7 +201,7 @@ class SettingsFrontend::BackendWrapper
// Only need these until |backend_| exists.
scoped_refptr<SettingsStorageFactory> storage_factory_;
- const SettingsStorageQuotaEnforcer::Limits& quota_;
+ const SettingsStorageQuotaEnforcer::Limits quota_;
scoped_refptr<SettingsObserverList> observers_;
// Wrapped Backend. Used exclusively on the FILE thread, and is created on
@@ -214,7 +227,9 @@ SettingsFrontend* SettingsFrontend::Create(
SettingsFrontend::SettingsFrontend(
const scoped_refptr<SettingsStorageFactory>& factory, Profile* profile)
- : profile_(profile),
+ : local_quota_limit_(GetLimitsFromExtensionAPI("local")),
+ sync_quota_limit_(GetLimitsFromExtensionAPI("sync")),
+ profile_(profile),
observers_(new SettingsObserverList()),
profile_observer_(new DefaultObserver(profile)) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
@@ -226,28 +241,28 @@ SettingsFrontend::SettingsFrontend(
backends_[settings_namespace::LOCAL].app =
BackendWrapper::CreateAndInit(
factory,
- kLocalQuota,
+ local_quota_limit_,
observers_,
profile_path.AppendASCII(
ExtensionService::kLocalAppSettingsDirectoryName));
backends_[settings_namespace::LOCAL].extension =
BackendWrapper::CreateAndInit(
factory,
- kLocalQuota,
+ local_quota_limit_,
observers_,
profile_path.AppendASCII(
ExtensionService::kLocalExtensionSettingsDirectoryName));
backends_[settings_namespace::SYNC].app =
BackendWrapper::CreateAndInit(
factory,
- kSyncQuota,
+ sync_quota_limit_,
observers_,
profile_path.AppendASCII(
ExtensionService::kSyncAppSettingsDirectoryName));
backends_[settings_namespace::SYNC].extension =
BackendWrapper::CreateAndInit(
factory,
- kSyncQuota,
+ sync_quota_limit_,
observers_,
profile_path.AppendASCII(
ExtensionService::kSyncExtensionSettingsDirectoryName));
« no previous file with comments | « chrome/browser/extensions/settings/settings_frontend.h ('k') | chrome/browser/extensions/settings/settings_leveldb_storage.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698