| Index: chrome/browser/sync/engine/syncer_util.cc
|
| diff --git a/chrome/browser/sync/engine/syncer_util.cc b/chrome/browser/sync/engine/syncer_util.cc
|
| index 3b62abb7bc9f8622e0e3e86e441ce9c721b1b612..c1bed3583325d8d8ed299b2a5e75c167ef739f15 100644
|
| --- a/chrome/browser/sync/engine/syncer_util.cc
|
| +++ b/chrome/browser/sync/engine/syncer_util.cc
|
| @@ -475,8 +475,7 @@ bool SyncerUtil::ServerAndLocalOrdersMatch(syncable::Entry* entry) {
|
|
|
| // Now find the closest up-to-date sibling in the server order.
|
| syncable::Id server_up_to_date_predecessor =
|
| - ComputePrevIdFromServerPosition(entry->trans(), entry,
|
| - entry->Get(SERVER_PARENT_ID));
|
| + entry->ComputePrevIdFromServerPosition(entry->Get(SERVER_PARENT_ID));
|
| return server_up_to_date_predecessor == local_up_to_date_predecessor;
|
| }
|
|
|
| @@ -563,8 +562,8 @@ void SyncerUtil::UpdateLocalDataFromServerData(
|
| entry->Put(NON_UNIQUE_NAME, entry->Get(SERVER_NON_UNIQUE_NAME));
|
| entry->Put(PARENT_ID, entry->Get(SERVER_PARENT_ID));
|
| CHECK(entry->Put(IS_DEL, false));
|
| - Id new_predecessor = ComputePrevIdFromServerPosition(trans, entry,
|
| - entry->Get(SERVER_PARENT_ID));
|
| + Id new_predecessor =
|
| + entry->ComputePrevIdFromServerPosition(entry->Get(SERVER_PARENT_ID));
|
| CHECK(entry->PutPredecessor(new_predecessor))
|
| << " Illegal predecessor after converting from server position.";
|
| }
|
| @@ -844,62 +843,4 @@ VerifyResult SyncerUtil::VerifyUndelete(syncable::WriteTransaction* trans,
|
| return VERIFY_UNDECIDED;
|
| }
|
|
|
| -// static
|
| -syncable::Id SyncerUtil::ComputePrevIdFromServerPosition(
|
| - syncable::BaseTransaction* trans,
|
| - syncable::Entry* update_item,
|
| - const syncable::Id& parent_id) {
|
| - const int64 position_in_parent = update_item->Get(SERVER_POSITION_IN_PARENT);
|
| -
|
| - // TODO(ncarter): This computation is linear in the number of children, but
|
| - // we could make it logarithmic if we kept an index on server position.
|
| - syncable::Id closest_sibling;
|
| - syncable::Id next_id = trans->directory()->GetFirstChildId(trans, parent_id);
|
| - while (!next_id.IsRoot()) {
|
| - syncable::Entry candidate(trans, GET_BY_ID, next_id);
|
| - if (!candidate.good()) {
|
| - LOG(WARNING) << "Should not happen";
|
| - return closest_sibling;
|
| - }
|
| - next_id = candidate.Get(NEXT_ID);
|
| -
|
| - // Defensively prevent self-comparison.
|
| - if (candidate.Get(META_HANDLE) == update_item->Get(META_HANDLE)) {
|
| - continue;
|
| - }
|
| -
|
| - // Ignore unapplied updates -- they might not even be server-siblings.
|
| - if (candidate.Get(IS_UNAPPLIED_UPDATE)) {
|
| - continue;
|
| - }
|
| -
|
| - // Unsynced items don't have a valid server position.
|
| - if (!candidate.Get(IS_UNSYNCED)) {
|
| - // If |candidate| is after |update_entry| according to the server
|
| - // ordering, then we're done. ID is the tiebreaker.
|
| - if ((candidate.Get(SERVER_POSITION_IN_PARENT) > position_in_parent) ||
|
| - ((candidate.Get(SERVER_POSITION_IN_PARENT) == position_in_parent) &&
|
| - (candidate.Get(ID) > update_item->Get(ID)))) {
|
| - return closest_sibling;
|
| - }
|
| - }
|
| -
|
| - // We can't trust the SERVER_ fields of unsynced items, but they are
|
| - // potentially legitimate local predecessors. In the case where
|
| - // |update_item| and an unsynced item wind up in the same insertion
|
| - // position, we need to choose how to order them. The following check puts
|
| - // the unapplied update first; removing it would put the unsynced item(s)
|
| - // first.
|
| - if (candidate.Get(IS_UNSYNCED)) {
|
| - continue;
|
| - }
|
| -
|
| - // |update_entry| is considered to be somewhere after |candidate|, so store
|
| - // it as the upper bound.
|
| - closest_sibling = candidate.Get(ID);
|
| - }
|
| -
|
| - return closest_sibling;
|
| -}
|
| -
|
| } // namespace browser_sync
|
|
|