Chromium Code Reviews| Index: chrome/browser/resources/options/inline_editable_list.js |
| diff --git a/chrome/browser/resources/options/inline_editable_list.js b/chrome/browser/resources/options/inline_editable_list.js |
| index 05c63eac45d43b8571cd33228386b05ebea4be12..591ea8cf595fbb5db23536802ea7153de71d6065 100644 |
| --- a/chrome/browser/resources/options/inline_editable_list.js |
| +++ b/chrome/browser/resources/options/inline_editable_list.js |
| @@ -85,7 +85,8 @@ cr.define('options', function() { |
| /** @override */ |
| selectionChanged: function() { |
| - this.updateEditState(); |
| + if (!this.parentNode.eventsDisabled) |
| + this.updateEditState(); |
| }, |
| /** |
| @@ -577,6 +578,11 @@ cr.define('options', function() { |
| InlineEditableItemList.prototype = { |
| __proto__: DeletableItemList.prototype, |
| + // Event handling is disabled if > 0. |
| + // @type {number} |
|
James Hawkins
2015/01/06 18:54:51
It's legit now to do:
// @private {number}
But t
bondd
2015/01/06 23:07:24
Done. I made it a JSDoc block, but left it as
*
|
| + // @private |
| + eventsDisabledCount_: 0, |
| + |
| /** |
| * Focuses the input element of the placeholder if true. |
| * @type {boolean} |
| @@ -596,12 +602,27 @@ cr.define('options', function() { |
| }, |
| /** |
| + * Whether events are disabled. |
| + * Used to modify the list without triggering a bunch of unnecessary events. |
| + * @type {boolean} |
| + */ |
| + get eventsDisabled() { |
| + return this.eventsDisabledCount_ > 0; |
| + }, |
| + set eventsDisabled(disabled) { |
| + this.eventsDisabledCount_ += disabled ? 1 : -1; |
| + }, |
| + |
| + /** |
| * Called when the list hierarchy as a whole loses or gains focus; starts |
| * or ends editing for the lead item if necessary. |
| * @param {Event} e The change event. |
| * @private |
| */ |
| handleListFocusChange_: function(e) { |
| + if (this.eventsDisabled) |
| + return; |
| + |
| var leadItem = this.getListItemByIndex(this.selectionModel.leadIndex); |
| if (leadItem) { |
| if (e.newValue) { |
| @@ -626,6 +647,9 @@ cr.define('options', function() { |
| /** @override */ |
| handleLeadChange: function(e) { |
| + if (this.eventsDisabled) |
| + return; |
| + |
| DeletableItemList.prototype.handleLeadChange.call(this, e); |
| var focusedColumnIndex = -1; |
| @@ -665,6 +689,38 @@ cr.define('options', function() { |
| }, |
| /** |
| + * Set the selected index without changing the focused element on the page. |
| + * Used to change the selected index when the list doesn't have focus (and |
| + * doesn't want to take focus). |
| + */ |
| + setSelectedIndexWithoutFocusing: function(index) { |
| + this.eventsDisabled = true; |
| + // Remove focusability from old item. |
| + var oldItem = this.getListItemByIndex(this.selectionModel.leadIndex) || |
| + this.getInitialFocusableItem(); |
| + if (oldItem) { |
| + oldItem.setEditableValuesFocusable(false); |
| + oldItem.setStaticValuesFocusable(false); |
| + oldItem.setCloseButtonFocusable(false); |
| + oldItem.lead = false; |
| + } |
| + |
| + this.selectionModel.selectedIndex = index; |
| + // Add focusability to new item. |
| + var newItem = this.getListItemByIndex(index); |
| + if (newItem) { |
| + if (newItem.isPlaceholder) |
| + newItem.setEditableValuesFocusable(true); |
| + else |
| + newItem.setStaticValuesFocusable(true); |
| + |
| + newItem.setCloseButtonFocusable(true); |
| + newItem.lead = true; |
| + } |
| + this.eventsDisabled = false; |
| + }, |
| + |
| + /** |
| * Focus the placeholder's first input field. |
| * Should only be called immediately after the list has been repopulated. |
| */ |