| Index: chrome/browser/extensions/api/storage/storage_api.cc
|
| ===================================================================
|
| --- chrome/browser/extensions/api/storage/storage_api.cc (revision 176053)
|
| +++ chrome/browser/extensions/api/storage/storage_api.cc (working copy)
|
| @@ -1,286 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/extensions/api/storage/storage_api.h"
|
| -
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/stringprintf.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/extensions/api/storage/settings_frontend.h"
|
| -#include "chrome/browser/extensions/extension_service.h"
|
| -#include "chrome/browser/extensions/extensions_quota_service.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/common/extensions/api/storage.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -
|
| -namespace extensions {
|
| -
|
| -using content::BrowserThread;
|
| -
|
| -namespace {
|
| -const char kUnsupportedArgumentType[] = "Unsupported argument type";
|
| -const char kInvalidNamespaceErrorMessage[] =
|
| - "\"%s\" is not available in this instance of Chrome";
|
| -const char kManagedNamespaceDisabledErrorMessage[] =
|
| - "\"managed\" is disabled. Use \"--%s\" to enable it.";
|
| -const char kStorageErrorMessage[] = "Storage error";
|
| -} // namespace
|
| -
|
| -// SettingsFunction
|
| -
|
| -SettingsFunction::SettingsFunction()
|
| - : settings_namespace_(settings_namespace::INVALID) {}
|
| -
|
| -SettingsFunction::~SettingsFunction() {}
|
| -
|
| -bool SettingsFunction::ShouldSkipQuotaLimiting() const {
|
| - // Only apply quota if this is for sync storage.
|
| - std::string settings_namespace_string;
|
| - if (!args_->GetString(0, &settings_namespace_string)) {
|
| - // This is an error but it will be caught in RunImpl(), there is no
|
| - // mechanism to signify an error from this function.
|
| - return false;
|
| - }
|
| - return settings_namespace_string != "sync";
|
| -}
|
| -
|
| -bool SettingsFunction::RunImpl() {
|
| - std::string settings_namespace_string;
|
| - EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &settings_namespace_string));
|
| - args_->Remove(0, NULL);
|
| - settings_namespace_ =
|
| - settings_namespace::FromString(settings_namespace_string);
|
| - EXTENSION_FUNCTION_VALIDATE(
|
| - settings_namespace_ != settings_namespace::INVALID);
|
| -
|
| - SettingsFrontend* frontend =
|
| - profile()->GetExtensionService()->settings_frontend();
|
| - if (!frontend->IsStorageEnabled(settings_namespace_)) {
|
| - error_ = base::StringPrintf(kInvalidNamespaceErrorMessage,
|
| - settings_namespace_string.c_str());
|
| - return false;
|
| - }
|
| -
|
| - observers_ = frontend->GetObservers();
|
| - frontend->RunWithStorage(
|
| - extension_id(),
|
| - settings_namespace_,
|
| - base::Bind(&SettingsFunction::AsyncRunWithStorage, this));
|
| - return true;
|
| -}
|
| -
|
| -void SettingsFunction::AsyncRunWithStorage(ValueStore* storage) {
|
| - bool success = RunWithStorage(storage);
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI,
|
| - FROM_HERE,
|
| - base::Bind(&SettingsFunction::SendResponse, this, success));
|
| -}
|
| -
|
| -bool SettingsFunction::UseReadResult(ValueStore::ReadResult result) {
|
| - if (result->HasError()) {
|
| - error_ = result->error();
|
| - return false;
|
| - }
|
| -
|
| - SetResult(result->settings().release());
|
| - return true;
|
| -}
|
| -
|
| -bool SettingsFunction::UseWriteResult(ValueStore::WriteResult result) {
|
| - if (result->HasError()) {
|
| - error_ = result->error();
|
| - return false;
|
| - }
|
| -
|
| - if (!result->changes().empty()) {
|
| - observers_->Notify(
|
| - &SettingsObserver::OnSettingsChanged,
|
| - extension_id(),
|
| - settings_namespace_,
|
| - ValueStoreChange::ToJson(result->changes()));
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -// Concrete settings functions
|
| -
|
| -namespace {
|
| -
|
| -// Adds all StringValues from a ListValue to a vector of strings.
|
| -void AddAllStringValues(const ListValue& from, std::vector<std::string>* to) {
|
| - DCHECK(to->empty());
|
| - std::string as_string;
|
| - for (ListValue::const_iterator it = from.begin(); it != from.end(); ++it) {
|
| - if ((*it)->GetAsString(&as_string)) {
|
| - to->push_back(as_string);
|
| - }
|
| - }
|
| -}
|
| -
|
| -// Gets the keys of a DictionaryValue.
|
| -std::vector<std::string> GetKeys(const DictionaryValue& dict) {
|
| - std::vector<std::string> keys;
|
| - for (DictionaryValue::key_iterator it = dict.begin_keys();
|
| - it != dict.end_keys(); ++it) {
|
| - keys.push_back(*it);
|
| - }
|
| - return keys;
|
| -}
|
| -
|
| -// Creates quota heuristics for settings modification.
|
| -void GetModificationQuotaLimitHeuristics(QuotaLimitHeuristics* heuristics) {
|
| - QuotaLimitHeuristic::Config longLimitConfig = {
|
| - // See storage.json for current value.
|
| - api::storage::sync::MAX_WRITE_OPERATIONS_PER_HOUR,
|
| - base::TimeDelta::FromHours(1)
|
| - };
|
| - heuristics->push_back(
|
| - new ExtensionsQuotaService::TimedLimit(
|
| - longLimitConfig,
|
| - new QuotaLimitHeuristic::SingletonBucketMapper(),
|
| - "MAX_WRITE_OPERATIONS_PER_HOUR"));
|
| -
|
| - // A max of 10 operations per minute, sustained over 10 minutes.
|
| - QuotaLimitHeuristic::Config shortLimitConfig = {
|
| - // See storage.json for current value.
|
| - api::storage::sync::MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE,
|
| - base::TimeDelta::FromMinutes(1)
|
| - };
|
| - heuristics->push_back(
|
| - new ExtensionsQuotaService::SustainedLimit(
|
| - base::TimeDelta::FromMinutes(10),
|
| - shortLimitConfig,
|
| - new QuotaLimitHeuristic::SingletonBucketMapper(),
|
| - "MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE"));
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -bool StorageGetFunction::RunWithStorage(ValueStore* storage) {
|
| - Value* input = NULL;
|
| - EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &input));
|
| -
|
| - switch (input->GetType()) {
|
| - case Value::TYPE_NULL:
|
| - return UseReadResult(storage->Get());
|
| -
|
| - case Value::TYPE_STRING: {
|
| - std::string as_string;
|
| - input->GetAsString(&as_string);
|
| - return UseReadResult(storage->Get(as_string));
|
| - }
|
| -
|
| - case Value::TYPE_LIST: {
|
| - std::vector<std::string> as_string_list;
|
| - AddAllStringValues(*static_cast<ListValue*>(input), &as_string_list);
|
| - return UseReadResult(storage->Get(as_string_list));
|
| - }
|
| -
|
| - case Value::TYPE_DICTIONARY: {
|
| - DictionaryValue* as_dict = static_cast<DictionaryValue*>(input);
|
| - ValueStore::ReadResult result = storage->Get(GetKeys(*as_dict));
|
| - if (result->HasError()) {
|
| - return UseReadResult(result.Pass());
|
| - }
|
| -
|
| - DictionaryValue* with_default_values = as_dict->DeepCopy();
|
| - with_default_values->MergeDictionary(result->settings().get());
|
| - return UseReadResult(
|
| - ValueStore::MakeReadResult(with_default_values));
|
| - }
|
| -
|
| - default:
|
| - return UseReadResult(
|
| - ValueStore::MakeReadResult(kUnsupportedArgumentType));
|
| - }
|
| -}
|
| -
|
| -bool StorageGetBytesInUseFunction::RunWithStorage(ValueStore* storage) {
|
| - Value* input = NULL;
|
| - EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &input));
|
| -
|
| - size_t bytes_in_use = 0;
|
| -
|
| - switch (input->GetType()) {
|
| - case Value::TYPE_NULL:
|
| - bytes_in_use = storage->GetBytesInUse();
|
| - break;
|
| -
|
| - case Value::TYPE_STRING: {
|
| - std::string as_string;
|
| - input->GetAsString(&as_string);
|
| - bytes_in_use = storage->GetBytesInUse(as_string);
|
| - break;
|
| - }
|
| -
|
| - case Value::TYPE_LIST: {
|
| - std::vector<std::string> as_string_list;
|
| - AddAllStringValues(*static_cast<ListValue*>(input), &as_string_list);
|
| - bytes_in_use = storage->GetBytesInUse(as_string_list);
|
| - break;
|
| - }
|
| -
|
| - default:
|
| - error_ = kUnsupportedArgumentType;
|
| - return false;
|
| - }
|
| -
|
| - SetResult(Value::CreateIntegerValue(bytes_in_use));
|
| - return true;
|
| -}
|
| -
|
| -bool StorageSetFunction::RunWithStorage(ValueStore* storage) {
|
| - DictionaryValue* input = NULL;
|
| - EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &input));
|
| - return UseWriteResult(storage->Set(ValueStore::DEFAULTS, *input));
|
| -}
|
| -
|
| -void StorageSetFunction::GetQuotaLimitHeuristics(
|
| - QuotaLimitHeuristics* heuristics) const {
|
| - GetModificationQuotaLimitHeuristics(heuristics);
|
| -}
|
| -
|
| -bool StorageRemoveFunction::RunWithStorage(ValueStore* storage) {
|
| - Value* input = NULL;
|
| - EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &input));
|
| -
|
| - switch (input->GetType()) {
|
| - case Value::TYPE_STRING: {
|
| - std::string as_string;
|
| - input->GetAsString(&as_string);
|
| - return UseWriteResult(storage->Remove(as_string));
|
| - }
|
| -
|
| - case Value::TYPE_LIST: {
|
| - std::vector<std::string> as_string_list;
|
| - AddAllStringValues(*static_cast<ListValue*>(input), &as_string_list);
|
| - return UseWriteResult(storage->Remove(as_string_list));
|
| - }
|
| -
|
| - default:
|
| - return UseWriteResult(
|
| - ValueStore::MakeWriteResult(kUnsupportedArgumentType));
|
| - };
|
| -}
|
| -
|
| -void StorageRemoveFunction::GetQuotaLimitHeuristics(
|
| - QuotaLimitHeuristics* heuristics) const {
|
| - GetModificationQuotaLimitHeuristics(heuristics);
|
| -}
|
| -
|
| -bool StorageClearFunction::RunWithStorage(ValueStore* storage) {
|
| - return UseWriteResult(storage->Clear());
|
| -}
|
| -
|
| -void StorageClearFunction::GetQuotaLimitHeuristics(
|
| - QuotaLimitHeuristics* heuristics) const {
|
| - GetModificationQuotaLimitHeuristics(heuristics);
|
| -}
|
| -
|
| -} // namespace extensions
|
|
|