From be80eae925e1bb08b0584e55cd47accceba09390 Mon Sep 17 00:00:00 2001 From: "kalman@chromium.org" Date: Sat, 22 Oct 2011 03:32:07 +0000 Subject: Re-commit 106660 with the crashing test disabled. Reverted in 106671. Add onChanged events to the extension settings API, both from sync and between split mode background pages. BUG=97545 TEST=ExtensionSettingsStorageUnittest, ExtensionSettingsSyncUnittest, ExtensionSettingsApitest Review URL: http://codereview.chromium.org/8177022 TBR=rsleevi@chromium.org Review URL: http://codereview.chromium.org/8361027 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@106848 0039d316-1c4b-4281-b951-d872f2087c98 --- .../browser/extensions/extension_settings_api.cc | 56 +++++++++++++++++----- 1 file changed, 44 insertions(+), 12 deletions(-) (limited to 'chrome/browser/extensions/extension_settings_api.cc') diff --git a/chrome/browser/extensions/extension_settings_api.cc b/chrome/browser/extensions/extension_settings_api.cc index 5da832f..64526d7 100644 --- a/chrome/browser/extensions/extension_settings_api.cc +++ b/chrome/browser/extensions/extension_settings_api.cc @@ -25,7 +25,7 @@ bool SettingsFunction::RunImpl() { void SettingsFunction::RunWithBackendOnFileThread( ExtensionSettingsBackend* backend) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); - bool success = RunWithStorage(backend->GetStorage(extension_id())); + bool success = RunWithStorage(backend, backend->GetStorage(extension_id())); BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, @@ -33,13 +33,35 @@ void SettingsFunction::RunWithBackendOnFileThread( } bool SettingsFunction::UseResult( + ExtensionSettingsBackend* backend, const ExtensionSettingsStorage::Result& storage_result) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); if (storage_result.HasError()) { error_ = storage_result.GetError(); return false; } - DictionaryValue* settings = storage_result.GetSettings(); - result_.reset(settings == NULL ? NULL : settings->DeepCopy()); + + const DictionaryValue* settings = storage_result.GetSettings(); + if (settings) { + result_.reset(settings->DeepCopy()); + } + + const std::set* changed_keys = storage_result.GetChangedKeys(); + if (changed_keys && !changed_keys->empty()) { + ExtensionSettingChanges::Builder changes; + for (std::set::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); + } + backend->TriggerOnSettingsChanged( + profile(), extension_id(), changes.Build()); + } + return true; } @@ -58,47 +80,57 @@ static void AddAllStringValues( } bool GetSettingsFunction::RunWithStorage( + ExtensionSettingsBackend* backend, 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(storage->Get()); + return UseResult(backend, storage->Get()); } else if (input->GetAsString(&as_string)) { - return UseResult(storage->Get(as_string)); + return UseResult(backend, storage->Get(as_string)); } else if (input->GetAsList(&as_list)) { std::vector string_list; AddAllStringValues(*as_list, &string_list); - return UseResult(storage->Get(string_list)); + return UseResult(backend, storage->Get(string_list)); } - return UseResult(ExtensionSettingsStorage::Result(kUnsupportedArgumentType)); + return UseResult( + backend, ExtensionSettingsStorage::Result(kUnsupportedArgumentType)); } bool SetSettingsFunction::RunWithStorage( + ExtensionSettingsBackend* backend, ExtensionSettingsStorage* storage) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); DictionaryValue *input; EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &input)); - return UseResult(storage->Set(*input)); + return UseResult(backend, storage->Set(*input)); } bool RemoveSettingsFunction::RunWithStorage( + ExtensionSettingsBackend* backend, 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->GetAsString(&as_string)) { - return UseResult(storage->Remove(as_string)); + return UseResult(backend, storage->Remove(as_string)); } else if (input->GetAsList(&as_list)) { std::vector string_list; AddAllStringValues(*as_list, &string_list); - return UseResult(storage->Remove(string_list)); + return UseResult(backend, storage->Remove(string_list)); } - return UseResult(ExtensionSettingsStorage::Result(kUnsupportedArgumentType)); + return UseResult( + backend, ExtensionSettingsStorage::Result(kUnsupportedArgumentType)); } bool ClearSettingsFunction::RunWithStorage( + ExtensionSettingsBackend* backend, ExtensionSettingsStorage* storage) { - return UseResult(storage->Clear()); + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); + return UseResult(backend, storage->Clear()); } -- cgit v1.1