Index: third_party/WebKit/Source/devtools/front_end/coverage/CoverageListView.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/coverage/CoverageListView.js b/third_party/WebKit/Source/devtools/front_end/coverage/CoverageListView.js |
index a7fe3ff13599833b921777cf90c0a0cb8b795f7e..654120e1170d3ce491f6a10b433574e58007363a 100644 |
--- a/third_party/WebKit/Source/devtools/front_end/coverage/CoverageListView.js |
+++ b/third_party/WebKit/Source/devtools/front_end/coverage/CoverageListView.js |
@@ -5,6 +5,8 @@ |
Coverage.CoverageListView = class extends UI.VBox { |
constructor() { |
super(true); |
+ /** @type {!Map<!Coverage.URLCoverageInfo, !Coverage.CoverageListView.GridNode>} */ |
+ this._nodeForCoverageInfo = new Map(); |
this.registerRequiredCSS('coverage/coverageListView.css'); |
var columns = [ |
{id: 'url', title: Common.UIString('URL'), width: '300px', fixedWidth: false, sortable: true}, |
@@ -42,12 +44,27 @@ Coverage.CoverageListView = class extends UI.VBox { |
* @param {!Array<!Coverage.URLCoverageInfo>} coverageInfo |
*/ |
update(coverageInfo) { |
+ var hadUpdates = false; |
var maxSize = coverageInfo.reduce((acc, entry) => Math.max(acc, entry.size()), 0); |
var rootNode = this._dataGrid.rootNode(); |
- rootNode.removeChildren(); |
- for (var entry of coverageInfo) |
- rootNode.appendChild(new Coverage.CoverageListView.GridNode(entry, maxSize)); |
- this._sortingChanged(); |
+ for (var entry of coverageInfo) { |
+ var node = this._nodeForCoverageInfo.get(entry); |
+ if (node) { |
+ hadUpdates = node._refreshIfNeeded(maxSize) || hadUpdates; |
+ continue; |
+ } |
+ hadUpdates = true; |
+ node = new Coverage.CoverageListView.GridNode(entry, maxSize); |
+ this._nodeForCoverageInfo.set(entry, node); |
+ rootNode.appendChild(node); |
+ } |
+ if (hadUpdates) |
+ this._sortingChanged(); |
+ } |
+ |
+ reset() { |
+ this._nodeForCoverageInfo.clear(); |
+ this._dataGrid.rootNode().removeChildren(); |
} |
/** |
@@ -135,7 +152,7 @@ Coverage.CoverageListView = class extends UI.VBox { |
var nodeA = /** @type {!Coverage.CoverageListView.GridNode} */ (a); |
var nodeB = /** @type {!Coverage.CoverageListView.GridNode} */ (b); |
- return nodeA._coverageInfo[fieldName]() - nodeB._coverageInfo[fieldName](); |
+ return nodeA._coverageInfo[fieldName]() - nodeB._coverageInfo[fieldName]() || compareURL(a, b); |
} |
/** |
@@ -148,7 +165,7 @@ Coverage.CoverageListView = class extends UI.VBox { |
var nodeB = /** @type {!Coverage.CoverageListView.GridNode} */ (b); |
var typeA = Coverage.CoverageListView._typeToString(nodeA._coverageInfo.type()); |
var typeB = Coverage.CoverageListView._typeToString(nodeB._coverageInfo.type()); |
- return typeA.localeCompare(typeB); |
+ return typeA.localeCompare(typeB) || compareURL(a, b); |
} |
} |
@@ -173,12 +190,27 @@ Coverage.CoverageListView.GridNode = class extends DataGrid.SortableDataGridNode |
constructor(coverageInfo, maxSize) { |
super(); |
this._coverageInfo = coverageInfo; |
+ /** @type {number|undefined} */ |
+ this._lastUsedSize; |
this._url = coverageInfo.url(); |
this._displayURL = new Common.ParsedURL(this._url).displayName; |
this._maxSize = maxSize; |
} |
/** |
+ * @param {number} maxSize |
+ * @return {boolean} |
+ */ |
+ _refreshIfNeeded(maxSize) { |
+ if (this._lastUsedSize === this._coverageInfo.usedSize() && maxSize === this._maxSize) |
+ return false; |
+ this._lastUsedSize = this._coverageInfo.usedSize(); |
+ this._maxSize = maxSize; |
+ this.refresh(); |
+ return true; |
+ } |
+ |
+ /** |
* @override |
* @param {string} columnId |
* @return {!Element} |