Index: chrome/browser/resources/extensions/extension_list.js |
diff --git a/chrome/browser/resources/extensions/extension_list.js b/chrome/browser/resources/extensions/extension_list.js |
index c05e07f01f8c8d00bec4574b3da35b35d4d8d833..8e6e6d105530ad5b79ca600e73b47a95f640f758 100644 |
--- a/chrome/browser/resources/extensions/extension_list.js |
+++ b/chrome/browser/resources/extensions/extension_list.js |
@@ -146,8 +146,7 @@ cr.define('extensions', function() { |
function ExtensionList() { |
var div = document.createElement('div'); |
div.__proto__ = ExtensionList.prototype; |
- /** @private {!Array<ExtensionInfo>} */ |
- div.extensions_ = []; |
+ div.initialize(); |
return div; |
} |
@@ -206,6 +205,39 @@ cr.define('extensions', function() { |
enableAppInfoDialog_: false, |
/** |
+ * Initializes the list. |
+ */ |
+ initialize: function() { |
+ /** @private {!Array<ExtensionInfo>} */ |
+ this.extensions_ = []; |
+ |
+ chrome.developerPrivate.onItemStateChanged.addListener( |
+ function(eventData) { |
+ var EventType = chrome.developerPrivate.EventType; |
+ switch (eventData.event_type) { |
+ case EventType.VIEW_REGISTERED: |
+ case EventType.VIEW_UNREGISTERED: |
+ // For now, view notifications are handled through the WebUI. |
+ // TODO(devlin): Transition these. |
+ break; |
+ case EventType.INSTALLED: |
+ case EventType.LOADED: |
+ case EventType.UNLOADED: |
+ case EventType.ERROR_ADDED: |
+ if (eventData.extensionInfo) |
+ this.updateExtension_(eventData.extensionInfo); |
+ break; |
+ case EventType.UNINSTALLED: |
+ var childNode = $(eventData.item_id); |
+ childNode.parentNode.removeChild(childNode); |
+ break; |
+ default: |
+ assertNotReached(); |
+ } |
+ }.bind(this)); |
+ }, |
+ |
+ /** |
* Updates the extensions on the page. |
* @param {boolean} incognitoAvailable Whether or not incognito is allowed. |
* @param {boolean} enableAppInfoDialog Whether or not the app info dialog |
@@ -270,15 +302,9 @@ cr.define('extensions', function() { |
var seenIds = []; |
// Iterate over the extension data and add each item to the list. |
- this.extensions_.forEach(function(extension, i) { |
- var nextExt = this.extensions_[i + 1]; |
- var node = $(extension.id); |
+ this.extensions_.forEach(function(extension) { |
seenIds.push(extension.id); |
- |
- if (node) |
- this.updateNode_(extension, node); |
- else |
- this.createNode_(extension, nextExt ? $(nextExt.id) : null); |
+ this.updateExtension_(extension); |
}, this); |
// Remove extensions that are no longer installed. |
@@ -984,6 +1010,22 @@ cr.define('extensions', function() { |
// after its showing animation? Makes very little sense to me. |
overlay.setInitialFocus(); |
}, |
+ |
+ /** |
+ * Updates the node for the extension. |
+ * @param {!ExtensionInfo} extension The information about the extension to |
+ * update. |
+ * @private |
+ */ |
+ updateExtension_: function(extension) { |
+ var node = /** @type {ExtensionFocusRow} */ ($(extension.id)); |
+ if (node) { |
+ this.updateNode_(extension, node); |
+ } else { |
+ var nextExt = this.extensions_[this.extensions_.indexOf(extension) + 1]; |
+ this.createNode_(extension, nextExt ? $(nextExt.id) : null); |
+ } |
+ } |
}; |
return { |