Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1832)

Unified Diff: chrome/browser/resources/md_bookmarks/api_listener.js

Issue 2977523002: MD Bookmarks: Scroll and select items that are added to the main list (Closed)
Patch Set: Reformat json schema Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/resources/md_bookmarks/actions.js ('k') | chrome/browser/resources/md_bookmarks/app.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/resources/md_bookmarks/api_listener.js
diff --git a/chrome/browser/resources/md_bookmarks/api_listener.js b/chrome/browser/resources/md_bookmarks/api_listener.js
index 1e8852cbe7d587a12e13c8fe04c9ef2a0978a0bb..681e941d74179a16ab4f25dbe4696a7d9842522c 100644
--- a/chrome/browser/resources/md_bookmarks/api_listener.js
+++ b/chrome/browser/resources/md_bookmarks/api_listener.js
@@ -9,8 +9,12 @@
cr.define('bookmarks.ApiListener', function() {
- /** @type {?number} */
- var timerHandle;
+ /** @type {boolean} */
+ var trackUpdates = false;
+ /** @type {!Array<string>} */
+ var updatedItems = [];
+
+ var debouncer;
/**
* Batches UI updates so that no changes will be made to UI until the next
@@ -18,15 +22,43 @@ cr.define('bookmarks.ApiListener', function() {
* can be called in a tight loop by UI actions.
*/
function batchUIUpdates() {
- if (timerHandle)
- clearTimeout(timerHandle);
- else
+ if (!debouncer || debouncer.done()) {
bookmarks.Store.getInstance().beginBatchUpdate();
+ debouncer = new bookmarks.Debouncer(
+ () => bookmarks.Store.getInstance().endBatchUpdate());
+ }
- timerHandle = setTimeout(function() {
- bookmarks.Store.getInstance().endBatchUpdate();
- timerHandle = null;
- });
+ debouncer.resetTimeout();
+ }
+
+ /**
+ * Tracks any items that are created or moved.
+ */
+ function trackUpdatedItems() {
+ trackUpdates = true;
+ }
+
+ function highlightUpdatedItemsImpl() {
+ if (!trackUpdates)
+ return;
+
+ document.dispatchEvent(new CustomEvent('highlight-items', {
+ detail: updatedItems,
+ }));
+ updatedItems = [];
+ trackUpdates = false;
+ }
+
+ /**
+ * Highlights any items that have been updated since |trackUpdatedItems| was
+ * called. Should be called after a user action causes new items to appear in
+ * the main list.
+ */
+ function highlightUpdatedItems() {
+ // Ensure that the items are highlighted after the current batch update (if
+ // there is one) is completed.
+ assert(debouncer);
+ debouncer.promise.then(highlightUpdatedItemsImpl);
}
/** @param {Action} action */
@@ -48,6 +80,8 @@ cr.define('bookmarks.ApiListener', function() {
*/
function onBookmarkCreated(id, treeNode) {
batchUIUpdates();
+ if (trackUpdatedItems)
+ updatedItems.push(id);
dispatch(bookmarks.actions.createBookmark(id, treeNode));
}
@@ -73,6 +107,8 @@ cr.define('bookmarks.ApiListener', function() {
*/
function onBookmarkMoved(id, moveInfo) {
batchUIUpdates();
+ if (trackUpdatedItems)
+ updatedItems.push(id);
dispatch(bookmarks.actions.moveBookmark(
id, moveInfo.parentId, moveInfo.index, moveInfo.oldParentId,
moveInfo.oldIndex));
@@ -116,14 +152,18 @@ cr.define('bookmarks.ApiListener', function() {
dispatch(bookmarks.actions.setCanEditBookmarks(canEdit));
}
+ var listeners = [
+ {api: chrome.bookmarks.onChanged, fn: onBookmarkChanged},
+ {api: chrome.bookmarks.onChildrenReordered, fn: onChildrenReordered},
+ {api: chrome.bookmarks.onCreated, fn: onBookmarkCreated},
+ {api: chrome.bookmarks.onMoved, fn: onBookmarkMoved},
+ {api: chrome.bookmarks.onRemoved, fn: onBookmarkRemoved},
+ {api: chrome.bookmarks.onImportBegan, fn: onImportBegan},
+ {api: chrome.bookmarks.onImportEnded, fn: onImportEnded},
+ ];
+
function init() {
- chrome.bookmarks.onChanged.addListener(onBookmarkChanged);
- chrome.bookmarks.onChildrenReordered.addListener(onChildrenReordered);
- chrome.bookmarks.onCreated.addListener(onBookmarkCreated);
- chrome.bookmarks.onMoved.addListener(onBookmarkMoved);
- chrome.bookmarks.onRemoved.addListener(onBookmarkRemoved);
- chrome.bookmarks.onImportBegan.addListener(onImportBegan);
- chrome.bookmarks.onImportEnded.addListener(onImportEnded);
+ listeners.forEach((listener) => listener.api.addListener(listener.fn));
cr.sendWithPromise('getIncognitoAvailability')
.then(onIncognitoAvailabilityChanged);
@@ -135,7 +175,18 @@ cr.define('bookmarks.ApiListener', function() {
'can-edit-bookmarks-changed', onCanEditBookmarksChanged);
}
+ function destroy() {
+ listeners.forEach((listener) => listener.api.removeListener(listener.fn));
+ cr.removeWebUIListener(
+ 'incognito-availability-changed', onIncognitoAvailabilityChanged);
+ cr.removeWebUIListener(
+ 'can-edit-bookmarks-changed', onCanEditBookmarksChanged);
+ }
+
return {
init: init,
+ destroy: destroy,
+ trackUpdatedItems: trackUpdatedItems,
+ highlightUpdatedItems: highlightUpdatedItems,
};
});
« no previous file with comments | « chrome/browser/resources/md_bookmarks/actions.js ('k') | chrome/browser/resources/md_bookmarks/app.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698