summaryrefslogtreecommitdiff
path: root/chromium/chrome/browser/resources/md_extensions/manager.js
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/resources/md_extensions/manager.js')
-rw-r--r--chromium/chrome/browser/resources/md_extensions/manager.js215
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};
});