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

Side by Side Diff: chrome/browser/extensions/settings/syncable_settings_storage.cc

Issue 8539037: Extension Settings API: make it so that when changes received from Sync fail to (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: comments, sync Created 9 years, 1 month 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/settings/syncable_settings_storage.h" 5 #include "chrome/browser/extensions/settings/syncable_settings_storage.h"
6 6
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "chrome/browser/extensions/settings/settings_sync_util.h" 8 #include "chrome/browser/extensions/settings/settings_sync_util.h"
9 #include "chrome/browser/sync/api/sync_data.h" 9 #include "chrome/browser/sync/api/sync_data.h"
10 #include "chrome/browser/sync/protocol/extension_setting_specifics.pb.h" 10 #include "chrome/browser/sync/protocol/extension_setting_specifics.pb.h"
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 139
140 if (sync_state.empty()) { 140 if (sync_state.empty()) {
141 return SendLocalSettingsToSync(maybe_settings.settings()); 141 return SendLocalSettingsToSync(maybe_settings.settings());
142 } 142 }
143 return OverwriteLocalSettingsWithSync(sync_state, maybe_settings.settings()); 143 return OverwriteLocalSettingsWithSync(sync_state, maybe_settings.settings());
144 } 144 }
145 145
146 SyncError SyncableSettingsStorage::SendLocalSettingsToSync( 146 SyncError SyncableSettingsStorage::SendLocalSettingsToSync(
147 const DictionaryValue& settings) { 147 const DictionaryValue& settings) {
148 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 148 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
149 DCHECK(sync_processor_);
150
149 SyncChangeList changes; 151 SyncChangeList changes;
150 for (DictionaryValue::key_iterator it = settings.begin_keys(); 152 for (DictionaryValue::key_iterator it = settings.begin_keys();
151 it != settings.end_keys(); ++it) { 153 it != settings.end_keys(); ++it) {
152 Value* value; 154 Value* value;
153 settings.GetWithoutPathExpansion(*it, &value); 155 settings.GetWithoutPathExpansion(*it, &value);
154 changes.push_back( 156 changes.push_back(
155 settings_sync_util::CreateAdd(extension_id_, *it, *value)); 157 settings_sync_util::CreateAdd(extension_id_, *it, *value));
156 } 158 }
157 159
158 if (changes.empty()) { 160 if (changes.empty()) {
159 return SyncError(); 161 return SyncError();
160 } 162 }
161 163
162 SyncError error = sync_processor_->ProcessSyncChanges(FROM_HERE, changes); 164 SyncError error = sync_processor_->ProcessSyncChanges(FROM_HERE, changes);
163 if (error.IsSet()) { 165 if (error.IsSet()) {
166 StopSyncing();
164 return error; 167 return error;
165 } 168 }
166 169
167 for (DictionaryValue::key_iterator it = settings.begin_keys(); 170 for (DictionaryValue::key_iterator it = settings.begin_keys();
168 it != settings.end_keys(); ++it) { 171 it != settings.end_keys(); ++it) {
169 synced_keys_.insert(*it); 172 synced_keys_.insert(*it);
170 } 173 }
171 return SyncError(); 174 return SyncError();
172 } 175 }
173 176
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 Value* value = NULL; 218 Value* value = NULL;
216 CHECK(new_sync_state->RemoveWithoutPathExpansion(key, &value)); 219 CHECK(new_sync_state->RemoveWithoutPathExpansion(key, &value));
217 changes.push_back( 220 changes.push_back(
218 SettingSyncData( 221 SettingSyncData(
219 SyncChange::ACTION_ADD, extension_id_, key, value)); 222 SyncChange::ACTION_ADD, extension_id_, key, value));
220 } 223 }
221 224
222 if (changes.empty()) { 225 if (changes.empty()) {
223 return SyncError(); 226 return SyncError();
224 } 227 }
225 228 return ProcessSyncChanges(changes);
226 std::vector<SyncError> sync_errors(ProcessSyncChanges(changes));
227 if (sync_errors.empty()) {
228 return SyncError();
229 }
230 // TODO(kalman): something sensible with multiple errors.
231 return sync_errors[0];
232 } 229 }
233 230
234 void SyncableSettingsStorage::StopSyncing() { 231 void SyncableSettingsStorage::StopSyncing() {
235 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 232 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
236 DCHECK(sync_type_ == syncable::EXTENSION_SETTINGS ||
237 sync_type_ == syncable::APP_SETTINGS);
238 DCHECK(sync_processor_);
239 233
234 // Stop syncing is allowed to be called multiple times without StartSyncing,
235 // so don't DCHECK that these values aren't already disabled.
240 sync_type_ = syncable::UNSPECIFIED; 236 sync_type_ = syncable::UNSPECIFIED;
241 sync_processor_ = NULL; 237 sync_processor_ = NULL;
242 synced_keys_.clear(); 238 synced_keys_.clear();
243 } 239 }
244 240
245 std::vector<SyncError> SyncableSettingsStorage::ProcessSyncChanges( 241 SyncError SyncableSettingsStorage::ProcessSyncChanges(
246 const SettingSyncDataList& sync_changes) { 242 const SettingSyncDataList& sync_changes) {
247 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 243 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
248 DCHECK(sync_processor_);
249 DCHECK(!sync_changes.empty()) << "No sync changes for " << extension_id_; 244 DCHECK(!sync_changes.empty()) << "No sync changes for " << extension_id_;
250 245
246 if (!sync_processor_) {
247 return SyncError(
248 FROM_HERE,
249 std::string("Sync is inactive for ") + extension_id_,
250 sync_type_);
251 }
252
251 std::vector<SyncError> errors; 253 std::vector<SyncError> errors;
252 SettingChangeList changes; 254 SettingChangeList changes;
253 255
254 for (SettingSyncDataList::const_iterator it = sync_changes.begin(); 256 for (SettingSyncDataList::const_iterator it = sync_changes.begin();
255 it != sync_changes.end(); ++it) { 257 it != sync_changes.end(); ++it) {
256 DCHECK_EQ(extension_id_, it->extension_id()); 258 DCHECK_EQ(extension_id_, it->extension_id());
257 259
258 const std::string& key = it->key(); 260 const std::string& key = it->key();
259 const Value& value = it->value(); 261 const Value& value = it->value();
260 262
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 if (error.IsSet()) { 322 if (error.IsSet()) {
321 errors.push_back(error); 323 errors.push_back(error);
322 } 324 }
323 } 325 }
324 326
325 observers_->Notify( 327 observers_->Notify(
326 &SettingsObserver::OnSettingsChanged, 328 &SettingsObserver::OnSettingsChanged,
327 extension_id_, 329 extension_id_,
328 SettingChange::GetEventJson(changes)); 330 SettingChange::GetEventJson(changes));
329 331
330 return errors; 332 // TODO(kalman): Something sensible with multiple errors.
333 return errors.empty() ? SyncError() : errors[0];
331 } 334 }
332 335
333 void SyncableSettingsStorage::SendChangesToSync( 336 void SyncableSettingsStorage::SendChangesToSync(
334 const SettingChangeList& changes) { 337 const SettingChangeList& changes) {
335 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 338 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
336 DCHECK(sync_processor_); 339 DCHECK(sync_processor_);
337 DCHECK(!changes.empty()); 340 DCHECK(!changes.empty());
338 341
339 SyncChangeList sync_changes; 342 SyncChangeList sync_changes;
340 std::set<std::string> added_keys; 343 std::set<std::string> added_keys;
(...skipping 28 matching lines...) Expand all
369 } 372 }
370 } 373 }
371 374
372 if (sync_changes.empty()) { 375 if (sync_changes.empty()) {
373 return; 376 return;
374 } 377 }
375 378
376 SyncError error = 379 SyncError error =
377 sync_processor_->ProcessSyncChanges(FROM_HERE, sync_changes); 380 sync_processor_->ProcessSyncChanges(FROM_HERE, sync_changes);
378 if (error.IsSet()) { 381 if (error.IsSet()) {
379 LOG(WARNING) << "Failed to send changes to sync: " << error.message(); 382 StopSyncing();
380 return; 383 return;
381 } 384 }
382 385
383 synced_keys_.insert(added_keys.begin(), added_keys.end()); 386 synced_keys_.insert(added_keys.begin(), added_keys.end());
384 for (std::set<std::string>::iterator it = deleted_keys.begin(); 387 for (std::set<std::string>::iterator it = deleted_keys.begin();
385 it != deleted_keys.end(); ++it) { 388 it != deleted_keys.end(); ++it) {
386 synced_keys_.erase(*it); 389 synced_keys_.erase(*it);
387 } 390 }
388 } 391 }
389 392
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
436 FROM_HERE, 439 FROM_HERE,
437 std::string("Error pushing sync remove to local settings: ") + 440 std::string("Error pushing sync remove to local settings: ") +
438 result.error(), 441 result.error(),
439 sync_type_); 442 sync_type_);
440 } 443 }
441 changes->push_back(SettingChange(key, old_value, NULL)); 444 changes->push_back(SettingChange(key, old_value, NULL));
442 return SyncError(); 445 return SyncError();
443 } 446 }
444 447
445 } // namespace extensions 448 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698