| Index: third_party/WebKit/Source/devtools/front_end/profiler/HeapSnapshotGridNodes.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/HeapSnapshotGridNodes.js b/third_party/WebKit/Source/devtools/front_end/profiler/HeapSnapshotGridNodes.js
|
| index 48e34a949aa2c2bed6e50664ef64a424a49fc456..1a4560158da6066699198121c5e99bb258bfd557 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/profiler/HeapSnapshotGridNodes.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/profiler/HeapSnapshotGridNodes.js
|
| @@ -27,16 +27,16 @@
|
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| */
|
| -
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.DataGridNode}
|
| - * @param {!WebInspector.HeapSnapshotSortableDataGrid} tree
|
| - * @param {boolean} hasChildren
|
| + * @unrestricted
|
| */
|
| -WebInspector.HeapSnapshotGridNode = function(tree, hasChildren)
|
| -{
|
| - WebInspector.DataGridNode.call(this, null, hasChildren);
|
| +WebInspector.HeapSnapshotGridNode = class extends WebInspector.DataGridNode {
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotSortableDataGrid} tree
|
| + * @param {boolean} hasChildren
|
| + */
|
| + constructor(tree, hasChildren) {
|
| + super(null, hasChildren);
|
| this._dataGrid = tree;
|
| this._instanceCount = 0;
|
|
|
| @@ -48,461 +48,440 @@ WebInspector.HeapSnapshotGridNode = function(tree, hasChildren)
|
| this._retrievedChildrenRanges = [];
|
|
|
| /**
|
| - * @type {?WebInspector.HeapSnapshotGridNode.ChildrenProvider}
|
| - */
|
| - this._providerObject = null;
|
| -};
|
| -
|
| -/** @enum {symbol} */
|
| -WebInspector.HeapSnapshotGridNode.Events = {
|
| - PopulateComplete: Symbol("PopulateComplete")
|
| -};
|
| -
|
| -/**
|
| - * @param {!Array.<string>} fieldNames
|
| - * @return {!WebInspector.HeapSnapshotCommon.ComparatorConfig}
|
| - */
|
| -WebInspector.HeapSnapshotGridNode.createComparator = function(fieldNames)
|
| -{
|
| - return /** @type {!WebInspector.HeapSnapshotCommon.ComparatorConfig} */ ({fieldName1: fieldNames[0], ascending1: fieldNames[1], fieldName2: fieldNames[2], ascending2: fieldNames[3]});
|
| -};
|
| -
|
| -
|
| -/**
|
| - * @interface
|
| - */
|
| -WebInspector.HeapSnapshotGridNode.ChildrenProvider = function() { };
|
| -
|
| -WebInspector.HeapSnapshotGridNode.ChildrenProvider.prototype = {
|
| - dispose: function() { },
|
| -
|
| - /**
|
| - * @param {number} snapshotObjectId
|
| - * @return {!Promise<number>}
|
| - */
|
| - nodePosition: function(snapshotObjectId) { },
|
| -
|
| - /**
|
| - * @param {function(boolean)} callback
|
| - */
|
| - isEmpty: function(callback) { },
|
| -
|
| - /**
|
| - * @param {number} startPosition
|
| - * @param {number} endPosition
|
| - * @param {function(!WebInspector.HeapSnapshotCommon.ItemsRange)} callback
|
| + * @type {?WebInspector.HeapSnapshotGridNode.ChildrenProvider}
|
| */
|
| - serializeItemsRange: function(startPosition, endPosition, callback) { },
|
| -
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotCommon.ComparatorConfig} comparator
|
| - * @return {!Promise<?>}
|
| - */
|
| - sortAndRewind: function(comparator) { }
|
| -};
|
| -
|
| + this._providerObject = null;
|
| + this._reachableFromWindow = false;
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array.<string>} fieldNames
|
| + * @return {!WebInspector.HeapSnapshotCommon.ComparatorConfig}
|
| + */
|
| + static createComparator(fieldNames) {
|
| + return /** @type {!WebInspector.HeapSnapshotCommon.ComparatorConfig} */ (
|
| + {fieldName1: fieldNames[0], ascending1: fieldNames[1], fieldName2: fieldNames[2], ascending2: fieldNames[3]});
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.HeapSnapshotSortableDataGrid}
|
| + */
|
| + heapSnapshotDataGrid() {
|
| + return this._dataGrid;
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.HeapSnapshotGridNode.ChildrenProvider}
|
| + */
|
| + createProvider() {
|
| + throw new Error('Not implemented.');
|
| + }
|
| +
|
| + /**
|
| + * @return {?{snapshot:!WebInspector.HeapSnapshotProxy, snapshotNodeIndex:number}}
|
| + */
|
| + retainersDataSource() {
|
| + return null;
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.HeapSnapshotGridNode.ChildrenProvider}
|
| + */
|
| + _provider() {
|
| + if (!this._providerObject)
|
| + this._providerObject = this.createProvider();
|
| + return this._providerObject;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {string} columnId
|
| + * @return {!Element}
|
| + */
|
| + createCell(columnId) {
|
| + var cell = super.createCell(columnId);
|
| + if (this._searchMatched)
|
| + cell.classList.add('highlight');
|
| + return cell;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + collapse() {
|
| + super.collapse();
|
| + this._dataGrid.updateVisibleNodes(true);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + expand() {
|
| + super.expand();
|
| + this._dataGrid.updateVisibleNodes(true);
|
| + }
|
| +
|
| + dispose() {
|
| + if (this._providerObject)
|
| + this._providerObject.dispose();
|
| + for (var node = this.children[0]; node; node = node.traverseNextNode(true, this, true))
|
| + if (node.dispose)
|
| + node.dispose();
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.Target} target
|
| + * @param {function(!WebInspector.RemoteObject)} callback
|
| + * @param {string} objectGroupName
|
| + */
|
| + queryObjectContent(target, callback, objectGroupName) {
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + wasDetached() {
|
| + this._dataGrid.nodeWasDetached(this);
|
| + }
|
| +
|
| + /**
|
| + * @param {number} num
|
| + * @return {string}
|
| + */
|
| + _toPercentString(num) {
|
| + return num.toFixed(0) + '\u2009%'; // \u2009 is a thin space.
|
| + }
|
| +
|
| + /**
|
| + * @param {number} distance
|
| + * @return {string}
|
| + */
|
| + _toUIDistance(distance) {
|
| + var baseSystemDistance = WebInspector.HeapSnapshotCommon.baseSystemDistance;
|
| + return distance >= 0 && distance < baseSystemDistance ? WebInspector.UIString('%d', distance) :
|
| + WebInspector.UIString('\u2212');
|
| + }
|
| +
|
| + /**
|
| + * @return {!Array.<!WebInspector.DataGridNode>}
|
| + */
|
| + allChildren() {
|
| + return this._dataGrid.allChildren(this);
|
| + }
|
| +
|
| + /**
|
| + * @param {number} index
|
| + */
|
| + removeChildByIndex(index) {
|
| + this._dataGrid.removeChildByIndex(this, index);
|
| + }
|
| +
|
| + /**
|
| + * @param {number} nodePosition
|
| + * @return {?WebInspector.DataGridNode}
|
| + */
|
| + childForPosition(nodePosition) {
|
| + var indexOfFirstChildInRange = 0;
|
| + for (var i = 0; i < this._retrievedChildrenRanges.length; i++) {
|
| + var range = this._retrievedChildrenRanges[i];
|
| + if (range.from <= nodePosition && nodePosition < range.to) {
|
| + var childIndex = indexOfFirstChildInRange + nodePosition - range.from;
|
| + return this.allChildren()[childIndex];
|
| + }
|
| + indexOfFirstChildInRange += range.to - range.from + 1;
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} columnId
|
| + * @return {!Element}
|
| + */
|
| + _createValueCell(columnId) {
|
| + var cell = createElement('td');
|
| + cell.className = 'numeric-column';
|
| + if (this.dataGrid.snapshot.totalSize !== 0) {
|
| + var div = createElement('div');
|
| + var valueSpan = createElement('span');
|
| + valueSpan.textContent = this.data[columnId];
|
| + div.appendChild(valueSpan);
|
| + var percentColumn = columnId + '-percent';
|
| + if (percentColumn in this.data) {
|
| + var percentSpan = createElement('span');
|
| + percentSpan.className = 'percent-column';
|
| + percentSpan.textContent = this.data[percentColumn];
|
| + div.appendChild(percentSpan);
|
| + div.classList.add('profile-multiple-values');
|
| + }
|
| + cell.appendChild(div);
|
| + }
|
| + return cell;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + populate() {
|
| + if (this._populated)
|
| + return;
|
| + this._populated = true;
|
| + this._provider().sortAndRewind(this.comparator()).then(this._populateChildren.bind(this));
|
| + }
|
| +
|
| + /**
|
| + * @return {!Promise<?>}
|
| + */
|
| + expandWithoutPopulate() {
|
| + // Make sure default populate won't take action.
|
| + this._populated = true;
|
| + this.expand();
|
| + return this._provider().sortAndRewind(this.comparator());
|
| + }
|
| +
|
| + /**
|
| + * @param {?number=} fromPosition
|
| + * @param {?number=} toPosition
|
| + * @param {function()=} afterPopulate
|
| + */
|
| + _populateChildren(fromPosition, toPosition, afterPopulate) {
|
| + fromPosition = fromPosition || 0;
|
| + toPosition = toPosition || fromPosition + this._dataGrid.defaultPopulateCount();
|
| + var firstNotSerializedPosition = fromPosition;
|
| +
|
| + /**
|
| + * @this {WebInspector.HeapSnapshotGridNode}
|
| + */
|
| + function serializeNextChunk() {
|
| + if (firstNotSerializedPosition >= toPosition)
|
| + return;
|
| + var end = Math.min(firstNotSerializedPosition + this._dataGrid.defaultPopulateCount(), toPosition);
|
| + this._provider().serializeItemsRange(firstNotSerializedPosition, end, childrenRetrieved.bind(this));
|
| + firstNotSerializedPosition = end;
|
| + }
|
|
|
| -WebInspector.HeapSnapshotGridNode.prototype = {
|
| /**
|
| - * @return {!WebInspector.HeapSnapshotSortableDataGrid}
|
| + * @this {WebInspector.HeapSnapshotGridNode}
|
| */
|
| - heapSnapshotDataGrid: function()
|
| - {
|
| - return this._dataGrid;
|
| - },
|
| + function insertRetrievedChild(item, insertionIndex) {
|
| + if (this._savedChildren) {
|
| + var hash = this._childHashForEntity(item);
|
| + if (hash in this._savedChildren) {
|
| + this._dataGrid.insertChild(this, this._savedChildren[hash], insertionIndex);
|
| + return;
|
| + }
|
| + }
|
| + this._dataGrid.insertChild(this, this._createChildNode(item), insertionIndex);
|
| + }
|
|
|
| /**
|
| - * @return {!WebInspector.HeapSnapshotGridNode.ChildrenProvider}
|
| + * @this {WebInspector.HeapSnapshotGridNode}
|
| */
|
| - createProvider: function()
|
| - {
|
| - throw new Error("Not implemented.");
|
| - },
|
| + function insertShowMoreButton(from, to, insertionIndex) {
|
| + var button = new WebInspector.ShowMoreDataGridNode(
|
| + this._populateChildren.bind(this), from, to, this._dataGrid.defaultPopulateCount());
|
| + this._dataGrid.insertChild(this, button, insertionIndex);
|
| + }
|
|
|
| /**
|
| - * @return {?{snapshot:!WebInspector.HeapSnapshotProxy, snapshotNodeIndex:number}}
|
| + * @param {!WebInspector.HeapSnapshotCommon.ItemsRange} itemsRange
|
| + * @this {WebInspector.HeapSnapshotGridNode}
|
| */
|
| - retainersDataSource: function()
|
| - {
|
| - return null;
|
| - },
|
| + function childrenRetrieved(itemsRange) {
|
| + var itemIndex = 0;
|
| + var itemPosition = itemsRange.startPosition;
|
| + var items = itemsRange.items;
|
| + var insertionIndex = 0;
|
|
|
| - /**
|
| - * @return {!WebInspector.HeapSnapshotGridNode.ChildrenProvider}
|
| - */
|
| - _provider: function()
|
| - {
|
| - if (!this._providerObject)
|
| - this._providerObject = this.createProvider();
|
| - return this._providerObject;
|
| - },
|
| + if (!this._retrievedChildrenRanges.length) {
|
| + if (itemsRange.startPosition > 0) {
|
| + this._retrievedChildrenRanges.push({from: 0, to: 0});
|
| + insertShowMoreButton.call(this, 0, itemsRange.startPosition, insertionIndex++);
|
| + }
|
| + this._retrievedChildrenRanges.push({from: itemsRange.startPosition, to: itemsRange.endPosition});
|
| + for (var i = 0, l = items.length; i < l; ++i)
|
| + insertRetrievedChild.call(this, items[i], insertionIndex++);
|
| + if (itemsRange.endPosition < itemsRange.totalLength)
|
| + insertShowMoreButton.call(this, itemsRange.endPosition, itemsRange.totalLength, insertionIndex++);
|
| + } else {
|
| + var rangeIndex = 0;
|
| + var found = false;
|
| + var range;
|
| + while (rangeIndex < this._retrievedChildrenRanges.length) {
|
| + range = this._retrievedChildrenRanges[rangeIndex];
|
| + if (range.to >= itemPosition) {
|
| + found = true;
|
| + break;
|
| + }
|
| + insertionIndex += range.to - range.from;
|
| + // Skip the button if there is one.
|
| + if (range.to < itemsRange.totalLength)
|
| + insertionIndex += 1;
|
| + ++rangeIndex;
|
| + }
|
|
|
| - /**
|
| - * @override
|
| - * @param {string} columnId
|
| - * @return {!Element}
|
| - */
|
| - createCell: function(columnId)
|
| - {
|
| - var cell = WebInspector.DataGridNode.prototype.createCell.call(this, columnId);
|
| - if (this._searchMatched)
|
| - cell.classList.add("highlight");
|
| - return cell;
|
| - },
|
| + if (!found || itemsRange.startPosition < range.from) {
|
| + // Update previous button.
|
| + this.allChildren()[insertionIndex - 1].setEndPosition(itemsRange.startPosition);
|
| + insertShowMoreButton.call(
|
| + this, itemsRange.startPosition, found ? range.from : itemsRange.totalLength, insertionIndex);
|
| + range = {from: itemsRange.startPosition, to: itemsRange.startPosition};
|
| + if (!found)
|
| + rangeIndex = this._retrievedChildrenRanges.length;
|
| + this._retrievedChildrenRanges.splice(rangeIndex, 0, range);
|
| + } else {
|
| + insertionIndex += itemPosition - range.from;
|
| + }
|
| + // At this point insertionIndex is always an index before button or between nodes.
|
| + // Also it is always true here that range.from <= itemPosition <= range.to
|
| +
|
| + // Stretch the range right bound to include all new items.
|
| + while (range.to < itemsRange.endPosition) {
|
| + // Skip already added nodes.
|
| + var skipCount = range.to - itemPosition;
|
| + insertionIndex += skipCount;
|
| + itemIndex += skipCount;
|
| + itemPosition = range.to;
|
| +
|
| + // We're at the position before button: ...<?node>x<button>
|
| + var nextRange = this._retrievedChildrenRanges[rangeIndex + 1];
|
| + var newEndOfRange = nextRange ? nextRange.from : itemsRange.totalLength;
|
| + if (newEndOfRange > itemsRange.endPosition)
|
| + newEndOfRange = itemsRange.endPosition;
|
| + while (itemPosition < newEndOfRange) {
|
| + insertRetrievedChild.call(this, items[itemIndex++], insertionIndex++);
|
| + ++itemPosition;
|
| + }
|
| +
|
| + // Merge with the next range.
|
| + if (nextRange && newEndOfRange === nextRange.from) {
|
| + range.to = nextRange.to;
|
| + // Remove "show next" button if there is one.
|
| + this.removeChildByIndex(insertionIndex);
|
| + this._retrievedChildrenRanges.splice(rangeIndex + 1, 1);
|
| + } else {
|
| + range.to = newEndOfRange;
|
| + // Remove or update next button.
|
| + if (newEndOfRange === itemsRange.totalLength)
|
| + this.removeChildByIndex(insertionIndex);
|
| + else
|
| + this.allChildren()[insertionIndex].setStartPosition(itemsRange.endPosition);
|
| + }
|
| + }
|
| + }
|
|
|
| - /**
|
| - * @override
|
| - */
|
| - collapse: function()
|
| - {
|
| - WebInspector.DataGridNode.prototype.collapse.call(this);
|
| - this._dataGrid.updateVisibleNodes(true);
|
| - },
|
| + // TODO: fix this.
|
| + this._instanceCount += items.length;
|
| + if (firstNotSerializedPosition < toPosition) {
|
| + serializeNextChunk.call(this);
|
| + return;
|
| + }
|
|
|
| - /**
|
| - * @override
|
| - */
|
| - expand: function()
|
| - {
|
| - WebInspector.DataGridNode.prototype.expand.call(this);
|
| + if (this.expanded)
|
| this._dataGrid.updateVisibleNodes(true);
|
| - },
|
| -
|
| - dispose: function()
|
| - {
|
| - if (this._providerObject)
|
| - this._providerObject.dispose();
|
| - for (var node = this.children[0]; node; node = node.traverseNextNode(true, this, true))
|
| - if (node.dispose)
|
| - node.dispose();
|
| - },
|
| -
|
| - _reachableFromWindow: false,
|
| -
|
| - queryObjectContent: function(callback)
|
| - {
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - wasDetached: function()
|
| - {
|
| - this._dataGrid.nodeWasDetached(this);
|
| - },
|
| -
|
| - /**
|
| - * @param {number} num
|
| - * @return {string}
|
| - */
|
| - _toPercentString: function(num)
|
| - {
|
| - return num.toFixed(0) + "\u2009%"; // \u2009 is a thin space.
|
| - },
|
| -
|
| - /**
|
| - * @param {number} distance
|
| - * @return {string}
|
| - */
|
| - _toUIDistance: function(distance)
|
| - {
|
| - var baseSystemDistance = WebInspector.HeapSnapshotCommon.baseSystemDistance;
|
| - return distance >= 0 && distance < baseSystemDistance ? WebInspector.UIString("%d", distance) : WebInspector.UIString("\u2212");
|
| - },
|
| -
|
| - /**
|
| - * @return {!Array.<!WebInspector.DataGridNode>}
|
| - */
|
| - allChildren: function()
|
| - {
|
| - return this._dataGrid.allChildren(this);
|
| - },
|
| -
|
| - /**
|
| - * @param {number} index
|
| - */
|
| - removeChildByIndex: function(index)
|
| - {
|
| - this._dataGrid.removeChildByIndex(this, index);
|
| - },
|
| -
|
| - /**
|
| - * @param {number} nodePosition
|
| - * @return {?WebInspector.DataGridNode}
|
| - */
|
| - childForPosition: function(nodePosition)
|
| - {
|
| - var indexOfFirstChildInRange = 0;
|
| - for (var i = 0; i < this._retrievedChildrenRanges.length; i++) {
|
| - var range = this._retrievedChildrenRanges[i];
|
| - if (range.from <= nodePosition && nodePosition < range.to) {
|
| - var childIndex = indexOfFirstChildInRange + nodePosition - range.from;
|
| - return this.allChildren()[childIndex];
|
| - }
|
| - indexOfFirstChildInRange += range.to - range.from + 1;
|
| - }
|
| - return null;
|
| - },
|
| -
|
| - /**
|
| - * @param {string} columnId
|
| - * @return {!Element}
|
| - */
|
| - _createValueCell: function(columnId)
|
| - {
|
| - var cell = createElement("td");
|
| - cell.className = "numeric-column";
|
| - if (this.dataGrid.snapshot.totalSize !== 0) {
|
| - var div = createElement("div");
|
| - var valueSpan = createElement("span");
|
| - valueSpan.textContent = this.data[columnId];
|
| - div.appendChild(valueSpan);
|
| - var percentColumn = columnId + "-percent";
|
| - if (percentColumn in this.data) {
|
| - var percentSpan = createElement("span");
|
| - percentSpan.className = "percent-column";
|
| - percentSpan.textContent = this.data[percentColumn];
|
| - div.appendChild(percentSpan);
|
| - div.classList.add("profile-multiple-values");
|
| - }
|
| - cell.appendChild(div);
|
| - }
|
| - return cell;
|
| - },
|
| + if (afterPopulate)
|
| + afterPopulate();
|
| + this.dispatchEventToListeners(WebInspector.HeapSnapshotGridNode.Events.PopulateComplete);
|
| + }
|
| + serializeNextChunk.call(this);
|
| + }
|
|
|
| - populate: function(event)
|
| - {
|
| - if (this._populated)
|
| - return;
|
| - this._populated = true;
|
| - this._provider().sortAndRewind(this.comparator()).then(this._populateChildren.bind(this));
|
| - },
|
| + _saveChildren() {
|
| + this._savedChildren = null;
|
| + var children = this.allChildren();
|
| + for (var i = 0, l = children.length; i < l; ++i) {
|
| + var child = children[i];
|
| + if (!child.expanded)
|
| + continue;
|
| + if (!this._savedChildren)
|
| + this._savedChildren = {};
|
| + this._savedChildren[this._childHashForNode(child)] = child;
|
| + }
|
| + }
|
|
|
| - /**
|
| - * @return {!Promise<?>}
|
| - */
|
| - expandWithoutPopulate: function()
|
| - {
|
| - // Make sure default populate won't take action.
|
| - this._populated = true;
|
| - this.expand();
|
| - return this._provider().sortAndRewind(this.comparator());
|
| - },
|
| + sort() {
|
| + this._dataGrid.recursiveSortingEnter();
|
|
|
| /**
|
| - * @param {?number=} fromPosition
|
| - * @param {?number=} toPosition
|
| - * @param {function()=} afterPopulate
|
| + * @this {WebInspector.HeapSnapshotGridNode}
|
| */
|
| - _populateChildren: function(fromPosition, toPosition, afterPopulate)
|
| - {
|
| - fromPosition = fromPosition || 0;
|
| - toPosition = toPosition || fromPosition + this._dataGrid.defaultPopulateCount();
|
| - var firstNotSerializedPosition = fromPosition;
|
| -
|
| - /**
|
| - * @this {WebInspector.HeapSnapshotGridNode}
|
| - */
|
| - function serializeNextChunk()
|
| - {
|
| - if (firstNotSerializedPosition >= toPosition)
|
| - return;
|
| - var end = Math.min(firstNotSerializedPosition + this._dataGrid.defaultPopulateCount(), toPosition);
|
| - this._provider().serializeItemsRange(firstNotSerializedPosition, end, childrenRetrieved.bind(this));
|
| - firstNotSerializedPosition = end;
|
| - }
|
| -
|
| - /**
|
| - * @this {WebInspector.HeapSnapshotGridNode}
|
| - */
|
| - function insertRetrievedChild(item, insertionIndex)
|
| - {
|
| - if (this._savedChildren) {
|
| - var hash = this._childHashForEntity(item);
|
| - if (hash in this._savedChildren) {
|
| - this._dataGrid.insertChild(this, this._savedChildren[hash], insertionIndex);
|
| - return;
|
| - }
|
| - }
|
| - this._dataGrid.insertChild(this, this._createChildNode(item), insertionIndex);
|
| - }
|
| -
|
| - /**
|
| - * @this {WebInspector.HeapSnapshotGridNode}
|
| - */
|
| - function insertShowMoreButton(from, to, insertionIndex)
|
| - {
|
| - var button = new WebInspector.ShowMoreDataGridNode(this._populateChildren.bind(this), from, to, this._dataGrid.defaultPopulateCount());
|
| - this._dataGrid.insertChild(this, button, insertionIndex);
|
| - }
|
| -
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotCommon.ItemsRange} itemsRange
|
| - * @this {WebInspector.HeapSnapshotGridNode}
|
| - */
|
| - function childrenRetrieved(itemsRange)
|
| - {
|
| - var itemIndex = 0;
|
| - var itemPosition = itemsRange.startPosition;
|
| - var items = itemsRange.items;
|
| - var insertionIndex = 0;
|
| -
|
| - if (!this._retrievedChildrenRanges.length) {
|
| - if (itemsRange.startPosition > 0) {
|
| - this._retrievedChildrenRanges.push({from: 0, to: 0});
|
| - insertShowMoreButton.call(this, 0, itemsRange.startPosition, insertionIndex++);
|
| - }
|
| - this._retrievedChildrenRanges.push({from: itemsRange.startPosition, to: itemsRange.endPosition});
|
| - for (var i = 0, l = items.length; i < l; ++i)
|
| - insertRetrievedChild.call(this, items[i], insertionIndex++);
|
| - if (itemsRange.endPosition < itemsRange.totalLength)
|
| - insertShowMoreButton.call(this, itemsRange.endPosition, itemsRange.totalLength, insertionIndex++);
|
| - } else {
|
| - var rangeIndex = 0;
|
| - var found = false;
|
| - var range;
|
| - while (rangeIndex < this._retrievedChildrenRanges.length) {
|
| - range = this._retrievedChildrenRanges[rangeIndex];
|
| - if (range.to >= itemPosition) {
|
| - found = true;
|
| - break;
|
| - }
|
| - insertionIndex += range.to - range.from;
|
| - // Skip the button if there is one.
|
| - if (range.to < itemsRange.totalLength)
|
| - insertionIndex += 1;
|
| - ++rangeIndex;
|
| - }
|
| -
|
| - if (!found || itemsRange.startPosition < range.from) {
|
| - // Update previous button.
|
| - this.allChildren()[insertionIndex - 1].setEndPosition(itemsRange.startPosition);
|
| - insertShowMoreButton.call(this, itemsRange.startPosition, found ? range.from : itemsRange.totalLength, insertionIndex);
|
| - range = {from: itemsRange.startPosition, to: itemsRange.startPosition};
|
| - if (!found)
|
| - rangeIndex = this._retrievedChildrenRanges.length;
|
| - this._retrievedChildrenRanges.splice(rangeIndex, 0, range);
|
| - } else {
|
| - insertionIndex += itemPosition - range.from;
|
| - }
|
| - // At this point insertionIndex is always an index before button or between nodes.
|
| - // Also it is always true here that range.from <= itemPosition <= range.to
|
| -
|
| - // Stretch the range right bound to include all new items.
|
| - while (range.to < itemsRange.endPosition) {
|
| - // Skip already added nodes.
|
| - var skipCount = range.to - itemPosition;
|
| - insertionIndex += skipCount;
|
| - itemIndex += skipCount;
|
| - itemPosition = range.to;
|
| -
|
| - // We're at the position before button: ...<?node>x<button>
|
| - var nextRange = this._retrievedChildrenRanges[rangeIndex + 1];
|
| - var newEndOfRange = nextRange ? nextRange.from : itemsRange.totalLength;
|
| - if (newEndOfRange > itemsRange.endPosition)
|
| - newEndOfRange = itemsRange.endPosition;
|
| - while (itemPosition < newEndOfRange) {
|
| - insertRetrievedChild.call(this, items[itemIndex++], insertionIndex++);
|
| - ++itemPosition;
|
| - }
|
| -
|
| - // Merge with the next range.
|
| - if (nextRange && newEndOfRange === nextRange.from) {
|
| - range.to = nextRange.to;
|
| - // Remove "show next" button if there is one.
|
| - this.removeChildByIndex(insertionIndex);
|
| - this._retrievedChildrenRanges.splice(rangeIndex + 1, 1);
|
| - } else {
|
| - range.to = newEndOfRange;
|
| - // Remove or update next button.
|
| - if (newEndOfRange === itemsRange.totalLength)
|
| - this.removeChildByIndex(insertionIndex);
|
| - else
|
| - this.allChildren()[insertionIndex].setStartPosition(itemsRange.endPosition);
|
| - }
|
| - }
|
| - }
|
| -
|
| - // TODO: fix this.
|
| - this._instanceCount += items.length;
|
| - if (firstNotSerializedPosition < toPosition) {
|
| - serializeNextChunk.call(this);
|
| - return;
|
| - }
|
| -
|
| - if (this.expanded)
|
| - this._dataGrid.updateVisibleNodes(true);
|
| - if (afterPopulate)
|
| - afterPopulate();
|
| - this.dispatchEventToListeners(WebInspector.HeapSnapshotGridNode.Events.PopulateComplete);
|
| - }
|
| - serializeNextChunk.call(this);
|
| - },
|
| + function afterSort() {
|
| + this._saveChildren();
|
| + this._dataGrid.removeAllChildren(this);
|
| + this._retrievedChildrenRanges = [];
|
|
|
| - _saveChildren: function()
|
| - {
|
| - this._savedChildren = null;
|
| + /**
|
| + * @this {WebInspector.HeapSnapshotGridNode}
|
| + */
|
| + function afterPopulate() {
|
| var children = this.allChildren();
|
| for (var i = 0, l = children.length; i < l; ++i) {
|
| - var child = children[i];
|
| - if (!child.expanded)
|
| - continue;
|
| - if (!this._savedChildren)
|
| - this._savedChildren = {};
|
| - this._savedChildren[this._childHashForNode(child)] = child;
|
| + var child = children[i];
|
| + if (child.expanded)
|
| + child.sort();
|
| }
|
| - },
|
| + this._dataGrid.recursiveSortingLeave();
|
| + }
|
| + var instanceCount = this._instanceCount;
|
| + this._instanceCount = 0;
|
| + this._populateChildren(0, instanceCount, afterPopulate.bind(this));
|
| + }
|
|
|
| - sort: function()
|
| - {
|
| - this._dataGrid.recursiveSortingEnter();
|
| + this._provider().sortAndRewind(this.comparator()).then(afterSort.bind(this));
|
| + }
|
| +};
|
|
|
| - /**
|
| - * @this {WebInspector.HeapSnapshotGridNode}
|
| - */
|
| - function afterSort()
|
| - {
|
| - this._saveChildren();
|
| - this._dataGrid.removeAllChildren(this);
|
| - this._retrievedChildrenRanges = [];
|
| -
|
| - /**
|
| - * @this {WebInspector.HeapSnapshotGridNode}
|
| - */
|
| - function afterPopulate()
|
| - {
|
| - var children = this.allChildren();
|
| - for (var i = 0, l = children.length; i < l; ++i) {
|
| - var child = children[i];
|
| - if (child.expanded)
|
| - child.sort();
|
| - }
|
| - this._dataGrid.recursiveSortingLeave();
|
| - }
|
| - var instanceCount = this._instanceCount;
|
| - this._instanceCount = 0;
|
| - this._populateChildren(0, instanceCount, afterPopulate.bind(this));
|
| - }
|
| +/** @enum {symbol} */
|
| +WebInspector.HeapSnapshotGridNode.Events = {
|
| + PopulateComplete: Symbol('PopulateComplete')
|
| +};
|
|
|
| - this._provider().sortAndRewind(this.comparator()).then(afterSort.bind(this));
|
| - },
|
|
|
| - __proto__: WebInspector.DataGridNode.prototype
|
| -};
|
| +/**
|
| + * @interface
|
| + */
|
| +WebInspector.HeapSnapshotGridNode.ChildrenProvider = function() {};
|
|
|
| +WebInspector.HeapSnapshotGridNode.ChildrenProvider.prototype = {
|
| + dispose: function() {},
|
| +
|
| + /**
|
| + * @param {number} snapshotObjectId
|
| + * @return {!Promise<number>}
|
| + */
|
| + nodePosition: function(snapshotObjectId) {},
|
| +
|
| + /**
|
| + * @param {function(boolean)} callback
|
| + */
|
| + isEmpty: function(callback) {},
|
| +
|
| + /**
|
| + * @param {number} startPosition
|
| + * @param {number} endPosition
|
| + * @param {function(!WebInspector.HeapSnapshotCommon.ItemsRange)} callback
|
| + */
|
| + serializeItemsRange: function(startPosition, endPosition, callback) {},
|
| +
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotCommon.ComparatorConfig} comparator
|
| + * @return {!Promise<?>}
|
| + */
|
| + sortAndRewind: function(comparator) {}
|
| +};
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.HeapSnapshotGridNode}
|
| - * @param {!WebInspector.HeapSnapshotSortableDataGrid} dataGrid
|
| - * @param {!WebInspector.HeapSnapshotCommon.Node} node
|
| + * @unrestricted
|
| */
|
| -WebInspector.HeapSnapshotGenericObjectNode = function(dataGrid, node)
|
| -{
|
| - WebInspector.HeapSnapshotGridNode.call(this, dataGrid, false);
|
| +WebInspector.HeapSnapshotGenericObjectNode = class extends WebInspector.HeapSnapshotGridNode {
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotSortableDataGrid} dataGrid
|
| + * @param {!WebInspector.HeapSnapshotCommon.Node} node
|
| + */
|
| + constructor(dataGrid, node) {
|
| + super(dataGrid, false);
|
| // node is null for DataGrid root nodes.
|
| if (!node)
|
| - return;
|
| + return;
|
| this._name = node.name;
|
| this._type = node.type;
|
| this._distance = node.distance;
|
| @@ -510,193 +489,183 @@ WebInspector.HeapSnapshotGenericObjectNode = function(dataGrid, node)
|
| this._retainedSize = node.retainedSize;
|
| this.snapshotNodeId = node.id;
|
| this.snapshotNodeIndex = node.nodeIndex;
|
| - if (this._type === "string")
|
| - this._reachableFromWindow = true;
|
| - else if (this._type === "object" && this._name.startsWith("Window")) {
|
| - this._name = this.shortenWindowURL(this._name, false);
|
| - this._reachableFromWindow = true;
|
| + if (this._type === 'string')
|
| + this._reachableFromWindow = true;
|
| + else if (this._type === 'object' && this._name.startsWith('Window')) {
|
| + this._name = this.shortenWindowURL(this._name, false);
|
| + this._reachableFromWindow = true;
|
| } else if (node.canBeQueried)
|
| - this._reachableFromWindow = true;
|
| + this._reachableFromWindow = true;
|
| if (node.detachedDOMTreeNode)
|
| - this.detachedDOMTreeNode = true;
|
| + this.detachedDOMTreeNode = true;
|
|
|
| var snapshot = dataGrid.snapshot;
|
| var shallowSizePercent = this._shallowSize / snapshot.totalSize * 100.0;
|
| var retainedSizePercent = this._retainedSize / snapshot.totalSize * 100.0;
|
| this.data = {
|
| - "distance": this._toUIDistance(this._distance),
|
| - "shallowSize": Number.withThousandsSeparator(this._shallowSize),
|
| - "retainedSize": Number.withThousandsSeparator(this._retainedSize),
|
| - "shallowSize-percent": this._toPercentString(shallowSizePercent),
|
| - "retainedSize-percent": this._toPercentString(retainedSizePercent)
|
| + 'distance': this._toUIDistance(this._distance),
|
| + 'shallowSize': Number.withThousandsSeparator(this._shallowSize),
|
| + 'retainedSize': Number.withThousandsSeparator(this._retainedSize),
|
| + 'shallowSize-percent': this._toPercentString(shallowSizePercent),
|
| + 'retainedSize-percent': this._toPercentString(retainedSizePercent)
|
| };
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotGenericObjectNode.prototype = {
|
| - /**
|
| - * @override
|
| - * @return {?{snapshot:!WebInspector.HeapSnapshotProxy, snapshotNodeIndex:number}}
|
| - */
|
| - retainersDataSource: function()
|
| - {
|
| - return {snapshot: this._dataGrid.snapshot, snapshotNodeIndex: this.snapshotNodeIndex};
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {string} columnId
|
| - * @return {!Element}
|
| - */
|
| - createCell: function(columnId)
|
| - {
|
| - var cell = columnId !== "object" ? this._createValueCell(columnId) : this._createObjectCell();
|
| - if (this._searchMatched)
|
| - cell.classList.add("highlight");
|
| - return cell;
|
| - },
|
| -
|
| - /**
|
| - * @return {!Element}
|
| - */
|
| - _createObjectCell: function()
|
| - {
|
| - var value = this._name;
|
| - var valueStyle = "object";
|
| - switch (this._type) {
|
| - case "concatenated string":
|
| - case "string":
|
| - value = "\"" + value + "\"";
|
| - valueStyle = "string";
|
| - break;
|
| - case "regexp":
|
| - value = "/" + value + "/";
|
| - valueStyle = "string";
|
| - break;
|
| - case "closure":
|
| - value = value + "()";
|
| - valueStyle = "function";
|
| - break;
|
| - case "number":
|
| - valueStyle = "number";
|
| - break;
|
| - case "hidden":
|
| - valueStyle = "null";
|
| - break;
|
| - case "array":
|
| - value = (value || "") + "[]";
|
| - break;
|
| - }
|
| - if (this._reachableFromWindow)
|
| - valueStyle += " highlight";
|
| - if (value === "Object")
|
| - value = "";
|
| - if (this.detachedDOMTreeNode)
|
| - valueStyle += " detached-dom-tree-node";
|
| - return this._createObjectCellWithValue(valueStyle, value);
|
| - },
|
| -
|
| - _createObjectCellWithValue: function(valueStyle, value)
|
| - {
|
| - var cell = createElement("td");
|
| - cell.className = "object-column";
|
| - var div = createElement("div");
|
| - div.className = "source-code event-properties";
|
| - div.style.overflow = "visible";
|
| -
|
| - this._prefixObjectCell(div);
|
| -
|
| - var valueSpan = createElement("span");
|
| - valueSpan.className = "value object-value-" + valueStyle;
|
| - valueSpan.textContent = value;
|
| - div.appendChild(valueSpan);
|
| -
|
| - var idSpan = createElement("span");
|
| - idSpan.className = "object-value-id";
|
| - idSpan.textContent = " @" + this.snapshotNodeId;
|
| - div.appendChild(idSpan);
|
| -
|
| - cell.appendChild(div);
|
| - cell.classList.add("disclosure");
|
| - if (this.depth)
|
| - cell.style.setProperty("padding-left", (this.depth * this.dataGrid.indentWidth) + "px");
|
| - cell.heapSnapshotNode = this;
|
| - return cell;
|
| - },
|
| -
|
| - _prefixObjectCell: function(div)
|
| - {
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.Target} target
|
| - * @param {function(!WebInspector.RemoteObject)} callback
|
| - * @param {string} objectGroupName
|
| - */
|
| - queryObjectContent: function(target, callback, objectGroupName)
|
| - {
|
| - /**
|
| - * @param {?Protocol.Error} error
|
| - * @param {!RuntimeAgent.RemoteObject} object
|
| - */
|
| - function formatResult(error, object)
|
| - {
|
| - if (!error && object.type)
|
| - callback(target.runtimeModel.createRemoteObject(object));
|
| - else
|
| - callback(target.runtimeModel.createRemoteObjectFromPrimitiveValue(WebInspector.UIString("Preview is not available")));
|
| - }
|
| -
|
| - if (this._type === "string")
|
| - callback(target.runtimeModel.createRemoteObjectFromPrimitiveValue(this._name));
|
| - else
|
| - target.heapProfilerAgent().getObjectByHeapObjectId(String(this.snapshotNodeId), objectGroupName, formatResult);
|
| - },
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {?{snapshot:!WebInspector.HeapSnapshotProxy, snapshotNodeIndex:number}}
|
| + */
|
| + retainersDataSource() {
|
| + return {snapshot: this._dataGrid.snapshot, snapshotNodeIndex: this.snapshotNodeIndex};
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {string} columnId
|
| + * @return {!Element}
|
| + */
|
| + createCell(columnId) {
|
| + var cell = columnId !== 'object' ? this._createValueCell(columnId) : this._createObjectCell();
|
| + if (this._searchMatched)
|
| + cell.classList.add('highlight');
|
| + return cell;
|
| + }
|
| +
|
| + /**
|
| + * @return {!Element}
|
| + */
|
| + _createObjectCell() {
|
| + var value = this._name;
|
| + var valueStyle = 'object';
|
| + switch (this._type) {
|
| + case 'concatenated string':
|
| + case 'string':
|
| + value = '"' + value + '"';
|
| + valueStyle = 'string';
|
| + break;
|
| + case 'regexp':
|
| + value = '/' + value + '/';
|
| + valueStyle = 'string';
|
| + break;
|
| + case 'closure':
|
| + value = value + '()';
|
| + valueStyle = 'function';
|
| + break;
|
| + case 'number':
|
| + valueStyle = 'number';
|
| + break;
|
| + case 'hidden':
|
| + valueStyle = 'null';
|
| + break;
|
| + case 'array':
|
| + value = (value || '') + '[]';
|
| + break;
|
| + }
|
| + if (this._reachableFromWindow)
|
| + valueStyle += ' highlight';
|
| + if (value === 'Object')
|
| + value = '';
|
| + if (this.detachedDOMTreeNode)
|
| + valueStyle += ' detached-dom-tree-node';
|
| + return this._createObjectCellWithValue(valueStyle, value);
|
| + }
|
| +
|
| + _createObjectCellWithValue(valueStyle, value) {
|
| + var cell = createElement('td');
|
| + cell.className = 'object-column';
|
| + var div = createElement('div');
|
| + div.className = 'source-code event-properties';
|
| + div.style.overflow = 'visible';
|
| +
|
| + this._prefixObjectCell(div);
|
| +
|
| + var valueSpan = createElement('span');
|
| + valueSpan.className = 'value object-value-' + valueStyle;
|
| + valueSpan.textContent = value;
|
| + div.appendChild(valueSpan);
|
| +
|
| + var idSpan = createElement('span');
|
| + idSpan.className = 'object-value-id';
|
| + idSpan.textContent = ' @' + this.snapshotNodeId;
|
| + div.appendChild(idSpan);
|
| +
|
| + cell.appendChild(div);
|
| + cell.classList.add('disclosure');
|
| + if (this.depth)
|
| + cell.style.setProperty('padding-left', (this.depth * this.dataGrid.indentWidth) + 'px');
|
| + cell.heapSnapshotNode = this;
|
| + return cell;
|
| + }
|
| +
|
| + _prefixObjectCell(div) {
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.Target} target
|
| + * @param {function(!WebInspector.RemoteObject)} callback
|
| + * @param {string} objectGroupName
|
| + */
|
| + queryObjectContent(target, callback, objectGroupName) {
|
| + /**
|
| + * @param {?Protocol.Error} error
|
| + * @param {!RuntimeAgent.RemoteObject} object
|
| + */
|
| + function formatResult(error, object) {
|
| + if (!error && object.type)
|
| + callback(target.runtimeModel.createRemoteObject(object));
|
| + else
|
| + callback(target.runtimeModel.createRemoteObjectFromPrimitiveValue(
|
| + WebInspector.UIString('Preview is not available')));
|
| + }
|
|
|
| - updateHasChildren: function()
|
| - {
|
| - /**
|
| - * @this {WebInspector.HeapSnapshotGenericObjectNode}
|
| - */
|
| - function isEmptyCallback(isEmpty)
|
| - {
|
| - this.hasChildren = !isEmpty;
|
| - }
|
| - this._provider().isEmpty(isEmptyCallback.bind(this));
|
| - },
|
| + if (this._type === 'string')
|
| + callback(target.runtimeModel.createRemoteObjectFromPrimitiveValue(this._name));
|
| + else
|
| + target.heapProfilerAgent().getObjectByHeapObjectId(String(this.snapshotNodeId), objectGroupName, formatResult);
|
| + }
|
|
|
| + updateHasChildren() {
|
| /**
|
| - * @param {string} fullName
|
| - * @param {boolean} hasObjectId
|
| - * @return {string}
|
| + * @this {WebInspector.HeapSnapshotGenericObjectNode}
|
| */
|
| - shortenWindowURL: function(fullName, hasObjectId)
|
| - {
|
| - var startPos = fullName.indexOf("/");
|
| - var endPos = hasObjectId ? fullName.indexOf("@") : fullName.length;
|
| - if (startPos !== -1 && endPos !== -1) {
|
| - var fullURL = fullName.substring(startPos + 1, endPos).trimLeft();
|
| - var url = fullURL.trimURL();
|
| - if (url.length > 40)
|
| - url = url.trimMiddle(40);
|
| - return fullName.substr(0, startPos + 2) + url + fullName.substr(endPos);
|
| - } else
|
| - return fullName;
|
| - },
|
| -
|
| - __proto__: WebInspector.HeapSnapshotGridNode.prototype
|
| + function isEmptyCallback(isEmpty) {
|
| + this.hasChildren = !isEmpty;
|
| + }
|
| + this._provider().isEmpty(isEmptyCallback.bind(this));
|
| + }
|
| +
|
| + /**
|
| + * @param {string} fullName
|
| + * @param {boolean} hasObjectId
|
| + * @return {string}
|
| + */
|
| + shortenWindowURL(fullName, hasObjectId) {
|
| + var startPos = fullName.indexOf('/');
|
| + var endPos = hasObjectId ? fullName.indexOf('@') : fullName.length;
|
| + if (startPos !== -1 && endPos !== -1) {
|
| + var fullURL = fullName.substring(startPos + 1, endPos).trimLeft();
|
| + var url = fullURL.trimURL();
|
| + if (url.length > 40)
|
| + url = url.trimMiddle(40);
|
| + return fullName.substr(0, startPos + 2) + url + fullName.substr(endPos);
|
| + } else
|
| + return fullName;
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.HeapSnapshotGenericObjectNode}
|
| - * @param {!WebInspector.HeapSnapshotSortableDataGrid} dataGrid
|
| - * @param {!WebInspector.HeapSnapshotProxy} snapshot
|
| - * @param {!WebInspector.HeapSnapshotCommon.Edge} edge
|
| - * @param {?WebInspector.HeapSnapshotObjectNode} parentObjectNode
|
| + * @unrestricted
|
| */
|
| -WebInspector.HeapSnapshotObjectNode = function(dataGrid, snapshot, edge, parentObjectNode)
|
| -{
|
| - WebInspector.HeapSnapshotGenericObjectNode.call(this, dataGrid, edge.node);
|
| +WebInspector.HeapSnapshotObjectNode = class extends WebInspector.HeapSnapshotGenericObjectNode {
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotSortableDataGrid} dataGrid
|
| + * @param {!WebInspector.HeapSnapshotProxy} snapshot
|
| + * @param {!WebInspector.HeapSnapshotCommon.Edge} edge
|
| + * @param {?WebInspector.HeapSnapshotObjectNode} parentObjectNode
|
| + */
|
| + constructor(dataGrid, snapshot, edge, parentObjectNode) {
|
| + super(dataGrid, edge.node);
|
| this._referenceName = edge.name;
|
| this._referenceType = edge.type;
|
| this._edgeIndex = edge.edgeIndex;
|
| @@ -705,326 +674,307 @@ WebInspector.HeapSnapshotObjectNode = function(dataGrid, snapshot, edge, parentO
|
| this._parentObjectNode = parentObjectNode;
|
| this._cycledWithAncestorGridNode = this._findAncestorWithSameSnapshotNodeId();
|
| if (!this._cycledWithAncestorGridNode)
|
| - this.updateHasChildren();
|
| + this.updateHasChildren();
|
|
|
| var data = this.data;
|
| - data["count"] = "";
|
| - data["addedCount"] = "";
|
| - data["removedCount"] = "";
|
| - data["countDelta"] = "";
|
| - data["addedSize"] = "";
|
| - data["removedSize"] = "";
|
| - data["sizeDelta"] = "";
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotObjectNode.prototype = {
|
| - /**
|
| - * @override
|
| - * @return {?{snapshot:!WebInspector.HeapSnapshotProxy, snapshotNodeIndex:number}}
|
| - */
|
| - retainersDataSource: function()
|
| - {
|
| - return {snapshot: this._snapshot, snapshotNodeIndex: this.snapshotNodeIndex};
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!WebInspector.HeapSnapshotProviderProxy}
|
| - */
|
| - createProvider: function()
|
| - {
|
| - return this._snapshot.createEdgesProvider(this.snapshotNodeIndex);
|
| - },
|
| -
|
| - _findAncestorWithSameSnapshotNodeId: function()
|
| - {
|
| - var ancestor = this._parentObjectNode;
|
| - while (ancestor) {
|
| - if (ancestor.snapshotNodeId === this.snapshotNodeId)
|
| - return ancestor;
|
| - ancestor = ancestor._parentObjectNode;
|
| - }
|
| - return null;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotCommon.Edge} item
|
| - * @return {!WebInspector.HeapSnapshotObjectNode}
|
| - */
|
| - _createChildNode: function(item)
|
| - {
|
| - return new WebInspector.HeapSnapshotObjectNode(this._dataGrid, this._snapshot, item, this);
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotCommon.Edge} edge
|
| - * @return {number}
|
| - */
|
| - _childHashForEntity: function(edge)
|
| - {
|
| - return edge.edgeIndex;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotObjectNode} childNode
|
| - * @return {number}
|
| - */
|
| - _childHashForNode: function(childNode)
|
| - {
|
| - return childNode._edgeIndex;
|
| - },
|
| -
|
| - /**
|
| - * @return {!WebInspector.HeapSnapshotCommon.ComparatorConfig}
|
| - */
|
| - comparator: function()
|
| - {
|
| - var sortAscending = this._dataGrid.isSortOrderAscending();
|
| - var sortColumnId = this._dataGrid.sortColumnId();
|
| - var sortFields = {
|
| - object: ["!edgeName", sortAscending, "retainedSize", false],
|
| - count: ["!edgeName", true, "retainedSize", false],
|
| - shallowSize: ["selfSize", sortAscending, "!edgeName", true],
|
| - retainedSize: ["retainedSize", sortAscending, "!edgeName", true],
|
| - distance: ["distance", sortAscending, "_name", true]
|
| - }[sortColumnId] || ["!edgeName", true, "retainedSize", false];
|
| - return WebInspector.HeapSnapshotGridNode.createComparator(sortFields);
|
| - },
|
| -
|
| - _prefixObjectCell: function(div)
|
| - {
|
| - var name = this._referenceName || "(empty)";
|
| - var nameClass = "name";
|
| - switch (this._referenceType) {
|
| - case "context":
|
| - nameClass = "object-value-number";
|
| - break;
|
| - case "internal":
|
| - case "hidden":
|
| - case "weak":
|
| - nameClass = "object-value-null";
|
| - break;
|
| - case "element":
|
| - name = "[" + name + "]";
|
| - break;
|
| - }
|
| -
|
| - if (this._cycledWithAncestorGridNode)
|
| - div.className += " cycled-ancessor-node";
|
| -
|
| - var nameSpan = createElement("span");
|
| - nameSpan.className = nameClass;
|
| - nameSpan.textContent = name;
|
| - div.appendChild(nameSpan);
|
| -
|
| - var separatorSpan = createElement("span");
|
| - separatorSpan.className = "grayed";
|
| - separatorSpan.textContent = this._edgeNodeSeparator();
|
| - div.appendChild(separatorSpan);
|
| - },
|
| -
|
| - /**
|
| - * @return {string}
|
| - */
|
| - _edgeNodeSeparator: function()
|
| - {
|
| - return " :: ";
|
| - },
|
| + data['count'] = '';
|
| + data['addedCount'] = '';
|
| + data['removedCount'] = '';
|
| + data['countDelta'] = '';
|
| + data['addedSize'] = '';
|
| + data['removedSize'] = '';
|
| + data['sizeDelta'] = '';
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {?{snapshot:!WebInspector.HeapSnapshotProxy, snapshotNodeIndex:number}}
|
| + */
|
| + retainersDataSource() {
|
| + return {snapshot: this._snapshot, snapshotNodeIndex: this.snapshotNodeIndex};
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!WebInspector.HeapSnapshotProviderProxy}
|
| + */
|
| + createProvider() {
|
| + return this._snapshot.createEdgesProvider(this.snapshotNodeIndex);
|
| + }
|
| +
|
| + _findAncestorWithSameSnapshotNodeId() {
|
| + var ancestor = this._parentObjectNode;
|
| + while (ancestor) {
|
| + if (ancestor.snapshotNodeId === this.snapshotNodeId)
|
| + return ancestor;
|
| + ancestor = ancestor._parentObjectNode;
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotCommon.Edge} item
|
| + * @return {!WebInspector.HeapSnapshotObjectNode}
|
| + */
|
| + _createChildNode(item) {
|
| + return new WebInspector.HeapSnapshotObjectNode(this._dataGrid, this._snapshot, item, this);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotCommon.Edge} edge
|
| + * @return {number}
|
| + */
|
| + _childHashForEntity(edge) {
|
| + return edge.edgeIndex;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotObjectNode} childNode
|
| + * @return {number}
|
| + */
|
| + _childHashForNode(childNode) {
|
| + return childNode._edgeIndex;
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.HeapSnapshotCommon.ComparatorConfig}
|
| + */
|
| + comparator() {
|
| + var sortAscending = this._dataGrid.isSortOrderAscending();
|
| + var sortColumnId = this._dataGrid.sortColumnId();
|
| + var sortFields = {
|
| + object: ['!edgeName', sortAscending, 'retainedSize', false],
|
| + count: ['!edgeName', true, 'retainedSize', false],
|
| + shallowSize: ['selfSize', sortAscending, '!edgeName', true],
|
| + retainedSize: ['retainedSize', sortAscending, '!edgeName', true],
|
| + distance: ['distance', sortAscending, '_name', true]
|
| + }[sortColumnId] ||
|
| + ['!edgeName', true, 'retainedSize', false];
|
| + return WebInspector.HeapSnapshotGridNode.createComparator(sortFields);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + _prefixObjectCell(div) {
|
| + var name = this._referenceName || '(empty)';
|
| + var nameClass = 'name';
|
| + switch (this._referenceType) {
|
| + case 'context':
|
| + nameClass = 'object-value-number';
|
| + break;
|
| + case 'internal':
|
| + case 'hidden':
|
| + case 'weak':
|
| + nameClass = 'object-value-null';
|
| + break;
|
| + case 'element':
|
| + name = '[' + name + ']';
|
| + break;
|
| + }
|
|
|
| - __proto__: WebInspector.HeapSnapshotGenericObjectNode.prototype
|
| + if (this._cycledWithAncestorGridNode)
|
| + div.className += ' cycled-ancessor-node';
|
| +
|
| + var nameSpan = createElement('span');
|
| + nameSpan.className = nameClass;
|
| + nameSpan.textContent = name;
|
| + div.appendChild(nameSpan);
|
| +
|
| + var separatorSpan = createElement('span');
|
| + separatorSpan.className = 'grayed';
|
| + separatorSpan.textContent = this._edgeNodeSeparator();
|
| + div.appendChild(separatorSpan);
|
| + }
|
| +
|
| + /**
|
| + * @return {string}
|
| + */
|
| + _edgeNodeSeparator() {
|
| + return ' :: ';
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.HeapSnapshotObjectNode}
|
| - * @param {!WebInspector.HeapSnapshotSortableDataGrid} dataGrid
|
| - * @param {!WebInspector.HeapSnapshotProxy} snapshot
|
| - * @param {!WebInspector.HeapSnapshotCommon.Edge} edge
|
| - * @param {?WebInspector.HeapSnapshotRetainingObjectNode} parentRetainingObjectNode
|
| + * @unrestricted
|
| */
|
| -WebInspector.HeapSnapshotRetainingObjectNode = function(dataGrid, snapshot, edge, parentRetainingObjectNode)
|
| -{
|
| - WebInspector.HeapSnapshotObjectNode.call(this, dataGrid, snapshot, edge, parentRetainingObjectNode);
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotRetainingObjectNode.prototype = {
|
| - /**
|
| - * @override
|
| - * @return {!WebInspector.HeapSnapshotProviderProxy}
|
| - */
|
| - createProvider: function()
|
| - {
|
| - return this._snapshot.createRetainingEdgesProvider(this.snapshotNodeIndex);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.HeapSnapshotCommon.Edge} item
|
| - * @return {!WebInspector.HeapSnapshotRetainingObjectNode}
|
| - */
|
| - _createChildNode: function(item)
|
| - {
|
| - return new WebInspector.HeapSnapshotRetainingObjectNode(this._dataGrid, this._snapshot, item, this);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {string}
|
| - */
|
| - _edgeNodeSeparator: function()
|
| - {
|
| - return " in ";
|
| - },
|
| -
|
| - expand: function()
|
| - {
|
| - this._expandRetainersChain(20);
|
| - },
|
| -
|
| - /**
|
| - * @param {number} maxExpandLevels
|
| - */
|
| - _expandRetainersChain: function(maxExpandLevels)
|
| - {
|
| - /**
|
| - * @this {!WebInspector.HeapSnapshotRetainingObjectNode}
|
| - */
|
| - function populateComplete()
|
| - {
|
| - this.removeEventListener(WebInspector.HeapSnapshotGridNode.Events.PopulateComplete, populateComplete, this);
|
| - this._expandRetainersChain(maxExpandLevels);
|
| - }
|
| -
|
| - if (!this._populated) {
|
| - this.addEventListener(WebInspector.HeapSnapshotGridNode.Events.PopulateComplete, populateComplete, this);
|
| - this.populate();
|
| - return;
|
| - }
|
| - WebInspector.HeapSnapshotGenericObjectNode.prototype.expand.call(this);
|
| - if (--maxExpandLevels > 0 && this.children.length > 0) {
|
| - var retainer = this.children[0];
|
| - if (retainer._distance > 1) {
|
| - retainer._expandRetainersChain(maxExpandLevels);
|
| - return;
|
| - }
|
| - }
|
| - this._dataGrid.dispatchEventToListeners(WebInspector.HeapSnapshotRetainmentDataGrid.Events.ExpandRetainersComplete);
|
| - },
|
| +WebInspector.HeapSnapshotRetainingObjectNode = class extends WebInspector.HeapSnapshotObjectNode {
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotSortableDataGrid} dataGrid
|
| + * @param {!WebInspector.HeapSnapshotProxy} snapshot
|
| + * @param {!WebInspector.HeapSnapshotCommon.Edge} edge
|
| + * @param {?WebInspector.HeapSnapshotRetainingObjectNode} parentRetainingObjectNode
|
| + */
|
| + constructor(dataGrid, snapshot, edge, parentRetainingObjectNode) {
|
| + super(dataGrid, snapshot, edge, parentRetainingObjectNode);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!WebInspector.HeapSnapshotProviderProxy}
|
| + */
|
| + createProvider() {
|
| + return this._snapshot.createRetainingEdgesProvider(this.snapshotNodeIndex);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.HeapSnapshotCommon.Edge} item
|
| + * @return {!WebInspector.HeapSnapshotRetainingObjectNode}
|
| + */
|
| + _createChildNode(item) {
|
| + return new WebInspector.HeapSnapshotRetainingObjectNode(this._dataGrid, this._snapshot, item, this);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {string}
|
| + */
|
| + _edgeNodeSeparator() {
|
| + return ' in ';
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + expand() {
|
| + this._expandRetainersChain(20);
|
| + }
|
| +
|
| + /**
|
| + * @param {number} maxExpandLevels
|
| + */
|
| + _expandRetainersChain(maxExpandLevels) {
|
| + /**
|
| + * @this {!WebInspector.HeapSnapshotRetainingObjectNode}
|
| + */
|
| + function populateComplete() {
|
| + this.removeEventListener(WebInspector.HeapSnapshotGridNode.Events.PopulateComplete, populateComplete, this);
|
| + this._expandRetainersChain(maxExpandLevels);
|
| + }
|
|
|
| - __proto__: WebInspector.HeapSnapshotObjectNode.prototype
|
| + if (!this._populated) {
|
| + this.addEventListener(WebInspector.HeapSnapshotGridNode.Events.PopulateComplete, populateComplete, this);
|
| + this.populate();
|
| + return;
|
| + }
|
| + super.expand();
|
| + if (--maxExpandLevels > 0 && this.children.length > 0) {
|
| + var retainer = this.children[0];
|
| + if (retainer._distance > 1) {
|
| + retainer._expandRetainersChain(maxExpandLevels);
|
| + return;
|
| + }
|
| + }
|
| + this._dataGrid.dispatchEventToListeners(WebInspector.HeapSnapshotRetainmentDataGrid.Events.ExpandRetainersComplete);
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.HeapSnapshotGenericObjectNode}
|
| - * @param {!WebInspector.HeapSnapshotSortableDataGrid} dataGrid
|
| - * @param {!WebInspector.HeapSnapshotProxy} snapshot
|
| - * @param {!WebInspector.HeapSnapshotCommon.Node} node
|
| - * @param {boolean} isDeletedNode
|
| + * @unrestricted
|
| */
|
| -WebInspector.HeapSnapshotInstanceNode = function(dataGrid, snapshot, node, isDeletedNode)
|
| -{
|
| - WebInspector.HeapSnapshotGenericObjectNode.call(this, dataGrid, node);
|
| +WebInspector.HeapSnapshotInstanceNode = class extends WebInspector.HeapSnapshotGenericObjectNode {
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotSortableDataGrid} dataGrid
|
| + * @param {!WebInspector.HeapSnapshotProxy} snapshot
|
| + * @param {!WebInspector.HeapSnapshotCommon.Node} node
|
| + * @param {boolean} isDeletedNode
|
| + */
|
| + constructor(dataGrid, snapshot, node, isDeletedNode) {
|
| + super(dataGrid, node);
|
| this._baseSnapshotOrSnapshot = snapshot;
|
| this._isDeletedNode = isDeletedNode;
|
| this.updateHasChildren();
|
|
|
| var data = this.data;
|
| - data["count"] = "";
|
| - data["countDelta"] = "";
|
| - data["sizeDelta"] = "";
|
| + data['count'] = '';
|
| + data['countDelta'] = '';
|
| + data['sizeDelta'] = '';
|
| if (this._isDeletedNode) {
|
| - data["addedCount"] = "";
|
| - data["addedSize"] = "";
|
| - data["removedCount"] = "\u2022";
|
| - data["removedSize"] = Number.withThousandsSeparator(this._shallowSize);
|
| + data['addedCount'] = '';
|
| + data['addedSize'] = '';
|
| + data['removedCount'] = '\u2022';
|
| + data['removedSize'] = Number.withThousandsSeparator(this._shallowSize);
|
| } else {
|
| - data["addedCount"] = "\u2022";
|
| - data["addedSize"] = Number.withThousandsSeparator(this._shallowSize);
|
| - data["removedCount"] = "";
|
| - data["removedSize"] = "";
|
| + data['addedCount'] = '\u2022';
|
| + data['addedSize'] = Number.withThousandsSeparator(this._shallowSize);
|
| + data['removedCount'] = '';
|
| + data['removedSize'] = '';
|
| }
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotInstanceNode.prototype = {
|
| - /**
|
| - * @override
|
| - * @return {?{snapshot:!WebInspector.HeapSnapshotProxy, snapshotNodeIndex:number}}
|
| - */
|
| - retainersDataSource: function()
|
| - {
|
| - return {snapshot: this._baseSnapshotOrSnapshot, snapshotNodeIndex: this.snapshotNodeIndex};
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!WebInspector.HeapSnapshotProviderProxy}
|
| - */
|
| - createProvider: function()
|
| - {
|
| - return this._baseSnapshotOrSnapshot.createEdgesProvider(this.snapshotNodeIndex);
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotCommon.Edge} item
|
| - * @return {!WebInspector.HeapSnapshotObjectNode}
|
| - */
|
| - _createChildNode: function(item)
|
| - {
|
| - return new WebInspector.HeapSnapshotObjectNode(this._dataGrid, this._baseSnapshotOrSnapshot, item, null);
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotCommon.Edge} edge
|
| - * @return {number}
|
| - */
|
| - _childHashForEntity: function(edge)
|
| - {
|
| - return edge.edgeIndex;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotObjectNode} childNode
|
| - * @return {number}
|
| - */
|
| - _childHashForNode: function(childNode)
|
| - {
|
| - return childNode._edgeIndex;
|
| - },
|
| -
|
| - /**
|
| - * @return {!WebInspector.HeapSnapshotCommon.ComparatorConfig}
|
| - */
|
| - comparator: function()
|
| - {
|
| - var sortAscending = this._dataGrid.isSortOrderAscending();
|
| - var sortColumnId = this._dataGrid.sortColumnId();
|
| - var sortFields = {
|
| - object: ["!edgeName", sortAscending, "retainedSize", false],
|
| - distance: ["distance", sortAscending, "retainedSize", false],
|
| - count: ["!edgeName", true, "retainedSize", false],
|
| - addedSize: ["selfSize", sortAscending, "!edgeName", true],
|
| - removedSize: ["selfSize", sortAscending, "!edgeName", true],
|
| - shallowSize: ["selfSize", sortAscending, "!edgeName", true],
|
| - retainedSize: ["retainedSize", sortAscending, "!edgeName", true]
|
| - }[sortColumnId] || ["!edgeName", true, "retainedSize", false];
|
| - return WebInspector.HeapSnapshotGridNode.createComparator(sortFields);
|
| - },
|
| -
|
| - __proto__: WebInspector.HeapSnapshotGenericObjectNode.prototype
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {?{snapshot:!WebInspector.HeapSnapshotProxy, snapshotNodeIndex:number}}
|
| + */
|
| + retainersDataSource() {
|
| + return {snapshot: this._baseSnapshotOrSnapshot, snapshotNodeIndex: this.snapshotNodeIndex};
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!WebInspector.HeapSnapshotProviderProxy}
|
| + */
|
| + createProvider() {
|
| + return this._baseSnapshotOrSnapshot.createEdgesProvider(this.snapshotNodeIndex);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotCommon.Edge} item
|
| + * @return {!WebInspector.HeapSnapshotObjectNode}
|
| + */
|
| + _createChildNode(item) {
|
| + return new WebInspector.HeapSnapshotObjectNode(this._dataGrid, this._baseSnapshotOrSnapshot, item, null);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotCommon.Edge} edge
|
| + * @return {number}
|
| + */
|
| + _childHashForEntity(edge) {
|
| + return edge.edgeIndex;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotObjectNode} childNode
|
| + * @return {number}
|
| + */
|
| + _childHashForNode(childNode) {
|
| + return childNode._edgeIndex;
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.HeapSnapshotCommon.ComparatorConfig}
|
| + */
|
| + comparator() {
|
| + var sortAscending = this._dataGrid.isSortOrderAscending();
|
| + var sortColumnId = this._dataGrid.sortColumnId();
|
| + var sortFields = {
|
| + object: ['!edgeName', sortAscending, 'retainedSize', false],
|
| + distance: ['distance', sortAscending, 'retainedSize', false],
|
| + count: ['!edgeName', true, 'retainedSize', false],
|
| + addedSize: ['selfSize', sortAscending, '!edgeName', true],
|
| + removedSize: ['selfSize', sortAscending, '!edgeName', true],
|
| + shallowSize: ['selfSize', sortAscending, '!edgeName', true],
|
| + retainedSize: ['retainedSize', sortAscending, '!edgeName', true]
|
| + }[sortColumnId] ||
|
| + ['!edgeName', true, 'retainedSize', false];
|
| + return WebInspector.HeapSnapshotGridNode.createComparator(sortFields);
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {!WebInspector.HeapSnapshotConstructorsDataGrid} dataGrid
|
| - * @param {string} className
|
| - * @param {!WebInspector.HeapSnapshotCommon.Aggregate} aggregate
|
| - * @param {!WebInspector.HeapSnapshotCommon.NodeFilter} nodeFilter
|
| - * @extends {WebInspector.HeapSnapshotGridNode}
|
| + * @unrestricted
|
| */
|
| -WebInspector.HeapSnapshotConstructorNode = function(dataGrid, className, aggregate, nodeFilter)
|
| -{
|
| - WebInspector.HeapSnapshotGridNode.call(this, dataGrid, aggregate.count > 0);
|
| +WebInspector.HeapSnapshotConstructorNode = class extends WebInspector.HeapSnapshotGridNode {
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotConstructorsDataGrid} dataGrid
|
| + * @param {string} className
|
| + * @param {!WebInspector.HeapSnapshotCommon.Aggregate} aggregate
|
| + * @param {!WebInspector.HeapSnapshotCommon.NodeFilter} nodeFilter
|
| + */
|
| + constructor(dataGrid, className, aggregate, nodeFilter) {
|
| + super(dataGrid, aggregate.count > 0);
|
| this._name = className;
|
| this._nodeFilter = nodeFilter;
|
| this._distance = aggregate.distance;
|
| @@ -1038,283 +988,263 @@ WebInspector.HeapSnapshotConstructorNode = function(dataGrid, className, aggrega
|
| var shallowSizePercent = this._shallowSize / snapshot.totalSize * 100.0;
|
|
|
| this.data = {
|
| - "object": className,
|
| - "count": Number.withThousandsSeparator(this._count),
|
| - "distance": this._toUIDistance(this._distance),
|
| - "shallowSize": Number.withThousandsSeparator(this._shallowSize),
|
| - "retainedSize": Number.withThousandsSeparator(this._retainedSize),
|
| - "count-percent": this._toPercentString(countPercent),
|
| - "shallowSize-percent": this._toPercentString(shallowSizePercent),
|
| - "retainedSize-percent": this._toPercentString(retainedSizePercent)
|
| + 'object': className,
|
| + 'count': Number.withThousandsSeparator(this._count),
|
| + 'distance': this._toUIDistance(this._distance),
|
| + 'shallowSize': Number.withThousandsSeparator(this._shallowSize),
|
| + 'retainedSize': Number.withThousandsSeparator(this._retainedSize),
|
| + 'count-percent': this._toPercentString(countPercent),
|
| + 'shallowSize-percent': this._toPercentString(shallowSizePercent),
|
| + 'retainedSize-percent': this._toPercentString(retainedSizePercent)
|
| };
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotConstructorNode.prototype = {
|
| - /**
|
| - * @override
|
| - * @return {!WebInspector.HeapSnapshotProviderProxy}
|
| - */
|
| - createProvider: function()
|
| - {
|
| - return this._dataGrid.snapshot.createNodesProviderForClass(this._name, this._nodeFilter);
|
| - },
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!WebInspector.HeapSnapshotProviderProxy}
|
| + */
|
| + createProvider() {
|
| + return this._dataGrid.snapshot.createNodesProviderForClass(this._name, this._nodeFilter);
|
| + }
|
| +
|
| + /**
|
| + * @param {number} snapshotObjectId
|
| + * @return {!Promise<!Array<!WebInspector.HeapSnapshotGridNode>>}
|
| + */
|
| + populateNodeBySnapshotObjectId(snapshotObjectId) {
|
| + /**
|
| + * @this {WebInspector.HeapSnapshotConstructorNode}
|
| + */
|
| + function didExpand() {
|
| + return this._provider().nodePosition(snapshotObjectId).then(didGetNodePosition.bind(this));
|
| + }
|
|
|
| /**
|
| - * @param {number} snapshotObjectId
|
| + * @this {WebInspector.HeapSnapshotConstructorNode}
|
| + * @param {number} nodePosition
|
| * @return {!Promise<!Array<!WebInspector.HeapSnapshotGridNode>>}
|
| */
|
| - populateNodeBySnapshotObjectId: function(snapshotObjectId)
|
| - {
|
| + function didGetNodePosition(nodePosition) {
|
| + if (nodePosition === -1) {
|
| + this.collapse();
|
| + return Promise.resolve([]);
|
| + } else {
|
| /**
|
| + * @param {function(!Array<!WebInspector.HeapSnapshotGridNode>)} fulfill
|
| * @this {WebInspector.HeapSnapshotConstructorNode}
|
| */
|
| - function didExpand()
|
| - {
|
| - return this._provider().nodePosition(snapshotObjectId).then(didGetNodePosition.bind(this));
|
| + function action(fulfill) {
|
| + this._populateChildren(nodePosition, null, didPopulateChildren.bind(this, nodePosition, fulfill));
|
| }
|
| -
|
| - /**
|
| - * @this {WebInspector.HeapSnapshotConstructorNode}
|
| - * @param {number} nodePosition
|
| - * @return {!Promise<!Array<!WebInspector.HeapSnapshotGridNode>>}
|
| - */
|
| - function didGetNodePosition(nodePosition)
|
| - {
|
| - if (nodePosition === -1) {
|
| - this.collapse();
|
| - return Promise.resolve([]);
|
| - } else {
|
| - /**
|
| - * @param {function(!Array<!WebInspector.HeapSnapshotGridNode>)} fulfill
|
| - * @this {WebInspector.HeapSnapshotConstructorNode}
|
| - */
|
| - function action(fulfill)
|
| - {
|
| - this._populateChildren(nodePosition, null, didPopulateChildren.bind(this, nodePosition, fulfill));
|
| - }
|
| - return new Promise(action.bind(this));
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * @this {WebInspector.HeapSnapshotConstructorNode}
|
| - * @param {number} nodePosition
|
| - * @param {function(!Array<!WebInspector.HeapSnapshotGridNode>)} callback
|
| - */
|
| - function didPopulateChildren(nodePosition, callback)
|
| - {
|
| - var node = /** @type {?WebInspector.HeapSnapshotGridNode} */ (this.childForPosition(nodePosition));
|
| - callback(node ? [this, node] : []);
|
| - }
|
| -
|
| - this._dataGrid.resetNameFilter();
|
| - return this.expandWithoutPopulate().then(didExpand.bind(this));
|
| - },
|
| -
|
| - /**
|
| - * @param {string} filterValue
|
| - * @return {boolean}
|
| - */
|
| - filteredOut: function(filterValue)
|
| - {
|
| - return this._name.toLowerCase().indexOf(filterValue) === -1;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {string} columnId
|
| - * @return {!Element}
|
| - */
|
| - createCell: function(columnId)
|
| - {
|
| - var cell = columnId !== "object" ? this._createValueCell(columnId) : WebInspector.HeapSnapshotGridNode.prototype.createCell.call(this, columnId);
|
| - if (this._searchMatched)
|
| - cell.classList.add("highlight");
|
| - return cell;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotCommon.Node} item
|
| - * @return {!WebInspector.HeapSnapshotInstanceNode}
|
| - */
|
| - _createChildNode: function(item)
|
| - {
|
| - return new WebInspector.HeapSnapshotInstanceNode(this._dataGrid, this._dataGrid.snapshot, item, false);
|
| - },
|
| -
|
| - /**
|
| - * @return {!WebInspector.HeapSnapshotCommon.ComparatorConfig}
|
| - */
|
| - comparator: function()
|
| - {
|
| - var sortAscending = this._dataGrid.isSortOrderAscending();
|
| - var sortColumnId = this._dataGrid.sortColumnId();
|
| - var sortFields = {
|
| - object: ["name", sortAscending, "id", true],
|
| - distance: ["distance", sortAscending, "retainedSize", false],
|
| - count: ["name", true, "id", true],
|
| - shallowSize: ["selfSize", sortAscending, "id", true],
|
| - retainedSize: ["retainedSize", sortAscending, "id", true]
|
| - }[sortColumnId];
|
| - return WebInspector.HeapSnapshotGridNode.createComparator(sortFields);
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotCommon.Node} node
|
| - * @return {number}
|
| - */
|
| - _childHashForEntity: function(node)
|
| - {
|
| - return node.id;
|
| - },
|
| + return new Promise(action.bind(this));
|
| + }
|
| + }
|
|
|
| /**
|
| - * @param {!WebInspector.HeapSnapshotInstanceNode} childNode
|
| - * @return {number}
|
| + * @this {WebInspector.HeapSnapshotConstructorNode}
|
| + * @param {number} nodePosition
|
| + * @param {function(!Array<!WebInspector.HeapSnapshotGridNode>)} callback
|
| */
|
| - _childHashForNode: function(childNode)
|
| - {
|
| - return childNode.snapshotNodeId;
|
| - },
|
| + function didPopulateChildren(nodePosition, callback) {
|
| + var node = /** @type {?WebInspector.HeapSnapshotGridNode} */ (this.childForPosition(nodePosition));
|
| + callback(node ? [this, node] : []);
|
| + }
|
|
|
| - __proto__: WebInspector.HeapSnapshotGridNode.prototype
|
| + this._dataGrid.resetNameFilter();
|
| + return this.expandWithoutPopulate().then(didExpand.bind(this));
|
| + }
|
| +
|
| + /**
|
| + * @param {string} filterValue
|
| + * @return {boolean}
|
| + */
|
| + filteredOut(filterValue) {
|
| + return this._name.toLowerCase().indexOf(filterValue) === -1;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {string} columnId
|
| + * @return {!Element}
|
| + */
|
| + createCell(columnId) {
|
| + var cell = columnId !== 'object' ? this._createValueCell(columnId) : super.createCell(columnId);
|
| + if (this._searchMatched)
|
| + cell.classList.add('highlight');
|
| + return cell;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotCommon.Node} item
|
| + * @return {!WebInspector.HeapSnapshotInstanceNode}
|
| + */
|
| + _createChildNode(item) {
|
| + return new WebInspector.HeapSnapshotInstanceNode(this._dataGrid, this._dataGrid.snapshot, item, false);
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.HeapSnapshotCommon.ComparatorConfig}
|
| + */
|
| + comparator() {
|
| + var sortAscending = this._dataGrid.isSortOrderAscending();
|
| + var sortColumnId = this._dataGrid.sortColumnId();
|
| + var sortFields = {
|
| + object: ['name', sortAscending, 'id', true],
|
| + distance: ['distance', sortAscending, 'retainedSize', false],
|
| + count: ['name', true, 'id', true],
|
| + shallowSize: ['selfSize', sortAscending, 'id', true],
|
| + retainedSize: ['retainedSize', sortAscending, 'id', true]
|
| + }[sortColumnId];
|
| + return WebInspector.HeapSnapshotGridNode.createComparator(sortFields);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotCommon.Node} node
|
| + * @return {number}
|
| + */
|
| + _childHashForEntity(node) {
|
| + return node.id;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotInstanceNode} childNode
|
| + * @return {number}
|
| + */
|
| + _childHashForNode(childNode) {
|
| + return childNode.snapshotNodeId;
|
| + }
|
| };
|
|
|
| -
|
| /**
|
| - * @constructor
|
| * @implements {WebInspector.HeapSnapshotGridNode.ChildrenProvider}
|
| - * @param {!WebInspector.HeapSnapshotProviderProxy} addedNodesProvider
|
| - * @param {!WebInspector.HeapSnapshotProviderProxy} deletedNodesProvider
|
| - * @param {number} addedCount
|
| - * @param {number} removedCount
|
| + * @unrestricted
|
| */
|
| -WebInspector.HeapSnapshotDiffNodesProvider = function(addedNodesProvider, deletedNodesProvider, addedCount, removedCount)
|
| -{
|
| +WebInspector.HeapSnapshotDiffNodesProvider = class {
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotProviderProxy} addedNodesProvider
|
| + * @param {!WebInspector.HeapSnapshotProviderProxy} deletedNodesProvider
|
| + * @param {number} addedCount
|
| + * @param {number} removedCount
|
| + */
|
| + constructor(addedNodesProvider, deletedNodesProvider, addedCount, removedCount) {
|
| this._addedNodesProvider = addedNodesProvider;
|
| this._deletedNodesProvider = deletedNodesProvider;
|
| this._addedCount = addedCount;
|
| this._removedCount = removedCount;
|
| -};
|
| -
|
| -WebInspector.HeapSnapshotDiffNodesProvider.prototype = {
|
| - /**
|
| - * @override
|
| - */
|
| - dispose: function()
|
| - {
|
| - this._addedNodesProvider.dispose();
|
| - this._deletedNodesProvider.dispose();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} snapshotObjectId
|
| - * @return {!Promise<number>}
|
| - */
|
| - nodePosition: function(snapshotObjectId)
|
| - {
|
| - throw new Error("Unreachable");
|
| - },
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + dispose() {
|
| + this._addedNodesProvider.dispose();
|
| + this._deletedNodesProvider.dispose();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} snapshotObjectId
|
| + * @return {!Promise<number>}
|
| + */
|
| + nodePosition(snapshotObjectId) {
|
| + throw new Error('Unreachable');
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {function(boolean)} callback
|
| + */
|
| + isEmpty(callback) {
|
| + callback(false);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} beginPosition
|
| + * @param {number} endPosition
|
| + * @param {function(!WebInspector.HeapSnapshotCommon.ItemsRange)} callback
|
| + */
|
| + serializeItemsRange(beginPosition, endPosition, callback) {
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotCommon.ItemsRange} items
|
| + * @this {WebInspector.HeapSnapshotDiffNodesProvider}
|
| + */
|
| + function didReceiveAllItems(items) {
|
| + items.totalLength = this._addedCount + this._removedCount;
|
| + callback(items);
|
| + }
|
|
|
| /**
|
| - * @override
|
| - * @param {function(boolean)} callback
|
| - */
|
| - isEmpty: function(callback)
|
| - {
|
| - callback(false);
|
| - },
|
| + * @param {!WebInspector.HeapSnapshotCommon.ItemsRange} addedItems
|
| + * @param {!WebInspector.HeapSnapshotCommon.ItemsRange} itemsRange
|
| + * @this {WebInspector.HeapSnapshotDiffNodesProvider}
|
| + */
|
| + function didReceiveDeletedItems(addedItems, itemsRange) {
|
| + var items = itemsRange.items;
|
| + if (!addedItems.items.length)
|
| + addedItems.startPosition = this._addedCount + itemsRange.startPosition;
|
| + for (var i = 0; i < items.length; i++) {
|
| + items[i].isAddedNotRemoved = false;
|
| + addedItems.items.push(items[i]);
|
| + }
|
| + addedItems.endPosition = this._addedCount + itemsRange.endPosition;
|
| + didReceiveAllItems.call(this, addedItems);
|
| + }
|
|
|
| /**
|
| - * @override
|
| - * @param {number} beginPosition
|
| - * @param {number} endPosition
|
| - * @param {function(!WebInspector.HeapSnapshotCommon.ItemsRange)} callback
|
| + * @param {!WebInspector.HeapSnapshotCommon.ItemsRange} itemsRange
|
| + * @this {WebInspector.HeapSnapshotDiffNodesProvider}
|
| */
|
| - serializeItemsRange: function(beginPosition, endPosition, callback)
|
| - {
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotCommon.ItemsRange} items
|
| - * @this {WebInspector.HeapSnapshotDiffNodesProvider}
|
| - */
|
| - function didReceiveAllItems(items)
|
| - {
|
| - items.totalLength = this._addedCount + this._removedCount;
|
| - callback(items);
|
| - }
|
| + function didReceiveAddedItems(itemsRange) {
|
| + var items = itemsRange.items;
|
| + for (var i = 0; i < items.length; i++)
|
| + items[i].isAddedNotRemoved = true;
|
| + if (itemsRange.endPosition < endPosition)
|
| + return this._deletedNodesProvider.serializeItemsRange(
|
| + 0, endPosition - itemsRange.endPosition, didReceiveDeletedItems.bind(this, itemsRange));
|
|
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotCommon.ItemsRange} addedItems
|
| - * @param {!WebInspector.HeapSnapshotCommon.ItemsRange} itemsRange
|
| - * @this {WebInspector.HeapSnapshotDiffNodesProvider}
|
| - */
|
| - function didReceiveDeletedItems(addedItems, itemsRange)
|
| - {
|
| - var items = itemsRange.items;
|
| - if (!addedItems.items.length)
|
| - addedItems.startPosition = this._addedCount + itemsRange.startPosition;
|
| - for (var i = 0; i < items.length; i++) {
|
| - items[i].isAddedNotRemoved = false;
|
| - addedItems.items.push(items[i]);
|
| - }
|
| - addedItems.endPosition = this._addedCount + itemsRange.endPosition;
|
| - didReceiveAllItems.call(this, addedItems);
|
| - }
|
| -
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotCommon.ItemsRange} itemsRange
|
| - * @this {WebInspector.HeapSnapshotDiffNodesProvider}
|
| - */
|
| - function didReceiveAddedItems(itemsRange)
|
| - {
|
| - var items = itemsRange.items;
|
| - for (var i = 0; i < items.length; i++)
|
| - items[i].isAddedNotRemoved = true;
|
| - if (itemsRange.endPosition < endPosition)
|
| - return this._deletedNodesProvider.serializeItemsRange(0, endPosition - itemsRange.endPosition, didReceiveDeletedItems.bind(this, itemsRange));
|
| -
|
| - itemsRange.totalLength = this._addedCount + this._removedCount;
|
| - didReceiveAllItems.call(this, itemsRange);
|
| - }
|
| + itemsRange.totalLength = this._addedCount + this._removedCount;
|
| + didReceiveAllItems.call(this, itemsRange);
|
| + }
|
|
|
| - if (beginPosition < this._addedCount) {
|
| - this._addedNodesProvider.serializeItemsRange(beginPosition, endPosition, didReceiveAddedItems.bind(this));
|
| - } else {
|
| - var emptyRange = new WebInspector.HeapSnapshotCommon.ItemsRange(0, 0, 0, []);
|
| - this._deletedNodesProvider.serializeItemsRange(beginPosition - this._addedCount, endPosition - this._addedCount, didReceiveDeletedItems.bind(this, emptyRange));
|
| - }
|
| - },
|
| + if (beginPosition < this._addedCount) {
|
| + this._addedNodesProvider.serializeItemsRange(beginPosition, endPosition, didReceiveAddedItems.bind(this));
|
| + } else {
|
| + var emptyRange = new WebInspector.HeapSnapshotCommon.ItemsRange(0, 0, 0, []);
|
| + this._deletedNodesProvider.serializeItemsRange(
|
| + beginPosition - this._addedCount, endPosition - this._addedCount,
|
| + didReceiveDeletedItems.bind(this, emptyRange));
|
| + }
|
| + }
|
|
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.HeapSnapshotCommon.ComparatorConfig} comparator
|
| + * @return {!Promise<?>}
|
| + */
|
| + sortAndRewind(comparator) {
|
| /**
|
| - * @override
|
| - * @param {!WebInspector.HeapSnapshotCommon.ComparatorConfig} comparator
|
| + * @this {WebInspector.HeapSnapshotDiffNodesProvider}
|
| * @return {!Promise<?>}
|
| */
|
| - sortAndRewind: function(comparator)
|
| - {
|
| - /**
|
| - * @this {WebInspector.HeapSnapshotDiffNodesProvider}
|
| - * @return {!Promise<?>}
|
| - */
|
| - function afterSort()
|
| - {
|
| - return this._deletedNodesProvider.sortAndRewind(comparator);
|
| - }
|
| - return this._addedNodesProvider.sortAndRewind(comparator).then(afterSort.bind(this));
|
| + function afterSort() {
|
| + return this._deletedNodesProvider.sortAndRewind(comparator);
|
| }
|
| + return this._addedNodesProvider.sortAndRewind(comparator).then(afterSort.bind(this));
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {!WebInspector.HeapSnapshotDiffDataGrid} dataGrid
|
| - * @param {string} className
|
| - * @param {!WebInspector.HeapSnapshotCommon.DiffForClass} diffForClass
|
| - * @extends {WebInspector.HeapSnapshotGridNode}
|
| + * @unrestricted
|
| */
|
| -WebInspector.HeapSnapshotDiffNode = function(dataGrid, className, diffForClass)
|
| -{
|
| - WebInspector.HeapSnapshotGridNode.call(this, dataGrid, true);
|
| +WebInspector.HeapSnapshotDiffNode = class extends WebInspector.HeapSnapshotGridNode {
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotDiffDataGrid} dataGrid
|
| + * @param {string} className
|
| + * @param {!WebInspector.HeapSnapshotCommon.DiffForClass} diffForClass
|
| + */
|
| + constructor(dataGrid, className, diffForClass) {
|
| + super(dataGrid, true);
|
| this._name = className;
|
| this._addedCount = diffForClass.addedCount;
|
| this._removedCount = diffForClass.removedCount;
|
| @@ -1324,209 +1254,193 @@ WebInspector.HeapSnapshotDiffNode = function(dataGrid, className, diffForClass)
|
| this._sizeDelta = diffForClass.sizeDelta;
|
| this._deletedIndexes = diffForClass.deletedIndexes;
|
| this.data = {
|
| - "object": className,
|
| - "addedCount": Number.withThousandsSeparator(this._addedCount),
|
| - "removedCount": Number.withThousandsSeparator(this._removedCount),
|
| - "countDelta": this._signForDelta(this._countDelta) + Number.withThousandsSeparator(Math.abs(this._countDelta)),
|
| - "addedSize": Number.withThousandsSeparator(this._addedSize),
|
| - "removedSize": Number.withThousandsSeparator(this._removedSize),
|
| - "sizeDelta": this._signForDelta(this._sizeDelta) + Number.withThousandsSeparator(Math.abs(this._sizeDelta))
|
| + 'object': className,
|
| + 'addedCount': Number.withThousandsSeparator(this._addedCount),
|
| + 'removedCount': Number.withThousandsSeparator(this._removedCount),
|
| + 'countDelta': this._signForDelta(this._countDelta) + Number.withThousandsSeparator(Math.abs(this._countDelta)),
|
| + 'addedSize': Number.withThousandsSeparator(this._addedSize),
|
| + 'removedSize': Number.withThousandsSeparator(this._removedSize),
|
| + 'sizeDelta': this._signForDelta(this._sizeDelta) + Number.withThousandsSeparator(Math.abs(this._sizeDelta))
|
| };
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!WebInspector.HeapSnapshotDiffNodesProvider}
|
| + */
|
| + createProvider() {
|
| + var tree = this._dataGrid;
|
| + return new WebInspector.HeapSnapshotDiffNodesProvider(
|
| + tree.snapshot.createAddedNodesProvider(tree.baseSnapshot.uid, this._name),
|
| + tree.baseSnapshot.createDeletedNodesProvider(this._deletedIndexes), this._addedCount, this._removedCount);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {string} columnId
|
| + * @return {!Element}
|
| + */
|
| + createCell(columnId) {
|
| + var cell = super.createCell(columnId);
|
| + if (columnId !== 'object')
|
| + cell.classList.add('numeric-column');
|
| + return cell;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotCommon.Node} item
|
| + * @return {!WebInspector.HeapSnapshotInstanceNode}
|
| + */
|
| + _createChildNode(item) {
|
| + if (item.isAddedNotRemoved)
|
| + return new WebInspector.HeapSnapshotInstanceNode(this._dataGrid, this._dataGrid.snapshot, item, false);
|
| + else
|
| + return new WebInspector.HeapSnapshotInstanceNode(this._dataGrid, this._dataGrid.baseSnapshot, item, true);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotCommon.Node} node
|
| + * @return {number}
|
| + */
|
| + _childHashForEntity(node) {
|
| + return node.id;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotInstanceNode} childNode
|
| + * @return {number}
|
| + */
|
| + _childHashForNode(childNode) {
|
| + return childNode.snapshotNodeId;
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.HeapSnapshotCommon.ComparatorConfig}
|
| + */
|
| + comparator() {
|
| + var sortAscending = this._dataGrid.isSortOrderAscending();
|
| + var sortColumnId = this._dataGrid.sortColumnId();
|
| + var sortFields = {
|
| + object: ['name', sortAscending, 'id', true],
|
| + addedCount: ['name', true, 'id', true],
|
| + removedCount: ['name', true, 'id', true],
|
| + countDelta: ['name', true, 'id', true],
|
| + addedSize: ['selfSize', sortAscending, 'id', true],
|
| + removedSize: ['selfSize', sortAscending, 'id', true],
|
| + sizeDelta: ['selfSize', sortAscending, 'id', true]
|
| + }[sortColumnId];
|
| + return WebInspector.HeapSnapshotGridNode.createComparator(sortFields);
|
| + }
|
| +
|
| + /**
|
| + * @param {string} filterValue
|
| + * @return {boolean}
|
| + */
|
| + filteredOut(filterValue) {
|
| + return this._name.toLowerCase().indexOf(filterValue) === -1;
|
| + }
|
| +
|
| + _signForDelta(delta) {
|
| + if (delta === 0)
|
| + return '';
|
| + if (delta > 0)
|
| + return '+';
|
| + else
|
| + return '\u2212'; // Math minus sign, same width as plus.
|
| + }
|
| };
|
|
|
| -WebInspector.HeapSnapshotDiffNode.prototype = {
|
| - /**
|
| - * @override
|
| - * @return {!WebInspector.HeapSnapshotDiffNodesProvider}
|
| - */
|
| - createProvider: function()
|
| - {
|
| - var tree = this._dataGrid;
|
| - return new WebInspector.HeapSnapshotDiffNodesProvider(
|
| - tree.snapshot.createAddedNodesProvider(tree.baseSnapshot.uid, this._name),
|
| - tree.baseSnapshot.createDeletedNodesProvider(this._deletedIndexes),
|
| - this._addedCount,
|
| - this._removedCount);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {string} columnId
|
| - * @return {!Element}
|
| - */
|
| - createCell: function(columnId)
|
| - {
|
| - var cell = WebInspector.HeapSnapshotGridNode.prototype.createCell.call(this, columnId);
|
| - if (columnId !== "object")
|
| - cell.classList.add("numeric-column");
|
| - return cell;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotCommon.Node} item
|
| - * @return {!WebInspector.HeapSnapshotInstanceNode}
|
| - */
|
| - _createChildNode: function(item)
|
| - {
|
| - if (item.isAddedNotRemoved)
|
| - return new WebInspector.HeapSnapshotInstanceNode(this._dataGrid, this._dataGrid.snapshot, item, false);
|
| - else
|
| - return new WebInspector.HeapSnapshotInstanceNode(this._dataGrid, this._dataGrid.baseSnapshot, item, true);
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotCommon.Node} node
|
| - * @return {number}
|
| - */
|
| - _childHashForEntity: function(node)
|
| - {
|
| - return node.id;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotInstanceNode} childNode
|
| - * @return {number}
|
| - */
|
| - _childHashForNode: function(childNode)
|
| - {
|
| - return childNode.snapshotNodeId;
|
| - },
|
| -
|
| - /**
|
| - * @return {!WebInspector.HeapSnapshotCommon.ComparatorConfig}
|
| - */
|
| - comparator: function()
|
| - {
|
| - var sortAscending = this._dataGrid.isSortOrderAscending();
|
| - var sortColumnId = this._dataGrid.sortColumnId();
|
| - var sortFields = {
|
| - object: ["name", sortAscending, "id", true],
|
| - addedCount: ["name", true, "id", true],
|
| - removedCount: ["name", true, "id", true],
|
| - countDelta: ["name", true, "id", true],
|
| - addedSize: ["selfSize", sortAscending, "id", true],
|
| - removedSize: ["selfSize", sortAscending, "id", true],
|
| - sizeDelta: ["selfSize", sortAscending, "id", true]
|
| - }[sortColumnId];
|
| - return WebInspector.HeapSnapshotGridNode.createComparator(sortFields);
|
| - },
|
| -
|
| - /**
|
| - * @param {string} filterValue
|
| - * @return {boolean}
|
| - */
|
| - filteredOut: function(filterValue)
|
| - {
|
| - return this._name.toLowerCase().indexOf(filterValue) === -1;
|
| - },
|
| -
|
| - _signForDelta: function(delta)
|
| - {
|
| - if (delta === 0)
|
| - return "";
|
| - if (delta > 0)
|
| - return "+";
|
| - else
|
| - return "\u2212"; // Math minus sign, same width as plus.
|
| - },
|
| -
|
| - __proto__: WebInspector.HeapSnapshotGridNode.prototype
|
| -};
|
| -
|
| -
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.HeapSnapshotGridNode}
|
| - * @param {!WebInspector.AllocationDataGrid} dataGrid
|
| - * @param {!WebInspector.HeapSnapshotCommon.SerializedAllocationNode} data
|
| + * @unrestricted
|
| */
|
| -WebInspector.AllocationGridNode = function(dataGrid, data)
|
| -{
|
| - WebInspector.HeapSnapshotGridNode.call(this, dataGrid, data.hasChildren);
|
| +WebInspector.AllocationGridNode = class extends WebInspector.HeapSnapshotGridNode {
|
| + /**
|
| + * @param {!WebInspector.AllocationDataGrid} dataGrid
|
| + * @param {!WebInspector.HeapSnapshotCommon.SerializedAllocationNode} data
|
| + */
|
| + constructor(dataGrid, data) {
|
| + super(dataGrid, data.hasChildren);
|
| this._populated = false;
|
| this._allocationNode = data;
|
| this.data = {
|
| - "liveCount": Number.withThousandsSeparator(data.liveCount),
|
| - "count": Number.withThousandsSeparator(data.count),
|
| - "liveSize": Number.withThousandsSeparator(data.liveSize),
|
| - "size": Number.withThousandsSeparator(data.size),
|
| - "name": data.name
|
| + 'liveCount': Number.withThousandsSeparator(data.liveCount),
|
| + 'count': Number.withThousandsSeparator(data.count),
|
| + 'liveSize': Number.withThousandsSeparator(data.liveSize),
|
| + 'size': Number.withThousandsSeparator(data.size),
|
| + 'name': data.name
|
| };
|
| -};
|
| -
|
| -WebInspector.AllocationGridNode.prototype = {
|
| - populate: function()
|
| - {
|
| - if (this._populated)
|
| - return;
|
| - this._populated = true;
|
| - this._dataGrid.snapshot.allocationNodeCallers(this._allocationNode.id, didReceiveCallers.bind(this));
|
| -
|
| - /**
|
| - * @param {!WebInspector.HeapSnapshotCommon.AllocationNodeCallers} callers
|
| - * @this {WebInspector.AllocationGridNode}
|
| - */
|
| - function didReceiveCallers(callers)
|
| - {
|
| - var callersChain = callers.nodesWithSingleCaller;
|
| - var parentNode = this;
|
| - var dataGrid = /** @type {!WebInspector.AllocationDataGrid} */ (this._dataGrid);
|
| - for (var i = 0; i < callersChain.length; i++) {
|
| - var child = new WebInspector.AllocationGridNode(dataGrid, callersChain[i]);
|
| - dataGrid.appendNode(parentNode, child);
|
| - parentNode = child;
|
| - parentNode._populated = true;
|
| - if (this.expanded)
|
| - parentNode.expand();
|
| - }
|
| -
|
| - var callersBranch = callers.branchingCallers;
|
| - callersBranch.sort(this._dataGrid._createComparator());
|
| - for (var i = 0; i < callersBranch.length; i++)
|
| - dataGrid.appendNode(parentNode, new WebInspector.AllocationGridNode(dataGrid, callersBranch[i]));
|
| - dataGrid.updateVisibleNodes(true);
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - expand: function()
|
| - {
|
| - WebInspector.HeapSnapshotGridNode.prototype.expand.call(this);
|
| - if (this.children.length === 1)
|
| - this.children[0].expand();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {string} columnId
|
| - * @return {!Element}
|
| - */
|
| - createCell: function(columnId)
|
| - {
|
| - if (columnId !== "name")
|
| - return this._createValueCell(columnId);
|
| -
|
| - var cell = WebInspector.HeapSnapshotGridNode.prototype.createCell.call(this, columnId);
|
| - var allocationNode = this._allocationNode;
|
| - var target = this._dataGrid.target();
|
| - if (allocationNode.scriptId) {
|
| - var linkifier = this._dataGrid._linkifier;
|
| - var urlElement = linkifier.linkifyScriptLocation(target, String(allocationNode.scriptId), allocationNode.scriptName, allocationNode.line - 1, allocationNode.column - 1, "profile-node-file");
|
| - urlElement.style.maxWidth = "75%";
|
| - cell.insertBefore(urlElement, cell.firstChild);
|
| - }
|
| - return cell;
|
| - },
|
| -
|
| - /**
|
| - * @return {number}
|
| - */
|
| - allocationNodeId: function()
|
| - {
|
| - return this._allocationNode.id;
|
| - },
|
| -
|
| - __proto__: WebInspector.HeapSnapshotGridNode.prototype
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + populate() {
|
| + if (this._populated)
|
| + return;
|
| + this._populated = true;
|
| + this._dataGrid.snapshot.allocationNodeCallers(this._allocationNode.id, didReceiveCallers.bind(this));
|
| +
|
| + /**
|
| + * @param {!WebInspector.HeapSnapshotCommon.AllocationNodeCallers} callers
|
| + * @this {WebInspector.AllocationGridNode}
|
| + */
|
| + function didReceiveCallers(callers) {
|
| + var callersChain = callers.nodesWithSingleCaller;
|
| + var parentNode = this;
|
| + var dataGrid = /** @type {!WebInspector.AllocationDataGrid} */ (this._dataGrid);
|
| + for (var i = 0; i < callersChain.length; i++) {
|
| + var child = new WebInspector.AllocationGridNode(dataGrid, callersChain[i]);
|
| + dataGrid.appendNode(parentNode, child);
|
| + parentNode = child;
|
| + parentNode._populated = true;
|
| + if (this.expanded)
|
| + parentNode.expand();
|
| + }
|
| +
|
| + var callersBranch = callers.branchingCallers;
|
| + callersBranch.sort(this._dataGrid._createComparator());
|
| + for (var i = 0; i < callersBranch.length; i++)
|
| + dataGrid.appendNode(parentNode, new WebInspector.AllocationGridNode(dataGrid, callersBranch[i]));
|
| + dataGrid.updateVisibleNodes(true);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + expand() {
|
| + super.expand();
|
| + if (this.children.length === 1)
|
| + this.children[0].expand();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {string} columnId
|
| + * @return {!Element}
|
| + */
|
| + createCell(columnId) {
|
| + if (columnId !== 'name')
|
| + return this._createValueCell(columnId);
|
| +
|
| + var cell = super.createCell(columnId);
|
| + var allocationNode = this._allocationNode;
|
| + var target = this._dataGrid.target();
|
| + if (allocationNode.scriptId) {
|
| + var linkifier = this._dataGrid._linkifier;
|
| + var urlElement = linkifier.linkifyScriptLocation(
|
| + target, String(allocationNode.scriptId), allocationNode.scriptName, allocationNode.line - 1,
|
| + allocationNode.column - 1, 'profile-node-file');
|
| + urlElement.style.maxWidth = '75%';
|
| + cell.insertBefore(urlElement, cell.firstChild);
|
| + }
|
| + return cell;
|
| + }
|
| +
|
| + /**
|
| + * @return {number}
|
| + */
|
| + allocationNodeId() {
|
| + return this._allocationNode.id;
|
| + }
|
| };
|
|
|