Index: chrome/browser/enhanced_bookmarks/chrome_bookmark_server_cluster_service.cc |
diff --git a/chrome/browser/enhanced_bookmarks/chrome_bookmark_server_cluster_service.cc b/chrome/browser/enhanced_bookmarks/chrome_bookmark_server_cluster_service.cc |
index e270c5356257974be9e464961bf984e4aa209e3e..2643b3999cf432621c9525d332cbe68172e5b656 100644 |
--- a/chrome/browser/enhanced_bookmarks/chrome_bookmark_server_cluster_service.cc |
+++ b/chrome/browser/enhanced_bookmarks/chrome_bookmark_server_cluster_service.cc |
@@ -37,8 +37,8 @@ void ChromeBookmarkServerClusterService::AddObserver( |
BookmarkServerServiceObserver* observer) { |
BookmarkServerClusterService::AddObserver(observer); |
if (sync_refresh_skipped_) { |
- sync_refresh_skipped_ = false; |
TriggerTokenRequest(false); |
+ sync_refresh_skipped_ = false; |
} |
} |
@@ -50,19 +50,55 @@ void ChromeBookmarkServerClusterService::OnSyncCycleCompleted() { |
// The stars cluster API relies on the information in chrome-sync. Sending a |
// cluster request immediately after a bookmark is changed from the bookmark |
// observer notification will yield the wrong results. The request must be |
- // delayed until the sync cycle has completed. In fact, the ideal signal would |
- // be "bookmark changed by sync", but we don't have that yet, and this is a |
- // compromise. |
+ // delayed until the sync cycle has completed. |
// Note that we will be skipping calling this cluster API if there is no |
// observer attached, because calling that is meaningless without UI to show. |
- if (model_->loaded()) { |
+ // We also will avoid requesting for clusters if the bookmark data hasn't |
+ // changed. |
+ if (refreshes_needed_ > 0) { |
+ DCHECK(model_->loaded()); |
if (observers_.might_have_observers()) { |
TriggerTokenRequest(false); |
sync_refresh_skipped_ = false; |
} else { |
sync_refresh_skipped_ = true; |
} |
+ --refreshes_needed_; |
} |
} |
+void ChromeBookmarkServerClusterService::EnhancedBookmarkAdded( |
+ const BookmarkNode* node) { |
+ BookmarkServerClusterService::EnhancedBookmarkAdded(node); |
+ InvalidateCache(); |
+} |
+ |
+void ChromeBookmarkServerClusterService::EnhancedBookmarkRemoved( |
+ const BookmarkNode* node) { |
+ BookmarkServerClusterService::EnhancedBookmarkRemoved(node); |
+ InvalidateCache(); |
+} |
+ |
+void ChromeBookmarkServerClusterService::EnhancedBookmarkNodeChanged( |
+ const BookmarkNode* node) { |
+ BookmarkServerClusterService::EnhancedBookmarkNodeChanged(node); |
+ InvalidateCache(); |
+} |
+ |
+void ChromeBookmarkServerClusterService::InvalidateCache() { |
+ // Bookmark changes can happen locally or via sync. It is difficult to |
+ // determine if a given SyncCycle contains all the local modifications. |
+ // |
+ // Consider the following sequence: |
+ // 1. SyncCycleBeginning (bookmark version:1) |
+ // 2. Bookmarks mutate locally (bookmark version:2) |
+ // 3. SyncCycleCompleted (bookmark version:1) |
+ // |
+ // In this case, the bookmarks modified locally won't be sent to the server |
+ // until the next SyncCycleCompleted. Since we can't accurately determine |
+ // if a bookmark change has been sent on a SyncCycleCompleted, we're always |
+ // assuming that we need to wait for 2 sync cycles. |
+ refreshes_needed_ = 2; |
+} |
+ |
} // namespace enhanced_bookmarks |