15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/storage/settings_sync_processor.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/storage/settings_sync_util.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/api/storage/settings_namespace.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_change_processor.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_data.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/extension_setting_specifics.pb.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SettingsSyncProcessor::SettingsSyncProcessor( 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelType type, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChangeProcessor* sync_processor) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : extension_id_(extension_id), 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_(type), 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_processor_(sync_processor), 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initialized_(false) { 25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(type == syncer::EXTENSION_SETTINGS || type == syncer::APP_SETTINGS); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(sync_processor); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SettingsSyncProcessor::~SettingsSyncProcessor() { 31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SettingsSyncProcessor::Init(const base::DictionaryValue& initial_state) { 35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!initialized_) << "Init called multiple times"; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (base::DictionaryValue::Iterator i(initial_state); !i.IsAtEnd(); 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i.Advance()) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) synced_keys_.insert(i.key()); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initialized_ = true; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::SyncError SettingsSyncProcessor::SendChanges( 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ValueStoreChangeList& changes) { 47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(initialized_) << "Init not called"; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChangeList sync_changes; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> added_keys; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> deleted_keys; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueStoreChangeList::const_iterator i = changes.begin(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != changes.end(); ++i) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key = i->key(); 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Value* value = i->new_value(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (synced_keys_.count(key)) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // New value, key is synced; send ACTION_UPDATE. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_changes.push_back(settings_sync_util::CreateUpdate( 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_id_, key, *value, type_)); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // New value, key is not synced; send ACTION_ADD. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_changes.push_back(settings_sync_util::CreateAdd( 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_id_, key, *value, type_)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) added_keys.insert(key); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (synced_keys_.count(key)) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clearing value, key is synced; send ACTION_DELETE. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_changes.push_back(settings_sync_util::CreateDelete( 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_id_, key, type_)); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deleted_keys.insert(key); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Deleted " << key << " but not in synced_keys_"; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sync_changes.empty()) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return syncer::SyncError(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncError error = 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_processor_->ProcessSyncChanges(FROM_HERE, sync_changes); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error.IsSet()) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) synced_keys_.insert(added_keys.begin(), added_keys.end()); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<std::string>::iterator i = deleted_keys.begin(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != deleted_keys.end(); ++i) { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) synced_keys_.erase(*i); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return syncer::SyncError(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SettingsSyncProcessor::NotifyChanges(const ValueStoreChangeList& changes) { 99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(initialized_) << "Init not called"; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueStoreChangeList::const_iterator i = changes.begin(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != changes.end(); ++i) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i->new_value()) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) synced_keys_.insert(i->key()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) synced_keys_.erase(i->key()); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 112