12fc2651226baac27029e38c9d6ef883fa32084dbSteve Block/* 22fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Copyright (C) 2011 Google Inc. All rights reserved. 32fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * 42fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Redistribution and use in source and binary forms, with or without 52fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * modification, are permitted provided that the following conditions are 62fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * met: 72fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * 82fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * * Redistributions of source code must retain the above copyright 92fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * notice, this list of conditions and the following disclaimer. 102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * * Redistributions in binary form must reproduce the above 112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * copyright notice, this list of conditions and the following disclaimer 122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * in the documentation and/or other materials provided with the 132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * distribution. 142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * * Neither the name of Google Inc. nor the names of its 152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * contributors may be used to endorse or promote products derived from 162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * this software without specific prior written permission. 172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * 182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block */ 302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotContainmentDataGrid = function() 3281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 3381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var columns = { 3481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch object: { title: WebInspector.UIString("Object"), disclosure: true, sortable: true, sort: "ascending" }, 3581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch shallowSize: { title: WebInspector.UIString("Shallow Size"), width: "90px", sortable: true }, 3681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch retainedSize: { title: WebInspector.UIString("Retained Size"), width: "90px", sortable: true } 3781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }; 3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WebInspector.DataGrid.call(this, columns); 3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.addEventListener("sorting changed", this.sort, this); 4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 4181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotContainmentDataGrid.prototype = { 432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _defaultPopulateCount: 100, 442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch setDataSource: function(snapshotView, snapshot) 4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.snapshotView = snapshotView; 4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.snapshot = snapshot; 492bde8e466a4451c7319e3a072d118917957d6554Steve Block this.snapshotNodeIndex = this.snapshot.rootNodeIndex; 502bde8e466a4451c7319e3a072d118917957d6554Steve Block this._provider = this._createProvider(snapshot, this.snapshotNodeIndex); 5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.sort(); 5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}; 5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochMixInSnapshotNodeFunctions(WebInspector.HeapSnapshotObjectNode.prototype, WebInspector.HeapSnapshotContainmentDataGrid.prototype); 5681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotContainmentDataGrid.prototype.__proto__ = WebInspector.DataGrid.prototype; 5781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotSortableDataGrid = function(columns) 5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WebInspector.DataGrid.call(this, columns); 6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.addEventListener("sorting changed", this.sortingChanged, this); 6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotSortableDataGrid.prototype = { 6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch sortingChanged: function() 6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var sortAscending = this.sortOrder === "ascending"; 6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var sortColumnIdentifier = this.sortColumnIdentifier; 692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (this._lastSortColumnIdentifier === sortColumnIdentifier && this._lastSortAscending === sortAscending) 702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._lastSortColumnIdentifier = sortColumnIdentifier; 722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._lastSortAscending = sortAscending; 7381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var sortFields = this._sortFields(sortColumnIdentifier, sortAscending); 7481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch function SortByTwoFields(nodeA, nodeB) 7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var field1 = nodeA[sortFields[0]]; 7881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var field2 = nodeB[sortFields[0]]; 7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var result = field1 < field2 ? -1 : (field1 > field2 ? 1 : 0); 8081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!sortFields[1]) 8181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch result = -result; 8281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (result !== 0) 8381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return result; 8481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch field1 = nodeA[sortFields[2]]; 8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch field2 = nodeB[sortFields[2]]; 8681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch result = field1 < field2 ? -1 : (field1 > field2 ? 1 : 0); 8781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!sortFields[3]) 8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch result = -result; 8981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return result; 9081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 9181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._performSorting(SortByTwoFields); 9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _performSorting: function(sortFunction) 9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.dispatchEventToListeners("start sorting"); 9881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var children = this.children; 9981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.removeChildren(); 10081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch children.sort(sortFunction); 10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for (var i = 0, l = children.length; i < l; ++i) { 10281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var child = children[i]; 10381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.appendChild(child); 10481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (child.expanded) 10581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch child.sort(); 10681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 1072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.dispatchEventToListeners("sorting complete"); 10881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}; 11081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 11181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotSortableDataGrid.prototype.__proto__ = WebInspector.DataGrid.prototype; 11281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 11381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotConstructorsDataGrid = function() 11481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 11581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var columns = { 11681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch object: { title: WebInspector.UIString("Constructor"), disclosure: true, sortable: true }, 11781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch count: { title: WebInspector.UIString("#"), width: "45px", sortable: true }, 11881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch shallowSize: { title: WebInspector.UIString("Shallow Size"), width: "90px", sortable: true }, 11981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch retainedSize: { title: WebInspector.UIString("Retained Size"), width: "90px", sort: "descending", sortable: true } 12081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }; 12181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WebInspector.HeapSnapshotSortableDataGrid.call(this, columns); 12281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 12381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 12481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotConstructorsDataGrid.prototype = { 1252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _defaultPopulateCount: 100, 1262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 12781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _sortFields: function(sortColumn, sortAscending) 12881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 12981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return { 13081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch object: ["_name", sortAscending, "_count", false], 13181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch count: ["_count", sortAscending, "_name", true], 13281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch shallowSize: ["_shallowSize", sortAscending, "_name", true], 13381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch retainedSize: ["_retainedSize", sortAscending, "_name", true] 13481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }[sortColumn]; 13581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 13681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 13781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch setDataSource: function(snapshotView, snapshot) 13881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 13981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.snapshotView = snapshotView; 14081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.snapshot = snapshot; 14181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.populateChildren(); 14281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 14381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 14481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch populateChildren: function() 14581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 1462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch function aggregatesReceived(aggregates) 1472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (var constructor in aggregates) 1492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.appendChild(new WebInspector.HeapSnapshotConstructorNode(this, constructor, aggregates[constructor])); 1502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.sortingChanged(); 1512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.snapshot.aggregates(false, aggregatesReceived.bind(this)); 15381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 15481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}; 15581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 15681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotConstructorsDataGrid.prototype.__proto__ = WebInspector.HeapSnapshotSortableDataGrid.prototype; 15781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 15881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotDiffDataGrid = function() 15981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 16081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var columns = { 16181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch object: { title: WebInspector.UIString("Constructor"), disclosure: true, sortable: true }, 16281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch addedCount: { title: WebInspector.UIString("# New"), width: "72px", sortable: true, sort: "descending" }, 16381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch removedCount: { title: WebInspector.UIString("# Deleted"), width: "72px", sortable: true }, 16481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // \u0394 is a Greek delta letter. 16581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch countDelta: { title: "\u0394", width: "40px", sortable: true }, 16681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch addedSize: { title: WebInspector.UIString("Alloc. Size"), width: "72px", sortable: true }, 16781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch removedSize: { title: WebInspector.UIString("Freed Size"), width: "72px", sortable: true }, 16881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch sizeDelta: { title: "\u0394", width: "72px", sortable: true } 16981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }; 17081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WebInspector.HeapSnapshotSortableDataGrid.call(this, columns); 17181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 17281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 17381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotDiffDataGrid.prototype = { 1742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _defaultPopulateCount: 50, 1752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 17681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _sortFields: function(sortColumn, sortAscending) 17781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 17881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return { 17981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch object: ["_name", sortAscending, "_count", false], 18081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch addedCount: ["_addedCount", sortAscending, "_name", true], 18181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch removedCount: ["_removedCount", sortAscending, "_name", true], 18281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch countDelta: ["_countDelta", sortAscending, "_name", true], 18381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch addedSize: ["_addedSize", sortAscending, "_name", true], 18481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch removedSize: ["_removedSize", sortAscending, "_name", true], 18581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch sizeDelta: ["_sizeDelta", sortAscending, "_name", true] 18681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }[sortColumn]; 18781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 18881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 18981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch setDataSource: function(snapshotView, snapshot) 19081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 19181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.snapshotView = snapshotView; 19281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.snapshot = snapshot; 19381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 19481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 19581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch setBaseDataSource: function(baseSnapshot) 19681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 19781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.baseSnapshot = baseSnapshot; 19881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.removeChildren(); 1992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (this.baseSnapshot === this.snapshot) 2002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 2012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.populateChildren(); 20281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 20381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 20481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch populateChildren: function() 20581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 2062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch function baseAggregatesReceived(baseClasses) 2072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch function aggregatesReceived(classes) 2092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var nodeCount = 0; 2112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch function addNodeIfNonZeroDiff(node, zeroDiff) 2122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!zeroDiff) 2142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.appendChild(node); 2152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!--nodeCount) 2162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.sortingChanged(); 2172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (var clss in baseClasses) { 2192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var node = new WebInspector.HeapSnapshotDiffNode(this, clss, baseClasses[clss], classes[clss]); 2202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ++nodeCount; 2212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch node.calculateDiff(this, addNodeIfNonZeroDiff.bind(this, node)); 2222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (clss in classes) { 2242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!(clss in baseClasses)) { 2252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var node = new WebInspector.HeapSnapshotDiffNode(this, clss, null, classes[clss]); 2262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ++nodeCount; 2272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch node.calculateDiff(this, addNodeIfNonZeroDiff.bind(this, node)); 2282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 23081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 2312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.snapshot.aggregates(true, aggregatesReceived.bind(this)); 23281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 2332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.baseSnapshot.aggregates(true, baseAggregatesReceived.bind(this)); 23481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 23581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}; 23681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 23781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotDiffDataGrid.prototype.__proto__ = WebInspector.HeapSnapshotSortableDataGrid.prototype; 23881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 23981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotDominatorsDataGrid = function() 24081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 24181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var columns = { 24281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch object: { title: WebInspector.UIString("Object"), disclosure: true, sortable: true }, 24381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch shallowSize: { title: WebInspector.UIString("Shallow Size"), width: "90px", sortable: true }, 24481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch retainedSize: { title: WebInspector.UIString("Retained Size"), width: "90px", sort: "descending", sortable: true } 24581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }; 24681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WebInspector.DataGrid.call(this, columns); 24781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.addEventListener("sorting changed", this.sort, this); 24881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 24981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 25081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotDominatorsDataGrid.prototype = { 2512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _defaultPopulateCount: 25, 2522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 25381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch setDataSource: function(snapshotView, snapshot) 25481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 25581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.snapshotView = snapshotView; 25681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.snapshot = snapshot; 2572bde8e466a4451c7319e3a072d118917957d6554Steve Block this.snapshotNodeIndex = this.snapshot.rootNodeIndex; 25881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._provider = this._createProvider(snapshot, this.snapshotNodeIndex); 25981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.sort(); 26081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 26181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}; 26281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 26381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochMixInSnapshotNodeFunctions(WebInspector.HeapSnapshotDominatorObjectNode.prototype, WebInspector.HeapSnapshotDominatorsDataGrid.prototype); 26481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotDominatorsDataGrid.prototype.__proto__ = WebInspector.DataGrid.prototype; 26581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 26681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotRetainingPathsList = function() 26781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 26881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var columns = { 26981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch path: { title: WebInspector.UIString("Retaining path"), sortable: true }, 27081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch len: { title: WebInspector.UIString("Length"), width: "90px", sortable: true, sort: "ascending" } 27181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }; 27281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WebInspector.HeapSnapshotSortableDataGrid.call(this, columns); 2732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._defaultPopulateCount = 100; 27481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 27581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 27681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotRetainingPathsList.prototype = { 27781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _sortFields: function(sortColumn, sortAscending) 27881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 27981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return { 28081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch path: ["path", sortAscending, "len", true], 28181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch len: ["len", sortAscending, "path", true] 28281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }[sortColumn]; 28381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 28481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 2852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _resetPaths: function() 2862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._setRootChildrenForFinder(); 2882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.removeChildren(); 2892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._counter = 0; 2902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.showNext(this._defaultPopulateCount); 2912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }, 2922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 29381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch setDataSource: function(snapshotView, snapshot, nodeIndex, prefix) 29481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 29581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.snapshotView = snapshotView; 29681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._prefix = prefix; 29781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 29881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (this.pathFinder) 29981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.searchCancelled(); 3002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.pathFinder = snapshot.createPathFinder(nodeIndex); 3012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._resetPaths(); 3022bde8e466a4451c7319e3a072d118917957d6554Steve Block }, 3032bde8e466a4451c7319e3a072d118917957d6554Steve Block 3042bde8e466a4451c7319e3a072d118917957d6554Steve Block refresh: function() 3052bde8e466a4451c7319e3a072d118917957d6554Steve Block { 3062bde8e466a4451c7319e3a072d118917957d6554Steve Block delete this._cancel; 3072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._resetPaths(); 30881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 30981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 31081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch showNext: function(pathsCount) 31181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 31281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WebInspector.PleaseWaitMessage.prototype.show(this.element, this.searchCancelled.bind(this, pathsCount)); 3132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch function pathFound(result) 3152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (result === null) { 3172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WebInspector.PleaseWaitMessage.prototype.hide(); 3182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!this.children.length) 3192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.appendChild(new WebInspector.DataGridNode({path:WebInspector.UIString("Can't find any paths."), len:""}, false)); 3202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 3212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } else if (result !== false) { 3222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (this._prefix) 3232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch result.path = this._prefix + result.path; 3242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.appendChild(new WebInspector.DataGridNode(result, false)); 3252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ++this._counter; 3262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch setTimeout(startSearching.bind(this), 0); 3282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 32981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 33081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch function startSearching() 33181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 3322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (this._cancel === this.pathFinder) 3332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 3342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch delete this._cancel; 3352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (this._counter < pathsCount) 3362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.pathFinder.findNext(pathFound.bind(this)); 3372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch else { 3382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.searchCancelled.call(this, pathsCount); 3392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch delete this._cancel; 34081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 34181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 3422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch setTimeout(startSearching.bind(this), 0); 34381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 34481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 34581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch searchCancelled: function(pathsCount) 34681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 34781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WebInspector.PleaseWaitMessage.prototype.hide(); 34881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._counter = 0; 34981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._cancel = this.pathFinder; 35081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (pathsCount) { 35181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.appendChild(new WebInspector.ShowMoreDataGridNode(this.showNext.bind(this), pathsCount)); 35281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.sortingChanged(); 35381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 35481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 35581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 3562bde8e466a4451c7319e3a072d118917957d6554Steve Block _setRootChildrenForFinder: function() 3572bde8e466a4451c7319e3a072d118917957d6554Steve Block { 3582bde8e466a4451c7319e3a072d118917957d6554Steve Block function FilterDOMWindow(node) 3592bde8e466a4451c7319e3a072d118917957d6554Steve Block { 3602bde8e466a4451c7319e3a072d118917957d6554Steve Block return node.name === "DOMWindow"; 3612bde8e466a4451c7319e3a072d118917957d6554Steve Block } 3622bde8e466a4451c7319e3a072d118917957d6554Steve Block 3632bde8e466a4451c7319e3a072d118917957d6554Steve Block if (this.snapshotView.isTracingToWindowObjects) 3642bde8e466a4451c7319e3a072d118917957d6554Steve Block this.pathFinder.updateRoots(FilterDOMWindow); 3652bde8e466a4451c7319e3a072d118917957d6554Steve Block else 3662bde8e466a4451c7319e3a072d118917957d6554Steve Block this.pathFinder.updateRoots(); 3672bde8e466a4451c7319e3a072d118917957d6554Steve Block }, 3682bde8e466a4451c7319e3a072d118917957d6554Steve Block 36981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _performSorting: function(sortFunction) 37081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 37181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch function DataExtractorWrapper(nodeA, nodeB) 37281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 37381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return sortFunction(nodeA.data, nodeB.data); 37481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 37581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 37681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.sortNodes(DataExtractorWrapper); 37781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 37881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}; 37981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 38081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.HeapSnapshotRetainingPathsList.prototype.__proto__ = WebInspector.HeapSnapshotSortableDataGrid.prototype; 38181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 3822fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWebInspector.DetailedHeapshotView = function(parent, profile) 3832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 3842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block WebInspector.View.call(this); 3852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 38681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.element.addStyleClass("detailed-heapshot-view"); 3872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 3882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block this.parent = parent; 38981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.parent.addEventListener("profile added", this._updateBaseOptions, this); 39081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 39181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.showCountAsPercent = false; 39281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.showShallowSizeAsPercent = false; 39381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.showRetainedSizeAsPercent = false; 39481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 39581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.containmentView = new WebInspector.View(); 39681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.containmentView.element.addStyleClass("view"); 39781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.containmentDataGrid = new WebInspector.HeapSnapshotContainmentDataGrid(); 39881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.containmentDataGrid.element.addEventListener("click", this._mouseClickInContainmentGrid.bind(this), true); 39981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.containmentView.element.appendChild(this.containmentDataGrid.element); 40081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.element.appendChild(this.containmentView.element); 40181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 40281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.constructorsView = new WebInspector.View(); 40381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.constructorsView.element.addStyleClass("view"); 40481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.constructorsDataGrid = new WebInspector.HeapSnapshotConstructorsDataGrid(); 40581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.constructorsDataGrid.element.addEventListener("click", this._mouseClickInContainmentGrid.bind(this), true); 40681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.constructorsView.element.appendChild(this.constructorsDataGrid.element); 40781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.element.appendChild(this.constructorsView.element); 40881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 40981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.diffView = new WebInspector.View(); 41081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.diffView.element.addStyleClass("view"); 41181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.diffDataGrid = new WebInspector.HeapSnapshotDiffDataGrid(); 41281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.diffDataGrid.element.addEventListener("click", this._mouseClickInContainmentGrid.bind(this), true); 41381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.diffView.element.appendChild(this.diffDataGrid.element); 41481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.element.appendChild(this.diffView.element); 41581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 41681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.dominatorView = new WebInspector.View(); 41781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.dominatorView.element.addStyleClass("view"); 41881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.dominatorDataGrid = new WebInspector.HeapSnapshotDominatorsDataGrid(); 41981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.dominatorDataGrid.element.addEventListener("click", this._mouseClickInContainmentGrid.bind(this), true); 42081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.dominatorView.element.appendChild(this.dominatorDataGrid.element); 42181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.element.appendChild(this.dominatorView.element); 42281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 42381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var retainmentView = new WebInspector.View(); 4242bde8e466a4451c7319e3a072d118917957d6554Steve Block retainmentView.element.addStyleClass("view"); 4252bde8e466a4451c7319e3a072d118917957d6554Steve Block retainmentView.element.addStyleClass("retaining-paths-view"); 42681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var retainingPathsTitleDiv = document.createElement("div"); 42781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch retainingPathsTitleDiv.className = "title"; 42881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var retainingPathsTitle = document.createElement("span"); 4292bde8e466a4451c7319e3a072d118917957d6554Steve Block retainingPathsTitle.textContent = WebInspector.UIString("Paths from the selected object"); 4302bde8e466a4451c7319e3a072d118917957d6554Steve Block this.retainingPathsRoot = document.createElement("select"); 4312bde8e466a4451c7319e3a072d118917957d6554Steve Block this.retainingPathsRoot.className = "status-bar-item"; 4322bde8e466a4451c7319e3a072d118917957d6554Steve Block this.retainingPathsRoot.addEventListener("change", this._changeRetainingPathsRoot.bind(this), false); 4332bde8e466a4451c7319e3a072d118917957d6554Steve Block var toGCRootsTraceOption = document.createElement("option"); 4342bde8e466a4451c7319e3a072d118917957d6554Steve Block toGCRootsTraceOption.label = WebInspector.UIString("to GC roots"); 4352bde8e466a4451c7319e3a072d118917957d6554Steve Block var toWindowObjectsTraceOption = document.createElement("option"); 4362bde8e466a4451c7319e3a072d118917957d6554Steve Block toWindowObjectsTraceOption.label = WebInspector.UIString("to window objects"); 4372bde8e466a4451c7319e3a072d118917957d6554Steve Block this.retainingPathsRoot.appendChild(toGCRootsTraceOption); 4382bde8e466a4451c7319e3a072d118917957d6554Steve Block this.retainingPathsRoot.appendChild(toWindowObjectsTraceOption); 43981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch retainingPathsTitleDiv.appendChild(retainingPathsTitle); 4402bde8e466a4451c7319e3a072d118917957d6554Steve Block retainingPathsTitleDiv.appendChild(this.retainingPathsRoot); 44181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch retainmentView.element.appendChild(retainingPathsTitleDiv); 44281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.retainmentDataGrid = new WebInspector.HeapSnapshotRetainingPathsList(); 44381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch retainmentView.element.appendChild(this.retainmentDataGrid.element); 44481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch retainmentView.visible = true; 44581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.element.appendChild(retainmentView.element); 44681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 44781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.dataGrid = this.constructorsDataGrid; 44881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.currentView = this.constructorsView; 44981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 45081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.viewSelectElement = document.createElement("select"); 45181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.viewSelectElement.className = "status-bar-item"; 45281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.viewSelectElement.addEventListener("change", this._changeView.bind(this), false); 45381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 4542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.views = [{title: "Summary", view: this.constructorsView, grid: this.constructorsDataGrid}, 4552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch {title: "Comparison", view: this.diffView, grid: this.diffDataGrid}, 4562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch {title: "Containment", view: this.containmentView, grid: this.containmentDataGrid}, 4572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch {title: "Dominators", view: this.dominatorView, grid: this.dominatorDataGrid}]; 45881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.views.current = 0; 4592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (var i = 0; i < this.views.length; ++i) { 4602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var view = this.views[i]; 4612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var option = document.createElement("option"); 4622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch option.label = WebInspector.UIString(view.title); 4632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.viewSelectElement.appendChild(option); 4642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 46581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 46681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._profileUid = profile.uid; 46781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 46881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.baseSelectElement = document.createElement("select"); 46981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.baseSelectElement.className = "status-bar-item hidden"; 47081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.baseSelectElement.addEventListener("change", this._changeBase.bind(this), false); 47181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._updateBaseOptions(); 47281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 47381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.percentButton = new WebInspector.StatusBarButton("", "percent-time-status-bar-item status-bar-item"); 47481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.percentButton.addEventListener("click", this._percentClicked.bind(this), false); 47581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.helpButton = new WebInspector.StatusBarButton("", "heapshot-help-status-bar-item status-bar-item"); 47681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.helpButton.addEventListener("click", this._helpClicked.bind(this), false); 47781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 4782bde8e466a4451c7319e3a072d118917957d6554Steve Block var popoverHelper = new WebInspector.PopoverHelper(this.element, this._getHoverAnchor.bind(this), this._showStringContentPopup.bind(this)); 4792bde8e466a4451c7319e3a072d118917957d6554Steve Block 48081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._loadProfile(this._profileUid, profileCallback.bind(this)); 48181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 4822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch function profileCallback() 48381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 48481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var list = this._profiles(); 48581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var profileIndex; 48681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for (var i = 0; i < list.length; ++i) 4872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (list[i].uid === this._profileUid) { 48881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch profileIndex = i; 48981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch break; 49081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 49181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (profileIndex > 0) 49281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.baseSelectElement.selectedIndex = profileIndex - 1; 49381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch else 49481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.baseSelectElement.selectedIndex = profileIndex; 49581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.dataGrid.setDataSource(this, this.profileWrapper); 49681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._updatePercentButton(); 49781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 4982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 4992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 5002fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWebInspector.DetailedHeapshotView.prototype = { 50181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch dispose: function() 50281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 50381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (this._profileWrapper) 50481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._profileWrapper.dispose(); 50581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (this._baseProfileWrapper) 50681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._baseProfileWrapper.dispose(); 50781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 50881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 50981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch get statusBarItems() 51081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 51181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return [this.viewSelectElement, this.baseSelectElement, this.percentButton.element, this.helpButton.element]; 51281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 51381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block get profile() 5152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 51681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return this.parent.getProfile(WebInspector.HeapSnapshotProfileType.TypeId, this._profileUid); 5172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block }, 5182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 51981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch get profileWrapper() 5202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 52181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!this._profileWrapper) 5222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._profileWrapper = this.profile.proxy; 52381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return this._profileWrapper; 52481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 52581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 52681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch get baseProfile() 52781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 52881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return this.parent.getProfile(WebInspector.HeapSnapshotProfileType.TypeId, this._baseProfileUid); 52981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 53081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 53181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch get baseProfileWrapper() 53281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 5332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!this._baseProfileWrapper) 5342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._baseProfileWrapper = this.baseProfile.proxy; 53581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return this._baseProfileWrapper; 53681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 53781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 53881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch show: function(parentElement) 53981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 54081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WebInspector.View.prototype.show.call(this, parentElement); 5412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!this.profileWrapper.loaded) 54281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._loadProfile(this._profileUid, profileCallback1.bind(this)); 54381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch else 5442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch profileCallback1.call(this); 54581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch function profileCallback1() { 5472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (this.baseProfile && !this.baseProfileWrapper.loaded) 54881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._loadProfile(this._baseProfileUid, profileCallback2.bind(this)); 54981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch else 5502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch profileCallback2.call(this); 55181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 55281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch function profileCallback2() { 55481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.currentView.show(); 55581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.dataGrid.updateWidths(); 55681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 55781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 55881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 55981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch hide: function() 56081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 56181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WebInspector.View.prototype.hide.call(this); 56281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._currentSearchResultIndex = -1; 56381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 56481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 56581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch resize: function() 56681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 56781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (this.dataGrid) 56881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.dataGrid.updateWidths(); 56981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 57081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 57181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch refreshShowAsPercents: function() 57281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 57381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._updatePercentButton(); 57481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.refreshVisibleData(); 57581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 57681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 57781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch searchCanceled: function() 57881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 57981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (this._searchResults) { 58081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for (var i = 0; i < this._searchResults.length; ++i) { 58181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var node = this._searchResults[i].node; 58281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch delete node._searchMatched; 58381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch node.refresh(); 58481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 58581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 58681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 58781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch delete this._searchFinishedCallback; 58881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._currentSearchResultIndex = -1; 58981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._searchResults = []; 59081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 59181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 59281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch performSearch: function(query, finishedCallback) 59381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 59481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Call searchCanceled since it will reset everything we need before doing a new search. 59581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.searchCanceled(); 59681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 59781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch query = query.trim(); 59881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 59981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!query.length) 60081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 60181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (this.currentView !== this.constructorsView && this.currentView !== this.diffView) 60281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 60381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 60481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._searchFinishedCallback = finishedCallback; 60581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 60681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch function matchesByName(gridNode) { 60781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return ("name" in gridNode) && gridNode.name.hasSubstring(query, true); 60881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 60981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 61081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch function matchesById(gridNode) { 61181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return ("snapshotNodeId" in gridNode) && gridNode.snapshotNodeId === query; 61281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 61381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 61481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var matchPredicate; 61581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (query.charAt(0) !== "@") 61681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch matchPredicate = matchesByName; 61781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch else { 61881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch query = parseInt(query.substring(1), 10); 61981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch matchPredicate = matchesById; 62081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 62181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 62281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch function matchesQuery(gridNode) 62381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 62481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch delete gridNode._searchMatched; 62581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (matchPredicate(gridNode)) { 62681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch gridNode._searchMatched = true; 62781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch gridNode.refresh(); 62881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return true; 62981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 63081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return false; 63181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 63281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 63381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var current = this.dataGrid.children[0]; 63481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var depth = 0; 63581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var info = {}; 63681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 63781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Restrict to type nodes and instances. 63881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch const maxDepth = 1; 63981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 64081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch while (current) { 64181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (matchesQuery(current)) 64281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._searchResults.push({ node: current }); 64381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch current = current.traverseNextNode(false, null, (depth >= maxDepth), info); 64481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch depth += info.depthChange; 64581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 64681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 64781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch finishedCallback(this, this._searchResults.length); 64881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 64981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 65081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch jumpToFirstSearchResult: function() 65181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 65281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!this._searchResults || !this._searchResults.length) 65381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 65481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._currentSearchResultIndex = 0; 65581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._jumpToSearchResult(this._currentSearchResultIndex); 65681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 65781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 65881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch jumpToLastSearchResult: function() 65981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 66081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!this._searchResults || !this._searchResults.length) 66181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 66281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._currentSearchResultIndex = (this._searchResults.length - 1); 66381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._jumpToSearchResult(this._currentSearchResultIndex); 66481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 66581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 66681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch jumpToNextSearchResult: function() 66781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 66881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!this._searchResults || !this._searchResults.length) 66981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 67081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (++this._currentSearchResultIndex >= this._searchResults.length) 67181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._currentSearchResultIndex = 0; 67281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._jumpToSearchResult(this._currentSearchResultIndex); 67381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 67481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 67581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch jumpToPreviousSearchResult: function() 67681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 67781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!this._searchResults || !this._searchResults.length) 67881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 67981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (--this._currentSearchResultIndex < 0) 68081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._currentSearchResultIndex = (this._searchResults.length - 1); 68181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._jumpToSearchResult(this._currentSearchResultIndex); 68281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 68381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 68481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch showingFirstSearchResult: function() 68581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 68681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return (this._currentSearchResultIndex === 0); 68781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 68881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 68981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch showingLastSearchResult: function() 69081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 69181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return (this._searchResults && this._currentSearchResultIndex === (this._searchResults.length - 1)); 69281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 69381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 69481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _jumpToSearchResult: function(index) 69581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 69681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var searchResult = this._searchResults[index]; 69781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!searchResult) 69881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 69981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 70081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var node = searchResult.node; 70181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch node.reveal(); 70281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch node.select(); 70381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 70481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 70581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch refreshVisibleData: function() 70681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 70781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var child = this.dataGrid.children[0]; 70881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch while (child) { 70981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch child.refresh(); 71081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch child = child.traverseNextNode(false, null, true); 71181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 71281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 71381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 71481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _changeBase: function() 71581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 71681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (this._baseProfileUid === this._profiles()[this.baseSelectElement.selectedIndex].uid) 71781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 71881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 71981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._baseProfileUid = this._profiles()[this.baseSelectElement.selectedIndex].uid; 72081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._loadProfile(this._baseProfileUid, baseProfileLoaded.bind(this)); 72181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 7222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch function baseProfileLoaded() 72381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 72481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch delete this._baseProfileWrapper; 72581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.baseProfile._lastShown = Date.now(); 72681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WebInspector.PleaseWaitMessage.prototype.startAction(this.currentView.element, showDiffData.bind(this)); 72781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 72881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 72981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch function showDiffData() 73081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 73181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.diffDataGrid.setBaseDataSource(this.baseProfileWrapper); 73281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 73381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 73481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults) 73581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 73681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 73781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // The current search needs to be performed again. First negate out previous match 73881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // count by calling the search finished callback with a negative number of matches. 73981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Then perform the search again with the same query and callback. 74081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._searchFinishedCallback(this, -this._searchResults.length); 74181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.performSearch(this.currentQuery, this._searchFinishedCallback); 74281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 74381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 74481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _profiles: function() 74581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 74681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return WebInspector.panels.profiles.getProfiles(WebInspector.HeapSnapshotProfileType.TypeId); 74781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 74881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 74981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _loadProfile: function(profileUid, callback) 75081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 75181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WebInspector.panels.profiles.loadHeapSnapshot(profileUid, callback); 75281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 75381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 75481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch isDetailedSnapshot: function(snapshot) 75581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 75681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var s = new WebInspector.HeapSnapshot(snapshot); 75781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for (var iter = s.rootNode.edges; iter.hasNext(); iter.next()) 75881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (iter.edge.node.name === "(GC roots)") 75981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return true; 76081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return false; 76181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 76281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 76381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch processLoadedSnapshot: function(profile, snapshot) 76481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 76581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch profile.nodes = snapshot.nodes; 76681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch profile.strings = snapshot.strings; 76781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var s = new WebInspector.HeapSnapshot(profile); 76881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch profile.sideBarElement.subtitle = Number.bytesToString(s.totalSize); 76981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 77081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 77181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _mouseClickInContainmentGrid: function(event) 77281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 77381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var cell = event.target.enclosingNodeOrSelfWithNodeName("td"); 7742bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!cell || (!cell.hasStyleClass("object-column") && !cell.hasStyleClass("shallowSize-column") && !cell.hasStyleClass("retainedSize-column"))) 77581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 77681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var row = event.target.enclosingNodeOrSelfWithNodeName("tr"); 77781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!row) 77881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 77981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var nodeItem = row._dataGridNode; 78081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!nodeItem || nodeItem.isEventWithinDisclosureTriangle(event) || !nodeItem.snapshotNodeIndex) 78181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 78281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 78381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.retainmentDataGrid.setDataSource(this, nodeItem.isDeletedNode ? nodeItem.dataGrid.baseSnapshot : nodeItem.dataGrid.snapshot, nodeItem.snapshotNodeIndex, nodeItem.isDeletedNode ? this.baseSelectElement.childNodes[this.baseSelectElement.selectedIndex].label + " | " : ""); 78481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 78581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 78681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _changeView: function(event) 78781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 78881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!event || !this._profileUid) 78981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 79081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (event.target.selectedIndex === this.views.current) 79181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 79281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 79381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.views.current = event.target.selectedIndex; 79481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.currentView.hide(); 7952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var view = this.views[this.views.current]; 7962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.currentView = view.view; 7972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.dataGrid = view.grid; 79881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.currentView.show(); 79981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.refreshVisibleData(); 80081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (this.currentView === this.diffView) { 80181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.baseSelectElement.removeStyleClass("hidden"); 80281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!this.dataGrid.snapshotView) { 80381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.dataGrid.setDataSource(this, this.profileWrapper); 80481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._changeBase(); 80581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 80681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } else { 80781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.baseSelectElement.addStyleClass("hidden"); 80881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!this.dataGrid.snapshotView) 80981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WebInspector.PleaseWaitMessage.prototype.startAction(this.currentView.element, loadData.bind(this)); 81081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 81181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 81281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch function loadData() 81381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 81481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.dataGrid.setDataSource(this, this.profileWrapper); 81581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 81681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 81781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults) 81881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 81981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 82081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // The current search needs to be performed again. First negate out previous match 82181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // count by calling the search finished callback with a negative number of matches. 82281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Then perform the search again the with same query and callback. 82381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this._searchFinishedCallback(this, -this._searchResults.length); 82481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.performSearch(this.currentQuery, this._searchFinishedCallback); 82581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 82681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 8272bde8e466a4451c7319e3a072d118917957d6554Steve Block _changeRetainingPathsRoot: function(event) 8282bde8e466a4451c7319e3a072d118917957d6554Steve Block { 8292bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!event) 8302bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 8312bde8e466a4451c7319e3a072d118917957d6554Steve Block this.retainmentDataGrid.refresh(); 8322bde8e466a4451c7319e3a072d118917957d6554Steve Block }, 8332bde8e466a4451c7319e3a072d118917957d6554Steve Block 8342bde8e466a4451c7319e3a072d118917957d6554Steve Block _getHoverAnchor: function(target) 8352bde8e466a4451c7319e3a072d118917957d6554Steve Block { 8362bde8e466a4451c7319e3a072d118917957d6554Steve Block var span = target.enclosingNodeOrSelfWithNodeName("span"); 8372bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!span || !span.hasStyleClass("console-formatted-string")) 8382bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 8392bde8e466a4451c7319e3a072d118917957d6554Steve Block var row = target.enclosingNodeOrSelfWithNodeName("tr"); 8402bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!row) 8412bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 8422bde8e466a4451c7319e3a072d118917957d6554Steve Block var gridNode = row._dataGridNode; 8432bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!gridNode.snapshotNodeIndex) 8442bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 8452bde8e466a4451c7319e3a072d118917957d6554Steve Block span.snapshotNodeIndex = gridNode.snapshotNodeIndex; 8462bde8e466a4451c7319e3a072d118917957d6554Steve Block return span; 8472bde8e466a4451c7319e3a072d118917957d6554Steve Block }, 8482bde8e466a4451c7319e3a072d118917957d6554Steve Block 8492bde8e466a4451c7319e3a072d118917957d6554Steve Block get isTracingToWindowObjects() 8502bde8e466a4451c7319e3a072d118917957d6554Steve Block { 8512bde8e466a4451c7319e3a072d118917957d6554Steve Block return this.retainingPathsRoot.selectedIndex === 1; 8522bde8e466a4451c7319e3a072d118917957d6554Steve Block }, 8532bde8e466a4451c7319e3a072d118917957d6554Steve Block 85481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch get _isShowingAsPercent() 85581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 85681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return this.showCountAsPercent && this.showShallowSizeAsPercent && this.showRetainedSizeAsPercent; 85781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 85881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 85981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _percentClicked: function(event) 86081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 86181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var currentState = this._isShowingAsPercent; 86281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.showCountAsPercent = !currentState; 86381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.showShallowSizeAsPercent = !currentState; 86481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.showRetainedSizeAsPercent = !currentState; 86581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.refreshShowAsPercents(); 86681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 86781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 8682bde8e466a4451c7319e3a072d118917957d6554Steve Block _showStringContentPopup: function(span) 8692bde8e466a4451c7319e3a072d118917957d6554Steve Block { 8702bde8e466a4451c7319e3a072d118917957d6554Steve Block var snapshotNode = new WebInspector.HeapSnapshotNode(this.profileWrapper, span.snapshotNodeIndex); 8712bde8e466a4451c7319e3a072d118917957d6554Steve Block var stringContentElement = document.createElement("span"); 8722bde8e466a4451c7319e3a072d118917957d6554Steve Block stringContentElement.className = "monospace console-formatted-string"; 8732bde8e466a4451c7319e3a072d118917957d6554Steve Block stringContentElement.style.whiteSpace = "pre"; 8742bde8e466a4451c7319e3a072d118917957d6554Steve Block stringContentElement.textContent = "\"" + snapshotNode.name + "\""; 8752bde8e466a4451c7319e3a072d118917957d6554Steve Block var popover = new WebInspector.Popover(stringContentElement); 8762bde8e466a4451c7319e3a072d118917957d6554Steve Block popover.show(span); 8772bde8e466a4451c7319e3a072d118917957d6554Steve Block return popover; 8782bde8e466a4451c7319e3a072d118917957d6554Steve Block }, 8792bde8e466a4451c7319e3a072d118917957d6554Steve Block 88081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _helpClicked: function(event) 88181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 88281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!this.helpPopover) { 88381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var refTypes = ["a:", "console-formatted-name", WebInspector.UIString("property"), 88481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch "0:", "console-formatted-name", WebInspector.UIString("element"), 88581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch "a:", "console-formatted-number", WebInspector.UIString("context var"), 88681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch "a:", "console-formatted-null", WebInspector.UIString("system prop")]; 88781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var objTypes = [" a ", "console-formatted-object", "Object", 88881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch "\"a\"", "console-formatted-string", "String", 88981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch "/a/", "console-formatted-string", "RegExp", 89081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch "a()", "console-formatted-function", "Function", 89181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch "a[]", "console-formatted-object", "Array", 89281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch "num", "console-formatted-number", "Number", 89381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch " a ", "console-formatted-null", "System"]; 89481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 89581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var contentElement = document.createElement("table"); 89681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch contentElement.className = "heapshot-help"; 89781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var headerRow = document.createElement("tr"); 89881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var propsHeader = document.createElement("th"); 89981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch propsHeader.textContent = WebInspector.UIString("Property types:"); 90081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch headerRow.appendChild(propsHeader); 90181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var objsHeader = document.createElement("th"); 90281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch objsHeader.textContent = WebInspector.UIString("Object types:"); 90381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch headerRow.appendChild(objsHeader); 90481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch contentElement.appendChild(headerRow); 90581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var len = Math.max(refTypes.length, objTypes.length); 90681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for (var i = 0; i < len; i += 3) { 90781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var row = document.createElement("tr"); 90881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var refCell = document.createElement("td"); 90981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (refTypes[i]) 91081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch appendHelp(refTypes, i, refCell); 91181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch row.appendChild(refCell); 91281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var objCell = document.createElement("td"); 91381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (objTypes[i]) 91481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch appendHelp(objTypes, i, objCell); 91581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch row.appendChild(objCell); 91681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch contentElement.appendChild(row); 91781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 91881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.helpPopover = new WebInspector.Popover(contentElement); 91981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 92081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch function appendHelp(help, index, cell) 92181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 92281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var div = document.createElement("div"); 92381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch div.className = "source-code event-properties"; 92481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var name = document.createElement("span"); 92581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch name.textContent = help[index]; 92681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch name.className = help[index + 1]; 92781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch div.appendChild(name); 92881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var desc = document.createElement("span"); 92981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch desc.textContent = " " + help[index + 2]; 93081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch div.appendChild(desc); 93181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch cell.appendChild(div); 93281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 93381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 93481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (this.helpPopover.visible) 93581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.helpPopover.hide(); 93681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch else 93781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.helpPopover.show(this.helpButton.element); 93881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 93981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 94081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _updateBaseOptions: function() 94181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 94281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var list = this._profiles(); 94381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // We're assuming that snapshots can only be added. 94481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (this.baseSelectElement.length === list.length) 94581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 94681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 94781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for (var i = this.baseSelectElement.length, n = list.length; i < n; ++i) { 94881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var baseOption = document.createElement("option"); 94981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch var title = list[i].title; 95081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!title.indexOf(UserInitiatedProfileName)) 95181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch title = WebInspector.UIString("Snapshot %d", title.substring(UserInitiatedProfileName.length + 1)); 95281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch baseOption.label = title; 95381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.baseSelectElement.appendChild(baseOption); 95481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 95581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }, 95681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 95781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _updatePercentButton: function() 95881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 95981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (this._isShowingAsPercent) { 96081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.percentButton.title = WebInspector.UIString("Show absolute counts and sizes."); 96181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.percentButton.toggled = true; 96281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } else { 96381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.percentButton.title = WebInspector.UIString("Show counts and sizes as percentages."); 96481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch this.percentButton.toggled = false; 96581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 9662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 9672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}; 9682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 9692fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWebInspector.DetailedHeapshotView.prototype.__proto__ = WebInspector.View.prototype; 9702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 97181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.DetailedHeapshotView.prototype.showHiddenData = true; 97281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 9732fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWebInspector.DetailedHeapshotProfileType = function() 9742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 9752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block WebInspector.ProfileType.call(this, WebInspector.HeapSnapshotProfileType.TypeId, WebInspector.UIString("HEAP SNAPSHOTS")); 9762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 9772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 9782fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWebInspector.DetailedHeapshotProfileType.prototype = { 9792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block get buttonTooltip() 9802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 9812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return WebInspector.UIString("Take heap snapshot."); 9822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block }, 9832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 9842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block get buttonStyle() 9852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 9862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return "heap-snapshot-status-bar-item status-bar-item"; 9872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block }, 9882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 9892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block buttonClicked: function() 9902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 9912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block WebInspector.panels.profiles.takeHeapSnapshot(true); 9922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block }, 9932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 9942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block get welcomeMessage() 9952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 9962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return WebInspector.UIString("Get a heap snapshot by pressing the %s button on the status bar."); 9972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block }, 9982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 9992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block createSidebarTreeElementForProfile: function(profile) 10002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 10012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return new WebInspector.ProfileSidebarTreeElement(profile, WebInspector.UIString("Snapshot %d"), "heap-snapshot-sidebar-tree-item"); 10022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block }, 10032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 10042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block createView: function(profile) 10052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 10062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return new WebInspector.DetailedHeapshotView(WebInspector.panels.profiles, profile); 10072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 10082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 10092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 10102fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWebInspector.DetailedHeapshotProfileType.prototype.__proto__ = WebInspector.ProfileType.prototype; 1011