| Index: third_party/WebKit/Source/devtools/front_end/console/ConsolePrompt.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/console/ConsolePrompt.js b/third_party/WebKit/Source/devtools/front_end/console/ConsolePrompt.js
|
| index 6ab4ec7a32c4698bc2bc52cd3a80814f172eeabc..1486f788ee6cab849d3827841f28921ccb2c89ab 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/console/ConsolePrompt.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/console/ConsolePrompt.js
|
| @@ -1,18 +1,16 @@
|
| // 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.
|
| -
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.Widget}
|
| + * @unrestricted
|
| */
|
| -WebInspector.ConsolePrompt = function()
|
| -{
|
| - WebInspector.Widget.call(this);
|
| +WebInspector.ConsolePrompt = class extends WebInspector.Widget {
|
| + constructor() {
|
| + super();
|
| this._addCompletionsFromHistory = true;
|
| this._history = new WebInspector.ConsoleHistoryManager();
|
|
|
| - this._initialText = "";
|
| + this._initialText = '';
|
| this._editor = null;
|
|
|
| this.element.tabIndex = 0;
|
| @@ -23,279 +21,262 @@ WebInspector.ConsolePrompt = function()
|
| * @param {!WebInspector.TextEditorFactory} factory
|
| * @this {WebInspector.ConsolePrompt}
|
| */
|
| - function gotFactory(factory)
|
| - {
|
| - this._editor = factory.createEditor({
|
| - lineNumbers: false,
|
| - lineWrapping: true,
|
| - mimeType: "javascript",
|
| - autoHeight: true
|
| - });
|
| -
|
| - this._editor.configureAutocomplete({
|
| - substituteRangeCallback: this._substituteRange.bind(this),
|
| - suggestionsCallback: this._wordsWithPrefix.bind(this),
|
| - captureEnter: true
|
| - });
|
| - this._editor.widget().element.addEventListener("keydown", this._editorKeyDown.bind(this), true);
|
| - this._editor.widget().show(this.element);
|
| -
|
| - this.setText(this._initialText);
|
| - delete this._initialText;
|
| - if (this.hasFocus())
|
| - this.focus();
|
| - this.element.tabIndex = -1;
|
| -
|
| - this._editorSetForTest();
|
| + function gotFactory(factory) {
|
| + this._editor =
|
| + factory.createEditor({lineNumbers: false, lineWrapping: true, mimeType: 'javascript', autoHeight: true});
|
| +
|
| + this._editor.configureAutocomplete({
|
| + substituteRangeCallback: this._substituteRange.bind(this),
|
| + suggestionsCallback: this._wordsWithPrefix.bind(this),
|
| + captureEnter: true
|
| + });
|
| + this._editor.widget().element.addEventListener('keydown', this._editorKeyDown.bind(this), true);
|
| + this._editor.widget().show(this.element);
|
| +
|
| + this.setText(this._initialText);
|
| + delete this._initialText;
|
| + if (this.hasFocus())
|
| + this.focus();
|
| + this.element.tabIndex = -1;
|
| +
|
| + this._editorSetForTest();
|
| }
|
| -};
|
| -
|
| -WebInspector.ConsolePrompt.prototype = {
|
| - /**
|
| - * @return {!WebInspector.ConsoleHistoryManager}
|
| - */
|
| - history: function()
|
| - {
|
| - return this._history;
|
| - },
|
| -
|
| - clearAutocomplete: function()
|
| - {
|
| - if (this._editor)
|
| - this._editor.clearAutocomplete();
|
| - },
|
| -
|
| - /**
|
| - * @return {boolean}
|
| - */
|
| - _isCaretAtEndOfPrompt: function()
|
| - {
|
| - return !!this._editor && this._editor.selection().collapseToEnd().equal(this._editor.fullRange().collapseToEnd());
|
| - },
|
| -
|
| - moveCaretToEndOfPrompt: function()
|
| - {
|
| - if (this._editor)
|
| - this._editor.setSelection(WebInspector.TextRange.createFromLocation(Infinity, Infinity));
|
| - },
|
| -
|
| - /**
|
| - * @param {string} text
|
| - */
|
| - setText: function(text)
|
| - {
|
| - if (this._editor)
|
| - this._editor.setText(text);
|
| - else
|
| - this._initialText = text;
|
| - },
|
| -
|
| - /**
|
| - * @return {string}
|
| - */
|
| - text: function()
|
| - {
|
| - return this._editor ? this._editor.text() : this._initialText;
|
| - },
|
| -
|
| - /**
|
| - * @param {boolean} value
|
| - */
|
| - setAddCompletionsFromHistory: function(value)
|
| - {
|
| - this._addCompletionsFromHistory = value;
|
| - },
|
| -
|
| - /**
|
| - * @param {!Event} event
|
| - */
|
| - _editorKeyDown: function(event)
|
| - {
|
| - var keyboardEvent = /** @type {!KeyboardEvent} */ (event);
|
| - var newText;
|
| - var isPrevious;
|
| -
|
| - switch (keyboardEvent.keyCode) {
|
| - case WebInspector.KeyboardShortcut.Keys.Up.code:
|
| - if (this._editor.selection().endLine > 0)
|
| - break;
|
| - newText = this._history.previous(this.text());
|
| - isPrevious = true;
|
| - break;
|
| - case WebInspector.KeyboardShortcut.Keys.Down.code:
|
| - if (this._editor.selection().endLine < this._editor.fullRange().endLine)
|
| - break;
|
| - newText = this._history.next();
|
| - break;
|
| - case WebInspector.KeyboardShortcut.Keys.P.code: // Ctrl+P = Previous
|
| - if (WebInspector.isMac() && keyboardEvent.ctrlKey && !keyboardEvent.metaKey && !keyboardEvent.altKey && !keyboardEvent.shiftKey) {
|
| - newText = this._history.previous(this.text());
|
| - isPrevious = true;
|
| - }
|
| - break;
|
| - case WebInspector.KeyboardShortcut.Keys.N.code: // Ctrl+N = Next
|
| - if (WebInspector.isMac() && keyboardEvent.ctrlKey && !keyboardEvent.metaKey && !keyboardEvent.altKey && !keyboardEvent.shiftKey)
|
| - newText = this._history.next();
|
| - break;
|
| - case WebInspector.KeyboardShortcut.Keys.Enter.code:
|
| - this._enterKeyPressed(keyboardEvent);
|
| - break;
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.ConsoleHistoryManager}
|
| + */
|
| + history() {
|
| + return this._history;
|
| + }
|
| +
|
| + clearAutocomplete() {
|
| + if (this._editor)
|
| + this._editor.clearAutocomplete();
|
| + }
|
| +
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| + _isCaretAtEndOfPrompt() {
|
| + return !!this._editor && this._editor.selection().collapseToEnd().equal(this._editor.fullRange().collapseToEnd());
|
| + }
|
| +
|
| + moveCaretToEndOfPrompt() {
|
| + if (this._editor)
|
| + this._editor.setSelection(WebInspector.TextRange.createFromLocation(Infinity, Infinity));
|
| + }
|
| +
|
| + /**
|
| + * @param {string} text
|
| + */
|
| + setText(text) {
|
| + if (this._editor)
|
| + this._editor.setText(text);
|
| + else
|
| + this._initialText = text;
|
| + }
|
| +
|
| + /**
|
| + * @return {string}
|
| + */
|
| + text() {
|
| + return this._editor ? this._editor.text() : this._initialText;
|
| + }
|
| +
|
| + /**
|
| + * @param {boolean} value
|
| + */
|
| + setAddCompletionsFromHistory(value) {
|
| + this._addCompletionsFromHistory = value;
|
| + }
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + _editorKeyDown(event) {
|
| + var keyboardEvent = /** @type {!KeyboardEvent} */ (event);
|
| + var newText;
|
| + var isPrevious;
|
| +
|
| + switch (keyboardEvent.keyCode) {
|
| + case WebInspector.KeyboardShortcut.Keys.Up.code:
|
| + if (this._editor.selection().endLine > 0)
|
| + break;
|
| + newText = this._history.previous(this.text());
|
| + isPrevious = true;
|
| + break;
|
| + case WebInspector.KeyboardShortcut.Keys.Down.code:
|
| + if (this._editor.selection().endLine < this._editor.fullRange().endLine)
|
| + break;
|
| + newText = this._history.next();
|
| + break;
|
| + case WebInspector.KeyboardShortcut.Keys.P.code: // Ctrl+P = Previous
|
| + if (WebInspector.isMac() && keyboardEvent.ctrlKey && !keyboardEvent.metaKey && !keyboardEvent.altKey &&
|
| + !keyboardEvent.shiftKey) {
|
| + newText = this._history.previous(this.text());
|
| + isPrevious = true;
|
| }
|
| + break;
|
| + case WebInspector.KeyboardShortcut.Keys.N.code: // Ctrl+N = Next
|
| + if (WebInspector.isMac() && keyboardEvent.ctrlKey && !keyboardEvent.metaKey && !keyboardEvent.altKey &&
|
| + !keyboardEvent.shiftKey)
|
| + newText = this._history.next();
|
| + break;
|
| + case WebInspector.KeyboardShortcut.Keys.Enter.code:
|
| + this._enterKeyPressed(keyboardEvent);
|
| + break;
|
| + }
|
|
|
| - if (newText === undefined)
|
| - return;
|
| - keyboardEvent.consume(true);
|
| - this.setText(newText);
|
| + if (newText === undefined)
|
| + return;
|
| + keyboardEvent.consume(true);
|
| + this.setText(newText);
|
|
|
| - if (isPrevious)
|
| - this._editor.setSelection(WebInspector.TextRange.createFromLocation(0, Infinity));
|
| - else
|
| - this.moveCaretToEndOfPrompt();
|
| - },
|
| + if (isPrevious)
|
| + this._editor.setSelection(WebInspector.TextRange.createFromLocation(0, Infinity));
|
| + else
|
| + this.moveCaretToEndOfPrompt();
|
| + }
|
|
|
| - /**
|
| - * @param {!KeyboardEvent} event
|
| - */
|
| - _enterKeyPressed: function(event)
|
| - {
|
| - if (event.altKey || event.ctrlKey || event.shiftKey)
|
| - return;
|
| + /**
|
| + * @param {!KeyboardEvent} event
|
| + */
|
| + _enterKeyPressed(event) {
|
| + if (event.altKey || event.ctrlKey || event.shiftKey)
|
| + return;
|
|
|
| - event.consume(true);
|
| + event.consume(true);
|
|
|
| - this.clearAutocomplete();
|
| + this.clearAutocomplete();
|
|
|
| - var str = this.text();
|
| - if (!str.length)
|
| - return;
|
| + var str = this.text();
|
| + if (!str.length)
|
| + return;
|
|
|
| - var currentExecutionContext = WebInspector.context.flavor(WebInspector.ExecutionContext);
|
| - if (!this._isCaretAtEndOfPrompt() || !currentExecutionContext) {
|
| - this._appendCommand(str, true);
|
| - return;
|
| - }
|
| - currentExecutionContext.target().runtimeModel.compileScript(str, "", false, currentExecutionContext.id, compileCallback.bind(this));
|
| -
|
| - /**
|
| - * @param {!RuntimeAgent.ScriptId=} scriptId
|
| - * @param {?RuntimeAgent.ExceptionDetails=} exceptionDetails
|
| - * @this {WebInspector.ConsolePrompt}
|
| - */
|
| - function compileCallback(scriptId, exceptionDetails)
|
| - {
|
| - if (str !== this.text())
|
| - return;
|
| - if (exceptionDetails && (exceptionDetails.exception.description.startsWith("SyntaxError: Unexpected end of input")
|
| - || exceptionDetails.exception.description.startsWith("SyntaxError: Unterminated template literal"))) {
|
| - this._editor.newlineAndIndent();
|
| - this._enterProcessedForTest();
|
| - return;
|
| - }
|
| - this._appendCommand(str, true);
|
| - this._enterProcessedForTest();
|
| - }
|
| - },
|
| + var currentExecutionContext = WebInspector.context.flavor(WebInspector.ExecutionContext);
|
| + if (!this._isCaretAtEndOfPrompt() || !currentExecutionContext) {
|
| + this._appendCommand(str, true);
|
| + return;
|
| + }
|
| + currentExecutionContext.target().runtimeModel.compileScript(
|
| + str, '', false, currentExecutionContext.id, compileCallback.bind(this));
|
|
|
| /**
|
| - * @param {string} text
|
| - * @param {boolean} useCommandLineAPI
|
| + * @param {!RuntimeAgent.ScriptId=} scriptId
|
| + * @param {?RuntimeAgent.ExceptionDetails=} exceptionDetails
|
| + * @this {WebInspector.ConsolePrompt}
|
| */
|
| - _appendCommand: function(text, useCommandLineAPI)
|
| - {
|
| - this.setText("");
|
| - var currentExecutionContext = WebInspector.context.flavor(WebInspector.ExecutionContext);
|
| - if (currentExecutionContext) {
|
| - WebInspector.ConsoleModel.evaluateCommandInConsole(currentExecutionContext, text, useCommandLineAPI);
|
| - if (WebInspector.ConsolePanel.instance().isShowing())
|
| - WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.CommandEvaluatedInConsolePanel);
|
| - }
|
| - },
|
| -
|
| - _enterProcessedForTest: function() { },
|
| + function compileCallback(scriptId, exceptionDetails) {
|
| + if (str !== this.text())
|
| + return;
|
| + if (exceptionDetails &&
|
| + (exceptionDetails.exception.description.startsWith('SyntaxError: Unexpected end of input') ||
|
| + exceptionDetails.exception.description.startsWith('SyntaxError: Unterminated template literal'))) {
|
| + this._editor.newlineAndIndent();
|
| + this._enterProcessedForTest();
|
| + return;
|
| + }
|
| + this._appendCommand(str, true);
|
| + this._enterProcessedForTest();
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {string} text
|
| + * @param {boolean} useCommandLineAPI
|
| + */
|
| + _appendCommand(text, useCommandLineAPI) {
|
| + this.setText('');
|
| + var currentExecutionContext = WebInspector.context.flavor(WebInspector.ExecutionContext);
|
| + if (currentExecutionContext) {
|
| + WebInspector.ConsoleModel.evaluateCommandInConsole(currentExecutionContext, text, useCommandLineAPI);
|
| + if (WebInspector.ConsolePanel.instance().isShowing())
|
| + WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.CommandEvaluatedInConsolePanel);
|
| + }
|
| + }
|
| +
|
| + _enterProcessedForTest() {
|
| + }
|
| +
|
| + /**
|
| + * @param {string} prefix
|
| + * @return {!WebInspector.SuggestBox.Suggestions}
|
| + */
|
| + _historyCompletions(prefix) {
|
| + if (!this._addCompletionsFromHistory || !this._isCaretAtEndOfPrompt())
|
| + return [];
|
| + var result = [];
|
| + var text = this.text();
|
| + var set = new Set();
|
| + var data = this._history.historyData();
|
| + for (var i = data.length - 1; i >= 0 && result.length < 50; --i) {
|
| + var item = data[i];
|
| + if (!item.startsWith(text))
|
| + continue;
|
| + if (set.has(item))
|
| + continue;
|
| + set.add(item);
|
| + result.push({title: item.substring(text.length - prefix.length), className: 'additional'});
|
| + }
|
| + return result;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + focus() {
|
| + if (this._editor)
|
| + this._editor.widget().focus();
|
| + else
|
| + this.element.focus();
|
| + }
|
| +
|
| + /**
|
| + * @param {number} lineNumber
|
| + * @param {number} columnNumber
|
| + * @return {?WebInspector.TextRange}
|
| + */
|
| + _substituteRange(lineNumber, columnNumber) {
|
| + var lineText = this._editor.line(lineNumber);
|
| + var index;
|
| + for (index = lineText.length - 1; index >= 0; index--) {
|
| + if (' =:[({;,!+-*/&|^<>.'.indexOf(lineText.charAt(index)) !== -1)
|
| + break;
|
| + }
|
| + return new WebInspector.TextRange(lineNumber, index + 1, lineNumber, columnNumber);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TextRange} prefixRange
|
| + * @param {!WebInspector.TextRange} substituteRange
|
| + * @return {!Promise<!WebInspector.SuggestBox.Suggestions>}
|
| + */
|
| + _wordsWithPrefix(prefixRange, substituteRange) {
|
| + var prefix = this._editor.text(prefixRange);
|
| + var before = this._editor.text(new WebInspector.TextRange(0, 0, prefixRange.startLine, prefixRange.startColumn));
|
| + var historyWords = this._historyCompletions(prefix);
|
| + return WebInspector.ExecutionContextSelector.completionsForTextInCurrentContext(before, prefix, true /* force */)
|
| + .then(innerWordsWithPrefix);
|
|
|
| /**
|
| - * @param {string} prefix
|
| + * @param {!Array<string>} words
|
| * @return {!WebInspector.SuggestBox.Suggestions}
|
| */
|
| - _historyCompletions: function(prefix)
|
| - {
|
| - if (!this._addCompletionsFromHistory || !this._isCaretAtEndOfPrompt())
|
| - return [];
|
| - var result = [];
|
| - var text = this.text();
|
| - var set = new Set();
|
| - var data = this._history.historyData();
|
| - for (var i = data.length - 1; i >= 0 && result.length < 50; --i) {
|
| - var item = data[i];
|
| - if (!item.startsWith(text))
|
| - continue;
|
| - if (set.has(item))
|
| - continue;
|
| - set.add(item);
|
| - result.push({ title: item.substring(text.length - prefix.length), className: "additional" });
|
| - }
|
| - return result;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - focus: function()
|
| - {
|
| - if (this._editor)
|
| - this._editor.widget().focus();
|
| - else
|
| - this.element.focus();
|
| - },
|
| -
|
| - /**
|
| - * @param {number} lineNumber
|
| - * @param {number} columnNumber
|
| - * @return {?WebInspector.TextRange}
|
| - */
|
| - _substituteRange: function(lineNumber, columnNumber)
|
| - {
|
| - var lineText = this._editor.line(lineNumber);
|
| - var index;
|
| - for (index = lineText.length - 1; index >= 0; index--) {
|
| - if (" =:[({;,!+-*/&|^<>.".indexOf(lineText.charAt(index)) !== -1)
|
| - break;
|
| - }
|
| - return new WebInspector.TextRange(lineNumber, index + 1, lineNumber, columnNumber);
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.TextRange} prefixRange
|
| - * @param {!WebInspector.TextRange} substituteRange
|
| - * @return {!Promise<!WebInspector.SuggestBox.Suggestions>}
|
| - */
|
| - _wordsWithPrefix: function(prefixRange, substituteRange)
|
| - {
|
| - var prefix = this._editor.text(prefixRange);
|
| - var before = this._editor.text(new WebInspector.TextRange(0, 0, prefixRange.startLine, prefixRange.startColumn));
|
| - var historyWords = this._historyCompletions(prefix);
|
| - return WebInspector.ExecutionContextSelector.completionsForTextInCurrentContext(before, prefix, true /* force */).then(innerWordsWithPrefix);
|
| -
|
| - /**
|
| - * @param {!Array<string>} words
|
| - * @return {!WebInspector.SuggestBox.Suggestions}
|
| - */
|
| - function innerWordsWithPrefix(words)
|
| - {
|
| - return words.map(item => ({title:item})).concat(historyWords);
|
| - }
|
| - },
|
| -
|
| - _editorSetForTest: function() { },
|
| + function innerWordsWithPrefix(words) {
|
| + return words.map(item => ({title: item})).concat(historyWords);
|
| + }
|
| + }
|
|
|
| - __proto__: WebInspector.Widget.prototype
|
| + _editorSetForTest() {
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| + * @unrestricted
|
| */
|
| -WebInspector.ConsoleHistoryManager = function()
|
| -{
|
| +WebInspector.ConsoleHistoryManager = class {
|
| + constructor() {
|
| /**
|
| * @type {!Array.<string>}
|
| */
|
| @@ -306,85 +287,77 @@ WebInspector.ConsoleHistoryManager = function()
|
| * @type {number}
|
| */
|
| this._historyOffset = 1;
|
| -};
|
| -
|
| -WebInspector.ConsoleHistoryManager.prototype = {
|
| - /**
|
| - * @return {!Array.<string>}
|
| - */
|
| - historyData: function()
|
| - {
|
| - return this._data;
|
| - },
|
| -
|
| - /**
|
| - * @param {!Array.<string>} data
|
| - */
|
| - setHistoryData: function(data)
|
| - {
|
| - this._data = data.slice();
|
| - this._historyOffset = 1;
|
| - },
|
| -
|
| - /**
|
| - * Pushes a committed text into the history.
|
| - * @param {string} text
|
| - */
|
| - pushHistoryItem: function(text)
|
| - {
|
| - if (this._uncommittedIsTop) {
|
| - this._data.pop();
|
| - delete this._uncommittedIsTop;
|
| - }
|
| -
|
| - this._historyOffset = 1;
|
| - if (text === this._currentHistoryItem())
|
| - return;
|
| - this._data.push(text);
|
| - },
|
| -
|
| - /**
|
| - * Pushes the current (uncommitted) text into the history.
|
| - * @param {string} currentText
|
| - */
|
| - _pushCurrentText: function(currentText)
|
| - {
|
| - if (this._uncommittedIsTop)
|
| - this._data.pop(); // Throw away obsolete uncommitted text.
|
| - this._uncommittedIsTop = true;
|
| - this._data.push(currentText);
|
| - },
|
| -
|
| - /**
|
| - * @param {string} currentText
|
| - * @return {string|undefined}
|
| - */
|
| - previous: function(currentText)
|
| - {
|
| - if (this._historyOffset > this._data.length)
|
| - return undefined;
|
| - if (this._historyOffset === 1)
|
| - this._pushCurrentText(currentText);
|
| - ++this._historyOffset;
|
| - return this._currentHistoryItem();
|
| - },
|
| -
|
| - /**
|
| - * @return {string|undefined}
|
| - */
|
| - next: function()
|
| - {
|
| - if (this._historyOffset === 1)
|
| - return undefined;
|
| - --this._historyOffset;
|
| - return this._currentHistoryItem();
|
| - },
|
| -
|
| - /**
|
| - * @return {string|undefined}
|
| - */
|
| - _currentHistoryItem: function()
|
| - {
|
| - return this._data[this._data.length - this._historyOffset];
|
| + }
|
| +
|
| + /**
|
| + * @return {!Array.<string>}
|
| + */
|
| + historyData() {
|
| + return this._data;
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array.<string>} data
|
| + */
|
| + setHistoryData(data) {
|
| + this._data = data.slice();
|
| + this._historyOffset = 1;
|
| + }
|
| +
|
| + /**
|
| + * Pushes a committed text into the history.
|
| + * @param {string} text
|
| + */
|
| + pushHistoryItem(text) {
|
| + if (this._uncommittedIsTop) {
|
| + this._data.pop();
|
| + delete this._uncommittedIsTop;
|
| }
|
| +
|
| + this._historyOffset = 1;
|
| + if (text === this._currentHistoryItem())
|
| + return;
|
| + this._data.push(text);
|
| + }
|
| +
|
| + /**
|
| + * Pushes the current (uncommitted) text into the history.
|
| + * @param {string} currentText
|
| + */
|
| + _pushCurrentText(currentText) {
|
| + if (this._uncommittedIsTop)
|
| + this._data.pop(); // Throw away obsolete uncommitted text.
|
| + this._uncommittedIsTop = true;
|
| + this._data.push(currentText);
|
| + }
|
| +
|
| + /**
|
| + * @param {string} currentText
|
| + * @return {string|undefined}
|
| + */
|
| + previous(currentText) {
|
| + if (this._historyOffset > this._data.length)
|
| + return undefined;
|
| + if (this._historyOffset === 1)
|
| + this._pushCurrentText(currentText);
|
| + ++this._historyOffset;
|
| + return this._currentHistoryItem();
|
| + }
|
| +
|
| + /**
|
| + * @return {string|undefined}
|
| + */
|
| + next() {
|
| + if (this._historyOffset === 1)
|
| + return undefined;
|
| + --this._historyOffset;
|
| + return this._currentHistoryItem();
|
| + }
|
| +
|
| + /**
|
| + * @return {string|undefined}
|
| + */
|
| + _currentHistoryItem() {
|
| + return this._data[this._data.length - this._historyOffset];
|
| + }
|
| };
|
|
|