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

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

Issue 277033002: [Sync] Make BookmarkChangeProcessor resilient against updates before add (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: CreateOrUpdate Created 6 years, 7 months 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/bookmark_change_processor.cc
diff --git a/chrome/browser/sync/glue/bookmark_change_processor.cc b/chrome/browser/sync/glue/bookmark_change_processor.cc
index 1ecef95836fe7744c371202a7633a00fd99e176b..1561c39a3ec6a09bd4371f8f5a8cb413559a9644 100644
--- a/chrome/browser/sync/glue/bookmark_change_processor.cc
+++ b/chrome/browser/sync/glue/bookmark_change_processor.cc
@@ -205,29 +205,27 @@ void BookmarkChangeProcessor::RemoveAllChildNodes(
}
}
-void BookmarkChangeProcessor::BookmarkModelLoaded(BookmarkModel* model,
- bool ids_reassigned) {
- NOTREACHED();
-}
-
-void BookmarkChangeProcessor::BookmarkModelBeingDeleted(
- BookmarkModel* model) {
- NOTREACHED();
- bookmark_model_ = NULL;
-}
-
-void BookmarkChangeProcessor::BookmarkNodeAdded(BookmarkModel* model,
- const BookmarkNode* parent,
- int index) {
- DCHECK(share_handle());
+void BookmarkChangeProcessor::CreateOrUpdateSyncNode(const BookmarkNode* node) {
+ const BookmarkNode* parent = node->parent();
+ int index = node->parent()->GetIndexOf(node);
int64 new_version = syncer::syncable::kInvalidTransactionVersion;
int64 sync_id = syncer::kInvalidId;
{
// Acquire a scoped write lock via a transaction.
syncer::WriteTransaction trans(FROM_HERE, share_handle(), &new_version);
- sync_id = CreateSyncNode(parent, model, index, &trans,
- model_associator_, error_handler());
+ sync_id = model_associator_->GetSyncIdFromChromeId(node->id());
+ if (sync_id != syncer::kInvalidId) {
+ UpdateSyncNode(
+ node, bookmark_model_, &trans, model_associator_, error_handler());
+ } else {
+ sync_id = CreateSyncNode(parent,
+ bookmark_model_,
+ index,
+ &trans,
+ model_associator_,
+ error_handler());
+ }
}
if (syncer::kInvalidId != sync_id) {
@@ -236,11 +234,29 @@ void BookmarkChangeProcessor::BookmarkNodeAdded(BookmarkModel* model,
// of added node here. After switching to ordinals for positioning,
// PREV_ID/NEXT_ID will be deprecated and siblings will not be updated.
UpdateTransactionVersion(
- new_version, model,
+ new_version,
+ bookmark_model_,
std::vector<const BookmarkNode*>(1, parent->GetChild(index)));
}
}
+void BookmarkChangeProcessor::BookmarkModelLoaded(BookmarkModel* model,
+ bool ids_reassigned) {
+ NOTREACHED();
+}
+
+void BookmarkChangeProcessor::BookmarkModelBeingDeleted(BookmarkModel* model) {
+ NOTREACHED();
+ bookmark_model_ = NULL;
+}
+
+void BookmarkChangeProcessor::BookmarkNodeAdded(BookmarkModel* model,
+ const BookmarkNode* parent,
+ int index) {
+ DCHECK(share_handle());
+ CreateOrUpdateSyncNode(parent->GetChild(index));
+}
+
// static
int64 BookmarkChangeProcessor::CreateSyncNode(const BookmarkNode* parent,
BookmarkModel* model, int index, syncer::WriteTransaction* trans,
@@ -290,77 +306,29 @@ void BookmarkChangeProcessor::BookmarkNodeChanged(BookmarkModel* model,
NOTREACHED() << "Saw update to permanent node!";
return;
}
+ CreateOrUpdateSyncNode(node);
+}
- int64 new_version = syncer::syncable::kInvalidTransactionVersion;
- {
- // Acquire a scoped write lock via a transaction.
- syncer::WriteTransaction trans(FROM_HERE, share_handle(), &new_version);
-
- // Lookup the sync node that's associated with |node|.
- syncer::WriteNode sync_node(&trans);
- if (!model_associator_->InitSyncNodeFromChromeId(node->id(), &sync_node)) {
- // TODO(tim): Investigating bug 121587.
- if (model_associator_->GetSyncIdFromChromeId(node->id()) ==
- syncer::kInvalidId) {
- error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE,
- "Bookmark id not found in model associator on BookmarkNodeChanged");
- LOG(ERROR) << "Bad id.";
- } else if (!sync_node.GetEntry()->good()) {
- error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE,
- "Could not InitByIdLookup on BookmarkNodeChanged, good() failed");
- LOG(ERROR) << "Bad entry.";
- } else if (sync_node.GetEntry()->GetIsDel()) {
- error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE,
- "Could not InitByIdLookup on BookmarkNodeChanged, is_del true");
- LOG(ERROR) << "Deleted entry.";
- } else {
- syncer::Cryptographer* crypto = trans.GetCryptographer();
- syncer::ModelTypeSet encrypted_types(trans.GetEncryptedTypes());
- const sync_pb::EntitySpecifics& specifics =
- sync_node.GetEntry()->GetSpecifics();
- CHECK(specifics.has_encrypted());
- const bool can_decrypt = crypto->CanDecrypt(specifics.encrypted());
- const bool agreement = encrypted_types.Has(syncer::BOOKMARKS);
- if (!agreement && !can_decrypt) {
- error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE,
- "Could not InitByIdLookup on BookmarkNodeChanged, "
- " Cryptographer thinks bookmarks not encrypted, and CanDecrypt"
- " failed.");
- LOG(ERROR) << "Case 1.";
- } else if (agreement && can_decrypt) {
- error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE,
- "Could not InitByIdLookup on BookmarkNodeChanged, "
- " Cryptographer thinks bookmarks are encrypted, and CanDecrypt"
- " succeeded (?!), but DecryptIfNecessary failed.");
- LOG(ERROR) << "Case 2.";
- } else if (agreement) {
- error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE,
- "Could not InitByIdLookup on BookmarkNodeChanged, "
- " Cryptographer thinks bookmarks are encrypted, but CanDecrypt"
- " failed.");
- LOG(ERROR) << "Case 3.";
- } else {
- error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE,
- "Could not InitByIdLookup on BookmarkNodeChanged, "
- " Cryptographer thinks bookmarks not encrypted, but CanDecrypt"
- " succeeded (super weird, btw)");
- LOG(ERROR) << "Case 4.";
- }
- }
- return;
- }
-
- UpdateSyncNodeProperties(node, model, &sync_node);
-
- DCHECK_EQ(sync_node.GetIsFolder(), node->is_folder());
- DCHECK_EQ(model_associator_->GetChromeNodeFromSyncId(
- sync_node.GetParentId()),
- node->parent());
- DCHECK_EQ(node->parent()->GetIndexOf(node), sync_node.GetPositionIndex());
+// Static.
+int64 BookmarkChangeProcessor::UpdateSyncNode(
+ const BookmarkNode* node,
+ BookmarkModel* model,
+ syncer::WriteTransaction* trans,
+ BookmarkModelAssociator* associator,
+ DataTypeErrorHandler* error_handler) {
+ // Lookup the sync node that's associated with |node|.
+ syncer::WriteNode sync_node(trans);
+ if (!associator->InitSyncNodeFromChromeId(node->id(), &sync_node)) {
+ error_handler->OnSingleDatatypeUnrecoverableError(
+ FROM_HERE, "Could not load bookmark node on update.");
+ return syncer::kInvalidId;
}
-
- UpdateTransactionVersion(new_version, model,
- std::vector<const BookmarkNode*>(1, node));
+ UpdateSyncNodeProperties(node, model, &sync_node);
+ DCHECK_EQ(sync_node.GetIsFolder(), node->is_folder());
+ DCHECK_EQ(associator->GetChromeNodeFromSyncId(sync_node.GetParentId()),
+ node->parent());
+ DCHECK_EQ(node->parent()->GetIndexOf(node), sync_node.GetPositionIndex());
+ return sync_node.GetId();
}
void BookmarkChangeProcessor::BookmarkMetaInfoChanged(
« no previous file with comments | « chrome/browser/sync/glue/bookmark_change_processor.h ('k') | chrome/browser/sync/profile_sync_service_bookmark_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698