// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. cr.define('extensions', function() { const ItemList = Polymer({ is: 'extensions-item-list', behaviors: [CrContainerShadowBehavior, I18nBehavior], properties: { /** @type {!Array} */ apps: Array, /** @type {!Array} */ extensions: Array, /** @type {extensions.ItemDelegate} */ delegate: Object, inDevMode: { type: Boolean, value: false, }, filter: { type: String, }, /** @private */ computedFilter_: { type: String, computed: 'computeFilter_(filter)', observer: 'announceSearchResults_', }, /** @private */ shownExtensionsCount_: { type: Number, value: 0, }, /** @private */ shownAppsCount_: { type: Number, value: 0, }, }, /** * @param {string} id * @return {?Element} */ getDetailsButton: function(id) { const item = this.$$(`#${id}`); return item && item.getDetailsButton(); }, /** * @param {string} id * @return {?Element} */ getErrorsButton: function(id) { const item = this.$$(`#${id}`); return item && item.getErrorsButton(); }, /** * Computes the filter function to be used for determining which items * should be shown. A |null| value indicates that everything should be * shown. * return {?Function} * @private */ computeFilter_: function() { const formattedFilter = this.filter.trim().toLowerCase(); return formattedFilter ? i => i.name.toLowerCase().includes(formattedFilter) : null; }, /** @private */ shouldShowEmptyItemsMessage_: function() { if (!this.apps || !this.extensions) { return; } return this.apps.length === 0 && this.extensions.length === 0; }, /** @private */ shouldShowEmptySearchMessage_: function() { return !this.shouldShowEmptyItemsMessage_() && this.shownAppsCount_ === 0 && this.shownExtensionsCount_ === 0; }, /** @private */ onNoExtensionsTap_: function(e) { if (e.target.tagName == 'A') { chrome.metricsPrivate.recordUserAction('Options_GetMoreExtensions'); } }, /** @private */ announceSearchResults_: function() { if (this.computedFilter_) { Polymer.IronA11yAnnouncer.requestAvailability(); this.async(() => { // Async to allow list to update. const total = this.shownAppsCount_ + this.shownExtensionsCount_; this.fire('iron-announce', { text: this.shouldShowEmptySearchMessage_() ? this.i18n('noSearchResults') : (total == 1 ? this.i18n('searchResultsSingular', this.filter) : this.i18n( 'searchResultsPlural', total.toString(), this.filter)), }); }); } }, }); return { ItemList: ItemList, }; });