blob: b5cefa74f864c09c5c514a0ff8c64d64277deb6d [file] [log] [blame]
// Copyright (c) 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.
/**
* @unrestricted
*/
UI.HistoryInput = class extends HTMLInputElement {
/**
* @return {!UI.HistoryInput}
*/
static create() {
if (!UI.HistoryInput._constructor)
UI.HistoryInput._constructor = UI.registerCustomElement('input', 'history-input', UI.HistoryInput.prototype);
return /** @type {!UI.HistoryInput} */ (new UI.HistoryInput._constructor());
}
/**
* @override
*/
createdCallback() {
this._history = [''];
this._historyPosition = 0;
this.addEventListener('keydown', this._onKeyDown.bind(this), false);
this.addEventListener('input', this._onInput.bind(this), false);
}
/**
* @param {!Event} event
*/
_onInput(event) {
if (this._history.length === this._historyPosition + 1)
this._history[this._history.length - 1] = this.value;
}
/**
* @param {!Event} event
*/
_onKeyDown(event) {
if (event.keyCode === UI.KeyboardShortcut.Keys.Up.code) {
this._historyPosition = Math.max(this._historyPosition - 1, 0);
this.value = this._history[this._historyPosition];
this.dispatchEvent(new Event('input', {'bubbles': true, 'cancelable': true}));
event.consume(true);
} else if (event.keyCode === UI.KeyboardShortcut.Keys.Down.code) {
this._historyPosition = Math.min(this._historyPosition + 1, this._history.length - 1);
this.value = this._history[this._historyPosition];
this.dispatchEvent(new Event('input', {'bubbles': true, 'cancelable': true}));
event.consume(true);
} else if (event.keyCode === UI.KeyboardShortcut.Keys.Enter.code) {
this._saveToHistory();
}
}
_saveToHistory() {
if (this._history.length > 1 && this._history[this._history.length - 2] === this.value)
return;
this._history[this._history.length - 1] = this.value;
this._historyPosition = this._history.length - 1;
this._history.push('');
}
};