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(); |
} |
/** |