Index: chrome/browser/resources/md_bookmarks/list.js |
diff --git a/chrome/browser/resources/md_bookmarks/list.js b/chrome/browser/resources/md_bookmarks/list.js |
index 0b14ed4dd2469359a5240d74501482bc405a5c4f..e603de200b9a7eb772c096a4be10d03b870fa253 100644 |
--- a/chrome/browser/resources/md_bookmarks/list.js |
+++ b/chrome/browser/resources/md_bookmarks/list.js |
@@ -20,7 +20,7 @@ Polymer({ |
type: Array, |
value: function() { |
// Use an empty list during initialization so that the databinding to |
- // hide #bookmarksCard takes effect. |
+ // hide #list takes effect. |
return []; |
}, |
}, |
@@ -50,7 +50,7 @@ Polymer({ |
}, |
attached: function() { |
- var list = /** @type {IronListElement} */ (this.$.bookmarksCard); |
+ var list = /** @type {IronListElement} */ (this.$.list); |
list.scrollTarget = this; |
this.watch('displayedIds_', function(state) { |
@@ -64,8 +64,17 @@ Polymer({ |
}); |
this.updateFromStore(); |
- this.$.bookmarksCard.addEventListener( |
+ this.$.list.addEventListener( |
'keydown', this.onItemKeydown_.bind(this), true); |
+ |
+ /** @private {function(!Event)} */ |
+ this.boundOnHighlightItems_ = this.onHighlightItems_.bind(this); |
+ document.addEventListener('highlight-items', this.boundOnHighlightItems_); |
+ }, |
+ |
+ detached: function() { |
+ document.removeEventListener( |
+ 'highlight-items', this.boundOnHighlightItems_); |
}, |
/** @return {HTMLElement} */ |
@@ -108,6 +117,20 @@ Polymer({ |
this.scrollTop = 0; |
}, |
+ /** |
+ * Scroll the list so that |itemId| is visible, if it is not already. |
+ * @param {string} itemId |
+ * @private |
+ */ |
+ scrollToId_: function(itemId) { |
+ var index = this.displayedIds_.indexOf(itemId); |
+ var list = this.$.list; |
+ if (index >= 0 && index < list.firstVisibleIndex || |
+ index > list.lastVisibleIndex) { |
+ list.scrollToIndex(index); |
+ } |
+ }, |
+ |
/** @private */ |
emptyListMessage_: function() { |
var emptyListMessage = this.searchTerm_ ? 'noSearchResults' : 'emptyList'; |
@@ -129,7 +152,7 @@ Polymer({ |
* @private |
*/ |
getIndexForItemElement_: function(el) { |
- return this.$.bookmarksCard.modelForElement(el).index; |
+ return this.$.list.modelForElement(el).index; |
}, |
/** |
@@ -137,12 +160,35 @@ Polymer({ |
* @private |
*/ |
onOpenItemMenu_: function(e) { |
- var index = this.displayedIds_.indexOf( |
- /** @type {BookmarksItemElement} */ (e.path[0]).itemId); |
- var list = this.$.bookmarksCard; |
// If the item is not visible, scroll to it before rendering the menu. |
- if (index < list.firstVisibleIndex || index > list.lastVisibleIndex) |
- list.scrollToIndex(index); |
+ this.scrollToId_(/** @type {BookmarksItemElement} */ (e.path[0]).itemId); |
+ }, |
+ |
+ /** |
+ * Highlight a list of items by selecting them, scrolling them into view and |
+ * focusing the first item. |
+ * @param {Event} e |
+ * @private |
+ */ |
+ onHighlightItems_: function(e) { |
+ // Ensure that we only select items which are actually being displayed. |
+ // This should only matter if an unrelated update to the bookmark model |
+ // happens with the perfect timing to end up in a tracked batch update. |
+ var toHighlight = /** @type {!Array<string>} */ |
+ (e.detail.filter((item) => this.displayedIds_.indexOf(item) != -1)); |
+ |
+ assert(toHighlight.length > 0); |
+ var leadId = toHighlight[0]; |
+ this.dispatch( |
+ bookmarks.actions.selectAll(toHighlight, this.getState(), leadId)); |
+ |
+ // Allow iron-list time to render additions to the list. |
+ this.async(function() { |
+ this.scrollToId_(leadId); |
+ var leadIndex = this.displayedIds_.indexOf(leadId); |
+ assert(leadIndex != -1); |
+ this.$.list.focusItem(leadIndex); |
+ }); |
}, |
/** |
@@ -151,7 +197,7 @@ Polymer({ |
*/ |
onItemKeydown_: function(e) { |
var handled = true; |
- var list = this.$.bookmarksCard; |
+ var list = this.$.list; |
var focusMoved = false; |
var focusedIndex = |
this.getIndexForItemElement_(/** @type {HTMLElement} */ (e.target)); |