blob: be96505ef60f121260af67f40d036a3565305d79 [file] [log] [blame]
// 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.
/**
* @fileoverview 'settings-search-engines-page' is the settings page
* containing search engines settings.
*/
Polymer({
is: 'settings-search-engines-page',
behaviors: [settings.GlobalScrollTargetBehavior, WebUIListenerBehavior],
properties: {
/** @type {!Array<!SearchEngine>} */
defaultEngines: Array,
/** @type {!Array<!SearchEngine>} */
otherEngines: Array,
/** @type {!Array<!SearchEngine>} */
extensions: Array,
/**
* Needed by GlobalScrollTargetBehavior.
* @override
*/
subpageRoute: {
type: Object,
value: settings.routes.SEARCH_ENGINES,
},
/** @private {boolean} */
showAddSearchEngineDialog_: Boolean,
/** @private {boolean} */
showExtensionsList_: {
type: Boolean,
computed: 'computeShowExtensionsList_(extensions)',
},
/** Filters out all search engines that do not match. */
filter: {
type: String,
value: '',
},
/** @private {!Array<!SearchEngine>} */
matchingDefaultEngines_: {
type: Array,
computed: 'computeMatchingEngines_(defaultEngines, filter)',
},
/** @private {!Array<!SearchEngine>} */
matchingOtherEngines_: {
type: Array,
computed: 'computeMatchingEngines_(otherEngines, filter)',
},
/** @private {!Array<!SearchEngine>} */
matchingExtensions_: {
type: Array,
computed: 'computeMatchingEngines_(extensions, filter)',
},
/** @private {HTMLElement} */
omniboxExtensionlastFocused_: Object,
},
// Since the iron-list for extensions is enclosed in a dom-if, observe both
// |extensions| and |showExtensionsList_|.
observers: ['extensionsChanged_(extensions, showExtensionsList_)'],
/** @override */
ready: function() {
settings.SearchEnginesBrowserProxyImpl.getInstance()
.getSearchEnginesList()
.then(this.enginesChanged_.bind(this));
this.addWebUIListener(
'search-engines-changed', this.enginesChanged_.bind(this));
// Sets offset in iron-list that uses the page as a scrollTarget.
Polymer.RenderStatus.afterNextRender(this, function() {
this.$.otherEngines.scrollOffset = this.$.otherEngines.offsetTop;
});
},
/** @private */
extensionsChanged_: function() {
if (this.showExtensionsList_ && this.$.extensions)
this.$.extensions.notifyResize();
},
/**
* @param {!SearchEnginesInfo} searchEnginesInfo
* @private
*/
enginesChanged_: function(searchEnginesInfo) {
this.defaultEngines = searchEnginesInfo['defaults'];
// Sort |otherEngines| in alphabetical order.
this.otherEngines = searchEnginesInfo['others'].sort(function(a, b) {
return a.name.toLocaleLowerCase().localeCompare(
b.name.toLocaleLowerCase());
});
this.extensions = searchEnginesInfo['extensions'];
},
/**
* @param {!Event} e
* @private
*/
onAddSearchEngineTap_: function(e) {
e.preventDefault();
this.showAddSearchEngineDialog_ = true;
this.async(() => {
const dialog = this.$$('settings-search-engine-dialog');
// Register listener to detect when the dialog is closed. Flip the boolean
// once closed to force a restamp next time it is shown such that the
// previous dialog's contents are cleared.
dialog.addEventListener('close', () => {
this.showAddSearchEngineDialog_ = false;
cr.ui.focusWithoutInk(assert(this.$.addSearchEngine));
});
});
},
/** @private */
computeShowExtensionsList_: function() {
return this.extensions.length > 0;
},
/**
* Filters the given list based on the currently existing filter string.
* @param {!Array<!SearchEngine>} list
* @return {!Array<!SearchEngine>}
* @private
*/
computeMatchingEngines_: function(list) {
if (this.filter == '')
return list;
const filter = this.filter.toLowerCase();
return list.filter(e => {
return [e.displayName, e.name, e.keyword, e.url].some(
term => term.toLowerCase().includes(filter));
});
},
/**
* @param {!Array<!SearchEngine>} list The original list.
* @param {!Array<!SearchEngine>} filteredList The filtered list.
* @return {boolean} Whether to show the "no results" message.
* @private
*/
showNoResultsMessage_: function(list, filteredList) {
return list.length > 0 && filteredList.length == 0;
},
});