| 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);
|
| + }
|
|
|
| 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;
|
|
|