blob: 50d7071658f49975e600b0fc5eadaf4fe7865b43 [file] [log] [blame]
// Copyright 2016 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-engine-dialog' is a component for adding
* or editing a search engine entry.
*/
Polymer({
is: 'settings-search-engine-dialog',
properties: {
/**
* The search engine to be edited. If not populated a new search engine
* should be added.
* @type {?SearchEngine}
*/
model: Object,
/** @private {string} */
searchEngine_: String,
/** @private {string} */
keyword_: String,
/** @private {string} */
queryUrl_: String,
/** @private {string} */
dialogTitle_: String,
/** @private {string} */
actionButtonText_: String,
},
/** @private {settings.SearchEnginesBrowserProxy} */
browserProxy_: null,
/**
* The |modelIndex| to use when a new search engine is added. Must match with
* kNewSearchEngineIndex constant specified at
* chrome/browser/ui/webui/settings/search_engines_handler.cc
* @type {number}
*/
DEFAULT_MODEL_INDEX: -1,
/** @override */
created: function() {
this.browserProxy_ = settings.SearchEnginesBrowserProxyImpl.getInstance();
},
/** @override */
ready: function() {
if (this.model) {
this.dialogTitle_ =
loadTimeData.getString('searchEnginesEditSearchEngine');
this.actionButtonText_ = loadTimeData.getString('save');
// If editing an existing search engine, pre-populate the input fields.
this.searchEngine_ = this.model.name;
this.keyword_ = this.model.keyword;
this.queryUrl_ = this.model.url;
} else {
this.dialogTitle_ =
loadTimeData.getString('searchEnginesAddSearchEngine');
this.actionButtonText_ = loadTimeData.getString('add');
}
this.addEventListener('cancel', () => {
this.browserProxy_.searchEngineEditCancelled();
});
},
/** @override */
attached: function() {
this.updateActionButtonState_();
this.browserProxy_.searchEngineEditStarted(
this.model ? this.model.modelIndex : this.DEFAULT_MODEL_INDEX);
this.$.dialog.showModal();
},
/** @private */
cancel_: function() {
this.$.dialog.cancel();
},
/** @private */
onActionButtonTap_: function() {
this.browserProxy_.searchEngineEditCompleted(
this.searchEngine_, this.keyword_, this.queryUrl_);
this.$.dialog.close();
},
/**
* @param {!Event} event
* @private
*/
validate_: function(event) {
const inputElement = Polymer.dom(event).localTarget;
// If element is empty, disable the action button, but don't show the red
// invalid message.
if (inputElement.value == '') {
inputElement.invalid = false;
this.updateActionButtonState_();
return;
}
this.browserProxy_
.validateSearchEngineInput(inputElement.id, inputElement.value)
.then(isValid => {
inputElement.invalid = !isValid;
this.updateActionButtonState_();
});
},
/** @private */
updateActionButtonState_: function() {
const allValid = [
this.$.searchEngine, this.$.keyword, this.$.queryUrl
].every(function(inputElement) {
return !inputElement.invalid && inputElement.value.length > 0;
});
this.$.actionButton.disabled = !allValid;
},
});