Index: chrome/browser/sync/glue/preference_change_processor.cc |
diff --git a/chrome/browser/sync/glue/preference_change_processor.cc b/chrome/browser/sync/glue/preference_change_processor.cc |
deleted file mode 100644 |
index 6a6840b3c1ba7ce298da47e447ec64459bfbd8bc..0000000000000000000000000000000000000000 |
--- a/chrome/browser/sync/glue/preference_change_processor.cc |
+++ /dev/null |
@@ -1,228 +0,0 @@ |
-// Copyright (c) 2011 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/sync/glue/preference_change_processor.h" |
- |
-#include <set> |
-#include <string> |
- |
-#include "base/auto_reset.h" |
-#include "base/json/json_reader.h" |
-#include "base/utf_string_conversions.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/sync/glue/preference_model_associator.h" |
-#include "chrome/browser/sync/profile_sync_service.h" |
-#include "chrome/browser/sync/protocol/preference_specifics.pb.h" |
-#include "chrome/common/pref_names.h" |
-#include "content/browser/browser_thread.h" |
-#include "content/common/json_value_serializer.h" |
-#include "content/common/notification_details.h" |
-#include "content/common/notification_source.h" |
- |
-namespace browser_sync { |
- |
-PreferenceChangeProcessor::PreferenceChangeProcessor( |
- PreferenceModelAssociator* model_associator, |
- UnrecoverableErrorHandler* error_handler) |
- : ChangeProcessor(error_handler), |
- pref_service_(NULL), |
- model_associator_(model_associator), |
- processing_pref_change_(false) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(model_associator); |
- DCHECK(error_handler); |
-} |
- |
-PreferenceChangeProcessor::~PreferenceChangeProcessor() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
-} |
- |
-void PreferenceChangeProcessor::Observe(NotificationType type, |
- const NotificationSource& source, |
- const NotificationDetails& details) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(running()); |
- DCHECK(NotificationType::PREF_CHANGED == type); |
- DCHECK_EQ(pref_service_, Source<PrefService>(source).ptr()); |
- |
- // Avoid recursion. |
- if (processing_pref_change_) |
- return; |
- |
- AutoReset<bool> guard(&processing_pref_change_, true); |
- std::string* name = Details<std::string>(details).ptr(); |
- const PrefService::Preference* preference = |
- pref_service_->FindPreference((*name).c_str()); |
- DCHECK(preference); |
- int64 sync_id = model_associator_->GetSyncIdFromChromeId(*name); |
- bool user_modifiable = preference->IsUserModifiable(); |
- if (!user_modifiable) { |
- // We do not track preferences the user cannot change. |
- model_associator_->Disassociate(sync_id); |
- return; |
- } |
- |
- sync_api::WriteTransaction trans(share_handle()); |
- sync_api::WriteNode node(&trans); |
- |
- // Since we don't create sync nodes for preferences that are not under control |
- // of the user or still have their default value, this changed preference may |
- // not have a sync node yet. If so, we create a node. Similarly, a preference |
- // may become user-modifiable (e.g. due to laxer policy configuration), in |
- // which case we also need to create a sync node and associate it. |
- if (sync_api::kInvalidId == sync_id) { |
- sync_api::ReadNode root(&trans); |
- if (!root.InitByTagLookup(browser_sync::kPreferencesTag)) { |
- error_handler()->OnUnrecoverableError(FROM_HERE, "Can't find root."); |
- return; |
- } |
- |
- // InitPrefNodeAndAssociate takes care of writing the value to the sync |
- // node if appropriate. |
- if (!model_associator_->InitPrefNodeAndAssociate(&trans, |
- root, |
- preference)) { |
- error_handler()->OnUnrecoverableError(FROM_HERE, |
- "Can't create sync node."); |
- } |
- return; |
- } |
- |
- if (!node.InitByIdLookup(sync_id)) { |
- error_handler()->OnUnrecoverableError(FROM_HERE, |
- "Preference node lookup failed."); |
- return; |
- } |
- |
- if (!PreferenceModelAssociator::WritePreferenceToNode( |
- preference->name(), |
- *preference->GetValue(), |
- &node)) { |
- error_handler()->OnUnrecoverableError(FROM_HERE, |
- "Failed to update preference node."); |
- return; |
- } |
-} |
- |
-void PreferenceChangeProcessor::ApplyChangesFromSyncModel( |
- const sync_api::BaseTransaction* trans, |
- const sync_api::SyncManager::ChangeRecord* changes, |
- int change_count) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (!running()) |
- return; |
- StopObserving(); |
- |
- for (int i = 0; i < change_count; ++i) { |
- sync_api::ReadNode node(trans); |
- // TODO(ncarter): Can't look up the name for deletions: lookup of |
- // deleted items fails at the syncapi layer. However, the node should |
- // generally still exist in the syncable database; we just need to |
- // plumb the syncapi so that it succeeds. |
- if (sync_api::SyncManager::ChangeRecord::ACTION_DELETE == |
- changes[i].action) { |
- // Until the above is fixed, we have no choice but to ignore deletions. |
- LOG(ERROR) << "No way to handle pref deletion"; |
- continue; |
- } |
- |
- if (!node.InitByIdLookup(changes[i].id)) { |
- error_handler()->OnUnrecoverableError(FROM_HERE, |
- "Preference node lookup failed."); |
- return; |
- } |
- DCHECK(syncable::PREFERENCES == node.GetModelType()); |
- |
- std::string name; |
- scoped_ptr<Value> value(ReadPreference(&node, &name)); |
- // Skip values we can't deserialize. |
- if (!value.get()) |
- continue; |
- |
- // It is possible that we may receive a change to a preference we |
- // do not want to sync. For example if the user is syncing a Mac |
- // client and a Windows client, the Windows client does not |
- // support kConfirmToQuitEnabled. Ignore updates from these |
- // preferences. |
- const char* pref_name = name.c_str(); |
- if (model_associator_->synced_preferences().count(pref_name) == 0) |
- continue; |
- |
- // Don't try to overwrite preferences not controllable by the user. |
- const PrefService::Preference* pref = |
- pref_service_->FindPreference(pref_name); |
- DCHECK(pref); |
- if (!pref->IsUserModifiable()) |
- continue; |
- |
- if (sync_api::SyncManager::ChangeRecord::ACTION_DELETE == |
- changes[i].action) { |
- pref_service_->ClearPref(pref_name); |
- } else { |
- pref_service_->Set(pref_name, *value); |
- |
- // If this is a newly added node, associate. |
- if (sync_api::SyncManager::ChangeRecord::ACTION_ADD == |
- changes[i].action) { |
- const PrefService::Preference* preference = |
- pref_service_->FindPreference(name.c_str()); |
- model_associator_->Associate(preference, changes[i].id); |
- } |
- |
- model_associator_->AfterUpdateOperations(name); |
- } |
- } |
- StartObserving(); |
-} |
- |
-Value* PreferenceChangeProcessor::ReadPreference( |
- sync_api::ReadNode* node, |
- std::string* name) { |
- const sync_pb::PreferenceSpecifics& preference( |
- node->GetPreferenceSpecifics()); |
- base::JSONReader reader; |
- scoped_ptr<Value> value(reader.JsonToValue(preference.value(), false, false)); |
- if (!value.get()) { |
- std::string err = "Failed to deserialize preference value: " + |
- reader.GetErrorMessage(); |
- error_handler()->OnUnrecoverableError(FROM_HERE, err); |
- return NULL; |
- } |
- *name = preference.name(); |
- return value.release(); |
-} |
- |
-void PreferenceChangeProcessor::StartImpl(Profile* profile) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- pref_service_ = profile->GetPrefs(); |
- registrar_.Init(pref_service_); |
- StartObserving(); |
-} |
- |
-void PreferenceChangeProcessor::StopImpl() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- StopObserving(); |
- pref_service_ = NULL; |
-} |
- |
- |
-void PreferenceChangeProcessor::StartObserving() { |
- DCHECK(pref_service_); |
- for (std::set<std::string>::const_iterator it = |
- model_associator_->synced_preferences().begin(); |
- it != model_associator_->synced_preferences().end(); ++it) { |
- registrar_.Add((*it).c_str(), this); |
- } |
-} |
- |
-void PreferenceChangeProcessor::StopObserving() { |
- DCHECK(pref_service_); |
- for (std::set<std::string>::const_iterator it = |
- model_associator_->synced_preferences().begin(); |
- it != model_associator_->synced_preferences().end(); ++it) { |
- registrar_.Remove((*it).c_str(), this); |
- } |
-} |
- |
-} // namespace browser_sync |