diff options
Diffstat (limited to 'chrome/browser/extensions/extension_settings_api.cc')
-rw-r--r-- | chrome/browser/extensions/extension_settings_api.cc | 129 |
1 files changed, 82 insertions, 47 deletions
diff --git a/chrome/browser/extensions/extension_settings_api.cc b/chrome/browser/extensions/extension_settings_api.cc index 60cb933..d96c47b 100644 --- a/chrome/browser/extensions/extension_settings_api.cc +++ b/chrome/browser/extensions/extension_settings_api.cc @@ -43,37 +43,32 @@ void SettingsFunction::RunWithStorageOnFileThread( base::Bind(&SettingsFunction::SendResponse, this, success)); } -bool SettingsFunction::UseResult( - scoped_refptr<ExtensionSettingsObserverList> observers, - const ExtensionSettingsStorage::Result& storage_result) { +bool SettingsFunction::UseReadResult( + const ExtensionSettingsStorage::ReadResult& result) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); - if (storage_result.HasError()) { - error_ = storage_result.GetError(); + if (result.HasError()) { + error_ = result.error(); return false; } - const DictionaryValue* settings = storage_result.GetSettings(); - if (settings) { - result_.reset(settings->DeepCopy()); + result_.reset(result.settings().DeepCopy()); + return true; +} + +bool SettingsFunction::UseWriteResult( + scoped_refptr<ExtensionSettingsObserverList> observers, + const ExtensionSettingsStorage::WriteResult& result) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); + if (result.HasError()) { + error_ = result.error(); + return false; } - const std::set<std::string>* changed_keys = storage_result.GetChangedKeys(); - if (changed_keys && !changed_keys->empty()) { - ExtensionSettingChanges::Builder changes; - for (std::set<std::string>::const_iterator it = changed_keys->begin(); - it != changed_keys->end(); ++it) { - const Value* old_value = storage_result.GetOldValue(*it); - const Value* new_value = storage_result.GetNewValue(*it); - changes.AppendChange( - *it, - old_value ? old_value->DeepCopy() : NULL, - new_value ? new_value->DeepCopy() : NULL); - } + if (!result.changes().empty()) { observers->Notify( &ExtensionSettingsObserver::OnSettingsChanged, - profile(), extension_id(), - changes.Build()); + ExtensionSettingChange::GetEventJson(result.changes())); } return true; @@ -93,25 +88,57 @@ static void AddAllStringValues( } } +// Gets the keys of a DictionaryValue. +static 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; +} + bool GetSettingsFunction::RunWithStorage( scoped_refptr<ExtensionSettingsObserverList> observers, ExtensionSettingsStorage* storage) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); Value *input; EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &input)); - std::string as_string; - ListValue* as_list; - if (input->IsType(Value::TYPE_NULL)) { - return UseResult(observers, storage->Get()); - } else if (input->GetAsString(&as_string)) { - return UseResult(observers, storage->Get(as_string)); - } else if (input->GetAsList(&as_list)) { - std::vector<std::string> string_list; - AddAllStringValues(*as_list, &string_list); - return UseResult(observers, storage->Get(string_list)); + + 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); + ExtensionSettingsStorage::ReadResult result = + storage->Get(GetKeys(*as_dict)); + if (result.HasError()) { + return UseReadResult(result); + } + + DictionaryValue* with_default_values = as_dict->DeepCopy(); + with_default_values->MergeDictionary(&result.settings()); + return UseReadResult( + ExtensionSettingsStorage::ReadResult(with_default_values)); + } + + default: + return UseReadResult( + ExtensionSettingsStorage::ReadResult(kUnsupportedArgumentType)); } - return UseResult( - observers, ExtensionSettingsStorage::Result(kUnsupportedArgumentType)); } bool SetSettingsFunction::RunWithStorage( @@ -120,7 +147,7 @@ bool SetSettingsFunction::RunWithStorage( DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); DictionaryValue *input; EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &input)); - return UseResult(observers, storage->Set(*input)); + return UseWriteResult(observers, storage->Set(*input)); } bool RemoveSettingsFunction::RunWithStorage( @@ -129,22 +156,30 @@ bool RemoveSettingsFunction::RunWithStorage( DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); Value *input; EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &input)); - std::string as_string; - ListValue* as_list; - if (input->GetAsString(&as_string)) { - return UseResult(observers, storage->Remove(as_string)); - } else if (input->GetAsList(&as_list)) { - std::vector<std::string> string_list; - AddAllStringValues(*as_list, &string_list); - return UseResult(observers, storage->Remove(string_list)); - } - return UseResult( - observers, ExtensionSettingsStorage::Result(kUnsupportedArgumentType)); + + switch (input->GetType()) { + case Value::TYPE_STRING: { + std::string as_string; + input->GetAsString(&as_string); + return UseWriteResult(observers, 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(observers, storage->Remove(as_string_list)); + } + + default: + return UseWriteResult( + observers, + ExtensionSettingsStorage::WriteResult(kUnsupportedArgumentType)); + }; } bool ClearSettingsFunction::RunWithStorage( scoped_refptr<ExtensionSettingsObserverList> observers, ExtensionSettingsStorage* storage) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); - return UseResult(observers, storage->Clear()); + return UseWriteResult(observers, storage->Clear()); } |