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. |
*/ |