Chromium Code Reviews| 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 4a221cdf1e809c52dd1cb94882d243fdbaa45081..8c37b129d82902107991194e7fa8f5cb484c7345 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 |
| @@ -161,16 +161,19 @@ UI.FilteredListWidget = class extends UI.VBox { |
| if (this._scoringTimer) { |
| clearTimeout(this._scoringTimer); |
| delete this._scoringTimer; |
| + |
| + if (this._refreshViewportWithCurrentResult) |
| + this._refreshViewportWithCurrentResult(); |
| } |
| var query = this._delegate.rewriteQuery(this._value()); |
| this._query = query; |
| + |
| var filterRegex = query ? UI.FilteredListWidget.filterRegex(query) : null; |
| var oldSelectedAbsoluteIndex = |
| - this._selectedIndexInFiltered ? this._filteredItems[this._selectedIndexInFiltered] : null; |
| + this._selectedIndexInFiltered && query ? this._filteredItems[this._selectedIndexInFiltered] : undefined; |
| var filteredItems = []; |
| - this._selectedIndexInFiltered = 0; |
| var bestScores = []; |
| var bestItems = []; |
| @@ -194,8 +197,10 @@ UI.FilteredListWidget = class extends UI.VBox { |
| * @this {UI.FilteredListWidget} |
| */ |
| function scoreItems(fromIndex) { |
| + delete this._scoringTimer; |
| 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))) |
| @@ -223,27 +228,40 @@ UI.FilteredListWidget = class extends UI.VBox { |
| } |
| } |
| + this._refreshViewportWithCurrentResult = |
| + this._refreshViewport.bind(this, bestItems, overflowItems, filteredItems, oldSelectedAbsoluteIndex); |
| + |
| // 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._refreshViewportWithCurrentResult(); |
| + } |
| + } |
| + |
| + /** |
| + * @param {!Array<number>} bestItems |
| + * @param {!Array<number>} overflowItems |
| + * @param {!Array<number>} filteredItems |
| + * @param {number|undefined} selectedAbsoluteIndex |
| + */ |
| + _refreshViewport(bestItems, overflowItems, filteredItems, selectedAbsoluteIndex) { |
| + delete this._refreshViewportWithCurrentResult; |
| + this._filteredItems = bestItems.concat(overflowItems).concat(filteredItems); |
|
lushnikov
2016/12/16 22:26:32
we can speed this up if we mutate single array ins
|
| + |
| + this._selectedIndexInFiltered = 0; |
| + for (var i = 0; selectedAbsoluteIndex !== undefined && i < this._filteredItems.length; ++i) { |
| + if (this._filteredItems[i] === selectedAbsoluteIndex) { |
| + this._selectedIndexInFiltered = i; |
| + break; |
| } |
| - this._elements = []; |
| - this._viewportControl.refresh(); |
| - if (!query) |
| - this._selectedIndexInFiltered = 0; |
| - this._updateSelection(this._selectedIndexInFiltered, false); |
| - this._itemsFilteredForTest(); |
| } |
| + this._elements = []; |
| + this._viewportControl.refresh(); |
| + this._updateSelection(this._selectedIndexInFiltered, false); |
| + this._itemsFilteredForTest(); |
| } |
| /** |