| 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} | 
|  |