| Index: third_party/WebKit/Source/devtools/front_end/ui_lazy/FilteredListWidget.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/ui_lazy/FilteredListWidget.js b/third_party/WebKit/Source/devtools/front_end/ui_lazy/FilteredListWidget.js
|
| index d1e5bc9b2a668832100af07802cb28b8b31d2061..f15fb130afff5e959c322289842ce96ff3b15ef2 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/ui_lazy/FilteredListWidget.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/ui_lazy/FilteredListWidget.js
|
| @@ -3,41 +3,41 @@
|
| * Use of this source code is governed by a BSD-style license that can be
|
| * found in the LICENSE file.
|
| */
|
| -
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.VBox}
|
| * @implements {WebInspector.StaticViewportControl.Provider}
|
| - * @param {!WebInspector.FilteredListWidget.Delegate} delegate
|
| + * @unrestricted
|
| */
|
| -WebInspector.FilteredListWidget = function(delegate)
|
| -{
|
| - WebInspector.VBox.call(this, true);
|
| +WebInspector.FilteredListWidget = class extends WebInspector.VBox {
|
| + /**
|
| + * @param {!WebInspector.FilteredListWidget.Delegate} delegate
|
| + */
|
| + constructor(delegate) {
|
| + super(true);
|
|
|
| this._renderAsTwoRows = delegate.renderAsTwoRows();
|
|
|
| - this.contentElement.classList.add("filtered-list-widget");
|
| - this.contentElement.addEventListener("keydown", this._onKeyDown.bind(this), false);
|
| + this.contentElement.classList.add('filtered-list-widget');
|
| + this.contentElement.addEventListener('keydown', this._onKeyDown.bind(this), false);
|
| if (delegate.renderMonospace())
|
| - this.contentElement.classList.add("monospace");
|
| - this.registerRequiredCSS("ui_lazy/filteredListWidget.css");
|
| + this.contentElement.classList.add('monospace');
|
| + this.registerRequiredCSS('ui_lazy/filteredListWidget.css');
|
|
|
| - this._promptElement = this.contentElement.createChild("div", "filtered-list-widget-input");
|
| - this._promptElement.setAttribute("spellcheck", "false");
|
| - this._promptElement.setAttribute("contenteditable", "plaintext-only");
|
| + this._promptElement = this.contentElement.createChild('div', 'filtered-list-widget-input');
|
| + this._promptElement.setAttribute('spellcheck', 'false');
|
| + this._promptElement.setAttribute('contenteditable', 'plaintext-only');
|
| this._prompt = new WebInspector.TextPrompt();
|
| this._prompt.initialize(this._autocomplete.bind(this));
|
| this._prompt.renderAsBlock();
|
| this._prompt.addEventListener(WebInspector.TextPrompt.Events.ItemAccepted, this._onAutocompleted, this);
|
| var promptProxy = this._prompt.attach(this._promptElement);
|
| - promptProxy.addEventListener("input", this._onInput.bind(this), false);
|
| - promptProxy.classList.add("filtered-list-widget-prompt-element");
|
| + promptProxy.addEventListener('input', this._onInput.bind(this), false);
|
| + promptProxy.classList.add('filtered-list-widget-prompt-element');
|
|
|
| this._filteredItems = [];
|
| this._viewportControl = new WebInspector.StaticViewportControl(this);
|
| this._itemElementsContainer = this._viewportControl.element;
|
| - this._itemElementsContainer.classList.add("container");
|
| - this._itemElementsContainer.addEventListener("click", this._onClick.bind(this), false);
|
| + this._itemElementsContainer.classList.add('container');
|
| + this._itemElementsContainer.addEventListener('click', this._onClick.bind(this), false);
|
| this.contentElement.appendChild(this._itemElementsContainer);
|
|
|
| this.setDefaultFocusedElement(this._promptElement);
|
| @@ -51,537 +51,498 @@ WebInspector.FilteredListWidget = function(delegate)
|
|
|
| /** @typedef {!Array.<!Element>} */
|
| this._elements = [];
|
| -};
|
| + }
|
|
|
| -/**
|
| - * @param {string} query
|
| - * @return {!RegExp}
|
| - */
|
| -WebInspector.FilteredListWidget.filterRegex = function(query)
|
| -{
|
| + /**
|
| + * @param {string} query
|
| + * @return {!RegExp}
|
| + */
|
| + static filterRegex(query) {
|
| const toEscape = String.regexSpecialCharacters();
|
| - var regexString = "";
|
| + var regexString = '';
|
| for (var i = 0; i < query.length; ++i) {
|
| - var c = query.charAt(i);
|
| - if (toEscape.indexOf(c) !== -1)
|
| - c = "\\" + c;
|
| - if (i)
|
| - regexString += "[^\\0" + c + "]*";
|
| - regexString += c;
|
| + var c = query.charAt(i);
|
| + if (toEscape.indexOf(c) !== -1)
|
| + c = '\\' + c;
|
| + if (i)
|
| + regexString += '[^\\0' + c + ']*';
|
| + regexString += c;
|
| + }
|
| + return new RegExp(regexString, 'i');
|
| + }
|
| +
|
| + showAsDialog() {
|
| + this._dialog = new WebInspector.Dialog();
|
| + this._dialog.setMaxSize(new Size(504, 340));
|
| + this._dialog.setPosition(undefined, 22);
|
| + this.show(this._dialog.element);
|
| + this._dialog.show();
|
| + }
|
| +
|
| + /**
|
| + * @return {string}
|
| + */
|
| + _value() {
|
| + return this._prompt.text().trim();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + willHide() {
|
| + this._delegate.dispose();
|
| + if (this._filterTimer)
|
| + clearTimeout(this._filterTimer);
|
| + }
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + _onEnter(event) {
|
| + event.preventDefault();
|
| + if (!this._delegate.itemCount())
|
| + return;
|
| + var selectedIndex = this._shouldShowMatchingItems() && this._selectedIndexInFiltered < this._filteredItems.length ?
|
| + this._filteredItems[this._selectedIndexInFiltered] :
|
| + null;
|
| +
|
| + // Detach dialog before allowing delegate to override focus.
|
| + if (this._dialog)
|
| + this._dialog.detach();
|
| + this._delegate.selectItemWithQuery(selectedIndex, this._value());
|
| + }
|
| +
|
| + _itemsLoaded() {
|
| + if (this._loadTimeout)
|
| + return;
|
| + this._loadTimeout = setTimeout(this._updateAfterItemsLoaded.bind(this), 0);
|
| + }
|
| +
|
| + _updateAfterItemsLoaded() {
|
| + delete this._loadTimeout;
|
| + this._filterItems();
|
| + }
|
| +
|
| + /**
|
| + * @param {number} index
|
| + * @return {!Element}
|
| + */
|
| + _createItemElement(index) {
|
| + var itemElement = createElement('div');
|
| + itemElement.className = 'filtered-list-widget-item ' + (this._renderAsTwoRows ? 'two-rows' : 'one-row');
|
| + itemElement._titleElement = itemElement.createChild('div', 'filtered-list-widget-title');
|
| + itemElement._subtitleElement = itemElement.createChild('div', 'filtered-list-widget-subtitle');
|
| + itemElement._subtitleElement.textContent = '\u200B';
|
| + itemElement._index = index;
|
| + this._delegate.renderItem(index, this._value(), itemElement._titleElement, itemElement._subtitleElement);
|
| + return itemElement;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} query
|
| + */
|
| + setQuery(query) {
|
| + this._prompt.setText(query);
|
| + this._prompt.autoCompleteSoon(true);
|
| + this._scheduleFilter();
|
| + }
|
| +
|
| + /**
|
| + * @param {!Element} proxyElement
|
| + * @param {!Range} wordRange
|
| + * @param {boolean} force
|
| + * @param {function(!Array.<string>, number=)} completionsReadyCallback
|
| + */
|
| + _autocomplete(proxyElement, wordRange, force, completionsReadyCallback) {
|
| + var completions = wordRange.startOffset === 0 ? [this._delegate.autocomplete(wordRange.toString())] : [];
|
| + completionsReadyCallback.call(null, completions);
|
| + this._autocompletedForTests();
|
| + }
|
| +
|
| + _autocompletedForTests() {
|
| + // Sniffed in tests.
|
| + }
|
| +
|
| + _filterItems() {
|
| + delete this._filterTimer;
|
| + if (this._scoringTimer) {
|
| + clearTimeout(this._scoringTimer);
|
| + delete this._scoringTimer;
|
| }
|
| - return new RegExp(regexString, "i");
|
| -};
|
|
|
| -WebInspector.FilteredListWidget.prototype = {
|
| - showAsDialog: function()
|
| - {
|
| - this._dialog = new WebInspector.Dialog();
|
| - this._dialog.setMaxSize(new Size(504, 340));
|
| - this._dialog.setPosition(undefined, 22);
|
| - this.show(this._dialog.element);
|
| - this._dialog.show();
|
| - },
|
| + var query = this._delegate.rewriteQuery(this._value());
|
| + this._query = query;
|
| + var filterRegex = query ? WebInspector.FilteredListWidget.filterRegex(query) : null;
|
|
|
| - /**
|
| - * @return {string}
|
| - */
|
| - _value: function()
|
| - {
|
| - return this._prompt.text().trim();
|
| - },
|
| -
|
| - willHide: function()
|
| - {
|
| - this._delegate.dispose();
|
| - if (this._filterTimer)
|
| - clearTimeout(this._filterTimer);
|
| - },
|
| + var oldSelectedAbsoluteIndex =
|
| + this._selectedIndexInFiltered ? this._filteredItems[this._selectedIndexInFiltered] : null;
|
| + var filteredItems = [];
|
| + this._selectedIndexInFiltered = 0;
|
|
|
| - /**
|
| - * @param {!Event} event
|
| - */
|
| - _onEnter: function(event)
|
| - {
|
| - event.preventDefault();
|
| - if (!this._delegate.itemCount())
|
| - return;
|
| - var selectedIndex = this._shouldShowMatchingItems() && this._selectedIndexInFiltered < this._filteredItems.length ? this._filteredItems[this._selectedIndexInFiltered] : null;
|
| -
|
| - // Detach dialog before allowing delegate to override focus.
|
| - if (this._dialog)
|
| - this._dialog.detach();
|
| - this._delegate.selectItemWithQuery(selectedIndex, this._value());
|
| - },
|
| -
|
| - _itemsLoaded: function()
|
| - {
|
| -
|
| - if (this._loadTimeout)
|
| - return;
|
| - this._loadTimeout = setTimeout(this._updateAfterItemsLoaded.bind(this), 0);
|
| - },
|
| -
|
| - _updateAfterItemsLoaded: function()
|
| - {
|
| - delete this._loadTimeout;
|
| - this._filterItems();
|
| - },
|
| + var bestScores = [];
|
| + var bestItems = [];
|
| + var bestItemsToCollect = 100;
|
| + var minBestScore = 0;
|
| + var overflowItems = [];
|
|
|
| - /**
|
| - * @param {number} index
|
| - * @return {!Element}
|
| - */
|
| - _createItemElement: function(index)
|
| - {
|
| - var itemElement = createElement("div");
|
| - itemElement.className = "filtered-list-widget-item " + (this._renderAsTwoRows ? "two-rows" : "one-row");
|
| - itemElement._titleElement = itemElement.createChild("div", "filtered-list-widget-title");
|
| - itemElement._subtitleElement = itemElement.createChild("div", "filtered-list-widget-subtitle");
|
| - itemElement._subtitleElement.textContent = "\u200B";
|
| - itemElement._index = index;
|
| - this._delegate.renderItem(index, this._value(), itemElement._titleElement, itemElement._subtitleElement);
|
| - return itemElement;
|
| - },
|
| + scoreItems.call(this, 0);
|
|
|
| /**
|
| - * @param {string} query
|
| + * @param {number} a
|
| + * @param {number} b
|
| + * @return {number}
|
| */
|
| - setQuery: function(query)
|
| - {
|
| - this._prompt.setText(query);
|
| - this._prompt.autoCompleteSoon(true);
|
| - this._scheduleFilter();
|
| - },
|
| + function compareIntegers(a, b) {
|
| + return b - a;
|
| + }
|
|
|
| /**
|
| - * @param {!Element} proxyElement
|
| - * @param {!Range} wordRange
|
| - * @param {boolean} force
|
| - * @param {function(!Array.<string>, number=)} completionsReadyCallback
|
| + * @param {number} fromIndex
|
| + * @this {WebInspector.FilteredListWidget}
|
| */
|
| - _autocomplete: function(proxyElement, wordRange, force, completionsReadyCallback)
|
| - {
|
| - var completions = wordRange.startOffset === 0 ? [this._delegate.autocomplete(wordRange.toString())] : [];
|
| - completionsReadyCallback.call(null, completions);
|
| - this._autocompletedForTests();
|
| - },
|
| -
|
| - _autocompletedForTests: function()
|
| - {
|
| - // Sniffed in tests.
|
| - },
|
| -
|
| - _filterItems: function()
|
| - {
|
| - delete this._filterTimer;
|
| - if (this._scoringTimer) {
|
| - clearTimeout(this._scoringTimer);
|
| - delete this._scoringTimer;
|
| + function scoreItems(fromIndex) {
|
| + var maxWorkItems = 1000;
|
| + var workDone = 0;
|
| + for (var i = fromIndex; i < this._delegate.itemCount() && workDone < maxWorkItems; ++i) {
|
| + // Filter out non-matching items quickly.
|
| + if (filterRegex && !filterRegex.test(this._delegate.itemKeyAt(i)))
|
| + continue;
|
| +
|
| + // Score item.
|
| + var score = this._delegate.itemScoreAt(i, query);
|
| + if (query)
|
| + workDone++;
|
| +
|
| + // Find its index in the scores array (earlier elements have bigger scores).
|
| + if (score > minBestScore || bestScores.length < bestItemsToCollect) {
|
| + var index = bestScores.upperBound(score, compareIntegers);
|
| + bestScores.splice(index, 0, score);
|
| + bestItems.splice(index, 0, i);
|
| + if (bestScores.length > bestItemsToCollect) {
|
| + // Best list is too large -> drop last elements.
|
| + overflowItems.push(bestItems.peekLast());
|
| + bestScores.length = bestItemsToCollect;
|
| + bestItems.length = bestItemsToCollect;
|
| + }
|
| + minBestScore = bestScores.peekLast();
|
| + } else
|
| + filteredItems.push(i);
|
| + }
|
| +
|
| + // Process everything in chunks.
|
| + if (i < this._delegate.itemCount()) {
|
| + this._scoringTimer = setTimeout(scoreItems.bind(this, i), 0);
|
| + return;
|
| + }
|
| + delete this._scoringTimer;
|
| +
|
| + this._filteredItems = bestItems.concat(overflowItems).concat(filteredItems);
|
| + for (var i = 0; i < this._filteredItems.length; ++i) {
|
| + if (this._filteredItems[i] === oldSelectedAbsoluteIndex) {
|
| + this._selectedIndexInFiltered = i;
|
| + break;
|
| }
|
| -
|
| - var query = this._delegate.rewriteQuery(this._value());
|
| - this._query = query;
|
| - var filterRegex = query ? WebInspector.FilteredListWidget.filterRegex(query) : null;
|
| -
|
| - var oldSelectedAbsoluteIndex = this._selectedIndexInFiltered ? this._filteredItems[this._selectedIndexInFiltered] : null;
|
| - var filteredItems = [];
|
| + }
|
| + this._elements = [];
|
| + this._viewportControl.refresh();
|
| + if (!query)
|
| this._selectedIndexInFiltered = 0;
|
| + this._updateSelection(this._selectedIndexInFiltered, false);
|
| + }
|
| + }
|
|
|
| - var bestScores = [];
|
| - var bestItems = [];
|
| - var bestItemsToCollect = 100;
|
| - var minBestScore = 0;
|
| - var overflowItems = [];
|
| -
|
| - scoreItems.call(this, 0);
|
| -
|
| - /**
|
| - * @param {number} a
|
| - * @param {number} b
|
| - * @return {number}
|
| - */
|
| - function compareIntegers(a, b)
|
| - {
|
| - return b - a;
|
| - }
|
| -
|
| - /**
|
| - * @param {number} fromIndex
|
| - * @this {WebInspector.FilteredListWidget}
|
| - */
|
| - function scoreItems(fromIndex)
|
| - {
|
| - var maxWorkItems = 1000;
|
| - var workDone = 0;
|
| - for (var i = fromIndex; i < this._delegate.itemCount() && workDone < maxWorkItems; ++i) {
|
| - // Filter out non-matching items quickly.
|
| - if (filterRegex && !filterRegex.test(this._delegate.itemKeyAt(i)))
|
| - continue;
|
| -
|
| - // Score item.
|
| - var score = this._delegate.itemScoreAt(i, query);
|
| - if (query)
|
| - workDone++;
|
| -
|
| - // Find its index in the scores array (earlier elements have bigger scores).
|
| - if (score > minBestScore || bestScores.length < bestItemsToCollect) {
|
| - var index = bestScores.upperBound(score, compareIntegers);
|
| - bestScores.splice(index, 0, score);
|
| - bestItems.splice(index, 0, i);
|
| - if (bestScores.length > bestItemsToCollect) {
|
| - // Best list is too large -> drop last elements.
|
| - overflowItems.push(bestItems.peekLast());
|
| - bestScores.length = bestItemsToCollect;
|
| - bestItems.length = bestItemsToCollect;
|
| - }
|
| - minBestScore = bestScores.peekLast();
|
| - } else
|
| - filteredItems.push(i);
|
| - }
|
| -
|
| - // Process everything in chunks.
|
| - if (i < this._delegate.itemCount()) {
|
| - this._scoringTimer = setTimeout(scoreItems.bind(this, i), 0);
|
| - return;
|
| - }
|
| - delete this._scoringTimer;
|
| -
|
| - this._filteredItems = bestItems.concat(overflowItems).concat(filteredItems);
|
| - for (var i = 0; i < this._filteredItems.length; ++i) {
|
| - if (this._filteredItems[i] === oldSelectedAbsoluteIndex) {
|
| - this._selectedIndexInFiltered = i;
|
| - break;
|
| - }
|
| - }
|
| - this._elements = [];
|
| - this._viewportControl.refresh();
|
| - if (!query)
|
| - this._selectedIndexInFiltered = 0;
|
| - this._updateSelection(this._selectedIndexInFiltered, false);
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @return {boolean}
|
| - */
|
| - _shouldShowMatchingItems: function()
|
| - {
|
| - return this._delegate.shouldShowMatchingItems(this._value());
|
| - },
|
| -
|
| - _onAutocompleted: function()
|
| - {
|
| - this._prompt.autoCompleteSoon(true);
|
| - this._onInput();
|
| - },
|
| -
|
| - _onInput: function()
|
| - {
|
| - this._updateShowMatchingItems();
|
| - this._scheduleFilter();
|
| - },
|
| -
|
| - _updateShowMatchingItems: function()
|
| - {
|
| - var shouldShowMatchingItems = this._shouldShowMatchingItems();
|
| - this._itemElementsContainer.classList.toggle("hidden", !shouldShowMatchingItems);
|
| - },
|
| -
|
| - /**
|
| - * @return {number}
|
| - */
|
| - _rowsPerViewport: function()
|
| - {
|
| - return Math.floor(this._viewportControl.element.clientHeight / this._rowHeight);
|
| - },
|
| -
|
| - _onKeyDown: function(event)
|
| - {
|
| - var newSelectedIndex = this._selectedIndexInFiltered;
|
| -
|
| - switch (event.keyCode) {
|
| - case WebInspector.KeyboardShortcut.Keys.Down.code:
|
| - if (++newSelectedIndex >= this._filteredItems.length)
|
| - newSelectedIndex = 0;
|
| - this._updateSelection(newSelectedIndex, true);
|
| - event.consume(true);
|
| - break;
|
| - case WebInspector.KeyboardShortcut.Keys.Up.code:
|
| - if (--newSelectedIndex < 0)
|
| - newSelectedIndex = this._filteredItems.length - 1;
|
| - this._updateSelection(newSelectedIndex, false);
|
| - event.consume(true);
|
| - break;
|
| - case WebInspector.KeyboardShortcut.Keys.PageDown.code:
|
| - newSelectedIndex = Math.min(newSelectedIndex + this._rowsPerViewport(), this._filteredItems.length - 1);
|
| - this._updateSelection(newSelectedIndex, true);
|
| - event.consume(true);
|
| - break;
|
| - case WebInspector.KeyboardShortcut.Keys.PageUp.code:
|
| - newSelectedIndex = Math.max(newSelectedIndex - this._rowsPerViewport(), 0);
|
| - this._updateSelection(newSelectedIndex, false);
|
| - event.consume(true);
|
| - break;
|
| - case WebInspector.KeyboardShortcut.Keys.Enter.code:
|
| - this._onEnter(event);
|
| - break;
|
| - default:
|
| - }
|
| - },
|
| -
|
| - _scheduleFilter: function()
|
| - {
|
| - if (this._filterTimer)
|
| - return;
|
| - this._filterTimer = setTimeout(this._filterItems.bind(this), 0);
|
| - },
|
| -
|
| - /**
|
| - * @param {number} index
|
| - * @param {boolean} makeLast
|
| - */
|
| - _updateSelection: function(index, makeLast)
|
| - {
|
| - if (!this._filteredItems.length)
|
| - return;
|
| - if (this._selectedElement)
|
| - this._selectedElement.classList.remove("selected");
|
| - this._viewportControl.scrollItemIntoView(index, makeLast);
|
| - this._selectedIndexInFiltered = index;
|
| - this._selectedElement = this._elements[index];
|
| - if (this._selectedElement)
|
| - this._selectedElement.classList.add("selected");
|
| - },
|
| -
|
| - _onClick: function(event)
|
| - {
|
| - var itemElement = event.target.enclosingNodeOrSelfWithClass("filtered-list-widget-item");
|
| - if (!itemElement)
|
| - return;
|
| -
|
| - // Detach dialog before allowing delegate to override focus.
|
| - if (this._dialog)
|
| - this._dialog.detach();
|
| - this._delegate.selectItemWithQuery(itemElement._index, this._value());
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {number}
|
| - */
|
| - itemCount: function()
|
| - {
|
| - return this._filteredItems.length;
|
| - },
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| + _shouldShowMatchingItems() {
|
| + return this._delegate.shouldShowMatchingItems(this._value());
|
| + }
|
|
|
| - /**
|
| - * @override
|
| - * @param {number} index
|
| - * @return {number}
|
| - */
|
| - fastItemHeight: function(index)
|
| - {
|
| - if (!this._rowHeight) {
|
| - var delegateIndex = this._filteredItems[index];
|
| - var element = this._createItemElement(delegateIndex);
|
| - this._rowHeight = WebInspector.measurePreferredSize(element, this._itemElementsContainer).height;
|
| - }
|
| - return this._rowHeight;
|
| - },
|
| + _onAutocompleted() {
|
| + this._prompt.autoCompleteSoon(true);
|
| + this._onInput();
|
| + }
|
|
|
| - /**
|
| - * @override
|
| - * @param {number} index
|
| - * @return {!Element}
|
| - */
|
| - itemElement: function(index)
|
| - {
|
| - if (!this._elements[index])
|
| - this._elements[index] = this._createItemElement(this._filteredItems[index]);
|
| - return this._elements[index];
|
| - },
|
| -
|
| - __proto__: WebInspector.VBox.prototype
|
| + _onInput() {
|
| + this._updateShowMatchingItems();
|
| + this._scheduleFilter();
|
| + }
|
| +
|
| + _updateShowMatchingItems() {
|
| + var shouldShowMatchingItems = this._shouldShowMatchingItems();
|
| + this._itemElementsContainer.classList.toggle('hidden', !shouldShowMatchingItems);
|
| + }
|
| +
|
| + /**
|
| + * @return {number}
|
| + */
|
| + _rowsPerViewport() {
|
| + return Math.floor(this._viewportControl.element.clientHeight / this._rowHeight);
|
| + }
|
| +
|
| + _onKeyDown(event) {
|
| + var newSelectedIndex = this._selectedIndexInFiltered;
|
| +
|
| + switch (event.keyCode) {
|
| + case WebInspector.KeyboardShortcut.Keys.Down.code:
|
| + if (++newSelectedIndex >= this._filteredItems.length)
|
| + newSelectedIndex = 0;
|
| + this._updateSelection(newSelectedIndex, true);
|
| + event.consume(true);
|
| + break;
|
| + case WebInspector.KeyboardShortcut.Keys.Up.code:
|
| + if (--newSelectedIndex < 0)
|
| + newSelectedIndex = this._filteredItems.length - 1;
|
| + this._updateSelection(newSelectedIndex, false);
|
| + event.consume(true);
|
| + break;
|
| + case WebInspector.KeyboardShortcut.Keys.PageDown.code:
|
| + newSelectedIndex = Math.min(newSelectedIndex + this._rowsPerViewport(), this._filteredItems.length - 1);
|
| + this._updateSelection(newSelectedIndex, true);
|
| + event.consume(true);
|
| + break;
|
| + case WebInspector.KeyboardShortcut.Keys.PageUp.code:
|
| + newSelectedIndex = Math.max(newSelectedIndex - this._rowsPerViewport(), 0);
|
| + this._updateSelection(newSelectedIndex, false);
|
| + event.consume(true);
|
| + break;
|
| + case WebInspector.KeyboardShortcut.Keys.Enter.code:
|
| + this._onEnter(event);
|
| + break;
|
| + default:
|
| + }
|
| + }
|
| +
|
| + _scheduleFilter() {
|
| + if (this._filterTimer)
|
| + return;
|
| + this._filterTimer = setTimeout(this._filterItems.bind(this), 0);
|
| + }
|
| +
|
| + /**
|
| + * @param {number} index
|
| + * @param {boolean} makeLast
|
| + */
|
| + _updateSelection(index, makeLast) {
|
| + if (!this._filteredItems.length)
|
| + return;
|
| + if (this._selectedElement)
|
| + this._selectedElement.classList.remove('selected');
|
| + this._viewportControl.scrollItemIntoView(index, makeLast);
|
| + this._selectedIndexInFiltered = index;
|
| + this._selectedElement = this._elements[index];
|
| + if (this._selectedElement)
|
| + this._selectedElement.classList.add('selected');
|
| + }
|
| +
|
| + _onClick(event) {
|
| + var itemElement = event.target.enclosingNodeOrSelfWithClass('filtered-list-widget-item');
|
| + if (!itemElement)
|
| + return;
|
| +
|
| + // Detach dialog before allowing delegate to override focus.
|
| + if (this._dialog)
|
| + this._dialog.detach();
|
| + this._delegate.selectItemWithQuery(itemElement._index, this._value());
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {number}
|
| + */
|
| + itemCount() {
|
| + return this._filteredItems.length;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} index
|
| + * @return {number}
|
| + */
|
| + fastItemHeight(index) {
|
| + if (!this._rowHeight) {
|
| + var delegateIndex = this._filteredItems[index];
|
| + var element = this._createItemElement(delegateIndex);
|
| + this._rowHeight = WebInspector.measurePreferredSize(element, this._itemElementsContainer).height;
|
| + }
|
| + return this._rowHeight;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} index
|
| + * @return {!Element}
|
| + */
|
| + itemElement(index) {
|
| + if (!this._elements[index])
|
| + this._elements[index] = this._createItemElement(this._filteredItems[index]);
|
| + return this._elements[index];
|
| + }
|
| };
|
|
|
| +
|
| /**
|
| - * @constructor
|
| - * @param {!Array<string>} promptHistory
|
| + * @unrestricted
|
| */
|
| -WebInspector.FilteredListWidget.Delegate = function(promptHistory)
|
| -{
|
| +WebInspector.FilteredListWidget.Delegate = class {
|
| + /**
|
| + * @param {!Array<string>} promptHistory
|
| + */
|
| + constructor(promptHistory) {
|
| this._promptHistory = promptHistory;
|
| -};
|
| -
|
| -WebInspector.FilteredListWidget.Delegate.prototype = {
|
| - /**
|
| - * @param {function():void} refreshCallback
|
| - */
|
| - setRefreshCallback: function(refreshCallback)
|
| - {
|
| - this._refreshCallback = refreshCallback;
|
| - },
|
| -
|
| - /**
|
| - * @param {string} query
|
| - * @return {boolean}
|
| - */
|
| - shouldShowMatchingItems: function(query)
|
| - {
|
| - return true;
|
| - },
|
| -
|
| - /**
|
| - * @return {number}
|
| - */
|
| - itemCount: function()
|
| - {
|
| - return 0;
|
| - },
|
| -
|
| - /**
|
| - * @param {number} itemIndex
|
| - * @return {string}
|
| - */
|
| - itemKeyAt: function(itemIndex)
|
| - {
|
| - return "";
|
| - },
|
| -
|
| - /**
|
| - * @param {number} itemIndex
|
| - * @param {string} query
|
| - * @return {number}
|
| - */
|
| - itemScoreAt: function(itemIndex, query)
|
| - {
|
| - return 1;
|
| - },
|
| -
|
| - /**
|
| - * @param {number} itemIndex
|
| - * @param {string} query
|
| - * @param {!Element} titleElement
|
| - * @param {!Element} subtitleElement
|
| - */
|
| - renderItem: function(itemIndex, query, titleElement, subtitleElement)
|
| - {
|
| - },
|
| -
|
| - /**
|
| - * @param {!Element} element
|
| - * @param {string} query
|
| - * @return {boolean}
|
| - */
|
| - highlightRanges: function(element, query)
|
| - {
|
| - if (!query)
|
| - return false;
|
| -
|
| - /**
|
| - * @param {string} text
|
| - * @param {string} query
|
| - * @return {?Array.<!WebInspector.SourceRange>}
|
| - */
|
| - function rangesForMatch(text, query)
|
| - {
|
| - var opcodes = WebInspector.Diff.charDiff(query, text);
|
| - var offset = 0;
|
| - var ranges = [];
|
| - for (var i = 0; i < opcodes.length; ++i) {
|
| - var opcode = opcodes[i];
|
| - if (opcode[0] === WebInspector.Diff.Operation.Equal)
|
| - ranges.push(new WebInspector.SourceRange(offset, opcode[1].length));
|
| - else if (opcode[0] !== WebInspector.Diff.Operation.Insert)
|
| - return null;
|
| - offset += opcode[1].length;
|
| - }
|
| - return ranges;
|
| - }
|
| -
|
| - var text = element.textContent;
|
| - var ranges = rangesForMatch(text, query);
|
| - if (!ranges || !this.caseSensitive())
|
| - ranges = rangesForMatch(text.toUpperCase(), query.toUpperCase());
|
| - if (ranges) {
|
| - WebInspector.highlightRangesWithStyleClass(element, ranges, "highlight");
|
| - return true;
|
| - }
|
| - return false;
|
| - },
|
| -
|
| - /**
|
| - * @return {boolean}
|
| - */
|
| - caseSensitive: function()
|
| - {
|
| - return true;
|
| - },
|
| -
|
| - /**
|
| - * @return {boolean}
|
| - */
|
| - renderMonospace: function()
|
| - {
|
| - return true;
|
| - },
|
| -
|
| - /**
|
| - * @return {boolean}
|
| - */
|
| - renderAsTwoRows: function()
|
| - {
|
| - return false;
|
| - },
|
| -
|
| - /**
|
| - * @param {number} itemIndex
|
| - * @param {string} promptValue
|
| - */
|
| - selectItemWithQuery: function(itemIndex, promptValue)
|
| - {
|
| - this._promptHistory.push(promptValue);
|
| - if (this._promptHistory.length > 100)
|
| - this._promptHistory.shift();
|
| - this.selectItem(itemIndex, promptValue);
|
| - },
|
| -
|
| - /**
|
| - * @param {number} itemIndex
|
| - * @param {string} promptValue
|
| - */
|
| - selectItem: function(itemIndex, promptValue)
|
| - {
|
| - },
|
| -
|
| - refresh: function()
|
| - {
|
| - this._refreshCallback();
|
| - },
|
| + }
|
| +
|
| + /**
|
| + * @param {function():void} refreshCallback
|
| + */
|
| + setRefreshCallback(refreshCallback) {
|
| + this._refreshCallback = refreshCallback;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} query
|
| + * @return {boolean}
|
| + */
|
| + shouldShowMatchingItems(query) {
|
| + return true;
|
| + }
|
| +
|
| + /**
|
| + * @return {number}
|
| + */
|
| + itemCount() {
|
| + return 0;
|
| + }
|
| +
|
| + /**
|
| + * @param {number} itemIndex
|
| + * @return {string}
|
| + */
|
| + itemKeyAt(itemIndex) {
|
| + return '';
|
| + }
|
| +
|
| + /**
|
| + * @param {number} itemIndex
|
| + * @param {string} query
|
| + * @return {number}
|
| + */
|
| + itemScoreAt(itemIndex, query) {
|
| + return 1;
|
| + }
|
| +
|
| + /**
|
| + * @param {number} itemIndex
|
| + * @param {string} query
|
| + * @param {!Element} titleElement
|
| + * @param {!Element} subtitleElement
|
| + */
|
| + renderItem(itemIndex, query, titleElement, subtitleElement) {
|
| + }
|
| +
|
| + /**
|
| + * @param {!Element} element
|
| + * @param {string} query
|
| + * @return {boolean}
|
| + */
|
| + highlightRanges(element, query) {
|
| + if (!query)
|
| + return false;
|
|
|
| /**
|
| + * @param {string} text
|
| * @param {string} query
|
| - * @return {string}
|
| + * @return {?Array.<!WebInspector.SourceRange>}
|
| */
|
| - rewriteQuery: function(query)
|
| - {
|
| - return query;
|
| - },
|
| -
|
| - /**
|
| - * @param {string} query
|
| - * @return {string}
|
| - */
|
| - autocomplete: function(query)
|
| - {
|
| - for (var i = this._promptHistory.length - 1; i >= 0; i--) {
|
| - if (this._promptHistory[i] !== query && this._promptHistory[i].startsWith(query))
|
| - return this._promptHistory[i];
|
| - }
|
| - return query;
|
| - },
|
| + function rangesForMatch(text, query) {
|
| + var opcodes = WebInspector.Diff.charDiff(query, text);
|
| + var offset = 0;
|
| + var ranges = [];
|
| + for (var i = 0; i < opcodes.length; ++i) {
|
| + var opcode = opcodes[i];
|
| + if (opcode[0] === WebInspector.Diff.Operation.Equal)
|
| + ranges.push(new WebInspector.SourceRange(offset, opcode[1].length));
|
| + else if (opcode[0] !== WebInspector.Diff.Operation.Insert)
|
| + return null;
|
| + offset += opcode[1].length;
|
| + }
|
| + return ranges;
|
| + }
|
|
|
| - dispose: function()
|
| - {
|
| + var text = element.textContent;
|
| + var ranges = rangesForMatch(text, query);
|
| + if (!ranges || !this.caseSensitive())
|
| + ranges = rangesForMatch(text.toUpperCase(), query.toUpperCase());
|
| + if (ranges) {
|
| + WebInspector.highlightRangesWithStyleClass(element, ranges, 'highlight');
|
| + return true;
|
| + }
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| + caseSensitive() {
|
| + return true;
|
| + }
|
| +
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| + renderMonospace() {
|
| + return true;
|
| + }
|
| +
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| + renderAsTwoRows() {
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * @param {number} itemIndex
|
| + * @param {string} promptValue
|
| + */
|
| + selectItemWithQuery(itemIndex, promptValue) {
|
| + this._promptHistory.push(promptValue);
|
| + if (this._promptHistory.length > 100)
|
| + this._promptHistory.shift();
|
| + this.selectItem(itemIndex, promptValue);
|
| + }
|
| +
|
| + /**
|
| + * @param {number} itemIndex
|
| + * @param {string} promptValue
|
| + */
|
| + selectItem(itemIndex, promptValue) {
|
| + }
|
| +
|
| + refresh() {
|
| + this._refreshCallback();
|
| + }
|
| +
|
| + /**
|
| + * @param {string} query
|
| + * @return {string}
|
| + */
|
| + rewriteQuery(query) {
|
| + return query;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} query
|
| + * @return {string}
|
| + */
|
| + autocomplete(query) {
|
| + for (var i = this._promptHistory.length - 1; i >= 0; i--) {
|
| + if (this._promptHistory[i] !== query && this._promptHistory[i].startsWith(query))
|
| + return this._promptHistory[i];
|
| }
|
| + return query;
|
| + }
|
| +
|
| + dispose() {
|
| + }
|
| };
|
|
|