diff options
Diffstat (limited to 'chromium/chrome/browser/resources/md_extensions/manager.js')
-rw-r--r-- | chromium/chrome/browser/resources/md_extensions/manager.js | 215 |
1 files changed, 214 insertions, 1 deletions
diff --git a/chromium/chrome/browser/resources/md_extensions/manager.js b/chromium/chrome/browser/resources/md_extensions/manager.js index 729ee73338e..60c33b48dc5 100644 --- a/chromium/chrome/browser/resources/md_extensions/manager.js +++ b/chromium/chrome/browser/resources/md_extensions/manager.js @@ -3,9 +3,222 @@ // found in the LICENSE file. cr.define('extensions', function() { + 'use strict'; + + /** + * Compares two extensions to determine which should come first in the list. + * @param {chrome.developerPrivate.ExtensionInfo} a + * @param {chrome.developerPrivate.ExtensionInfo} b + * @return {number} + */ + var compareExtensions = function(a, b) { + function compare(x, y) { + return x < y ? -1 : (x > y ? 1 : 0); + } + function compareLocation(x, y) { + if (x.location == y.location) + return 0; + if (x.location == chrome.developerPrivate.Location.UNPACKED) + return -1; + if (y.location == chrome.developerPrivate.Location.UNPACKED) + return 1; + return 0; + } + return compareLocation(a, b) || + compare(a.name.toLowerCase(), b.name.toLowerCase()) || + compare(a.id, b.id); + }; + var Manager = Polymer({ - is: 'extensions-manager' + is: 'extensions-manager', + + properties: { + /** @type {extensions.Sidebar} */ + sidebar: Object, + + /** @type {extensions.Service} */ + service: Object, + + inDevMode: { + type: Boolean, + value: false, + }, + + filter: { + type: String, + value: '', + }, + + /** @type {!Array<!chrome.developerPrivate.ExtensionInfo>} */ + extensions: { + type: Array, + value: function() { return []; }, + }, + + /** @type {!Array<!chrome.developerPrivate.ExtensionInfo>} */ + apps: { + type: Array, + value: function() { return []; }, + }, + + /** @type {!Array<!chrome.developerPrivate.ExtensionInfo>} */ + websites: { + type: Array, + value: function() { return []; }, + }, + }, + + behaviors: [ + I18nBehavior, + ], + + ready: function() { + /** @type {extensions.Sidebar} */ + this.sidebar = + /** @type {extensions.Sidebar} */(this.$$('extensions-sidebar')); + this.service = extensions.Service.getInstance(); + this.service.managerReady(this); + this.scrollHelper_ = new ScrollHelper(this); + this.sidebar.setScrollDelegate(this.scrollHelper_); + this.$.toolbar.setSearchDelegate(new SearchHelper(this)); + }, + + /** + * @param {chrome.developerPrivate.ExtensionType} type The type of item. + * @return {string} The ID of the list that the item belongs in. + * @private + */ + getListId_: function(type) { + var listId; + var ExtensionType = chrome.developerPrivate.ExtensionType; + switch (type) { + case ExtensionType.HOSTED_APP: + case ExtensionType.LEGACY_PACKAGED_APP: + listId = 'websites'; + break; + case ExtensionType.PLATFORM_APP: + listId = 'apps'; + break; + case ExtensionType.EXTENSION: + case ExtensionType.SHARED_MODULE: + listId = 'extensions'; + break; + case ExtensionType.THEME: + assertNotReached( + 'Don\'t send themes to the chrome://extensions page'); + break; + } + assert(listId); + return listId; + }, + + /** + * @param {string} listId The list to look for the item in. + * @param {string} itemId The id of the item to look for. + * @return {number} The index of the item in the list, or -1 if not found. + * @private + */ + getIndexInList_: function(listId, itemId) { + return this[listId].findIndex(function(item) { + return item.id == itemId; + }); + }, + + /** + * @param {!Array<!chrome.developerPrivate.ExtensionInfo>} list + * @return {boolean} Whether the list should be visible. + */ + computeListHidden_: function(list) { + return list.length == 0; + }, + + /** + * Creates and adds a new extensions-item element to the list, inserting it + * into its sorted position in the relevant section. + * @param {!chrome.developerPrivate.ExtensionInfo} item The extension + * the new element is representing. + */ + addItem: function(item) { + var listId = this.getListId_(item.type); + // We should never try and add an existing item. + assert(this.getIndexInList_(listId, item.id) == -1); + var insertBeforeChild = this[listId].findIndex(function(listEl) { + return compareExtensions(listEl, item) > 0; + }); + if (insertBeforeChild == -1) + insertBeforeChild = this[listId].length; + this.splice(listId, insertBeforeChild, 0, item); + }, + + /** + * @param {!chrome.developerPrivate.ExtensionInfo} item The data for the + * item to update. + */ + updateItem: function(item) { + var listId = this.getListId_(item.type); + var index = this.getIndexInList_(listId, item.id); + // We should never try and update a non-existent item. + assert(index >= 0); + this.set([listId, index], item); + }, + + /** + * @param {!chrome.developerPrivate.ExtensionInfo} item The data for the + * item to remove. + */ + removeItem: function(item) { + var listId = this.getListId_(item.type); + var index = this.getIndexInList_(listId, item.id); + // We should never try and remove a non-existent item. + assert(index >= 0); + this.splice(listId, index, 1); + }, }); + /** + * @param {extensions.Manager} manager + * @constructor + * @implements {extensions.SidebarScrollDelegate} + */ + function ScrollHelper(manager) { + this.items_ = manager.$.items; + } + + ScrollHelper.prototype = { + /** @override */ + scrollToExtensions: function() { + this.items_.scrollTop = + this.items_.querySelector('#extensions-list').offsetTop; + }, + + /** @override */ + scrollToApps: function() { + this.items_.scrollTop = + this.items_.querySelector('#apps-list').offsetTop; + }, + + /** @override */ + scrollToWebsites: function() { + this.items_.scrollTop = + this.items_.querySelector('#websites-list').offsetTop; + }, + }; + + /** + * @param {extensions.Manager} manager + * @constructor + * @implements {SearchFieldDelegate} + */ + function SearchHelper(manager) { + this.manager_ = manager; + } + + SearchHelper.prototype = { + /** @override */ + onSearchTermSearch: function(searchTerm) { + this.manager_.filter = searchTerm; + }, + }; + return {Manager: Manager}; }); |