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

Unified Diff: chrome/browser/sync/glue/autofill_change_processor.cc

Issue 4683003: Sending the proto files for review to unblcok the server team Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Created 10 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/sync/glue/autofill_change_processor.cc
diff --git a/chrome/browser/sync/glue/autofill_change_processor.cc b/chrome/browser/sync/glue/autofill_change_processor.cc
index a2a8db42918c407672062c1d8af6b3bd70fef528..1f977b4f29ffcf7a478617fa5c611da156c67252 100644
--- a/chrome/browser/sync/glue/autofill_change_processor.cc
+++ b/chrome/browser/sync/glue/autofill_change_processor.cc
@@ -9,8 +9,10 @@
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
+#include "chrome/browser/guid.h"
#include "chrome/browser/profile.h"
#include "chrome/browser/autofill/personal_data_manager.h"
+#include "chrome/browser/sync/glue/autofill_change_processor2.h"
#include "chrome/browser/sync/glue/autofill_model_associator.h"
#include "chrome/browser/sync/profile_sync_service.h"
#include "chrome/browser/webdata/autofill_change.h"
@@ -46,6 +48,7 @@ AutofillChangeProcessor::AutofillChangeProcessor(
DCHECK(error_handler);
DCHECK(personal_data);
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
+
StartObserving();
}
@@ -54,6 +57,7 @@ AutofillChangeProcessor::~AutofillChangeProcessor() {}
void AutofillChangeProcessor::Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details) {
+
// Ensure this notification came from our web database.
WebDataService* wds = Source<WebDataService>(source).ptr();
if (!wds || wds->GetDatabase() != web_database_)
@@ -73,62 +77,10 @@ void AutofillChangeProcessor::Observe(NotificationType type,
return;
}
- switch (type.value) {
- case NotificationType::AUTOFILL_ENTRIES_CHANGED: {
- AutofillChangeList* changes = Details<AutofillChangeList>(details).ptr();
- ObserveAutofillEntriesChanged(changes, &trans, autofill_root);
- break;
- }
- case NotificationType::AUTOFILL_PROFILE_CHANGED: {
- AutofillProfileChange* change =
- Details<AutofillProfileChange>(details).ptr();
- ObserveAutofillProfileChanged(change, &trans, autofill_root);
- break;
- }
- default:
- NOTREACHED() << "Invalid NotificationType.";
- }
-}
-
-void AutofillChangeProcessor::ChangeProfileLabelIfAlreadyTaken(
- sync_api::BaseTransaction* trans,
- const string16& pre_update_label,
- AutoFillProfile* profile,
- std::string* tag) {
- DCHECK_EQ(AutofillModelAssociator::ProfileLabelToTag(profile->Label()),
- *tag);
- sync_api::ReadNode read_node(trans);
- if (!pre_update_label.empty() && pre_update_label == profile->Label())
- return;
- if (read_node.InitByClientTagLookup(syncable::AUTOFILL, *tag)) {
- // Handle the edge case of duplicate labels.
- string16 new_label(AutofillModelAssociator::MakeUniqueLabel(
- profile->Label(), pre_update_label, trans));
- if (new_label.empty()) {
- error_handler()->OnUnrecoverableError(FROM_HERE,
- "No unique label; can't move aside");
- return;
- }
- OverrideProfileLabel(new_label, profile, tag);
- }
-}
-
-void AutofillChangeProcessor::OverrideProfileLabel(
- const string16& new_label,
- AutoFillProfile* profile_to_update,
- std::string* tag_to_update) {
- tag_to_update->assign(AutofillModelAssociator::ProfileLabelToTag(new_label));
-
- profile_to_update->set_label(new_label);
- if (!web_database_->UpdateAutoFillProfile(*profile_to_update)) {
- std::string err = "Failed to overwrite label for node ";
- err += UTF16ToUTF8(new_label);
- error_handler()->OnUnrecoverableError(FROM_HERE, err);
- return;
- }
+ DCHECK(type.value == NotificationType::AUTOFILL_ENTRIES_CHANGED);
- // Notify the PersonalDataManager that it's out of date.
- PostOptimisticRefreshTask();
+ AutofillChangeList* changes = Details<AutofillChangeList>(details).ptr();
+ ObserveAutofillEntriesChanged(changes, &trans, autofill_root);
}
void AutofillChangeProcessor::PostOptimisticRefreshTask() {
@@ -137,71 +89,6 @@ void AutofillChangeProcessor::PostOptimisticRefreshTask() {
personal_data_));
}
-void AutofillChangeProcessor::AddAutofillProfileSyncNode(
- sync_api::WriteTransaction* trans, const sync_api::BaseNode& autofill,
- const std::string& tag, const AutoFillProfile* profile) {
- sync_api::WriteNode sync_node(trans);
- if (!sync_node.InitUniqueByCreation(syncable::AUTOFILL, autofill, tag)) {
- error_handler()->OnUnrecoverableError(FROM_HERE,
- "Failed to create autofill sync node.");
- return;
- }
- sync_node.SetTitle(UTF8ToWide(tag));
-
- WriteAutofillProfile(*profile, &sync_node);
- model_associator_->Associate(&tag, sync_node.GetId());
-}
-
-void AutofillChangeProcessor::ObserveAutofillProfileChanged(
- AutofillProfileChange* change, sync_api::WriteTransaction* trans,
- const sync_api::ReadNode& autofill_root) {
- std::string tag(AutofillModelAssociator::ProfileLabelToTag(change->key()));
- switch (change->type()) {
- case AutofillProfileChange::ADD: {
- scoped_ptr<AutoFillProfile> clone(
- static_cast<AutoFillProfile*>(change->profile()->Clone()));
- DCHECK_EQ(clone->Label(), change->key());
- ChangeProfileLabelIfAlreadyTaken(trans, string16(), clone.get(), &tag);
- AddAutofillProfileSyncNode(trans, autofill_root, tag, clone.get());
- break;
- }
- case AutofillProfileChange::UPDATE: {
- scoped_ptr<AutoFillProfile> clone(
- static_cast<AutoFillProfile*>(change->profile()->Clone()));
- std::string pre_update_tag = AutofillModelAssociator::ProfileLabelToTag(
- change->pre_update_label());
- DCHECK_EQ(clone->Label(), change->key());
- sync_api::WriteNode sync_node(trans);
- ChangeProfileLabelIfAlreadyTaken(trans, change->pre_update_label(),
- clone.get(), &tag);
- if (pre_update_tag != tag) {
- // If the label changes, replace the node instead of updating it.
- RemoveSyncNode(pre_update_tag, trans);
- AddAutofillProfileSyncNode(trans, autofill_root, tag, clone.get());
- return;
- }
- int64 sync_id = model_associator_->GetSyncIdFromChromeId(tag);
- if (sync_api::kInvalidId == sync_id) {
- std::string err = "Unexpected notification for: " + tag;
- error_handler()->OnUnrecoverableError(FROM_HERE, err);
- return;
- } else {
- if (!sync_node.InitByIdLookup(sync_id)) {
- error_handler()->OnUnrecoverableError(FROM_HERE,
- "Autofill node lookup failed.");
- return;
- }
- WriteAutofillProfile(*clone.get(), &sync_node);
- }
- break;
- }
- case AutofillProfileChange::REMOVE: {
- RemoveSyncNode(tag, trans);
- break;
- }
- }
-}
-
void AutofillChangeProcessor::ObserveAutofillEntriesChanged(
AutofillChangeList* changes, sync_api::WriteTransaction* trans,
const sync_api::ReadNode& autofill_root) {
@@ -324,7 +211,8 @@ void AutofillChangeProcessor::ApplyChangesFromSyncModel(
<< "Autofill specifics data not present on delete!";
const sync_pb::AutofillSpecifics& autofill =
changes[i].specifics.GetExtension(sync_pb::autofill);
- if (autofill.has_value() || autofill.has_profile()) {
+ if(autofill.has_value() ||
+ (IsUpgrading() && autofill.has_profile())) {
autofill_changes_.push_back(AutofillChangeRecord(changes[i].action,
changes[i].id,
autofill));
@@ -349,7 +237,7 @@ void AutofillChangeProcessor::ApplyChangesFromSyncModel(
const sync_pb::AutofillSpecifics& autofill(
sync_node.GetAutofillSpecifics());
int64 sync_id = sync_node.GetId();
- if (autofill.has_value() || autofill.has_profile()) {
+ if (autofill.has_value() || (IsUpgrading() && autofill.has_profile())) {
autofill_changes_.push_back(AutofillChangeRecord(changes[i].action,
sync_id, autofill));
} else {
@@ -374,8 +262,8 @@ void AutofillChangeProcessor::CommitChangesFromSyncModel() {
if (autofill_changes_[i].autofill_.has_value()) {
ApplySyncAutofillEntryDelete(autofill_changes_[i].autofill_);
} else if (autofill_changes_[i].autofill_.has_profile()) {
- ApplySyncAutofillProfileDelete(autofill_changes_[i].autofill_.profile(),
- autofill_changes_[i].id_);
+ DCHECK(IsUpgrading());
+ ApplySyncAutofillProfileDelete(autofill_changes_[i].id_);
} else {
NOTREACHED() << "Autofill's CommitChanges received change with no"
" data!";
@@ -389,6 +277,7 @@ void AutofillChangeProcessor::CommitChangesFromSyncModel() {
autofill_changes_[i].autofill_, &new_entries,
autofill_changes_[i].id_);
} else if (autofill_changes_[i].autofill_.has_profile()) {
+ DCHECK(IsUpgrading());
ApplySyncAutofillProfileChange(autofill_changes_[i].action_,
autofill_changes_[i].autofill_.profile(),
autofill_changes_[i].id_);
@@ -448,38 +337,39 @@ void AutofillChangeProcessor::ApplySyncAutofillProfileChange(
int64 sync_id) {
DCHECK_NE(sync_api::SyncManager::ChangeRecord::ACTION_DELETE, action);
- std::string tag(AutofillModelAssociator::ProfileLabelToTag(
- UTF8ToUTF16(profile.label())));
switch (action) {
case sync_api::SyncManager::ChangeRecord::ACTION_ADD: {
- PersonalDataManager* pdm = model_associator_->sync_service()->
- profile()->GetPersonalDataManager();
- scoped_ptr<AutoFillProfile> p(
- pdm->CreateNewEmptyAutoFillProfileForDBThread(
- UTF8ToUTF16(profile.label())));
+ std::string guid(guid::GenerateGUID());
+ scoped_ptr<AutoFillProfile> p(new AutoFillProfile);
+ p->set_guid(guid);
AutofillModelAssociator::OverwriteProfileWithServerData(p.get(),
profile);
- model_associator_->Associate(&tag, sync_id);
+ model_associator_->Associate(&guid, sync_id);
if (!web_database_->AddAutoFillProfile(*p.get())) {
- NOTREACHED() << "Couldn't add autofill profile: " << profile.label();
+ NOTREACHED() << "Couldn't add autofill profile: " << guid;
return;
}
break;
}
case sync_api::SyncManager::ChangeRecord::ACTION_UPDATE: {
- AutoFillProfile* p = NULL;
- string16 label = UTF8ToUTF16(profile.label());
- if (!web_database_->GetAutoFillProfileForLabel(label, &p)) {
- NOTREACHED() << "Couldn't retrieve autofill profile: " << label;
+ scoped_ptr<AutoFillProfile> p;
+ const std::string* guid = model_associator_->GetChromeNodeFromSyncId(
+ sync_id);
+ if(guid == NULL) {
+ LOG(ERROR) << " Model association has not happened for " << sync_id;
return;
}
- AutofillModelAssociator::OverwriteProfileWithServerData(p, profile);
- if (!web_database_->UpdateAutoFillProfile(*p)) {
- NOTREACHED() << "Couldn't update autofill profile: " << label;
+ if(!web_database_->GetAutoFillProfileForGUID(*guid, p.pointer_to())) {
+ LOG(ERROR) << "Autofill profile not found for " << *guid;
+ return;
+ }
+
+ AutofillModelAssociator::OverwriteProfileWithServerData(p.get(), profile);
+ if (!web_database_->UpdateAutoFillProfile(*(p.get()))) {
+ LOG(ERROR) << "Couldn't update autofill profile: " << guid;
return;
}
- delete p;
break;
}
default:
@@ -488,20 +378,20 @@ void AutofillChangeProcessor::ApplySyncAutofillProfileChange(
}
void AutofillChangeProcessor::ApplySyncAutofillProfileDelete(
- const sync_pb::AutofillProfileSpecifics& profile,
int64 sync_id) {
- string16 label(UTF8ToUTF16(profile.label()));
- AutoFillProfile* ptr = NULL;
- bool get_success = web_database_->GetAutoFillProfileForLabel(label, &ptr);
- scoped_ptr<AutoFillProfile> p(ptr);
- if (!get_success) {
- NOTREACHED() << "Couldn't retrieve autofill profile: " << label;
+
+ const std::string *guid = model_associator_->GetChromeNodeFromSyncId(sync_id);
+ if(guid == NULL) {
+ LOG(ERROR)<<" the profile is not associated";
return;
}
- if (!web_database_->RemoveAutoFillProfile(p->unique_id())) {
- NOTREACHED() << "Couldn't remove autofill profile: " << label;
- return;
+
+ if(!web_database_->RemoveAutoFillProfile(*guid))
+ {
+ LOG(ERROR) << "Could not remove the profile";
+ return ;
}
+
model_associator_->Disassociate(sync_id);
}
@@ -520,8 +410,6 @@ void AutofillChangeProcessor::StartObserving() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
notification_registrar_.Add(this, NotificationType::AUTOFILL_ENTRIES_CHANGED,
NotificationService::AllSources());
- notification_registrar_.Add(this, NotificationType::AUTOFILL_PROFILE_CHANGED,
- NotificationService::AllSources());
}
void AutofillChangeProcessor::StopObserving() {
@@ -549,7 +437,6 @@ void AutofillChangeProcessor::WriteAutofillProfile(
const AutoFillProfile& profile, sync_api::WriteNode* node) {
sync_pb::AutofillSpecifics autofill;
sync_pb::AutofillProfileSpecifics* s(autofill.mutable_profile());
- s->set_label(UTF16ToUTF8(profile.Label()));
s->set_name_first(UTF16ToUTF8(
profile.GetFieldText(AutoFillType(NAME_FIRST))));
s->set_name_middle(UTF16ToUTF8(
@@ -577,5 +464,8 @@ void AutofillChangeProcessor::WriteAutofillProfile(
AutoFillType(PHONE_HOME_WHOLE_NUMBER))));
node->SetAutofillSpecifics(autofill);
}
+bool AutofillChangeProcessor::IsUpgrading() {
+ return true;
+}
} // namespace browser_sync
« no previous file with comments | « chrome/browser/sync/glue/autofill_change_processor.h ('k') | chrome/browser/sync/glue/autofill_change_processor2.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698