| Index: chrome/browser/sync/glue/generic_change_processor.cc
|
| diff --git a/chrome/browser/sync/glue/generic_change_processor.cc b/chrome/browser/sync/glue/generic_change_processor.cc
|
| index a8accd94598001ab029a78b492bae596508033a8..0c9ac047e484261a149a852512ecf99a008ccaaa 100644
|
| --- a/chrome/browser/sync/glue/generic_change_processor.cc
|
| +++ b/chrome/browser/sync/glue/generic_change_processor.cc
|
| @@ -128,26 +128,91 @@ SyncError GenericChangeProcessor::GetSyncDataForType(
|
|
|
| namespace {
|
|
|
| -bool AttemptDelete(const SyncChange& change, sync_api::WriteNode* node) {
|
| +// TODO(isherman): Investigating http://crbug.com/121592
|
| +SyncError LogLookupFailure(sync_api::BaseNode::InitByLookupResult lookup_result,
|
| + const tracked_objects::Location& from_here,
|
| + const std::string& error_prefix,
|
| + syncable::ModelType type,
|
| + DataTypeErrorHandler* error_handler) {
|
| + SyncError error;
|
| + switch (lookup_result) {
|
| + case sync_api::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD:
|
| + error.Reset(from_here,
|
| + error_prefix +
|
| + "could not find entry matching the lookup criteria.",
|
| + type);
|
| + error_handler->OnSingleDatatypeUnrecoverableError(error.location(),
|
| + error.message());
|
| + return error;
|
| +
|
| + case sync_api::BaseNode::INIT_FAILED_ENTRY_IS_DEL:
|
| + error.Reset(from_here, error_prefix + "entry is already deleted.", type);
|
| + error_handler->OnSingleDatatypeUnrecoverableError(error.location(),
|
| + error.message());
|
| + return error;
|
| +
|
| + case sync_api::BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY:
|
| + error.Reset(from_here, error_prefix + "unable to decrypt", type);
|
| + error_handler->OnSingleDatatypeUnrecoverableError(error.location(),
|
| + error.message());
|
| + return error;
|
| +
|
| + case sync_api::BaseNode::INIT_FAILED_PRECONDITION:
|
| + error.Reset(from_here,
|
| + error_prefix + "a precondition was not met for calling init.",
|
| + type);
|
| + error_handler->OnSingleDatatypeUnrecoverableError(error.location(),
|
| + error.message());
|
| + return error;
|
| +
|
| + default:
|
| + // Should have listed all the possible error cases above.
|
| + NOTREACHED();
|
| + error.Reset(from_here, error_prefix + "unknown error", type);
|
| + error_handler->OnSingleDatatypeUnrecoverableError(error.location(),
|
| + error.message());
|
| + return error;
|
| + }
|
| +}
|
| +
|
| +SyncError AttemptDelete(const SyncChange& change,
|
| + syncable::ModelType type,
|
| + const std::string& type_str,
|
| + sync_api::WriteNode* node,
|
| + DataTypeErrorHandler* error_handler) {
|
| DCHECK_EQ(change.change_type(), SyncChange::ACTION_DELETE);
|
| if (change.sync_data().IsLocal()) {
|
| const std::string& tag = change.sync_data().GetTag();
|
| if (tag.empty()) {
|
| - return false;
|
| + SyncError error(
|
| + FROM_HERE,
|
| + "Failed to delete " + type_str + " node. Local data, empty tag.",
|
| + type);
|
| + error_handler->OnSingleDatatypeUnrecoverableError(error.location(),
|
| + error.message());
|
| + return error;
|
| }
|
| - if (node->InitByClientTagLookup(
|
| - change.sync_data().GetDataType(), tag) !=
|
| - sync_api::BaseNode::INIT_OK) {
|
| - return false;
|
| +
|
| + sync_api::BaseNode::InitByLookupResult result =
|
| + node->InitByClientTagLookup(change.sync_data().GetDataType(), tag);
|
| + if (result != sync_api::BaseNode::INIT_OK) {
|
| + return LogLookupFailure(
|
| + result, FROM_HERE,
|
| + "Failed to delete " + type_str + " node. Local data, ",
|
| + type, error_handler);
|
| }
|
| } else {
|
| - if (node->InitByIdLookup(change.sync_data().GetRemoteId()) !=
|
| - sync_api::BaseNode::INIT_OK) {
|
| - return false;
|
| + sync_api::BaseNode::InitByLookupResult result =
|
| + node->InitByIdLookup(change.sync_data().GetRemoteId());
|
| + if (result != sync_api::BaseNode::INIT_OK) {
|
| + return LogLookupFailure(
|
| + result, FROM_HERE,
|
| + "Failed to delete " + type_str + " node. Non-local data, ",
|
| + type, error_handler);
|
| }
|
| }
|
| node->Remove();
|
| - return true;
|
| + return SyncError();
|
| }
|
|
|
| } // namespace
|
| @@ -167,13 +232,10 @@ SyncError GenericChangeProcessor::ProcessSyncChanges(
|
| std::string type_str = syncable::ModelTypeToString(type);
|
| sync_api::WriteNode sync_node(&trans);
|
| if (change.change_type() == SyncChange::ACTION_DELETE) {
|
| - if (!AttemptDelete(change, &sync_node)) {
|
| + SyncError error = AttemptDelete(change, type, type_str, &sync_node,
|
| + error_handler());
|
| + if (error.IsSet()) {
|
| NOTREACHED();
|
| - SyncError error(FROM_HERE,
|
| - "Failed to delete " + type_str + " node.",
|
| - type);
|
| - error_handler()->OnSingleDatatypeUnrecoverableError(error.location(),
|
| - error.message());
|
| return error;
|
| }
|
| } else if (change.change_type() == SyncChange::ACTION_ADD) {
|
|
|