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