Chromium Code Reviews| 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 7d772a19766b1a8682de44eb493a6f8998e90082..80dd1f5c6e9fd32e7948565617da2a3c30ba5c9c 100644 |
| --- a/chrome/browser/resources/md_bookmarks/list.js |
| +++ b/chrome/browser/resources/md_bookmarks/list.js |
| @@ -64,8 +64,19 @@ Polymer({ |
| }); |
| this.updateFromStore(); |
| + this.boundOnItemKeydown_ = this.onItemKeydown_.bind(this); |
| + this.boundOnHighlightItems_ = this.onHighlightItems_.bind(this); |
| + |
| this.$.bookmarksCard.addEventListener( |
| - 'keydown', this.onItemKeydown_.bind(this), true); |
| + 'keydown', this.boundOnItemKeydown_, true); |
| + document.addEventListener('highlight-items', this.boundOnHighlightItems_); |
| + }, |
| + |
| + detached: function() { |
| + this.$.bookmarksCard.removeEventListener( |
| + 'keydown', this.boundOnItemKeydown_, true); |
| + document.removeEventListener( |
| + 'highlight-items', this.boundOnHighlightItems_); |
| }, |
| /** @return {HTMLElement} */ |
| @@ -108,6 +119,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.$.bookmarksCard; |
| + if (index >= 0 && index < list.firstVisibleIndex || |
| + index > list.lastVisibleIndex) { |
| + list.scrollToIndex(index); |
| + } |
| + }, |
| + |
| /** @private */ |
| emptyListMessage_: function() { |
| var emptyListMessage = this.searchTerm_ ? 'noSearchResults' : 'emptyList'; |
| @@ -137,12 +162,33 @@ 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) { |
| + var toHighlight = /** @type {!Array<string>} */ |
| + (e.detail.filter((item) => this.displayedIds_.indexOf(item) != -1)); |
|
calamity
2017/07/14 04:14:39
Comment plx. What are the cases where this comes u
tsergeant
2017/07/14 06:39:20
This is just being defensive, but I think it's a r
calamity
2017/07/17 05:09:49
Acknowledged.
|
| + |
| + assert(toHighlight.length > 0); |
| + var leadId = toHighlight[0]; |
| + this.dispatch(bookmarks.actions.updateAnchor(leadId)); |
| + this.dispatch( |
| + bookmarks.actions.selectAll(toHighlight, this.getState(), leadId)); |
|
calamity
2017/07/14 04:14:39
So a batch of operations from a move isn't _guaran
calamity
2017/07/14 04:14:39
leadId is selected as the anchor here and in the p
tsergeant
2017/07/14 06:39:19
Yeah, this is the thing that was hard about this C
tsergeant
2017/07/14 06:39:20
Done.
calamity
2017/07/17 05:09:49
Can we add a completion callback to Drop and Paste
tsergeant
2017/07/18 01:08:54
Done.
|
| + |
| + // Allow iron-list time to render changes to the list. |
|
calamity
2017/07/14 04:14:39
What changes need to be rendered here? The adds/re
tsergeant
2017/07/14 06:39:20
Yeah, additions to the list are what's important.
|
| + this.async(function() { |
| + this.scrollToId_(leadId); |
| + var leadIndex = this.displayedIds_.indexOf(leadId); |
| + assert(leadIndex != -1); |
| + this.$.bookmarksCard.focusItem(leadIndex); |
|
calamity
2017/07/14 04:14:39
tangent: I would love to rename bookmarksCard to l
tsergeant
2017/07/14 06:39:19
Renamed to list.
|
| + }); |
| }, |
| /** |