| Index: resources/inspector/heap_profiler_panel.js
|
| ===================================================================
|
| --- resources/inspector/heap_profiler_panel.js (revision 33840)
|
| +++ resources/inspector/heap_profiler_panel.js (working copy)
|
| @@ -1,715 +0,0 @@
|
| -// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -/**
|
| - * @fileoverview Heap profiler panel implementation.
|
| - */
|
| -
|
| -WebInspector.ProfilesPanel.prototype.addSnapshot = function(snapshot) {
|
| - snapshot.title = WebInspector.UIString("Snapshot %d", snapshot.number);
|
| -
|
| - var snapshots = WebInspector.HeapSnapshotProfileType.snapshots;
|
| - snapshots.push(snapshot);
|
| -
|
| - snapshot.listIndex = snapshots.length - 1;
|
| -
|
| - this.addProfileHeader(WebInspector.HeapSnapshotProfileType.TypeId, snapshot);
|
| -
|
| - this.dispatchEventToListeners("snapshot added");
|
| -}
|
| -
|
| -
|
| -WebInspector.HeapSnapshotView = function(parent, profile)
|
| -{
|
| - WebInspector.View.call(this);
|
| -
|
| - this.element.addStyleClass("heap-snapshot-view");
|
| -
|
| - this.parent = parent;
|
| - this.parent.addEventListener("snapshot added", this._updateBaseOptions, this);
|
| -
|
| - this.showCountAsPercent = true;
|
| - this.showSizeAsPercent = true;
|
| - this.showCountDeltaAsPercent = true;
|
| - this.showSizeDeltaAsPercent = true;
|
| -
|
| - this.summaryBar = new WebInspector.SummaryBar(this.categories);
|
| - this.summaryBar.element.id = "heap-snapshot-summary";
|
| - this.summaryBar.calculator = new WebInspector.HeapSummaryCalculator(profile.used);
|
| - this.element.appendChild(this.summaryBar.element);
|
| -
|
| - var columns = { "cons": { title: WebInspector.UIString("Constructor"), disclosure: true, sortable: true },
|
| - "count": { title: WebInspector.UIString("Count"), width: "54px", sortable: true },
|
| - "size": { title: WebInspector.UIString("Size"), width: "72px", sort: "descending", sortable: true },
|
| - "countDelta": { title: WebInspector.UIString("\xb1 Count"), width: "72px", sortable: true },
|
| - "sizeDelta": { title: WebInspector.UIString("\xb1 Size"), width: "72px", sortable: true } };
|
| -
|
| - this.dataGrid = new WebInspector.DataGrid(columns);
|
| - this.dataGrid.addEventListener("sorting changed", this._sortData, this);
|
| - this.dataGrid.element.addEventListener("mousedown", this._mouseDownInDataGrid.bind(this), true);
|
| - this.element.appendChild(this.dataGrid.element);
|
| -
|
| - this.profile = profile;
|
| -
|
| - this.baseSelectElement = document.createElement("select");
|
| - this.baseSelectElement.className = "status-bar-item";
|
| - this.baseSelectElement.addEventListener("change", this._changeBase.bind(this), false);
|
| - this._updateBaseOptions();
|
| - if (this.profile.listIndex > 0)
|
| - this.baseSelectElement.selectedIndex = this.profile.listIndex - 1;
|
| - else
|
| - this.baseSelectElement.selectedIndex = this.profile.listIndex;
|
| - this._resetDataGridList();
|
| -
|
| - this.percentButton = new WebInspector.StatusBarButton("", "percent-time-status-bar-item status-bar-item");
|
| - this.percentButton.addEventListener("click", this._percentClicked.bind(this), false);
|
| -
|
| - this.refresh();
|
| -
|
| - this._updatePercentButton();
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotView.prototype = {
|
| -
|
| - get categories()
|
| - {
|
| - return {code: {title: WebInspector.UIString("Code"), color: {r: 255, g: 121, b: 0}}, data: {title: WebInspector.UIString("Objects and Data"), color: {r: 47, g: 102, b: 236}}, other: {title: WebInspector.UIString("Other"), color: {r: 186, g: 186, b: 186}}};
|
| - },
|
| -
|
| - get statusBarItems()
|
| - {
|
| - return [this.baseSelectElement, this.percentButton.element];
|
| - },
|
| -
|
| - get profile()
|
| - {
|
| - return this._profile;
|
| - },
|
| -
|
| - set profile(profile)
|
| - {
|
| - this._profile = profile;
|
| - },
|
| -
|
| - show: function(parentElement)
|
| - {
|
| - WebInspector.View.prototype.show.call(this, parentElement);
|
| - this.dataGrid.updateWidths();
|
| - },
|
| -
|
| - resize: function()
|
| - {
|
| - if (this.dataGrid)
|
| - this.dataGrid.updateWidths();
|
| - },
|
| -
|
| - refresh: function()
|
| - {
|
| - this.dataGrid.removeChildren();
|
| -
|
| - var children = this.snapshotDataGridList.children;
|
| - var count = children.length;
|
| - for (var index = 0; index < count; ++index)
|
| - this.dataGrid.appendChild(children[index]);
|
| -
|
| - this._updateSummaryGraph();
|
| - },
|
| -
|
| - refreshShowAsPercents: function()
|
| - {
|
| - this._updatePercentButton();
|
| - this.refreshVisibleData();
|
| - },
|
| -
|
| - refreshVisibleData: function()
|
| - {
|
| - var child = this.dataGrid.children[0];
|
| - while (child) {
|
| - child.refresh();
|
| - child = child.traverseNextNode(false, null, true);
|
| - }
|
| - this._updateSummaryGraph();
|
| - },
|
| -
|
| - _changeBase: function() {
|
| - if (this.baseSnapshot === WebInspector.HeapSnapshotProfileType.snapshots[this.baseSelectElement.selectedIndex])
|
| - return;
|
| -
|
| - this._resetDataGridList();
|
| - this.refresh();
|
| - },
|
| -
|
| - _createSnapshotDataGridList: function()
|
| - {
|
| - if (this._snapshotDataGridList)
|
| - delete this._snapshotDataGridList;
|
| -
|
| - this._snapshotDataGridList = new WebInspector.HeapSnapshotDataGridList(this, this.baseSnapshot.entries, this.profile.entries);
|
| - return this._snapshotDataGridList;
|
| - },
|
| -
|
| - _mouseDownInDataGrid: function(event)
|
| - {
|
| - if (event.detail < 2)
|
| - return;
|
| -
|
| - var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
|
| - if (!cell || (!cell.hasStyleClass("count-column") && !cell.hasStyleClass("size-column") && !cell.hasStyleClass("countDelta-column") && !cell.hasStyleClass("sizeDelta-column")))
|
| - return;
|
| -
|
| - if (cell.hasStyleClass("count-column"))
|
| - this.showCountAsPercent = !this.showCountAsPercent;
|
| - else if (cell.hasStyleClass("size-column"))
|
| - this.showSizeAsPercent = !this.showSizeAsPercent;
|
| - else if (cell.hasStyleClass("countDelta-column"))
|
| - this.showCountDeltaAsPercent = !this.showCountDeltaAsPercent;
|
| - else if (cell.hasStyleClass("sizeDelta-column"))
|
| - this.showSizeDeltaAsPercent = !this.showSizeDeltaAsPercent;
|
| -
|
| - this.refreshShowAsPercents();
|
| -
|
| - event.preventDefault();
|
| - event.stopPropagation();
|
| - },
|
| -
|
| - get _isShowingAsPercent()
|
| - {
|
| - return this.showCountAsPercent && this.showSizeAsPercent && this.showCountDeltaAsPercent && this.showSizeDeltaAsPercent;
|
| - },
|
| -
|
| - _percentClicked: function(event)
|
| - {
|
| - var currentState = this._isShowingAsPercent;
|
| - this.showCountAsPercent = !currentState;
|
| - this.showSizeAsPercent = !currentState;
|
| - this.showCountDeltaAsPercent = !currentState;
|
| - this.showSizeDeltaAsPercent = !currentState;
|
| - this.refreshShowAsPercents();
|
| - },
|
| -
|
| - _resetDataGridList: function()
|
| - {
|
| - this.baseSnapshot = WebInspector.HeapSnapshotProfileType.snapshots[this.baseSelectElement.selectedIndex];
|
| - var lastComparator = WebInspector.HeapSnapshotDataGridList.propertyComparator("size", false);
|
| - if (this.snapshotDataGridList) {
|
| - lastComparator = this.snapshotDataGridList.lastComparator;
|
| - }
|
| - this.snapshotDataGridList = this._createSnapshotDataGridList();
|
| - this.snapshotDataGridList.sort(lastComparator, true);
|
| - },
|
| -
|
| - _sortData: function()
|
| - {
|
| - var sortAscending = this.dataGrid.sortOrder === "ascending";
|
| - var sortColumnIdentifier = this.dataGrid.sortColumnIdentifier;
|
| - var sortProperty = {
|
| - "cons": "constructorName",
|
| - "count": "count",
|
| - "size": "size",
|
| - "countDelta": this.showCountDeltaAsPercent ? "countDeltaPercent" : "countDelta",
|
| - "sizeDelta": this.showSizeDeltaAsPercent ? "sizeDeltaPercent" : "sizeDelta"
|
| - }[sortColumnIdentifier];
|
| -
|
| - this.snapshotDataGridList.sort(WebInspector.HeapSnapshotDataGridList.propertyComparator(sortProperty, sortAscending));
|
| -
|
| - this.refresh();
|
| - },
|
| -
|
| - _updateBaseOptions: function()
|
| - {
|
| - var list = WebInspector.HeapSnapshotProfileType.snapshots;
|
| - // We're assuming that snapshots can only be added.
|
| - if (this.baseSelectElement.length == list.length)
|
| - return;
|
| -
|
| - for (var i = this.baseSelectElement.length, n = list.length; i < n; ++i) {
|
| - var baseOption = document.createElement("option");
|
| - baseOption.label = WebInspector.UIString("Compared to %s", list[i].title);
|
| - this.baseSelectElement.appendChild(baseOption);
|
| - }
|
| - },
|
| -
|
| - _updatePercentButton: function()
|
| - {
|
| - if (this._isShowingAsPercent) {
|
| - this.percentButton.title = WebInspector.UIString("Show absolute counts and sizes.");
|
| - this.percentButton.toggled = true;
|
| - } else {
|
| - this.percentButton.title = WebInspector.UIString("Show counts and sizes as percentages.");
|
| - this.percentButton.toggled = false;
|
| - }
|
| - },
|
| -
|
| - _updateSummaryGraph: function()
|
| - {
|
| - this.summaryBar.calculator.showAsPercent = this._isShowingAsPercent;
|
| - this.summaryBar.update(this.profile.lowlevels);
|
| - }
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotView.prototype.__proto__ = WebInspector.View.prototype;
|
| -
|
| -WebInspector.HeapSummaryCalculator = function(total)
|
| -{
|
| - this.total = total;
|
| -}
|
| -
|
| -WebInspector.HeapSummaryCalculator.prototype = {
|
| - computeSummaryValues: function(lowLevels)
|
| - {
|
| - function highFromLow(type) {
|
| - if (type == "CODE_TYPE" || type == "SHARED_FUNCTION_INFO_TYPE" || type == "SCRIPT_TYPE") return "code";
|
| - if (type == "STRING_TYPE" || type == "HEAP_NUMBER_TYPE" || type.match(/^JS_/) || type.match(/_ARRAY_TYPE$/)) return "data";
|
| - return "other";
|
| - }
|
| - var highLevels = {data: 0, code: 0, other: 0};
|
| - for (var item in lowLevels) {
|
| - var highItem = highFromLow(item);
|
| - highLevels[highItem] += lowLevels[item].size;
|
| - }
|
| - return {categoryValues: highLevels};
|
| - },
|
| -
|
| - formatValue: function(value)
|
| - {
|
| - if (this.showAsPercent)
|
| - return WebInspector.UIString("%.2f%%", value / this.total * 100.0);
|
| - else
|
| - return Number.bytesToString(value);
|
| - },
|
| -
|
| - get showAsPercent()
|
| - {
|
| - return this._showAsPercent;
|
| - },
|
| -
|
| - set showAsPercent(x)
|
| - {
|
| - this._showAsPercent = x;
|
| - }
|
| -}
|
| -
|
| -WebInspector.HeapSnapshotSidebarTreeElement = function(snapshot)
|
| -{
|
| - this.profile = snapshot;
|
| -
|
| - WebInspector.SidebarTreeElement.call(this, "heap-snapshot-sidebar-tree-item", "", "", snapshot, false);
|
| -
|
| - this.refreshTitles();
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotSidebarTreeElement.prototype = {
|
| - get mainTitle()
|
| - {
|
| - if (this._mainTitle)
|
| - return this._mainTitle;
|
| - return this.profile.title;
|
| - },
|
| -
|
| - set mainTitle(x)
|
| - {
|
| - this._mainTitle = x;
|
| - this.refreshTitles();
|
| - },
|
| -
|
| - get subtitle()
|
| - {
|
| - if (this._subTitle)
|
| - return this._subTitle;
|
| - return WebInspector.UIString("Used %s of %s (%.0f%%)", Number.bytesToString(this.profile.used, null, false), Number.bytesToString(this.profile.capacity, null, false), this.profile.used / this.profile.capacity * 100.0);
|
| - },
|
| -
|
| - set subtitle(x)
|
| - {
|
| - this._subTitle = x;
|
| - this.refreshTitles();
|
| - }
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotSidebarTreeElement.prototype.__proto__ = WebInspector.ProfileSidebarTreeElement.prototype;
|
| -
|
| -WebInspector.HeapSnapshotDataGridNodeWithRetainers = function(owningTree)
|
| -{
|
| - this.tree = owningTree;
|
| -
|
| - WebInspector.DataGridNode.call(this, null, this._hasRetainers);
|
| -
|
| - this.addEventListener("populate", this._populate, this);
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype = {
|
| - isEmptySet: function(set)
|
| - {
|
| - for (var x in set)
|
| - return false;
|
| - return true;
|
| - },
|
| -
|
| - get _hasRetainers()
|
| - {
|
| - return !this.isEmptySet(this.retainers);
|
| - },
|
| -
|
| - get _parent()
|
| - {
|
| - // For top-level nodes, return owning tree as a parent, not data grid.
|
| - return this.parent !== this.dataGrid ? this.parent : this.tree;
|
| - },
|
| -
|
| - _populate: function(event)
|
| - {
|
| - var self = this;
|
| - this.produceDiff(this.baseRetainers, this.retainers, function(baseItem, snapshotItem) {
|
| - self.appendChild(new WebInspector.HeapSnapshotDataGridRetainerNode(self.snapshotView, baseItem, snapshotItem, self.tree));
|
| - });
|
| -
|
| - if (this._parent) {
|
| - var currentComparator = this._parent.lastComparator;
|
| - if (currentComparator)
|
| - this.sort(currentComparator, true);
|
| - }
|
| -
|
| - this.removeEventListener("populate", this._populate, this);
|
| - },
|
| -
|
| - produceDiff: function(baseEntries, currentEntries, callback)
|
| - {
|
| - for (var item in currentEntries)
|
| - callback(baseEntries[item], currentEntries[item]);
|
| -
|
| - for (item in baseEntries) {
|
| - if (!(item in currentEntries))
|
| - callback(baseEntries[item], null);
|
| - }
|
| - },
|
| -
|
| - sort: function(comparator, force) {
|
| - if (!force && this.lastComparator === comparator)
|
| - return;
|
| -
|
| - this.children.sort(comparator);
|
| - var childCount = this.children.length;
|
| - for (var childIndex = 0; childIndex < childCount; ++childIndex)
|
| - this.children[childIndex]._recalculateSiblings(childIndex);
|
| - for (var i = 0; i < this.children.length; ++i) {
|
| - var child = this.children[i];
|
| - if (!force && (!child.expanded || child.lastComparator === comparator))
|
| - continue;
|
| - child.sort(comparator, force);
|
| - }
|
| - this.lastComparator = comparator;
|
| - },
|
| -
|
| - signForDelta: function(delta) {
|
| - if (delta == 0)
|
| - return "";
|
| - if (delta > 0)
|
| - return "+";
|
| - else
|
| - // Math minus sign, same width as plus.
|
| - return "\u2212";
|
| - },
|
| -
|
| - showDeltaAsPercent: function(value) {
|
| - if (value === Number.POSITIVE_INFINITY)
|
| - return WebInspector.UIString("new");
|
| - else if (value === Number.NEGATIVE_INFINITY)
|
| - return WebInspector.UIString("deleted");
|
| - if (value > 1000.0)
|
| - return WebInspector.UIString("%s >1000%%", this.signForDelta(value));
|
| - return WebInspector.UIString("%s%.2f%%", this.signForDelta(value), Math.abs(value));
|
| - },
|
| -
|
| - getTotalCount: function() {
|
| - if (!this._count) {
|
| - this._count = 0;
|
| - for (var i = 0, n = this.children.length; i < n; ++i) {
|
| - this._count += this.children[i].count;
|
| - }
|
| - }
|
| - return this._count;
|
| - },
|
| -
|
| - getTotalSize: function() {
|
| - if (!this._size) {
|
| - this._size = 0;
|
| - for (var i = 0, n = this.children.length; i < n; ++i) {
|
| - this._size += this.children[i].size;
|
| - }
|
| - }
|
| - return this._size;
|
| - },
|
| -
|
| - get countPercent()
|
| - {
|
| - return this.count / this._parent.getTotalCount() * 100.0;
|
| - },
|
| -
|
| - get sizePercent()
|
| - {
|
| - return this.size / this._parent.getTotalSize() * 100.0;
|
| - },
|
| -
|
| - get countDeltaPercent()
|
| - {
|
| - if (this.baseCount > 0) {
|
| - if (this.count > 0)
|
| - return this.countDelta / this.baseCount * 100.0;
|
| - else
|
| - return Number.NEGATIVE_INFINITY;
|
| - } else
|
| - return Number.POSITIVE_INFINITY;
|
| - },
|
| -
|
| - get sizeDeltaPercent()
|
| - {
|
| - if (this.baseSize > 0) {
|
| - if (this.size > 0)
|
| - return this.sizeDelta / this.baseSize * 100.0;
|
| - else
|
| - return Number.NEGATIVE_INFINITY;
|
| - } else
|
| - return Number.POSITIVE_INFINITY;
|
| - },
|
| -
|
| - getData: function(showSize)
|
| - {
|
| - var data = {};
|
| -
|
| - data["cons"] = this.constructorName;
|
| -
|
| - if (this.snapshotView.showCountAsPercent)
|
| - data["count"] = WebInspector.UIString("%.2f%%", this.countPercent);
|
| - else
|
| - data["count"] = this.count;
|
| -
|
| - if (showSize) {
|
| - if (this.snapshotView.showSizeAsPercent)
|
| - data["size"] = WebInspector.UIString("%.2f%%", this.sizePercent);
|
| - else
|
| - data["size"] = Number.bytesToString(this.size);
|
| - } else {
|
| - data["size"] = "";
|
| - }
|
| -
|
| - if (this.snapshotView.showCountDeltaAsPercent)
|
| - data["countDelta"] = this.showDeltaAsPercent(this.countDeltaPercent);
|
| - else
|
| - data["countDelta"] = WebInspector.UIString("%s%d", this.signForDelta(this.countDelta), Math.abs(this.countDelta));
|
| -
|
| - if (showSize) {
|
| - if (this.snapshotView.showSizeDeltaAsPercent)
|
| - data["sizeDelta"] = this.showDeltaAsPercent(this.sizeDeltaPercent);
|
| - else
|
| - data["sizeDelta"] = WebInspector.UIString("%s%s", this.signForDelta(this.sizeDelta), Number.bytesToString(Math.abs(this.sizeDelta)));
|
| - } else {
|
| - data["sizeDelta"] = "";
|
| - }
|
| -
|
| - return data;
|
| - }
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.__proto__ = WebInspector.DataGridNode.prototype;
|
| -
|
| -WebInspector.HeapSnapshotDataGridNode = function(snapshotView, baseEntry, snapshotEntry, owningTree)
|
| -{
|
| - this.snapshotView = snapshotView;
|
| -
|
| - if (!snapshotEntry)
|
| - snapshotEntry = { cons: baseEntry.cons, count: 0, size: 0, retainers: {} };
|
| - this.constructorName = snapshotEntry.cons;
|
| - this.count = snapshotEntry.count;
|
| - this.size = snapshotEntry.size;
|
| - this.retainers = snapshotEntry.retainers;
|
| -
|
| - if (!baseEntry)
|
| - baseEntry = { count: 0, size: 0, retainers: {} };
|
| - this.baseCount = baseEntry.count;
|
| - this.countDelta = this.count - this.baseCount;
|
| - this.baseSize = baseEntry.size;
|
| - this.sizeDelta = this.size - this.baseSize;
|
| - this.baseRetainers = baseEntry.retainers;
|
| -
|
| - WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree);
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotDataGridNode.prototype = {
|
| - get data()
|
| - {
|
| - return this.getData(true);
|
| - }
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotDataGridNode.prototype.__proto__ = WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype;
|
| -
|
| -WebInspector.HeapSnapshotDataGridList = function(snapshotView, baseEntries, snapshotEntries)
|
| -{
|
| - this.tree = this;
|
| - this.snapshotView = snapshotView;
|
| - this.children = [];
|
| - this.lastComparator = null;
|
| - this.populateChildren(baseEntries, snapshotEntries);
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotDataGridList.prototype = {
|
| - appendChild: function(child)
|
| - {
|
| - this.insertChild(child, this.children.length);
|
| - },
|
| -
|
| - insertChild: function(child, index)
|
| - {
|
| - this.children.splice(index, 0, child);
|
| - },
|
| -
|
| - removeChildren: function()
|
| - {
|
| - this.children = [];
|
| - },
|
| -
|
| - populateChildren: function(baseEntries, snapshotEntries)
|
| - {
|
| - var self = this;
|
| - this.produceDiff(baseEntries, snapshotEntries, function(baseItem, snapshotItem) {
|
| - self.appendChild(new WebInspector.HeapSnapshotDataGridNode(self.snapshotView, baseItem, snapshotItem, self));
|
| - });
|
| - },
|
| -
|
| - produceDiff: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.produceDiff,
|
| - sort: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.sort,
|
| - getTotalCount: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.getTotalCount,
|
| - getTotalSize: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.getTotalSize
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotDataGridList.propertyComparators = [{}, {}];
|
| -
|
| -WebInspector.HeapSnapshotDataGridList.propertyComparator = function(property, isAscending)
|
| -{
|
| - var comparator = this.propertyComparators[(isAscending ? 1 : 0)][property];
|
| - if (!comparator) {
|
| - comparator = function(lhs, rhs) {
|
| - var l = lhs[property], r = rhs[property];
|
| - var result = l < r ? -1 : (l > r ? 1 : 0);
|
| - return isAscending ? result : -result;
|
| - };
|
| - this.propertyComparators[(isAscending ? 1 : 0)][property] = comparator;
|
| - }
|
| - return comparator;
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotDataGridRetainerNode = function(snapshotView, baseEntry, snapshotEntry, owningTree)
|
| -{
|
| - this.snapshotView = snapshotView;
|
| -
|
| - if (!snapshotEntry)
|
| - snapshotEntry = { cons: baseEntry.cons, count: 0, clusters: {} };
|
| - this.constructorName = snapshotEntry.cons;
|
| - this.count = snapshotEntry.count;
|
| - this.retainers = this._calculateRetainers(this.snapshotView.profile, snapshotEntry.clusters);
|
| -
|
| - if (!baseEntry)
|
| - baseEntry = { count: 0, clusters: {} };
|
| - this.baseCount = baseEntry.count;
|
| - this.countDelta = this.count - this.baseCount;
|
| - this.baseRetainers = this._calculateRetainers(this.snapshotView.baseSnapshot, baseEntry.clusters);
|
| -
|
| - this.size = this.count; // This way, when sorting by sizes entries will be sorted by references count.
|
| -
|
| - WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree);
|
| -}
|
| -
|
| -WebInspector.HeapSnapshotDataGridRetainerNode.prototype = {
|
| - get data()
|
| - {
|
| - return this.getData(false);
|
| - },
|
| -
|
| - _calculateRetainers: function(snapshot, clusters) {
|
| - var retainers = {};
|
| - if (this.isEmptySet(clusters)) {
|
| - if (this.constructorName in snapshot.entries)
|
| - return snapshot.entries[this.constructorName].retainers;
|
| - } else {
|
| - // In case when an entry is retained by clusters, we need to gather up the list
|
| - // of retainers by merging retainers of every cluster.
|
| - // E.g. having such a tree:
|
| - // A
|
| - // Object:1 10
|
| - // X 3
|
| - // Y 4
|
| - // Object:2 5
|
| - // X 6
|
| - //
|
| - // will result in a following retainers list: X 9, Y 4.
|
| - for (var clusterName in clusters) {
|
| - if (clusterName in snapshot.clusters) {
|
| - var clusterRetainers = snapshot.clusters[clusterName].retainers;
|
| - for (var clusterRetainer in clusterRetainers) {
|
| - var clusterRetainerEntry = clusterRetainers[clusterRetainer];
|
| - if (!(clusterRetainer in retainers))
|
| - retainers[clusterRetainer] = { cons: clusterRetainerEntry.cons, count: 0, clusters: {} };
|
| - retainers[clusterRetainer].count += clusterRetainerEntry.count;
|
| - for (var clusterRetainerCluster in clusterRetainerEntry.clusters)
|
| - retainers[clusterRetainer].clusters[clusterRetainerCluster] = true;
|
| - }
|
| - }
|
| - }
|
| - }
|
| - return retainers;
|
| - }
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotDataGridRetainerNode.prototype.__proto__ = WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype;
|
| -
|
| -
|
| -WebInspector.HeapSnapshotProfileType = function()
|
| -{
|
| - WebInspector.ProfileType.call(this, WebInspector.HeapSnapshotProfileType.TypeId, WebInspector.UIString("HEAP SNAPSHOTS"));
|
| -}
|
| -
|
| -WebInspector.HeapSnapshotProfileType.TypeId = "HEAP";
|
| -
|
| -WebInspector.HeapSnapshotProfileType.snapshots = [];
|
| -
|
| -WebInspector.HeapSnapshotProfileType.prototype = {
|
| - get buttonTooltip()
|
| - {
|
| - return WebInspector.UIString("Take heap snapshot.");
|
| - },
|
| -
|
| - get buttonStyle()
|
| - {
|
| - return "heap-snapshot-status-bar-item status-bar-item";
|
| - },
|
| -
|
| - buttonClicked: function()
|
| - {
|
| - InspectorController.takeHeapSnapshot();
|
| - },
|
| -
|
| - createSidebarTreeElementForProfile: function(profile)
|
| - {
|
| - var element = new WebInspector.HeapSnapshotSidebarTreeElement(profile);
|
| - element.small = false;
|
| - return element;
|
| - },
|
| -
|
| - createView: function(profile)
|
| - {
|
| - return new WebInspector.HeapSnapshotView(WebInspector.panels.profiles, profile);
|
| - }
|
| -}
|
| -
|
| -WebInspector.HeapSnapshotProfileType.prototype.__proto__ = WebInspector.ProfileType.prototype;
|
| -
|
| -
|
| -(function() {
|
| - var originalCreatePanels = WebInspector._createPanels;
|
| - WebInspector._createPanels = function() {
|
| - originalCreatePanels.apply(this, arguments);
|
| - if (WebInspector.panels.profiles)
|
| - WebInspector.panels.profiles.registerProfileType(new WebInspector.HeapSnapshotProfileType());
|
| - }
|
| -})();
|
|
|