| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 /** | 5 /** |
| 6 * @fileoverview Heap profiler panel implementation. | 6 * @fileoverview Heap profiler panel implementation. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 WebInspector.ProfilesPanel.prototype.addSnapshot = function(snapshot) { | 9 WebInspector.ProfilesPanel.prototype.addSnapshot = function(snapshot) { |
| 10 snapshot.title = WebInspector.UIString("Snapshot %d", snapshot.number); | 10 snapshot.title = WebInspector.UIString("Snapshot %d", snapshot.number); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 { | 92 { |
| 93 this._profile = profile; | 93 this._profile = profile; |
| 94 }, | 94 }, |
| 95 | 95 |
| 96 show: function(parentElement) | 96 show: function(parentElement) |
| 97 { | 97 { |
| 98 WebInspector.View.prototype.show.call(this, parentElement); | 98 WebInspector.View.prototype.show.call(this, parentElement); |
| 99 this.dataGrid.updateWidths(); | 99 this.dataGrid.updateWidths(); |
| 100 }, | 100 }, |
| 101 | 101 |
| 102 hide: function() |
| 103 { |
| 104 WebInspector.View.prototype.hide.call(this); |
| 105 this._currentSearchResultIndex = -1; |
| 106 }, |
| 107 |
| 102 resize: function() | 108 resize: function() |
| 103 { | 109 { |
| 104 if (this.dataGrid) | 110 if (this.dataGrid) |
| 105 this.dataGrid.updateWidths(); | 111 this.dataGrid.updateWidths(); |
| 106 }, | 112 }, |
| 107 | 113 |
| 108 refresh: function() | 114 refresh: function() |
| 109 { | 115 { |
| 110 this.dataGrid.removeChildren(); | 116 this.dataGrid.removeChildren(); |
| 111 | 117 |
| 112 var children = this.snapshotDataGridList.children; | 118 var children = this.snapshotDataGridList.children; |
| 113 var count = children.length; | 119 var count = children.length; |
| 114 for (var index = 0; index < count; ++index) | 120 for (var index = 0; index < count; ++index) |
| 115 this.dataGrid.appendChild(children[index]); | 121 this.dataGrid.appendChild(children[index]); |
| 116 | 122 |
| 117 this._updateSummaryGraph(); | 123 this._updateSummaryGraph(); |
| 118 }, | 124 }, |
| 119 | 125 |
| 120 refreshShowAsPercents: function() | 126 refreshShowAsPercents: function() |
| 121 { | 127 { |
| 122 this._updatePercentButton(); | 128 this._updatePercentButton(); |
| 123 this.refreshVisibleData(); | 129 this.refreshVisibleData(); |
| 124 }, | 130 }, |
| 125 | 131 |
| 132 _deleteSearchMatchedFlags: function(node) |
| 133 { |
| 134 delete node._searchMatchedConsColumn; |
| 135 delete node._searchMatchedCountColumn; |
| 136 delete node._searchMatchedSizeColumn; |
| 137 delete node._searchMatchedCountDeltaColumn; |
| 138 delete node._searchMatchedSizeDeltaColumn; |
| 139 }, |
| 140 |
| 141 searchCanceled: function() |
| 142 { |
| 143 if (this._searchResults) { |
| 144 for (var i = 0; i < this._searchResults.length; ++i) { |
| 145 var profileNode = this._searchResults[i].profileNode; |
| 146 this._deleteSearchMatchedFlags(profileNode); |
| 147 profileNode.refresh(); |
| 148 } |
| 149 } |
| 150 |
| 151 delete this._searchFinishedCallback; |
| 152 this._currentSearchResultIndex = -1; |
| 153 this._searchResults = []; |
| 154 }, |
| 155 |
| 156 performSearch: function(query, finishedCallback) |
| 157 { |
| 158 // Call searchCanceled since it will reset everything we need before doi
ng a new search. |
| 159 this.searchCanceled(); |
| 160 |
| 161 query = query.trimWhitespace(); |
| 162 |
| 163 if (!query.length) |
| 164 return; |
| 165 |
| 166 this._searchFinishedCallback = finishedCallback; |
| 167 |
| 168 var helper = WebInspector.HeapSnapshotView.SearchHelper; |
| 169 |
| 170 var operationAndNumber = helper.parseOperationAndNumber(query); |
| 171 var operation = operationAndNumber[0]; |
| 172 var queryNumber = operationAndNumber[1]; |
| 173 |
| 174 var percentUnits = helper.percents.test(query); |
| 175 var megaBytesUnits = helper.megaBytes.test(query); |
| 176 var kiloBytesUnits = helper.kiloBytes.test(query); |
| 177 var bytesUnits = helper.bytes.test(query); |
| 178 |
| 179 var queryNumberBytes = (megaBytesUnits ? (queryNumber * 1024 * 1024) : (
kiloBytesUnits ? (queryNumber * 1024) : queryNumber)); |
| 180 |
| 181 function matchesQuery(heapSnapshotDataGridNode) |
| 182 { |
| 183 WebInspector.HeapSnapshotView.prototype._deleteSearchMatchedFlags(he
apSnapshotDataGridNode); |
| 184 |
| 185 if (percentUnits) { |
| 186 heapSnapshotDataGridNode._searchMatchedCountColumn = operation(h
eapSnapshotDataGridNode.countPercent, queryNumber); |
| 187 heapSnapshotDataGridNode._searchMatchedSizeColumn = operation(he
apSnapshotDataGridNode.sizePercent, queryNumber); |
| 188 heapSnapshotDataGridNode._searchMatchedCountDeltaColumn = operat
ion(heapSnapshotDataGridNode.countDeltaPercent, queryNumber); |
| 189 heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn = operati
on(heapSnapshotDataGridNode.sizeDeltaPercent, queryNumber); |
| 190 } else if (megaBytesUnits || kiloBytesUnits || bytesUnits) { |
| 191 heapSnapshotDataGridNode._searchMatchedSizeColumn = operation(he
apSnapshotDataGridNode.size, queryNumberBytes); |
| 192 heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn = operati
on(heapSnapshotDataGridNode.sizeDelta, queryNumberBytes); |
| 193 } else { |
| 194 heapSnapshotDataGridNode._searchMatchedCountColumn = operation(h
eapSnapshotDataGridNode.count, queryNumber); |
| 195 heapSnapshotDataGridNode._searchMatchedCountDeltaColumn = operat
ion(heapSnapshotDataGridNode.countDelta, queryNumber); |
| 196 } |
| 197 |
| 198 if (heapSnapshotDataGridNode.constructorName.hasSubstring(query, tru
e)) |
| 199 heapSnapshotDataGridNode._searchMatchedConsColumn = true; |
| 200 |
| 201 if (heapSnapshotDataGridNode._searchMatchedConsColumn || |
| 202 heapSnapshotDataGridNode._searchMatchedCountColumn || |
| 203 heapSnapshotDataGridNode._searchMatchedSizeColumn || |
| 204 heapSnapshotDataGridNode._searchMatchedCountDeltaColumn || |
| 205 heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn) { |
| 206 heapSnapshotDataGridNode.refresh(); |
| 207 return true; |
| 208 } |
| 209 |
| 210 return false; |
| 211 } |
| 212 |
| 213 var current = this.snapshotDataGridList.children[0]; |
| 214 var depth = 0; |
| 215 var info = {}; |
| 216 |
| 217 // The second and subsequent levels of heap snapshot nodes represent ret
ainers, |
| 218 // so recursive expansion will be infinite, since a graph is being trave
rsed. |
| 219 // So default to a recursion cap of 2 levels. |
| 220 var maxDepth = 2; |
| 221 |
| 222 while (current) { |
| 223 if (matchesQuery(current)) |
| 224 this._searchResults.push({ profileNode: current }); |
| 225 current = current.traverseNextNode(false, null, (depth >= maxDepth),
info); |
| 226 depth += info.depthChange; |
| 227 } |
| 228 |
| 229 finishedCallback(this, this._searchResults.length); |
| 230 }, |
| 231 |
| 232 jumpToFirstSearchResult: WebInspector.CPUProfileView.prototype.jumpToFirstSe
archResult, |
| 233 jumpToLastSearchResult: WebInspector.CPUProfileView.prototype.jumpToLastSear
chResult, |
| 234 jumpToNextSearchResult: WebInspector.CPUProfileView.prototype.jumpToNextSear
chResult, |
| 235 jumpToPreviousSearchResult: WebInspector.CPUProfileView.prototype.jumpToPrev
iousSearchResult, |
| 236 showingFirstSearchResult: WebInspector.CPUProfileView.prototype.showingFirst
SearchResult, |
| 237 showingLastSearchResult: WebInspector.CPUProfileView.prototype.showingLastSe
archResult, |
| 238 _jumpToSearchResult: WebInspector.CPUProfileView.prototype._jumpToSearchResu
lt, |
| 239 |
| 126 refreshVisibleData: function() | 240 refreshVisibleData: function() |
| 127 { | 241 { |
| 128 var child = this.dataGrid.children[0]; | 242 var child = this.dataGrid.children[0]; |
| 129 while (child) { | 243 while (child) { |
| 130 child.refresh(); | 244 child.refresh(); |
| 131 child = child.traverseNextNode(false, null, true); | 245 child = child.traverseNextNode(false, null, true); |
| 132 } | 246 } |
| 133 this._updateSummaryGraph(); | 247 this._updateSummaryGraph(); |
| 134 }, | 248 }, |
| 135 | 249 |
| 136 _changeBase: function() { | 250 _changeBase: function() { |
| 137 if (this.baseSnapshot === WebInspector.HeapSnapshotProfileType.snapshots
[this.baseSelectElement.selectedIndex]) | 251 if (this.baseSnapshot === WebInspector.HeapSnapshotProfileType.snapshots
[this.baseSelectElement.selectedIndex]) |
| 138 return; | 252 return; |
| 139 | 253 |
| 140 this._resetDataGridList(); | 254 this._resetDataGridList(); |
| 141 this.refresh(); | 255 this.refresh(); |
| 256 |
| 257 if (!this.currentQuery || !this._searchFinishedCallback || !this._search
Results) |
| 258 return; |
| 259 |
| 260 // The current search needs to be performed again. First negate out prev
ious match |
| 261 // count by calling the search finished callback with a negative number
of matches. |
| 262 // Then perform the search again with the same query and callback. |
| 263 this._searchFinishedCallback(this, -this._searchResults.length); |
| 264 this.performSearch(this.currentQuery, this._searchFinishedCallback); |
| 142 }, | 265 }, |
| 143 | 266 |
| 144 _createSnapshotDataGridList: function() | 267 _createSnapshotDataGridList: function() |
| 145 { | 268 { |
| 146 if (this._snapshotDataGridList) | 269 if (this._snapshotDataGridList) |
| 147 delete this._snapshotDataGridList; | 270 delete this._snapshotDataGridList; |
| 148 | 271 |
| 149 this._snapshotDataGridList = new WebInspector.HeapSnapshotDataGridList(t
his, this.baseSnapshot.entries, this.profile.entries); | 272 this._snapshotDataGridList = new WebInspector.HeapSnapshotDataGridList(t
his, this.baseSnapshot.entries, this.profile.entries); |
| 150 return this._snapshotDataGridList; | 273 return this._snapshotDataGridList; |
| 151 }, | 274 }, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 this.showSizeAsPercent = !currentState; | 309 this.showSizeAsPercent = !currentState; |
| 187 this.showCountDeltaAsPercent = !currentState; | 310 this.showCountDeltaAsPercent = !currentState; |
| 188 this.showSizeDeltaAsPercent = !currentState; | 311 this.showSizeDeltaAsPercent = !currentState; |
| 189 this.refreshShowAsPercents(); | 312 this.refreshShowAsPercents(); |
| 190 }, | 313 }, |
| 191 | 314 |
| 192 _resetDataGridList: function() | 315 _resetDataGridList: function() |
| 193 { | 316 { |
| 194 this.baseSnapshot = WebInspector.HeapSnapshotProfileType.snapshots[this.
baseSelectElement.selectedIndex]; | 317 this.baseSnapshot = WebInspector.HeapSnapshotProfileType.snapshots[this.
baseSelectElement.selectedIndex]; |
| 195 var lastComparator = WebInspector.HeapSnapshotDataGridList.propertyCompa
rator("size", false); | 318 var lastComparator = WebInspector.HeapSnapshotDataGridList.propertyCompa
rator("size", false); |
| 196 if (this.snapshotDataGridList) { | 319 if (this.snapshotDataGridList) |
| 197 lastComparator = this.snapshotDataGridList.lastComparator; | 320 lastComparator = this.snapshotDataGridList.lastComparator; |
| 198 } | |
| 199 this.snapshotDataGridList = this._createSnapshotDataGridList(); | 321 this.snapshotDataGridList = this._createSnapshotDataGridList(); |
| 200 this.snapshotDataGridList.sort(lastComparator, true); | 322 this.snapshotDataGridList.sort(lastComparator, true); |
| 201 }, | 323 }, |
| 202 | 324 |
| 203 _sortData: function() | 325 _sortData: function() |
| 204 { | 326 { |
| 205 var sortAscending = this.dataGrid.sortOrder === "ascending"; | 327 var sortAscending = this.dataGrid.sortOrder === "ascending"; |
| 206 var sortColumnIdentifier = this.dataGrid.sortColumnIdentifier; | 328 var sortColumnIdentifier = this.dataGrid.sortColumnIdentifier; |
| 207 var sortProperty = { | 329 var sortProperty = { |
| 208 "cons": "constructorName", | 330 "cons": ["constructorName", null], |
| 209 "count": "count", | 331 "count": ["count", null], |
| 210 "size": "size", | 332 "size": ["size", "count"], |
| 211 "countDelta": this.showCountDeltaAsPercent ? "countDeltaPercent"
: "countDelta", | 333 "countDelta": this.showCountDeltaAsPercent ? ["countDeltaPercent
", null] : ["countDelta", null], |
| 212 "sizeDelta": this.showSizeDeltaAsPercent ? "sizeDeltaPercent" :
"sizeDelta" | 334 "sizeDelta": this.showSizeDeltaAsPercent ? ["sizeDeltaPercent",
"countDeltaPercent"] : ["sizeDelta", "sizeDeltaPercent"] |
| 213 }[sortColumnIdentifier]; | 335 }[sortColumnIdentifier]; |
| 214 | 336 |
| 215 this.snapshotDataGridList.sort(WebInspector.HeapSnapshotDataGridList.pro
pertyComparator(sortProperty, sortAscending)); | 337 this.snapshotDataGridList.sort(WebInspector.HeapSnapshotDataGridList.pro
pertyComparator(sortProperty[0], sortProperty[1], sortAscending)); |
| 216 | 338 |
| 217 this.refresh(); | 339 this.refresh(); |
| 218 }, | 340 }, |
| 219 | 341 |
| 220 _updateBaseOptions: function() | 342 _updateBaseOptions: function() |
| 221 { | 343 { |
| 222 var list = WebInspector.HeapSnapshotProfileType.snapshots; | 344 var list = WebInspector.HeapSnapshotProfileType.snapshots; |
| 223 // We're assuming that snapshots can only be added. | 345 // We're assuming that snapshots can only be added. |
| 224 if (this.baseSelectElement.length == list.length) | 346 if (this.baseSelectElement.length == list.length) |
| 225 return; | 347 return; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 244 | 366 |
| 245 _updateSummaryGraph: function() | 367 _updateSummaryGraph: function() |
| 246 { | 368 { |
| 247 this.summaryBar.calculator.showAsPercent = this._isShowingAsPercent; | 369 this.summaryBar.calculator.showAsPercent = this._isShowingAsPercent; |
| 248 this.summaryBar.update(this.profile.lowlevels); | 370 this.summaryBar.update(this.profile.lowlevels); |
| 249 } | 371 } |
| 250 }; | 372 }; |
| 251 | 373 |
| 252 WebInspector.HeapSnapshotView.prototype.__proto__ = WebInspector.View.prototype; | 374 WebInspector.HeapSnapshotView.prototype.__proto__ = WebInspector.View.prototype; |
| 253 | 375 |
| 376 WebInspector.HeapSnapshotView.SearchHelper = { |
| 377 // In comparators, we assume that a value from a node is passed as the first
parameter. |
| 378 operations: { LESS: function (a, b) { return a !== null && a < b; }, |
| 379 LESS_OR_EQUAL: function (a, b) { return a !== null && a <= b;
}, |
| 380 EQUAL: function (a, b) { return a !== null && a == b; }, |
| 381 GREATER_OR_EQUAL: function (a, b) { return a !== null && a >=
b; }, |
| 382 GREATER: function (a, b) { return a !== null && a > b; } }, |
| 383 |
| 384 operationParsers: { LESS: /^<(\d+)/, |
| 385 LESS_OR_EQUAL: /^<=(\d+)/, |
| 386 GREATER_OR_EQUAL: /^>=(\d+)/, |
| 387 GREATER: /^>(\d+)/ }, |
| 388 |
| 389 parseOperationAndNumber: function(query) |
| 390 { |
| 391 var operations = WebInspector.HeapSnapshotView.SearchHelper.operations; |
| 392 var parsers = WebInspector.HeapSnapshotView.SearchHelper.operationParser
s; |
| 393 for (var operation in parsers) { |
| 394 var match = query.match(parsers[operation]); |
| 395 if (match != null) |
| 396 return [operations[operation], parseFloat(match[1])]; |
| 397 } |
| 398 return [operations.EQUAL, parseFloat(query)]; |
| 399 }, |
| 400 |
| 401 percents: /%$/, |
| 402 |
| 403 megaBytes: /MB$/i, |
| 404 |
| 405 kiloBytes: /KB$/i, |
| 406 |
| 407 bytes: /B$/i |
| 408 } |
| 409 |
| 254 WebInspector.HeapSummaryCalculator = function(total) | 410 WebInspector.HeapSummaryCalculator = function(total) |
| 255 { | 411 { |
| 256 this.total = total; | 412 this.total = total; |
| 257 } | 413 } |
| 258 | 414 |
| 259 WebInspector.HeapSummaryCalculator.prototype = { | 415 WebInspector.HeapSummaryCalculator.prototype = { |
| 260 computeSummaryValues: function(lowLevels) | 416 computeSummaryValues: function(lowLevels) |
| 261 { | 417 { |
| 262 function highFromLow(type) { | 418 function highFromLow(type) { |
| 263 if (type == "CODE_TYPE" || type == "SHARED_FUNCTION_INFO_TYPE" || ty
pe == "SCRIPT_TYPE") return "code"; | 419 if (type == "CODE_TYPE" || type == "SHARED_FUNCTION_INFO_TYPE" || ty
pe == "SCRIPT_TYPE") return "code"; |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 else if (value === Number.NEGATIVE_INFINITY) | 574 else if (value === Number.NEGATIVE_INFINITY) |
| 419 return WebInspector.UIString("deleted"); | 575 return WebInspector.UIString("deleted"); |
| 420 if (value > 1000.0) | 576 if (value > 1000.0) |
| 421 return WebInspector.UIString("%s >1000%%", this.signForDelta(value))
; | 577 return WebInspector.UIString("%s >1000%%", this.signForDelta(value))
; |
| 422 return WebInspector.UIString("%s%.2f%%", this.signForDelta(value), Math.
abs(value)); | 578 return WebInspector.UIString("%s%.2f%%", this.signForDelta(value), Math.
abs(value)); |
| 423 }, | 579 }, |
| 424 | 580 |
| 425 getTotalCount: function() { | 581 getTotalCount: function() { |
| 426 if (!this._count) { | 582 if (!this._count) { |
| 427 this._count = 0; | 583 this._count = 0; |
| 428 for (var i = 0, n = this.children.length; i < n; ++i) { | 584 for (var i = 0, n = this.children.length; i < n; ++i) |
| 429 this._count += this.children[i].count; | 585 this._count += this.children[i].count; |
| 430 } | |
| 431 } | 586 } |
| 432 return this._count; | 587 return this._count; |
| 433 }, | 588 }, |
| 434 | 589 |
| 435 getTotalSize: function() { | 590 getTotalSize: function() { |
| 436 if (!this._size) { | 591 if (!this._size) { |
| 437 this._size = 0; | 592 this._size = 0; |
| 438 for (var i = 0, n = this.children.length; i < n; ++i) { | 593 for (var i = 0, n = this.children.length; i < n; ++i) |
| 439 this._size += this.children[i].size; | 594 this._size += this.children[i].size; |
| 440 } | |
| 441 } | 595 } |
| 442 return this._size; | 596 return this._size; |
| 443 }, | 597 }, |
| 444 | 598 |
| 445 get countPercent() | 599 get countPercent() |
| 446 { | 600 { |
| 447 return this.count / this._parent.getTotalCount() * 100.0; | 601 return this.count / this._parent.getTotalCount() * 100.0; |
| 448 }, | 602 }, |
| 449 | 603 |
| 450 get sizePercent() | 604 get sizePercent() |
| (...skipping 16 matching lines...) Expand all Loading... |
| 467 { | 621 { |
| 468 if (this.baseSize > 0) { | 622 if (this.baseSize > 0) { |
| 469 if (this.size > 0) | 623 if (this.size > 0) |
| 470 return this.sizeDelta / this.baseSize * 100.0; | 624 return this.sizeDelta / this.baseSize * 100.0; |
| 471 else | 625 else |
| 472 return Number.NEGATIVE_INFINITY; | 626 return Number.NEGATIVE_INFINITY; |
| 473 } else | 627 } else |
| 474 return Number.POSITIVE_INFINITY; | 628 return Number.POSITIVE_INFINITY; |
| 475 }, | 629 }, |
| 476 | 630 |
| 477 getData: function(showSize) | 631 get data() |
| 478 { | 632 { |
| 479 var data = {}; | 633 var data = {}; |
| 480 | 634 |
| 481 data["cons"] = this.constructorName; | 635 data["cons"] = this.constructorName; |
| 482 | 636 |
| 483 if (this.snapshotView.showCountAsPercent) | 637 if (this.snapshotView.showCountAsPercent) |
| 484 data["count"] = WebInspector.UIString("%.2f%%", this.countPercent); | 638 data["count"] = WebInspector.UIString("%.2f%%", this.countPercent); |
| 485 else | 639 else |
| 486 data["count"] = this.count; | 640 data["count"] = this.count; |
| 487 | 641 |
| 488 if (showSize) { | 642 if (this.size !== null) { |
| 489 if (this.snapshotView.showSizeAsPercent) | 643 if (this.snapshotView.showSizeAsPercent) |
| 490 data["size"] = WebInspector.UIString("%.2f%%", this.sizePercent)
; | 644 data["size"] = WebInspector.UIString("%.2f%%", this.sizePercent)
; |
| 491 else | 645 else |
| 492 data["size"] = Number.bytesToString(this.size); | 646 data["size"] = Number.bytesToString(this.size); |
| 493 } else { | 647 } else |
| 494 data["size"] = ""; | 648 data["size"] = ""; |
| 495 } | |
| 496 | 649 |
| 497 if (this.snapshotView.showCountDeltaAsPercent) | 650 if (this.snapshotView.showCountDeltaAsPercent) |
| 498 data["countDelta"] = this.showDeltaAsPercent(this.countDeltaPercent)
; | 651 data["countDelta"] = this.showDeltaAsPercent(this.countDeltaPercent)
; |
| 499 else | 652 else |
| 500 data["countDelta"] = WebInspector.UIString("%s%d", this.signForDelta
(this.countDelta), Math.abs(this.countDelta)); | 653 data["countDelta"] = WebInspector.UIString("%s%d", this.signForDelta
(this.countDelta), Math.abs(this.countDelta)); |
| 501 | 654 |
| 502 if (showSize) { | 655 if (this.sizeDelta != null) { |
| 503 if (this.snapshotView.showSizeDeltaAsPercent) | 656 if (this.snapshotView.showSizeDeltaAsPercent) |
| 504 data["sizeDelta"] = this.showDeltaAsPercent(this.sizeDeltaPercen
t); | 657 data["sizeDelta"] = this.showDeltaAsPercent(this.sizeDeltaPercen
t); |
| 505 else | 658 else |
| 506 data["sizeDelta"] = WebInspector.UIString("%s%s", this.signForDe
lta(this.sizeDelta), Number.bytesToString(Math.abs(this.sizeDelta))); | 659 data["sizeDelta"] = WebInspector.UIString("%s%s", this.signForDe
lta(this.sizeDelta), Number.bytesToString(Math.abs(this.sizeDelta))); |
| 507 } else { | 660 } else |
| 508 data["sizeDelta"] = ""; | 661 data["sizeDelta"] = ""; |
| 509 } | |
| 510 | 662 |
| 511 return data; | 663 return data; |
| 664 }, |
| 665 |
| 666 createCell: function(columnIdentifier) |
| 667 { |
| 668 var cell = WebInspector.DataGridNode.prototype.createCell.call(this, col
umnIdentifier); |
| 669 |
| 670 if ((columnIdentifier === "cons" && this._searchMatchedConsColumn) || |
| 671 (columnIdentifier === "count" && this._searchMatchedCountColumn) || |
| 672 (columnIdentifier === "size" && this._searchMatchedSizeColumn) || |
| 673 (columnIdentifier === "countDelta" && this._searchMatchedCountDeltaC
olumn) || |
| 674 (columnIdentifier === "sizeDelta" && this._searchMatchedSizeDeltaCol
umn)) |
| 675 cell.addStyleClass("highlight"); |
| 676 |
| 677 return cell; |
| 512 } | 678 } |
| 513 }; | 679 }; |
| 514 | 680 |
| 515 WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.__proto__ = WebInsp
ector.DataGridNode.prototype; | 681 WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.__proto__ = WebInsp
ector.DataGridNode.prototype; |
| 516 | 682 |
| 517 WebInspector.HeapSnapshotDataGridNode = function(snapshotView, baseEntry, snapsh
otEntry, owningTree) | 683 WebInspector.HeapSnapshotDataGridNode = function(snapshotView, baseEntry, snapsh
otEntry, owningTree) |
| 518 { | 684 { |
| 519 this.snapshotView = snapshotView; | 685 this.snapshotView = snapshotView; |
| 520 | 686 |
| 521 if (!snapshotEntry) | 687 if (!snapshotEntry) |
| 522 snapshotEntry = { cons: baseEntry.cons, count: 0, size: 0, retainers: {}
}; | 688 snapshotEntry = { cons: baseEntry.cons, count: 0, size: 0, retainers: {}
}; |
| 523 this.constructorName = snapshotEntry.cons; | 689 this.constructorName = snapshotEntry.cons; |
| 524 this.count = snapshotEntry.count; | 690 this.count = snapshotEntry.count; |
| 525 this.size = snapshotEntry.size; | 691 this.size = snapshotEntry.size; |
| 526 this.retainers = snapshotEntry.retainers; | 692 this.retainers = snapshotEntry.retainers; |
| 527 | 693 |
| 528 if (!baseEntry) | 694 if (!baseEntry) |
| 529 baseEntry = { count: 0, size: 0, retainers: {} }; | 695 baseEntry = { count: 0, size: 0, retainers: {} }; |
| 530 this.baseCount = baseEntry.count; | 696 this.baseCount = baseEntry.count; |
| 531 this.countDelta = this.count - this.baseCount; | 697 this.countDelta = this.count - this.baseCount; |
| 532 this.baseSize = baseEntry.size; | 698 this.baseSize = baseEntry.size; |
| 533 this.sizeDelta = this.size - this.baseSize; | 699 this.sizeDelta = this.size - this.baseSize; |
| 534 this.baseRetainers = baseEntry.retainers; | 700 this.baseRetainers = baseEntry.retainers; |
| 535 | 701 |
| 536 WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree); | 702 WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree); |
| 537 }; | 703 }; |
| 538 | 704 |
| 539 WebInspector.HeapSnapshotDataGridNode.prototype = { | |
| 540 get data() | |
| 541 { | |
| 542 return this.getData(true); | |
| 543 } | |
| 544 }; | |
| 545 | |
| 546 WebInspector.HeapSnapshotDataGridNode.prototype.__proto__ = WebInspector.HeapSna
pshotDataGridNodeWithRetainers.prototype; | 705 WebInspector.HeapSnapshotDataGridNode.prototype.__proto__ = WebInspector.HeapSna
pshotDataGridNodeWithRetainers.prototype; |
| 547 | 706 |
| 548 WebInspector.HeapSnapshotDataGridList = function(snapshotView, baseEntries, snap
shotEntries) | 707 WebInspector.HeapSnapshotDataGridList = function(snapshotView, baseEntries, snap
shotEntries) |
| 549 { | 708 { |
| 550 this.tree = this; | 709 this.tree = this; |
| 551 this.snapshotView = snapshotView; | 710 this.snapshotView = snapshotView; |
| 552 this.children = []; | 711 this.children = []; |
| 553 this.lastComparator = null; | 712 this.lastComparator = null; |
| 554 this.populateChildren(baseEntries, snapshotEntries); | 713 this.populateChildren(baseEntries, snapshotEntries); |
| 555 }; | 714 }; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 579 }, | 738 }, |
| 580 | 739 |
| 581 produceDiff: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.pr
oduceDiff, | 740 produceDiff: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.pr
oduceDiff, |
| 582 sort: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.sort, | 741 sort: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.sort, |
| 583 getTotalCount: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.
getTotalCount, | 742 getTotalCount: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.
getTotalCount, |
| 584 getTotalSize: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.g
etTotalSize | 743 getTotalSize: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.g
etTotalSize |
| 585 }; | 744 }; |
| 586 | 745 |
| 587 WebInspector.HeapSnapshotDataGridList.propertyComparators = [{}, {}]; | 746 WebInspector.HeapSnapshotDataGridList.propertyComparators = [{}, {}]; |
| 588 | 747 |
| 589 WebInspector.HeapSnapshotDataGridList.propertyComparator = function(property, is
Ascending) | 748 WebInspector.HeapSnapshotDataGridList.propertyComparator = function(property, pr
operty2, isAscending) |
| 590 { | 749 { |
| 591 var comparator = this.propertyComparators[(isAscending ? 1 : 0)][property]; | 750 var propertyHash = property + '#' + property2; |
| 751 var comparator = this.propertyComparators[(isAscending ? 1 : 0)][propertyHas
h]; |
| 592 if (!comparator) { | 752 if (!comparator) { |
| 593 comparator = function(lhs, rhs) { | 753 comparator = function(lhs, rhs) { |
| 594 var l = lhs[property], r = rhs[property]; | 754 var l = lhs[property], r = rhs[property]; |
| 755 if ((l === null || r === null) && property2 !== null) |
| 756 l = lhs[property2], r = rhs[property2]; |
| 595 var result = l < r ? -1 : (l > r ? 1 : 0); | 757 var result = l < r ? -1 : (l > r ? 1 : 0); |
| 596 return isAscending ? result : -result; | 758 return isAscending ? result : -result; |
| 597 }; | 759 }; |
| 598 this.propertyComparators[(isAscending ? 1 : 0)][property] = comparator; | 760 this.propertyComparators[(isAscending ? 1 : 0)][propertyHash] = comparat
or; |
| 599 } | 761 } |
| 600 return comparator; | 762 return comparator; |
| 601 }; | 763 }; |
| 602 | 764 |
| 603 WebInspector.HeapSnapshotDataGridRetainerNode = function(snapshotView, baseEntry
, snapshotEntry, owningTree) | 765 WebInspector.HeapSnapshotDataGridRetainerNode = function(snapshotView, baseEntry
, snapshotEntry, owningTree) |
| 604 { | 766 { |
| 605 this.snapshotView = snapshotView; | 767 this.snapshotView = snapshotView; |
| 606 | 768 |
| 607 if (!snapshotEntry) | 769 if (!snapshotEntry) |
| 608 snapshotEntry = { cons: baseEntry.cons, count: 0, clusters: {} }; | 770 snapshotEntry = { cons: baseEntry.cons, count: 0, clusters: {} }; |
| 609 this.constructorName = snapshotEntry.cons; | 771 this.constructorName = snapshotEntry.cons; |
| 610 this.count = snapshotEntry.count; | 772 this.count = snapshotEntry.count; |
| 611 this.retainers = this._calculateRetainers(this.snapshotView.profile, snapsho
tEntry.clusters); | 773 this.retainers = this._calculateRetainers(this.snapshotView.profile, snapsho
tEntry.clusters); |
| 612 | 774 |
| 613 if (!baseEntry) | 775 if (!baseEntry) |
| 614 baseEntry = { count: 0, clusters: {} }; | 776 baseEntry = { count: 0, clusters: {} }; |
| 615 this.baseCount = baseEntry.count; | 777 this.baseCount = baseEntry.count; |
| 616 this.countDelta = this.count - this.baseCount; | 778 this.countDelta = this.count - this.baseCount; |
| 617 this.baseRetainers = this._calculateRetainers(this.snapshotView.baseSnapshot
, baseEntry.clusters); | 779 this.baseRetainers = this._calculateRetainers(this.snapshotView.baseSnapshot
, baseEntry.clusters); |
| 618 | 780 |
| 619 this.size = this.count; // This way, when sorting by sizes entries will be
sorted by references count. | 781 this.size = null; |
| 782 this.sizeDelta = null; |
| 620 | 783 |
| 621 WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree); | 784 WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree); |
| 622 } | 785 } |
| 623 | 786 |
| 624 WebInspector.HeapSnapshotDataGridRetainerNode.prototype = { | 787 WebInspector.HeapSnapshotDataGridRetainerNode.prototype = { |
| 625 get data() | 788 get sizePercent() |
| 626 { | 789 { |
| 627 return this.getData(false); | 790 return null; |
| 791 }, |
| 792 |
| 793 get sizeDeltaPercent() |
| 794 { |
| 795 return null; |
| 628 }, | 796 }, |
| 629 | 797 |
| 630 _calculateRetainers: function(snapshot, clusters) { | 798 _calculateRetainers: function(snapshot, clusters) { |
| 631 var retainers = {}; | 799 var retainers = {}; |
| 632 if (this.isEmptySet(clusters)) { | 800 if (this.isEmptySet(clusters)) { |
| 633 if (this.constructorName in snapshot.entries) | 801 if (this.constructorName in snapshot.entries) |
| 634 return snapshot.entries[this.constructorName].retainers; | 802 return snapshot.entries[this.constructorName].retainers; |
| 635 } else { | 803 } else { |
| 636 // In case when an entry is retained by clusters, we need to gather
up the list | 804 // In case when an entry is retained by clusters, we need to gather
up the list |
| 637 // of retainers by merging retainers of every cluster. | 805 // of retainers by merging retainers of every cluster. |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 707 | 875 |
| 708 | 876 |
| 709 (function() { | 877 (function() { |
| 710 var originalCreatePanels = WebInspector._createPanels; | 878 var originalCreatePanels = WebInspector._createPanels; |
| 711 WebInspector._createPanels = function() { | 879 WebInspector._createPanels = function() { |
| 712 originalCreatePanels.apply(this, arguments); | 880 originalCreatePanels.apply(this, arguments); |
| 713 if (WebInspector.panels.profiles) | 881 if (WebInspector.panels.profiles) |
| 714 WebInspector.panels.profiles.registerProfileType(new WebInspector.He
apSnapshotProfileType()); | 882 WebInspector.panels.profiles.registerProfileType(new WebInspector.He
apSnapshotProfileType()); |
| 715 } | 883 } |
| 716 })(); | 884 })(); |
| OLD | NEW |