Chromium Code Reviews| Index: chrome/browser/sync/glue/bookmark_model_associator.cc |
| diff --git a/chrome/browser/sync/glue/bookmark_model_associator.cc b/chrome/browser/sync/glue/bookmark_model_associator.cc |
| index c8395013242dde72c88ab48e2ccda0c9c04fa1a1..c01829bc5b36ecb50cc711f07207200d3835cdee 100644 |
| --- a/chrome/browser/sync/glue/bookmark_model_associator.cc |
| +++ b/chrome/browser/sync/glue/bookmark_model_associator.cc |
| @@ -6,6 +6,7 @@ |
| #include <stack> |
| +#include "base/command_line.h" |
| #include "base/hash_tables.h" |
| #include "base/message_loop.h" |
| #include "base/task.h" |
| @@ -17,6 +18,7 @@ |
| #include "chrome/browser/sync/syncable/autofill_migration.h" |
| #include "chrome/browser/sync/syncable/nigori_util.h" |
| #include "chrome/browser/sync/util/cryptographer.h" |
| +#include "chrome/common/chrome_switches.h" |
| #include "content/browser/browser_thread.h" |
| namespace browser_sync { |
| @@ -40,6 +42,7 @@ namespace browser_sync { |
| // TODO(ncarter): Pull these tags from an external protocol specification |
| // rather than hardcoding them here. |
| static const char kBookmarkBarTag[] = "bookmark_bar"; |
| +static const char kSyncedBookmarksTag[] = "synced_bookmarks"; |
| static const char kOtherBookmarksTag[] = "other_bookmarks"; |
| // Bookmark comparer for map of bookmark nodes. |
| @@ -232,6 +235,7 @@ void BookmarkModelAssociator::Disassociate(int64 sync_id) { |
| bool BookmarkModelAssociator::SyncModelHasUserCreatedNodes(bool* has_nodes) { |
| DCHECK(has_nodes); |
| *has_nodes = false; |
| + bool has_synced_folder = true; |
| int64 bookmark_bar_sync_id; |
| if (!GetSyncIdForTaggedNode(kBookmarkBarTag, &bookmark_bar_sync_id)) { |
| return false; |
| @@ -240,6 +244,10 @@ bool BookmarkModelAssociator::SyncModelHasUserCreatedNodes(bool* has_nodes) { |
| if (!GetSyncIdForTaggedNode(kOtherBookmarksTag, &other_bookmarks_sync_id)) { |
| return false; |
| } |
| + int64 synced_bookmarks_sync_id; |
| + if (!GetSyncIdForTaggedNode(kSyncedBookmarksTag, &synced_bookmarks_sync_id)) { |
| + has_synced_folder = false; |
| + } |
| sync_api::ReadTransaction trans(user_share_); |
| @@ -253,10 +261,18 @@ bool BookmarkModelAssociator::SyncModelHasUserCreatedNodes(bool* has_nodes) { |
| return false; |
| } |
| + sync_api::ReadNode synced_bookmarks_node(&trans); |
| + if (has_synced_folder && |
| + !synced_bookmarks_node.InitByIdLookup(synced_bookmarks_sync_id)) { |
| + return false; |
| + } |
| + |
| // Sync model has user created nodes if either one of the permanent nodes |
| // has children. |
| *has_nodes = bookmark_bar_node.GetFirstChildId() != sync_api::kInvalidId || |
| - other_bookmarks_node.GetFirstChildId() != sync_api::kInvalidId; |
| + other_bookmarks_node.GetFirstChildId() != sync_api::kInvalidId || |
| + (has_synced_folder && |
| + synced_bookmarks_node.GetFirstChildId() != sync_api::kInvalidId); |
| return true; |
| } |
| @@ -346,14 +362,32 @@ bool BookmarkModelAssociator::BuildAssociations() { |
| << "are running against an out-of-date server?"; |
| return false; |
| } |
| + // We only need to ensure that the "synced bookmarks" folder exists on the |
| + // server if the command line flag is set. |
| + if (CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kEnableSyncedBookmarksFolder) && |
| + !AssociateTaggedPermanentNode(bookmark_model_->synced_node(), |
| + kSyncedBookmarksTag)) { |
| + LOG(ERROR) << "Server did not create top-level synced nodes. Possibly " |
| + << "we are running against an out-of-date server?"; |
| + return false; |
| + } |
| int64 bookmark_bar_sync_id = GetSyncIdFromChromeId( |
| bookmark_model_->GetBookmarkBarNode()->id()); |
| DCHECK(bookmark_bar_sync_id != sync_api::kInvalidId); |
| int64 other_bookmarks_sync_id = GetSyncIdFromChromeId( |
| bookmark_model_->other_node()->id()); |
| DCHECK(other_bookmarks_sync_id != sync_api::kInvalidId); |
| + int64 synced_bookmarks_sync_id = GetSyncIdFromChromeId( |
| + bookmark_model_->synced_node()->id()); |
| + if (CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kEnableSyncedBookmarksFolder)) { |
| + DCHECK(synced_bookmarks_sync_id != sync_api::kInvalidId); |
|
tim (not reviewing)
2011/05/20 16:43:09
DCHECK_NE?
Yaron
2011/05/20 17:04:25
I was just being consistent with the above code bu
|
| + } |
| std::stack<int64> dfs_stack; |
| + if (synced_bookmarks_sync_id != sync_api::kInvalidId) |
| + dfs_stack.push(synced_bookmarks_sync_id); |
| dfs_stack.push(other_bookmarks_sync_id); |
| dfs_stack.push(bookmark_bar_sync_id); |
| @@ -486,14 +520,24 @@ bool BookmarkModelAssociator::LoadAssociations() { |
| // We should always be able to find the permanent nodes. |
| return false; |
| } |
| + int64 synced_bookmarks_id = -1; |
| + if (CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kEnableSyncedBookmarksFolder) && |
| + !GetSyncIdForTaggedNode(kSyncedBookmarksTag, &synced_bookmarks_id)) { |
| + // We should always be able to find the permanent nodes. |
| + return false; |
| + } |
| // Build a bookmark node ID index since we are going to repeatedly search for |
| // bookmark nodes by their IDs. |
| BookmarkNodeIdIndex id_index; |
| id_index.AddAll(bookmark_model_->GetBookmarkBarNode()); |
| id_index.AddAll(bookmark_model_->other_node()); |
| + id_index.AddAll(bookmark_model_->synced_node()); |
| std::stack<int64> dfs_stack; |
| + if (synced_bookmarks_id != -1) |
| + dfs_stack.push(synced_bookmarks_id); |
| dfs_stack.push(other_bookmarks_id); |
| dfs_stack.push(bookmark_bar_id); |
| @@ -522,6 +566,7 @@ bool BookmarkModelAssociator::LoadAssociations() { |
| // Don't try to call NodesMatch on permanent nodes like bookmark bar and |
| // other bookmarks. They are not expected to match. |
| if (node != bookmark_model_->GetBookmarkBarNode() && |
| + node != bookmark_model_->synced_node() && |
| node != bookmark_model_->other_node() && |
| !NodesMatch(node, &sync_parent)) |
| return false; |