Index: chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java |
index 15a18f5ee2bbc377643ff60ec0eacb5a9ceb4e2c..2e1b490c37af073bd88a8bb30e76d6600d2d4345 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java |
@@ -18,6 +18,7 @@ import java.util.List; |
*/ |
public class BookmarksBridge { |
private final Profile mProfile; |
+ private boolean mExtensiveBookmarkChangesHappening; |
private long mNativeBookmarksBridge; |
private boolean mIsNativeBookmarkModelLoaded; |
private final List<DelayedBookmarkCallback> mDelayedBookmarkCallbacks = |
@@ -48,71 +49,95 @@ public class BookmarksBridge { |
} |
/** |
- * Interface that provides listeners to be notified of changes to the bookmark model. |
+ * Base empty implementation observer class that provides listeners to be notified of changes |
+ * to the bookmark model. It's a mandatory to implement one method, |
Ian Wen
2014/09/10 21:48:51
s It's a mandatory/It's mandatory
Kibeom Kim (inactive)
2014/09/10 22:39:16
Done.
|
+ * bookmarkModelChangedNotDuringExtensiveChange. Other methods are optional and if they aren't |
+ * overridden, the default implementation of them will eventually call |
+ * bookmarkModelChangedNotDuringExtensiveChange. |
*/ |
- public interface BookmarkModelObserver { |
+ public abstract static class BookmarkModelObserver { |
/** |
- * Invoked when a node has moved. |
+ * Invoked when a node has been removed, the item may still be starred though. |
+ * @param parent The parent of the node that was removed. |
+ * @param oldIndex The index of the removed node in the parent before it was removed. |
+ * @param node The node that was removed. |
+ * @param isExtensiveBookmarkChangesHappening whether extensive changes are happening. |
+ */ |
+ public void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node, |
+ boolean isExtensiveBookmarkChangesHappening) { |
+ if (!isExtensiveBookmarkChangesHappening) { |
+ bookmarkNodeRemovedNotDuringExtensiveChange(parent, oldIndex, node); |
+ } |
+ } |
+ |
+ /** |
+ * Invoked when a node has moved. But only when it's not during extensive change. |
Ted C
2014/09/10 21:57:40
I wouldn't include "But only when it's not during
Kibeom Kim (inactive)
2014/09/10 22:39:16
Done.
|
* @param oldParent The parent before the move. |
* @param oldIndex The index of the node in the old parent. |
* @param newParent The parent after the move. |
* @param newIndex The index of the node in the new parent. |
*/ |
- void bookmarkNodeMoved( |
- BookmarkItem oldParent, int oldIndex, BookmarkItem newParent, int newIndex); |
+ public void bookmarkNodeMovedNotDuringExtensiveChange( |
Ian Wen
2014/09/10 21:48:51
I wonder if we could rename these functions to be
Ted C
2014/09/10 21:57:39
I don't think we need these NotDuringExtensiveChan
|
+ BookmarkItem oldParent, int oldIndex, BookmarkItem newParent, int newIndex) { |
+ bookmarkModelChangedNotDuringExtensiveChange(); |
+ } |
/** |
- * Invoked when a node has been added. |
+ * Invoked when a node has been added. But only when it's not during extensive change. |
* @param parent The parent of the node being added. |
* @param index The index of the added node. |
*/ |
- void bookmarkNodeAdded(BookmarkItem parent, int index); |
+ public void bookmarkNodeAddedNotDuringExtensiveChange(BookmarkItem parent, int index) { |
+ bookmarkModelChangedNotDuringExtensiveChange(); |
+ } |
/** |
* Invoked when a node has been removed, the item may still be starred though. |
+ * But only when it's not during extensive change. |
* @param parent The parent of the node that was removed. |
* @param oldIndex The index of the removed node in the parent before it was removed. |
* @param node The node that was removed. |
*/ |
- void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node); |
+ public void bookmarkNodeRemovedNotDuringExtensiveChange(BookmarkItem parent, int oldIndex, |
+ BookmarkItem node) { |
+ bookmarkModelChangedNotDuringExtensiveChange(); |
+ } |
/** |
- * Invoked when the title or url of a node changes. |
+ * Invoked when the title or url of a node changes. But only when it's not during extensive |
+ * change. |
* @param node The node being changed. |
*/ |
- void bookmarkNodeChanged(BookmarkItem node); |
+ public void bookmarkNodeChangedNotDuringExtensiveChange(BookmarkItem node) { |
+ bookmarkModelChangedNotDuringExtensiveChange(); |
+ } |
/** |
* Invoked when the children (just direct children, not descendants) of a node have been |
- * reordered in some way, such as sorted. |
+ * reordered in some way, such as sorted. But only when it's not during extensive change. |
* @param node The node whose children are being reordered. |
*/ |
- void bookmarkNodeChildrenReordered(BookmarkItem node); |
- |
- /** |
- * Invoked before an extensive set of model changes is about to begin. This tells UI |
- * intensive observers to wait until the updates finish to update themselves. These methods |
- * should only be used for imports and sync. Observers should still respond to |
- * BookmarkNodeRemoved immediately, to avoid holding onto stale node references. |
- */ |
- void extensiveBookmarkChangesBeginning(); |
+ public void bookmarkNodeChildrenReorderedNotDuringExtensiveChange(BookmarkItem node) { |
+ bookmarkModelChangedNotDuringExtensiveChange(); |
+ } |
/** |
- * Invoked after an extensive set of model changes has ended. This tells observers to |
- * update themselves if they were waiting for the update to finish. |
+ * Called when the native side of bookmark is loaded and now in usable state. |
*/ |
- void extensiveBookmarkChangesEnded(); |
+ public void bookmarkModelLoaded() { |
+ bookmarkModelChangedNotDuringExtensiveChange(); |
+ } |
/** |
* Called when there are changes to the bookmark model that don't trigger any of the other |
- * callback methods. For example, this is called when partner bookmarks change. |
+ * callback methods or it wasn't handled by other callback methods. Also note that this |
Ted C
2014/09/10 21:57:39
This behavior is odd to me. I fear that this will
Kibeom Kim (inactive)
2014/09/10 22:39:16
I think it should be a common pattern. First, we c
|
+ * isn't called during extensive change. |
+ * Examples: |
+ * - On partner bookmarks change. |
+ * - On extensive change finished. |
+ * - Falling back from other methods that are not overridden in this class. |
*/ |
- void bookmarkModelChanged(); |
- |
- /** |
- * Called when the native side of bookmark is loaded and now in usable state. |
- */ |
- void bookmarkModelLoaded(); |
+ public abstract void bookmarkModelChangedNotDuringExtensiveChange(); |
} |
/** |
@@ -372,57 +397,66 @@ public class BookmarksBridge { |
@CalledByNative |
private void bookmarkNodeMoved( |
BookmarkItem oldParent, int oldIndex, BookmarkItem newParent, int newIndex) { |
- for (BookmarkModelObserver observer : mObservers) { |
- observer.bookmarkNodeMoved(oldParent, oldIndex, newParent, newIndex); |
+ if (!mExtensiveBookmarkChangesHappening) { |
Ted C
2014/09/10 21:57:40
for all these i would early exit
if (mExtensiveBo
Kibeom Kim (inactive)
2014/09/10 22:39:16
Done.
|
+ for (BookmarkModelObserver observer : mObservers) { |
+ observer.bookmarkNodeMovedNotDuringExtensiveChange(oldParent, oldIndex, newParent, |
+ newIndex); |
+ } |
} |
} |
@CalledByNative |
private void bookmarkNodeAdded(BookmarkItem parent, int index) { |
- for (BookmarkModelObserver observer : mObservers) { |
- observer.bookmarkNodeAdded(parent, index); |
+ if (!mExtensiveBookmarkChangesHappening) { |
+ for (BookmarkModelObserver observer : mObservers) { |
+ observer.bookmarkNodeAddedNotDuringExtensiveChange(parent, index); |
+ } |
} |
} |
@CalledByNative |
private void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node) { |
for (BookmarkModelObserver observer : mObservers) { |
- observer.bookmarkNodeRemoved(parent, oldIndex, node); |
+ observer.bookmarkNodeRemoved(parent, oldIndex, node, |
+ mExtensiveBookmarkChangesHappening); |
} |
} |
@CalledByNative |
private void bookmarkNodeChanged(BookmarkItem node) { |
- for (BookmarkModelObserver observer : mObservers) { |
- observer.bookmarkNodeChanged(node); |
+ if (!mExtensiveBookmarkChangesHappening) { |
+ for (BookmarkModelObserver observer : mObservers) { |
+ observer.bookmarkNodeChangedNotDuringExtensiveChange(node); |
+ } |
} |
} |
@CalledByNative |
private void bookmarkNodeChildrenReordered(BookmarkItem node) { |
- for (BookmarkModelObserver observer : mObservers) { |
- observer.bookmarkNodeChildrenReordered(node); |
+ if (!mExtensiveBookmarkChangesHappening) { |
+ for (BookmarkModelObserver observer : mObservers) { |
+ observer.bookmarkNodeChildrenReorderedNotDuringExtensiveChange(node); |
+ } |
} |
} |
@CalledByNative |
private void extensiveBookmarkChangesBeginning() { |
- for (BookmarkModelObserver observer : mObservers) { |
- observer.extensiveBookmarkChangesBeginning(); |
- } |
+ mExtensiveBookmarkChangesHappening = true; |
} |
@CalledByNative |
private void extensiveBookmarkChangesEnded() { |
- for (BookmarkModelObserver observer : mObservers) { |
- observer.extensiveBookmarkChangesEnded(); |
- } |
+ mExtensiveBookmarkChangesHappening = false; |
+ bookmarkModelChanged(); |
} |
@CalledByNative |
private void bookmarkModelChanged() { |
- for (BookmarkModelObserver observer : mObservers) { |
- observer.bookmarkModelChanged(); |
+ if (!mExtensiveBookmarkChangesHappening) { |
+ for (BookmarkModelObserver observer : mObservers) { |
+ observer.bookmarkModelChangedNotDuringExtensiveChange(); |
+ } |
} |
} |