15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @implements {WebInspector.ProfileType.DataDisplayDelegate}
34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.VBox}
35323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * @param {!WebInspector.ProfileType.DataDisplayDelegate} dataDisplayDelegate
36926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {!WebInspector.HeapProfileHeader} profile
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
38323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)WebInspector.HeapSnapshotView = function(dataDisplayDelegate, profile)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.VBox.call(this);
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this.element.classList.add("heap-snapshot-view");
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    profile.profileType().addEventListener(WebInspector.HeapSnapshotProfileType.SnapshotReceived, this._onReceiveSnapshot, this);
4509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    profile.profileType().addEventListener(WebInspector.ProfileType.Events.RemoveProfileHeader, this._onProfileHeaderRemoved, this);
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (profile.profileType().id === WebInspector.TrackingHeapSnapshotProfileType.TypeId) {
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._trackingOverviewGrid = new WebInspector.HeapTrackingOverviewGrid(profile);
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._trackingOverviewGrid.addEventListener(WebInspector.HeapTrackingOverviewGrid.IdsRangeChanged, this._onIdsRangeChanged.bind(this));
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this._parentDataDisplayDelegate = dataDisplayDelegate;
537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._splitView = new WebInspector.SplitView(false, true, "heapSnapshotSplitViewState", 200, 200);
55d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._splitView.show(this.element);
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._containmentView = new WebInspector.VBox();
5807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    this._containmentView.setMinimumSize(50, 25);
597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this._containmentDataGrid = new WebInspector.HeapSnapshotContainmentDataGrid(this);
60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._containmentDataGrid.show(this._containmentView.element);
61d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._containmentDataGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode, this._selectionChanged, this);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
63d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._statisticsView = new WebInspector.HeapSnapshotStatisticsView();
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._constructorsView = new WebInspector.VBox();
6607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    this._constructorsView.setMinimumSize(50, 25);
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this._constructorsDataGrid = new WebInspector.HeapSnapshotConstructorsDataGrid(this);
69d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._constructorsDataGrid.show(this._constructorsView.element);
70d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._constructorsDataGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode, this._selectionChanged, this);
7193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
72d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._diffView = new WebInspector.VBox();
7307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    this._diffView.setMinimumSize(50, 25);
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this._diffDataGrid = new WebInspector.HeapSnapshotDiffDataGrid(this);
76d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._diffDataGrid.show(this._diffView.element);
77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._diffDataGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode, this._selectionChanged, this);
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
79197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (profile._hasAllocationStacks) {
80d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._allocationView = new WebInspector.VBox();
8107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        this._allocationView.setMinimumSize(50, 25);
827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._allocationDataGrid = new WebInspector.AllocationDataGrid(profile.target() , this);
8343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._allocationDataGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode, this._onSelectAllocationNode, this);
84d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._allocationDataGrid.show(this._allocationView.element);
8506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._allocationStackView = new WebInspector.HeapAllocationStackView(profile.target());
87a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._allocationStackView.setMinimumSize(50, 25);
88a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
89a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._tabbedPane = new WebInspector.TabbedPane();
90a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._tabbedPane.closeableTabs = false;
91a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._tabbedPane.headerElement().classList.add("heap-object-details-header");
92a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    }
93d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
94d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._retainmentView = new WebInspector.VBox();
9507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    this._retainmentView.setMinimumSize(50, 21);
96d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._retainmentView.element.classList.add("retaining-paths-view");
97a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
98a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    var splitViewResizer;
99a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (this._allocationStackView) {
100a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._tabbedPane = new WebInspector.TabbedPane();
101a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._tabbedPane.closeableTabs = false;
102a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._tabbedPane.headerElement().classList.add("heap-object-details-header");
103a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
104a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._tabbedPane.appendTab("retainers", WebInspector.UIString("Retainers"), this._retainmentView);
105a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._tabbedPane.appendTab("allocation-stack", WebInspector.UIString("Allocation stack"), this._allocationStackView);
106a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
107a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        splitViewResizer = this._tabbedPane.headerElement();
108a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._objectDetailsView = this._tabbedPane;
109a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    } else {
110a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var retainmentViewHeader = document.createElementWithClass("div", "heap-snapshot-view-resizer");
111a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var retainingPathsTitleDiv = retainmentViewHeader.createChild("div", "title");
112a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var retainingPathsTitle = retainingPathsTitleDiv.createChild("span");
113a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        retainingPathsTitle.textContent = WebInspector.UIString("Retainers");
114a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._retainmentView.element.appendChild(retainmentViewHeader);
115a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
116a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        splitViewResizer = retainmentViewHeader;
117a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._objectDetailsView = this._retainmentView;
118a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    }
119a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    this._splitView.hideDefaultResizer();
120a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    this._splitView.installResizer(splitViewResizer);
121a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
1227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this._retainmentDataGrid = new WebInspector.HeapSnapshotRetainmentDataGrid(this);
123d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._retainmentDataGrid.show(this._retainmentView.element);
124d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._retainmentDataGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode, this._inspectedObjectChanged, this);
125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._retainmentDataGrid.reset();
126d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
127d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._perspectives = [];
128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._perspectives.push(new WebInspector.HeapSnapshotView.SummaryPerspective());
12909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (profile.profileType() !== WebInspector.ProfileTypeRegistry.instance.trackingHeapSnapshotProfileType)
130d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._perspectives.push(new WebInspector.HeapSnapshotView.ComparisonPerspective());
131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._perspectives.push(new WebInspector.HeapSnapshotView.ContainmentPerspective());
132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (this._allocationView)
133d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._perspectives.push(new WebInspector.HeapSnapshotView.AllocationPerspective());
134c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._perspectives.push(new WebInspector.HeapSnapshotView.StatisticsPerspective());
135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._perspectiveSelect = new WebInspector.StatusBarComboBox(this._onSelectedPerspectiveChanged.bind(this));
137d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (var i = 0; i < this._perspectives.length; ++i)
138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._perspectiveSelect.createOption(this._perspectives[i].title());
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
140a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this._profile = profile;
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._baseSelect = new WebInspector.StatusBarComboBox(this._changeBase.bind(this));
143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._baseSelect.visible = false;
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._updateBaseOptions();
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    this._filterSelect = new WebInspector.StatusBarComboBox(this._changeFilter.bind(this));
147d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._filterSelect.visible = false;
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._updateFilterOptions();
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    this._classNameFilter = new WebInspector.StatusBarInput("Class filter");
151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._classNameFilter.visible = false;
152a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    this._constructorsDataGrid.setNameFilter(this._classNameFilter);
153a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    this._diffDataGrid.setNameFilter(this._classNameFilter);
15409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
155d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._selectedSizeText = new WebInspector.StatusBarText("");
15653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._popoverHelper = new WebInspector.ObjectPopoverHelper(this.element, this._getHoverAnchor.bind(this), this._resolveObjectForPopover.bind(this), undefined, true);
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
159d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._currentPerspectiveIndex = 0;
160d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._currentPerspective = this._perspectives[0];
161d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._currentPerspective.activate(this);
162d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._dataGrid = this._currentPerspective.masterGrid(this);
163d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
164a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this._refreshView();
165a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
167d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)/**
168d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @constructor
169d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @param {string} title
170d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) */
171d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.HeapSnapshotView.Perspective = function(title)
172d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
173d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._title = title;
174d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
175d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
176d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.HeapSnapshotView.Perspective.prototype = {
177d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
178d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {!WebInspector.HeapSnapshotView} heapSnapshotView
179d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
180d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    activate: function(heapSnapshotView) { },
181d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
182d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {!WebInspector.HeapSnapshotView} heapSnapshotView
184d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
185d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    deactivate: function(heapSnapshotView)
186d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
187d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        heapSnapshotView._baseSelect.visible = false;
188d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        heapSnapshotView._filterSelect.visible = false;
189d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        heapSnapshotView._classNameFilter.visible = false;
190d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (heapSnapshotView._trackingOverviewGrid)
191d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            heapSnapshotView._trackingOverviewGrid.detach();
192d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (heapSnapshotView._allocationView)
193d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            heapSnapshotView._allocationView.detach();
194d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (heapSnapshotView._statisticsView)
195d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            heapSnapshotView._statisticsView.detach();
196d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
197d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        heapSnapshotView._splitView.detach();
198d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        heapSnapshotView._splitView.detachChildViews();
199d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
200d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
201d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
202d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {!WebInspector.HeapSnapshotView} heapSnapshotView
203d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @return {?WebInspector.DataGrid}
204d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
205d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    masterGrid: function(heapSnapshotView)
206d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
207d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return null;
208d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
209d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
210d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
211d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @return {string}
212d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
213d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    title: function()
214d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
215d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return this._title;
216d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
217d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
218d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
219d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @return {boolean}
220d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
221d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    supportsSearch: function()
222d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
223d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
224d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
225d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
226d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
227d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)/**
228d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @constructor
229d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.HeapSnapshotView.Perspective}
230d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) */
231d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.HeapSnapshotView.SummaryPerspective = function()
232d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
233d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.HeapSnapshotView.Perspective.call(this,  WebInspector.UIString("Summary"));
234d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
235d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
236d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.HeapSnapshotView.SummaryPerspective.prototype = {
237d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
238d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @override
239d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {!WebInspector.HeapSnapshotView} heapSnapshotView
240d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
241d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    activate: function(heapSnapshotView)
242d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
243d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        heapSnapshotView._constructorsView.show(heapSnapshotView._splitView.mainElement());
244a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        heapSnapshotView._objectDetailsView.show(heapSnapshotView._splitView.sidebarElement());
245d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        heapSnapshotView._splitView.show(heapSnapshotView.element);
246d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        heapSnapshotView._filterSelect.visible = true;
247d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        heapSnapshotView._classNameFilter.visible = true;
248d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (heapSnapshotView._trackingOverviewGrid) {
249d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            heapSnapshotView._trackingOverviewGrid.show(heapSnapshotView.element, heapSnapshotView._splitView.element);
250d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            heapSnapshotView._trackingOverviewGrid.update();
25143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            heapSnapshotView._trackingOverviewGrid._updateGrid();
252d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
253d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
254d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
255d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
256d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @override
257d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {!WebInspector.HeapSnapshotView} heapSnapshotView
258d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @return {?WebInspector.DataGrid}
259d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
260d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    masterGrid: function(heapSnapshotView)
261d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
262d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return heapSnapshotView._constructorsDataGrid;
263d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
264d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
265d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
266d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @override
267d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @return {boolean}
268d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
269d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    supportsSearch: function()
270d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
271d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return true;
272d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
273d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
274d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)   __proto__: WebInspector.HeapSnapshotView.Perspective.prototype
275d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
276d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
277d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)/**
278d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @constructor
279d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.HeapSnapshotView.Perspective}
280d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) */
281d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.HeapSnapshotView.ComparisonPerspective = function()
282d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
283d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.HeapSnapshotView.Perspective.call(this,  WebInspector.UIString("Comparison"));
284d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
285d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
286d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.HeapSnapshotView.ComparisonPerspective.prototype = {
287d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
288d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @override
289d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {!WebInspector.HeapSnapshotView} heapSnapshotView
290d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
291d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    activate: function(heapSnapshotView)
292d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
293d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        heapSnapshotView._diffView.show(heapSnapshotView._splitView.mainElement());
294a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        heapSnapshotView._objectDetailsView.show(heapSnapshotView._splitView.sidebarElement());
295d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        heapSnapshotView._splitView.show(heapSnapshotView.element);
296d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        heapSnapshotView._baseSelect.visible = true;
297d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        heapSnapshotView._classNameFilter.visible = true;
298d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
299d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
300d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
301d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @override
302d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {!WebInspector.HeapSnapshotView} heapSnapshotView
303d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @return {?WebInspector.DataGrid}
304d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
305d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    masterGrid: function(heapSnapshotView)
306d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
307d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return heapSnapshotView._diffDataGrid;
308d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
309d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
310d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
311d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @override
312d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @return {boolean}
313d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
314d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    supportsSearch: function()
315d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
316d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return true;
317d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
318d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
319d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)   __proto__: WebInspector.HeapSnapshotView.Perspective.prototype
320d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
321d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
322d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)/**
323d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @constructor
324d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.HeapSnapshotView.Perspective}
325d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) */
326d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.HeapSnapshotView.ContainmentPerspective = function()
327d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
328d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.HeapSnapshotView.Perspective.call(this,  WebInspector.UIString("Containment"));
329d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
330d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
331d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.HeapSnapshotView.ContainmentPerspective.prototype = {
332d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
333d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @override
334d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {!WebInspector.HeapSnapshotView} heapSnapshotView
335d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
336d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    activate: function(heapSnapshotView)
337d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
338d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        heapSnapshotView._containmentView.show(heapSnapshotView._splitView.mainElement());
339a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        heapSnapshotView._objectDetailsView.show(heapSnapshotView._splitView.sidebarElement());
340d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        heapSnapshotView._splitView.show(heapSnapshotView.element);
341d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
342d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
343d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
344d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @override
345d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {!WebInspector.HeapSnapshotView} heapSnapshotView
346d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @return {?WebInspector.DataGrid}
347d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
348d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    masterGrid: function(heapSnapshotView)
349d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
350d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return heapSnapshotView._containmentDataGrid;
351d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
352d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)   __proto__: WebInspector.HeapSnapshotView.Perspective.prototype
353d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
354d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
355d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)/**
356d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @constructor
357d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.HeapSnapshotView.Perspective}
358d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) */
359d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.HeapSnapshotView.AllocationPerspective = function()
360d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
361d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.HeapSnapshotView.Perspective.call(this,  WebInspector.UIString("Allocation"));
36243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    this._allocationSplitView = new WebInspector.SplitView(false, true, "heapSnapshotAllocationSplitViewState", 200, 200);
363aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
364aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    var resizer = document.createElementWithClass("div", "heap-snapshot-view-resizer");
365aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    var title = resizer.createChild("div", "title").createChild("span");
366aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    title.textContent = WebInspector.UIString("Live objects");
367aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    this._allocationSplitView.hideDefaultResizer();
368aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    this._allocationSplitView.installResizer(resizer);
369aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
370aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    this._allocationSplitView.sidebarElement().appendChild(resizer);
371d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
372d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
373d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.HeapSnapshotView.AllocationPerspective.prototype = {
374d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
375d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @override
376d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {!WebInspector.HeapSnapshotView} heapSnapshotView
377d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
378d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    activate: function(heapSnapshotView)
379d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
38043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        heapSnapshotView._allocationView.show(this._allocationSplitView.mainElement());
38143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        heapSnapshotView._constructorsView.show(heapSnapshotView._splitView.mainElement());
382a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        heapSnapshotView._objectDetailsView.show(heapSnapshotView._splitView.sidebarElement());
38343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        heapSnapshotView._splitView.show(this._allocationSplitView.sidebarElement());
38443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._allocationSplitView.show(heapSnapshotView.element);
38543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
38643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        heapSnapshotView._constructorsDataGrid.clear();
38743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        var selectedNode = heapSnapshotView._allocationDataGrid.selectedNode;
38843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        if (selectedNode)
38943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            heapSnapshotView._constructorsDataGrid.setAllocationNodeId(selectedNode.allocationNodeId());
39043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    },
39143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
39243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    /**
39343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)     * @override
39443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)     * @param {!WebInspector.HeapSnapshotView} heapSnapshotView
39543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)     */
39643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    deactivate: function(heapSnapshotView)
39743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    {
39843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._allocationSplitView.detach();
39943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        WebInspector.HeapSnapshotView.Perspective.prototype.deactivate.call(this, heapSnapshotView);
400d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
401d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
402d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
403d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @override
404d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {!WebInspector.HeapSnapshotView} heapSnapshotView
405d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @return {?WebInspector.DataGrid}
406d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
407d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    masterGrid: function(heapSnapshotView)
408d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
409d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return heapSnapshotView._allocationDataGrid;
410d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
411d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
412d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)   __proto__: WebInspector.HeapSnapshotView.Perspective.prototype
413d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
414d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
415d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)/**
416d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @constructor
417d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.HeapSnapshotView.Perspective}
418d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) */
419d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.HeapSnapshotView.StatisticsPerspective = function()
420d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
421d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.HeapSnapshotView.Perspective.call(this,  WebInspector.UIString("Statistics"));
422d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
423d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
424d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.HeapSnapshotView.StatisticsPerspective.prototype = {
425d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
426d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @override
427d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {!WebInspector.HeapSnapshotView} heapSnapshotView
428d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
429d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    activate: function(heapSnapshotView)
430d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
431d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        heapSnapshotView._statisticsView.show(heapSnapshotView.element);
432d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
433d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
434d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
435d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @override
436d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {!WebInspector.HeapSnapshotView} heapSnapshotView
437d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @return {?WebInspector.DataGrid}
438d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
439d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    masterGrid: function(heapSnapshotView)
440d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
441d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return null;
442d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
443d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
444d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)   __proto__: WebInspector.HeapSnapshotView.Perspective.prototype
445d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
446d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
447d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
448a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)WebInspector.HeapSnapshotView.prototype = {
4497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /**
4507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @override
4517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @param {?WebInspector.ProfileHeader} profile
4527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @return {?WebInspector.View}
4537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     */
4547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    showProfile: function(profile)
4557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
4567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return this._parentDataDisplayDelegate.showProfile(profile);
4577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    },
4587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
4597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /**
4607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @override
4617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @param {!HeapProfilerAgent.HeapSnapshotObjectId} snapshotObjectId
4627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @param {string} perspectiveName
4637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     */
4647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    showObject: function(snapshotObjectId, perspectiveName)
4657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
4667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (snapshotObjectId <= this._profile.maxJSObjectId)
4677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            this.highlightLiveObject(perspectiveName, snapshotObjectId);
4687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        else
4697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            this._parentDataDisplayDelegate.showObject(snapshotObjectId, perspectiveName);
4707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    },
4717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
472a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    _refreshView: function()
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
47409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._profile.load(profileCallback.bind(this));
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
477d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)         * @param {!WebInspector.HeapSnapshotProxy} heapSnapshotProxy
47809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.HeapSnapshotView}
47909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
480a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        function profileCallback(heapSnapshotProxy)
481a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        {
482d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            heapSnapshotProxy.getStatistics(this._gotStatistics.bind(this));
483a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            var list = this._profiles();
484a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            var profileIndex = list.indexOf(this._profile);
485d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            this._baseSelect.setSelectedIndex(Math.max(0, profileIndex - 1));
486d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            this._dataGrid.setDataSource(heapSnapshotProxy);
48709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (this._trackingOverviewGrid)
48809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                this._trackingOverviewGrid._updateGrid();
489a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        }
490a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    },
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
492d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
493d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {!WebInspector.HeapSnapshotCommon.Statistics} statistics
494d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
4957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    _gotStatistics: function(statistics)
4967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
497d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._statisticsView.setTotal(statistics.total);
498d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._statisticsView.addRecord(statistics.code, WebInspector.UIString("Code"), "#f77");
499d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._statisticsView.addRecord(statistics.strings, WebInspector.UIString("Strings"), "#5e5");
500d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._statisticsView.addRecord(statistics.jsArrays, WebInspector.UIString("JS Arrays"), "#7af");
501d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._statisticsView.addRecord(statistics.native, WebInspector.UIString("Typed Arrays"), "#fc5");
502d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._statisticsView.addRecord(statistics.total, WebInspector.UIString("Total"));
503d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
504d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
50553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    _onIdsRangeChanged: function(event)
50653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
50753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var minId = event.data.minId;
50853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var maxId = event.data.maxId;
509d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._selectedSizeText.setText(WebInspector.UIString("Selected size: %s", Number.bytesToString(event.data.size)));
510d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (this._constructorsDataGrid.snapshot)
511d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            this._constructorsDataGrid.setSelectionRange(minId, maxId);
51253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
51353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get statusBarItems()
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
516d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var result = [this._perspectiveSelect.element, this._classNameFilter.element];
51709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (this._profile.profileType() !== WebInspector.ProfileTypeRegistry.instance.trackingHeapSnapshotProfileType)
518d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            result.push(this._baseSelect.element, this._filterSelect.element);
519d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        result.push(this._selectedSizeText.element);
52009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return result;
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    wasShown: function()
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: load base and current snapshots in parallel
52609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._profile.load(profileCallback.bind(this));
52709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
52809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
52909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.HeapSnapshotView}
53009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
53193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        function profileCallback() {
53209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this._profile._wasShown();
53309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (this._baseProfile)
53409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                this._baseProfile.load(function() { });
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    willHide: function()
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._currentSearchResultIndex = -1;
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._popoverHelper.hidePopover();
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.helpPopover && this.helpPopover.isShowing())
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.helpPopover.hide();
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    searchCanceled: function()
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._searchResults) {
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (var i = 0; i < this._searchResults.length; ++i) {
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var node = this._searchResults[i].node;
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                delete node._searchMatched;
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                node.refresh();
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        delete this._searchFinishedCallback;
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._currentSearchResultIndex = -1;
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._searchResults = [];
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
561e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    /**
562e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch     * @param {string} query
563e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch     * @param {function(!WebInspector.View, number)} finishedCallback
564e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch     */
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    performSearch: function(query, finishedCallback)
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Call searchCanceled since it will reset everything we need before doing a new search.
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.searchCanceled();
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        query = query.trim();
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
572e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (!query)
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
574d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!this._currentPerspective.supportsSearch())
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
577a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        /**
578a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         * @param {boolean} found
57909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.HeapSnapshotView}
580a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         */
581a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        function didHighlight(found)
582a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        {
583a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            finishedCallback(this, found ? 1 : 0);
584a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        }
585a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
58651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (query.charAt(0) === "@") {
58751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            var snapshotNodeId = parseInt(query.substring(1), 10);
588a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            if (!isNaN(snapshotNodeId))
589d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                this._dataGrid.highlightObjectByHeapSnapshotId(String(snapshotNodeId), didHighlight.bind(this));
590a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            else
59151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)                finishedCallback(this, 0);
59251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            return;
59351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        }
59451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._searchFinishedCallback = finishedCallback;
596e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        var nameRegExp = createPlainTextSearchRegex(query, "i");
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function matchesByName(gridNode) {
599e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            return ("_name" in gridNode) && nameRegExp.test(gridNode._name);
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function matchesQuery(gridNode)
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            delete gridNode._searchMatched;
60551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            if (matchesByName(gridNode)) {
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                gridNode._searchMatched = true;
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                gridNode.refresh();
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return true;
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
613d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var current = this._dataGrid.rootNode().children[0];
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var depth = 0;
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var info = {};
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Restrict to type nodes and instances.
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const maxDepth = 1;
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (current) {
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (matchesQuery(current))
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._searchResults.push({ node: current });
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            current = current.traverseNextNode(false, null, (depth >= maxDepth), info);
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            depth += info.depthChange;
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        finishedCallback(this, this._searchResults.length);
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jumpToFirstSearchResult: function()
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._searchResults || !this._searchResults.length)
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._currentSearchResultIndex = 0;
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._jumpToSearchResult(this._currentSearchResultIndex);
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jumpToLastSearchResult: function()
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._searchResults || !this._searchResults.length)
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._currentSearchResultIndex = (this._searchResults.length - 1);
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._jumpToSearchResult(this._currentSearchResultIndex);
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jumpToNextSearchResult: function()
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._searchResults || !this._searchResults.length)
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (++this._currentSearchResultIndex >= this._searchResults.length)
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._currentSearchResultIndex = 0;
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._jumpToSearchResult(this._currentSearchResultIndex);
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jumpToPreviousSearchResult: function()
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._searchResults || !this._searchResults.length)
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (--this._currentSearchResultIndex < 0)
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._currentSearchResultIndex = (this._searchResults.length - 1);
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._jumpToSearchResult(this._currentSearchResultIndex);
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
66409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
66509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
66609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    showingFirstSearchResult: function()
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (this._currentSearchResultIndex === 0);
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
67209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
67309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
67409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    showingLastSearchResult: function()
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (this._searchResults && this._currentSearchResultIndex === (this._searchResults.length - 1));
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
68009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
68109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {number}
68209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
68351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    currentSearchResultIndex: function() {
68451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return this._currentSearchResultIndex;
68551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    },
68651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _jumpToSearchResult: function(index)
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var searchResult = this._searchResults[index];
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!searchResult)
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var node = searchResult.node;
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        node.revealAndSelect();
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    refreshVisibleData: function()
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
699d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!this._dataGrid)
700d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
701d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var child = this._dataGrid.rootNode().children[0];
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (child) {
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child.refresh();
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child = child.traverseNextNode(false, null, true);
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _changeBase: function()
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
710d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (this._baseProfile === this._profiles()[this._baseSelect.selectedIndex()])
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
713d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._baseProfile = this._profiles()[this._baseSelect.selectedIndex()];
714d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var dataGrid = /** @type {!WebInspector.HeapSnapshotDiffDataGrid} */ (this._dataGrid);
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Change set base data source only if main data source is already set.
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (dataGrid.snapshot)
71709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this._baseProfile.load(dataGrid.setBaseDataSource.bind(dataGrid));
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults)
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The current search needs to be performed again. First negate out previous match
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // count by calling the search finished callback with a negative number of matches.
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Then perform the search again with the same query and callback.
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._searchFinishedCallback(this, -this._searchResults.length);
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.performSearch(this.currentQuery, this._searchFinishedCallback);
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _changeFilter: function()
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
73109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        var profileIndex = this._filterSelect.selectedIndex() - 1;
732d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._dataGrid.filterSelectIndexChanged(this._profiles(), profileIndex);
733926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
734926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction, {
735926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            action: WebInspector.UserMetrics.UserActionNames.HeapSnapshotFilterChanged,
73609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            label: this._filterSelect.selectedOption().label
737926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        });
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults)
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The current search needs to be performed again. First negate out previous match
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // count by calling the search finished callback with a negative number of matches.
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Then perform the search again with the same query and callback.
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._searchFinishedCallback(this, -this._searchResults.length);
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.performSearch(this.currentQuery, this._searchFinishedCallback);
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
74909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
750926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {!Array.<!WebInspector.ProfileHeader>}
751926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _profiles: function()
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
754a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return this._profile.profileType().getProfiles();
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
758a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.ContextMenu} contextMenu
759197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!Event} event
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    populateContextMenu: function(contextMenu, event)
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
763d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (this._dataGrid)
764d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            this._dataGrid.populateContextMenu(contextMenu, event);
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _selectionChanged: function(event)
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var selectedNode = event.target.selectedNode;
770a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._setSelectedNodeForDetailsView(selectedNode);
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._inspectedObjectChanged(event);
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
77443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    _onSelectAllocationNode: function(event)
77543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    {
77643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        var selectedNode = event.target.selectedNode;
77743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._constructorsDataGrid.setAllocationNodeId(selectedNode.allocationNodeId());
778a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._setSelectedNodeForDetailsView(null);
77943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    },
78043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _inspectedObjectChanged: function(event)
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var selectedNode = event.target.selectedNode;
784197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var target = this._profile.target();
7857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (target && selectedNode instanceof WebInspector.HeapSnapshotGenericObjectNode)
786197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            target.consoleAgent().addInspectedHeapObject(selectedNode.snapshotNodeId);
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
78907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    /**
79007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     * @param {?WebInspector.HeapSnapshotGridNode} nodeItem
79107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     */
792a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    _setSelectedNodeForDetailsView: function(nodeItem)
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
79407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        var dataSource = nodeItem && nodeItem.retainersDataSource();
795a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (dataSource) {
79607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            this._retainmentDataGrid.setDataSource(dataSource.snapshot, dataSource.snapshotNodeIndex);
797a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            if (this._allocationStackView)
798a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                this._allocationStackView.setAllocatedObject(dataSource.snapshot, dataSource.snapshotNodeIndex)
799a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        } else {
800a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            if (this._allocationStackView)
801a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                this._allocationStackView.clear();
802d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            this._retainmentDataGrid.reset();
803a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        }
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
806d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
807d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {string} perspectiveTitle
808d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {function()} callback
809d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
810d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    _changePerspectiveAndWait: function(perspectiveTitle, callback)
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
812d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var perspectiveIndex = null;
813d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        for (var i = 0; i < this._perspectives.length; ++i) {
814d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (this._perspectives[i].title() === perspectiveTitle) {
815d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                perspectiveIndex = i;
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
81853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
819d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (this._currentPerspectiveIndex === perspectiveIndex || perspectiveIndex === null) {
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setTimeout(callback, 0);
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
82409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
82509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.HeapSnapshotView}
82609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function dataGridContentShown(event)
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var dataGrid = event.data;
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            dataGrid.removeEventListener(WebInspector.HeapSnapshotSortableDataGrid.Events.ContentShown, dataGridContentShown, this);
831d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (dataGrid === this._dataGrid)
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                callback();
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
834d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._perspectives[perspectiveIndex].masterGrid(this).addEventListener(WebInspector.HeapSnapshotSortableDataGrid.Events.ContentShown, dataGridContentShown, this);
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
836d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._perspectiveSelect.setSelectedIndex(perspectiveIndex);
837d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._changePerspective(perspectiveIndex);
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _updateDataSourceAndView: function()
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
842d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var dataGrid = this._dataGrid;
843d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!dataGrid || dataGrid.snapshot)
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._profile.load(didLoadSnapshot.bind(this));
84709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
84809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
84909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.HeapSnapshotView}
85009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function didLoadSnapshot(snapshotProxy)
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
853d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (this._dataGrid !== dataGrid)
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (dataGrid.snapshot !== snapshotProxy)
856926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                dataGrid.setDataSource(snapshotProxy);
857d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (dataGrid === this._diffDataGrid) {
85809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                if (!this._baseProfile)
859d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    this._baseProfile = this._profiles()[this._baseSelect.selectedIndex()];
86009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                this._baseProfile.load(didLoadBaseSnaphot.bind(this));
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
86409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
86509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.HeapSnapshotView}
86609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function didLoadBaseSnaphot(baseSnapshotProxy)
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
869d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (this._diffDataGrid.baseSnapshot !== baseSnapshotProxy)
870d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                this._diffDataGrid.setBaseDataSource(baseSnapshotProxy);
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
874d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    _onSelectedPerspectiveChanged: function(event)
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
876d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._changePerspective(event.target.selectedIndex);
87707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        // FIXME: This is needed by CodeSchool extension.
87807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        this._onSelectedViewChanged(event);
87907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    },
88007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
88107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    _onSelectedViewChanged: function(event)
88207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    {
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /**
8867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @param {number} selectedIndex
8877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     */
888d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    _changePerspective: function(selectedIndex)
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
890d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (selectedIndex === this._currentPerspectiveIndex)
891d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
893d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._currentPerspectiveIndex = selectedIndex;
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
895d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._currentPerspective.deactivate(this);
896d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var perspective = this._perspectives[selectedIndex];
897d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._currentPerspective = perspective;
898d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._dataGrid = perspective.masterGrid(this);
89907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        perspective.activate(this);
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
901d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this.refreshVisibleData();
902a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (this._dataGrid)
903d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            this._dataGrid.updateWidths();
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._updateDataSourceAndView();
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults)
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The current search needs to be performed again. First negate out previous match
9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // count by calling the search finished callback with a negative number of matches.
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Then perform the search again the with same query and callback.
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._searchFinishedCallback(this, -this._searchResults.length);
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.performSearch(this.currentQuery, this._searchFinishedCallback);
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
917d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
918d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {string} perspectiveName
9197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @param {!HeapProfilerAgent.HeapSnapshotObjectId} snapshotObjectId
920d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
921d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    highlightLiveObject: function(perspectiveName, snapshotObjectId)
922d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
92343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._changePerspectiveAndWait(perspectiveName, didChangePerspective.bind(this));
92443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
925d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        /**
926d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)         * @this {WebInspector.HeapSnapshotView}
927d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)         */
928d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        function didChangePerspective()
929d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
93043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            this._dataGrid.highlightObjectByHeapSnapshotId(snapshotObjectId, didHighlightObject);
93143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        }
93243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
93343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        function didHighlightObject(found)
93443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        {
93543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            if (!found)
936197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                WebInspector.console.error("Cannot find corresponding heap snapshot node");
937d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
938d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
939d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _getHoverAnchor: function(target)
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var span = target.enclosingNodeOrSelfWithNodeName("span");
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!span)
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var row = target.enclosingNodeOrSelfWithNodeName("tr");
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!row)
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        span.node = row._dataGridNode;
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return span;
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _resolveObjectForPopover: function(element, showCallback, objectGroupName)
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
954197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (!this._profile.target())
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
956197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        element.node.queryObjectContent(this._profile.target(), showCallback, objectGroupName);
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _updateBaseOptions: function()
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var list = this._profiles();
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We're assuming that snapshots can only be added.
963d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (this._baseSelect.size() === list.length)
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
966d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        for (var i = this._baseSelect.size(), n = list.length; i < n; ++i) {
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var title = list[i].title;
968d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            this._baseSelect.createOption(title);
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _updateFilterOptions: function()
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var list = this._profiles();
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We're assuming that snapshots can only be added.
97609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (this._filterSelect.size() - 1 === list.length)
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
97909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!this._filterSelect.size())
98009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this._filterSelect.createOption(WebInspector.UIString("All objects"));
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
98209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        for (var i = this._filterSelect.size() - 1, n = list.length; i < n; ++i) {
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var title = list[i].title;
98406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            if (!i)
98506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)                title = WebInspector.UIString("Objects allocated before %s", title);
98606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            else
98706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)                title = WebInspector.UIString("Objects allocated between %s and %s", list[i - 1].title, title);
98809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this._filterSelect.createOption(title);
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
99209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    _updateControls: function()
99309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
99409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._updateBaseOptions();
99509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._updateFilterOptions();
99609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    },
99709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
998926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
999a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Event} event
1000926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
100107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    _onReceiveSnapshot: function(event)
1002926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
100309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._updateControls();
100409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    },
100509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
100609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
100709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {!WebInspector.Event} event
100809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
100909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    _onProfileHeaderRemoved: function(event)
101009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
101109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        var profile = event.data;
101209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (this._profile === profile) {
101309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this.detach();
101407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            this._profile.profileType().removeEventListener(WebInspector.HeapSnapshotProfileType.SnapshotReceived, this._onReceiveSnapshot, this);
101509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this._profile.profileType().removeEventListener(WebInspector.ProfileType.Events.RemoveProfileHeader, this._onProfileHeaderRemoved, this);
1016a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            this.dispose();
101709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        } else {
101809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this._updateControls();
101909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
1020926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
1021926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1022a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    dispose: function()
1023a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    {
1024a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (this._allocationStackView) {
1025a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            this._allocationStackView.clear();
1026a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            this._allocationDataGrid.dispose();
1027a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        }
1028a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    },
1029a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
1030d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    __proto__: WebInspector.VBox.prototype
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
103393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)/**
103493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * @constructor
1035197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @extends {WebInspector.ProfileType}
1036197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @implements {WebInspector.TargetManager.Observer}
1037197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {string=} id
1038197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {string=} title
103993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) */
1040197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.HeapSnapshotProfileType = function(id, title)
104193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
1042197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.ProfileType.call(this, id || WebInspector.HeapSnapshotProfileType.TypeId, title || WebInspector.UIString("Take Heap Snapshot"));
1043197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.targetManager.observeTargets(this);
1044c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    WebInspector.targetManager.addModelListener(WebInspector.HeapProfilerModel, WebInspector.HeapProfilerModel.Events.ResetProfiles, this._resetProfiles, this);
1045c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    WebInspector.targetManager.addModelListener(WebInspector.HeapProfilerModel, WebInspector.HeapProfilerModel.Events.AddHeapSnapshotChunk, this._addHeapSnapshotChunk, this);
1046c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    WebInspector.targetManager.addModelListener(WebInspector.HeapProfilerModel, WebInspector.HeapProfilerModel.Events.ReportHeapSnapshotProgress, this._reportHeapSnapshotProgress, this);
104793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
104893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
1049197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.HeapSnapshotProfileType.TypeId = "HEAP";
1050197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.HeapSnapshotProfileType.SnapshotReceived = "SnapshotReceived";
105193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
1052197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.HeapSnapshotProfileType.prototype = {
105393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    /**
1054197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.Target} target
105593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     */
1056197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    targetAdded: function(target)
105793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
1058197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        target.heapProfilerModel.enable();
105993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    },
106093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
106193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    /**
1062197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.Target} target
106393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     */
1064197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    targetRemoved: function(target)
106593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
106693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    },
106793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
106893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    /**
106993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     * @override
107053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     * @return {string}
107153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     */
107253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    fileExtension: function()
107353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
107453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return ".heapsnapshot";
107553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
107653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get buttonTooltip()
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebInspector.UIString("Take heap snapshot.");
10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @override
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {boolean}
10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1086926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isInstantProfile: function()
10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1088926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
1089926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
1090926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1091926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
1092926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @override
1093926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {boolean}
1094926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
1095926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    buttonClicked: function()
1096926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
1097591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._takeHeapSnapshot(function() {});
1098591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        WebInspector.userMetrics.ProfilesHeapProfileTaken.record();
10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1102521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    get treeItemTitle()
11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebInspector.UIString("HEAP SNAPSHOTS");
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get description()
11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebInspector.UIString("Heap snapshot profiles show memory distribution among your page's JavaScript objects and related DOM nodes.");
11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @override
11145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @param {string} title
1115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {!WebInspector.ProfileHeader}
11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1117a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    createProfileLoadedFromFile: function(title)
11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1119197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return new WebInspector.HeapProfileHeader(null, this, title);
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1122591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _takeHeapSnapshot: function(callback)
1123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
1124a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (this.profileBeingRecorded())
1125a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            return;
1126197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var target = /** @type {!WebInspector.Target} */ (WebInspector.context.flavor(WebInspector.Target));
1127323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        var profile = new WebInspector.HeapProfileHeader(target, this);
1128323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        this.setProfileBeingRecorded(profile);
1129323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        this.addProfile(profile);
1130323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        profile.updateStatus(WebInspector.UIString("Snapshotting\u2026"));
1131a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
113209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
113309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @param {?string} error
113409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.HeapSnapshotProfileType}
113509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
113609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        function didTakeHeapSnapshot(error)
113709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        {
113809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            var profile = this._profileBeingRecorded;
113909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            profile.title = WebInspector.UIString("Snapshot %d", profile.uid);
114009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            profile._finishLoad();
1141323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            this.setProfileBeingRecorded(null);
1142323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            this.dispatchEventToListeners(WebInspector.ProfileType.Events.ProfileComplete, profile);
114309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            callback();
114409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
1145197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        target.heapProfilerAgent().takeHeapSnapshot(true, didTakeHeapSnapshot.bind(this));
1146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
1147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
1149197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.Event} event
1150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
1151197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _addHeapSnapshotChunk: function(event)
1152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
115309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!this.profileBeingRecorded())
115409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return;
1155197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var chunk = /** @type {string} */(event.data);
115609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this.profileBeingRecorded().transferChunk(chunk);
1157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
1158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
1160197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.Event} event
1161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
1162197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _reportHeapSnapshotProgress: function(event)
1163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
1164a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        var profile = this.profileBeingRecorded();
1165a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (!profile)
1166a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            return;
1167197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var data = /** @type {{done: number, total: number, finished: boolean}} */ (event.data);
1168197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        profile.updateStatus(WebInspector.UIString("%.0f%", (data.done / data.total) * 100), true);
1169197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (data.finished)
117009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            profile._prepareToLoad();
1171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
1172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1173197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _resetProfiles: function()
1174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
1175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._reset();
1176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
1177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
117893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    _snapshotReceived: function(profile)
117993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
1180a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (this._profileBeingRecorded === profile)
1181323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            this.setProfileBeingRecorded(null);
118293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.HeapSnapshotProfileType.SnapshotReceived, profile);
118393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    },
118493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    __proto__: WebInspector.ProfileType.prototype
11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
118853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
118953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)/**
119053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * @constructor
119193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * @extends {WebInspector.HeapSnapshotProfileType}
119253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) */
119309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.TrackingHeapSnapshotProfileType = function()
119453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
119509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    WebInspector.HeapSnapshotProfileType.call(this, WebInspector.TrackingHeapSnapshotProfileType.TypeId, WebInspector.UIString("Record Heap Allocations"));
119653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
119753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
119853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)WebInspector.TrackingHeapSnapshotProfileType.TypeId = "HEAP-RECORD";
119953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
120093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)WebInspector.TrackingHeapSnapshotProfileType.HeapStatsUpdate = "HeapStatsUpdate";
120193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)WebInspector.TrackingHeapSnapshotProfileType.TrackingStarted = "TrackingStarted";
120293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)WebInspector.TrackingHeapSnapshotProfileType.TrackingStopped = "TrackingStopped";
120393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
120453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)WebInspector.TrackingHeapSnapshotProfileType.prototype = {
120593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
120693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    /**
1207197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.Target} target
120893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     */
1209197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    targetAdded: function(target)
1210197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
1211197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        WebInspector.HeapSnapshotProfileType.prototype.targetAdded.call(this, target);
1212197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        target.heapProfilerModel.addEventListener(WebInspector.HeapProfilerModel.Events.HeapStatsUpdate, this._heapStatsUpdate, this);
1213197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        target.heapProfilerModel.addEventListener(WebInspector.HeapProfilerModel.Events.LastSeenObjectId, this._lastSeenObjectId, this);
1214197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
1215197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1216197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
1217197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.Target} target
1218197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
1219197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    targetRemoved: function(target)
1220197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
1221197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        WebInspector.HeapSnapshotProfileType.prototype.targetRemoved.call(this, target);
1222197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        target.heapProfilerModel.removeEventListener(WebInspector.HeapProfilerModel.Events.HeapStatsUpdate, this._heapStatsUpdate, this);
1223197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        target.heapProfilerModel.removeEventListener(WebInspector.HeapProfilerModel.Events.LastSeenObjectId, this._lastSeenObjectId, this);
1224197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
1225197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1226197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
1227197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.Event} event
1228197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
1229197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _heapStatsUpdate: function(event)
123093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
123193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        if (!this._profileSamples)
123293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            return;
1233197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var samples = /** @type {!Array.<number>} */ (event.data);
123493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        var index;
123593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        for (var i = 0; i < samples.length; i += 3) {
123693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            index = samples[i];
123793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            var count = samples[i+1];
123893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            var size  = samples[i+2];
123993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            this._profileSamples.sizes[index] = size;
1240d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (!this._profileSamples.max[index])
124193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                this._profileSamples.max[index] = size;
124293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        }
124393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    },
124493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
124593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    /**
1246197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.Event} event
124793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     */
1248197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _lastSeenObjectId: function(event)
124993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
125093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        var profileSamples = this._profileSamples;
125193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        if (!profileSamples)
125293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            return;
1253197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var data = /** @type {{lastSeenObjectId: number, timestamp: number}} */ (event.data);
1254521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var currentIndex = Math.max(profileSamples.ids.length, profileSamples.max.length - 1);
1255197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        profileSamples.ids[currentIndex] = data.lastSeenObjectId;
125693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        if (!profileSamples.max[currentIndex]) {
125793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            profileSamples.max[currentIndex] = 0;
125893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            profileSamples.sizes[currentIndex] = 0;
125993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        }
1260197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        profileSamples.timestamps[currentIndex] = data.timestamp;
1261197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (profileSamples.totalTime < data.timestamp - profileSamples.timestamps[0])
126293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            profileSamples.totalTime *= 2;
126393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.TrackingHeapSnapshotProfileType.HeapStatsUpdate, this._profileSamples);
126409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._profileBeingRecorded.updateStatus(null, true);
126593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    },
126693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
126793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    /**
126893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     * @override
126993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     * @return {boolean}
127093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     */
127193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    hasTemporaryView: function()
127293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
127393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return true;
127493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    },
127593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
127653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    get buttonTooltip()
127753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
127853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return this._recording ? WebInspector.UIString("Stop recording heap profile.") : WebInspector.UIString("Start recording heap profile.");
127953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
128053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
128153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    /**
128253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     * @override
128353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     * @return {boolean}
128453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     */
128553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    isInstantProfile: function()
128653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
128753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
128853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
128953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
129053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    /**
129153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     * @override
129253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     * @return {boolean}
129353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     */
129453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    buttonClicked: function()
129553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
129693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return this._toggleRecording();
129793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    },
129893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
129993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    _startRecordingProfile: function()
130093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
1301a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (this.profileBeingRecorded())
1302a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            return;
1303197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var recordAllocationStacks = WebInspector.settings.recordAllocationStacks.get();
1304197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._addNewProfile(recordAllocationStacks);
1305197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this.profileBeingRecorded().target().heapProfilerAgent().startTrackingHeapObjects(recordAllocationStacks);
1306d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
1307d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1308197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
1309197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {boolean} withAllocationStacks
1310197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
1311197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _addNewProfile: function(withAllocationStacks)
1312d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
1313197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var target =  WebInspector.context.flavor(WebInspector.Target);
1314197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this.setProfileBeingRecorded(new WebInspector.HeapProfileHeader(target, this, undefined, withAllocationStacks));
131593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this._lastSeenIndex = -1;
131693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this._profileSamples = {
131793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            'sizes': [],
131893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            'ids': [],
131993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            'timestamps': [],
132093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            'max': [],
132193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            'totalTime': 30000
132293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        };
1323a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        this._profileBeingRecorded._profileSamples = this._profileSamples;
132493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this._recording = true;
1325a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        this.addProfile(this._profileBeingRecorded);
132609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._profileBeingRecorded.updateStatus(WebInspector.UIString("Recording\u2026"));
132793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.TrackingHeapSnapshotProfileType.TrackingStarted);
132893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    },
132993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
133093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    _stopRecordingProfile: function()
133193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
1332d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._profileBeingRecorded.updateStatus(WebInspector.UIString("Snapshotting\u2026"));
133309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
133409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @param {?string} error
133509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.HeapSnapshotProfileType}
133609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
133709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        function didTakeHeapSnapshot(error)
133809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        {
1339197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            var profile = this.profileBeingRecorded();
1340d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (!profile)
1341d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return;
134209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            profile._finishLoad();
134309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this._profileSamples = null;
1344323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            this.setProfileBeingRecorded(null);
1345323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            this.dispatchEventToListeners(WebInspector.ProfileType.Events.ProfileComplete, profile);
134609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
134709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1348197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._profileBeingRecorded.target().heapProfilerAgent().stopTrackingHeapObjects(true, didTakeHeapSnapshot.bind(this));
134993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this._recording = false;
135093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.TrackingHeapSnapshotProfileType.TrackingStopped);
135193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    },
135293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
135393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    _toggleRecording: function()
135493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
135593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        if (this._recording)
135693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            this._stopRecordingProfile();
135793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        else
135893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            this._startRecordingProfile();
135993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return this._recording;
136053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
136153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
136253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    get treeItemTitle()
136353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
1364521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return WebInspector.UIString("HEAP TIMELINES");
136553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
136653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
136753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    get description()
136853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
1369521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return WebInspector.UIString("Record JavaScript object allocations over time. Use this profile type to isolate memory leaks.");
1370521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
1371521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1372d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
1373d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @override
1374d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
1375d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    resetProfiles: function()
1376521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
1377d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var wasRecording = this._recording;
1378197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var recordingAllocationStacks = wasRecording && this.profileBeingRecorded()._hasAllocationStacks;
1379d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // Clear current profile to avoid stopping backend.
1380323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        this.setProfileBeingRecorded(null);
1381d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        WebInspector.HeapSnapshotProfileType.prototype.resetProfiles.call(this);
1382521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        this._profileSamples = null;
1383521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        this._lastSeenIndex = -1;
1384d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (wasRecording)
1385197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            this._addNewProfile(recordingAllocationStacks);
138653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
138753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
138809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
138909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @override
139009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
139109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    profileBeingRecordedRemoved: function()
139209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
139309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._stopRecordingProfile();
139409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._profileSamples = null;
139509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    },
139609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
139793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    __proto__: WebInspector.HeapSnapshotProfileType.prototype
139853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
139953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
14015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @extends {WebInspector.ProfileHeader}
1403197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {?WebInspector.Target} target
140409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!WebInspector.HeapSnapshotProfileType} type
140509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {string=} title
1406197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {boolean=} hasAllocationStacks
14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
1408197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.HeapProfileHeader = function(target, type, title, hasAllocationStacks)
14095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1410197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.ProfileHeader.call(this, target, type, title || WebInspector.UIString("Snapshot %d", type.nextProfileUid()));
1411197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this._hasAllocationStacks = !!hasAllocationStacks;
141209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    this.maxJSObjectId = -1;
141309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
141409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @type {?WebInspector.HeapSnapshotWorkerProxy}
141509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
141609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    this._workerProxy = null;
14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1418a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @type {?WebInspector.OutputStream}
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._receiver = null;
14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1422a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @type {?WebInspector.HeapSnapshotProxy}
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._snapshotProxy = null;
142509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
142609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @type {?Array.<function(!WebInspector.HeapSnapshotProxy)>}
142709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
142809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    this._loadCallbacks = [];
14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._totalNumberOfChunks = 0;
143009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    this._bufferedWriter = null;
14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.HeapProfileHeader.prototype = {
14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @override
1436323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)     * @param {!WebInspector.ProfileType.DataDisplayDelegate} dataDisplayDelegate
143709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {!WebInspector.ProfileSidebarTreeElement}
14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1439323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    createSidebarTreeElement: function(dataDisplayDelegate)
14405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1441323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        return new WebInspector.ProfileSidebarTreeElement(dataDisplayDelegate, this, "heap-snapshot-sidebar-tree-item");
14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @override
1446323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)     * @param {!WebInspector.ProfileType.DataDisplayDelegate} dataDisplayDelegate
144709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {!WebInspector.HeapSnapshotView}
14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1449323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    createView: function(dataDisplayDelegate)
14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1451323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        return new WebInspector.HeapSnapshotView(dataDisplayDelegate, this);
14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @override
1456a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(!WebInspector.HeapSnapshotProxy):void} callback
14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    load: function(callback)
14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
146093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        if (this.uid === -1)
146193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            return;
14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._snapshotProxy) {
14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            callback(this._snapshotProxy);
14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
146609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._loadCallbacks.push(callback);
14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
146909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    _prepareToLoad: function()
1470926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
147109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        console.assert(!this._receiver, "Already loading");
147209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._setupWorker();
147309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this.updateStatus(WebInspector.UIString("Loading\u2026"), true);
1474926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
1475926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
147609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    _finishLoad: function()
1477926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
1478d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!this._wasDisposed)
14797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            this._receiver.close();
148009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (this._bufferedWriter) {
14817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            this._bufferedWriter.finishWriting(this._didWriteToTempFile.bind(this));
148209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this._bufferedWriter = null;
148309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
1484926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
1485926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
148609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    _didWriteToTempFile: function(tempFile)
1487926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
1488d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (this._wasDisposed) {
1489d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (tempFile)
1490d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                tempFile.remove();
1491d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
1492d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
149309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._tempFile = tempFile;
149409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!tempFile)
149509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this._failedToCreateTempFile = true;
149609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (this._onTempFileReady) {
149709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this._onTempFileReady();
149809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this._onTempFileReady = null;
149909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
1500926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
1501926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _setupWorker: function()
15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
150409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
150509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.HeapProfileHeader}
150609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function setProfileWait(event)
15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
150909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this.updateStatus(null, event.data);
15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
151109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        console.assert(!this._workerProxy, "HeapSnapshotWorkerProxy already exists");
151209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._workerProxy = new WebInspector.HeapSnapshotWorkerProxy(this._handleWorkerEvent.bind(this));
151309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._workerProxy.addEventListener("wait", setProfileWait, this);
151409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._receiver = this._workerProxy.createLoader(this.uid, this._snapshotReceived.bind(this));
15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1517926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
1518a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {string} eventName
1519a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {*} data
15208abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)     */
15218abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    _handleWorkerEvent: function(eventName, data)
15228abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    {
152309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (WebInspector.HeapSnapshotProgressEvent.Update !== eventName)
15248abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            return;
152509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        var subtitle = /** @type {string} */ (data);
152609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this.updateStatus(subtitle);
15278abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    },
15288abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
15298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    /**
1530926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @override
1531926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dispose: function()
15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
153409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (this._workerProxy)
153509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this._workerProxy.dispose();
153609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this.removeTempFile();
153709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._wasDisposed = true;
15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15408abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    _didCompleteSnapshotTransfer: function()
15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
154209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!this._snapshotProxy)
154309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return;
154409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this.updateStatus(Number.bytesToString(this._snapshotProxy.totalSize), false);
15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} chunk
15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    transferChunk: function(chunk)
15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
155209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!this._bufferedWriter)
15537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            this._bufferedWriter = new WebInspector.DeferredTempFile("heap-profiler", String(this.uid));
15547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._bufferedWriter.write([chunk]);
155509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
155609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ++this._totalNumberOfChunks;
155709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._receiver.write(chunk, function() {});
15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _snapshotReceived: function(snapshotProxy)
15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
156209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (this._wasDisposed)
156309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return;
15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._receiver = null;
156509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._snapshotProxy = snapshotProxy;
156609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this.maxJSObjectId = snapshotProxy.maxJSObjectId();
15678abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        this._didCompleteSnapshotTransfer();
156809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._workerProxy.startCheckingForLongRunningCalls();
1569e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        this.notifySnapshotReceived();
1570e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    },
1571e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1572e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    notifySnapshotReceived: function()
1573e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    {
157409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        for (var i = 0; i < this._loadCallbacks.length; i++)
15757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            this._loadCallbacks[i](/** @type {!WebInspector.HeapSnapshotProxy} */ (this._snapshotProxy));
157609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._loadCallbacks = null;
157793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this._profileType._snapshotReceived(this);
157809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (this.canSaveToFile())
157909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this.dispatchEventToListeners(WebInspector.ProfileHeader.Events.ProfileReceived);
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
15815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1582591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // Hook point for tests.
1583591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _wasShown: function()
1584591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
1585591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
1586591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
15885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @override
15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {boolean}
15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
15915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    canSaveToFile: function()
15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
15937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return !this.fromFile() && !!this._snapshotProxy;
15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
15975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @override
15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
15995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    saveToFile: function()
16005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1601926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var fileOutputStream = new WebInspector.FileOutputStream();
1602a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1603a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        /**
1604a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         * @param {boolean} accepted
160509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.HeapProfileHeader}
1606a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         */
1607a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        function onOpen(accepted)
16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
1609a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            if (!accepted)
1610a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                return;
161109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (this._failedToCreateTempFile) {
1612197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                WebInspector.console.error("Failed to open temp file with heap snapshot");
161309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                fileOutputStream.close();
161409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            } else if (this._tempFile) {
161509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                var delegate = new WebInspector.SaveSnapshotOutputStreamDelegate(this);
161609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                this._tempFile.writeToOutputSteam(fileOutputStream, delegate);
161709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            } else {
161809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                this._onTempFileReady = onOpen.bind(this, accepted);
161909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                this._updateSaveProgress(0, 1);
162009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            }
16215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
162253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._fileName = this._fileName || "Heap-" + new Date().toISO8601Compact() + this._profileType.fileExtension();
1623926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        fileOutputStream.open(this._fileName, onOpen.bind(this));
16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
162609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    _updateSaveProgress: function(value, total)
162709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
162809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        var percentValue = ((total ? (value / total) : 0) * 100).toFixed(0);
162909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this.updateStatus(WebInspector.UIString("Saving\u2026 %d\%", percentValue));
163009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    },
163109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @override
1634a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!File} file
16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
16365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    loadFromFile: function(file)
16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
163809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this.updateStatus(WebInspector.UIString("Loading\u2026"), true);
16395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._setupWorker();
16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var delegate = new WebInspector.HeapSnapshotLoadFromFileDelegate(this);
16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var fileReader = this._createFileReader(file, delegate);
16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fileReader.start(this._receiver);
16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
16445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _createFileReader: function(file, delegate)
16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return new WebInspector.ChunkedFileReader(file, 10000000, delegate);
16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    __proto__: WebInspector.ProfileHeader.prototype
16515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16538abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)/**
16548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) * @constructor
165509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @implements {WebInspector.OutputStreamDelegate}
16568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) */
165709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.HeapSnapshotLoadFromFileDelegate = function(snapshotHeader)
16588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
165909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    this._snapshotHeader = snapshotHeader;
16608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
16618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
166209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.HeapSnapshotLoadFromFileDelegate.prototype = {
166309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    onTransferStarted: function()
16648abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    {
16658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    },
16668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
166709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
166809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {!WebInspector.ChunkedReader} reader
166909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
167009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    onChunkTransferred: function(reader)
16718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    {
16728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    },
16738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
167409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    onTransferFinished: function()
16758abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    {
16768abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    },
16778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
167809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
167909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {!WebInspector.ChunkedReader} reader
1680197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!Event} e
168109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
168209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    onError: function (reader, e)
16838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    {
168409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        var subtitle;
168509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        switch(e.target.error.code) {
168609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        case e.target.error.NOT_FOUND_ERR:
168709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            subtitle = WebInspector.UIString("'%s' not found.", reader.fileName());
168809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            break;
168909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        case e.target.error.NOT_READABLE_ERR:
169009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            subtitle = WebInspector.UIString("'%s' is not readable", reader.fileName());
169109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            break;
169209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        case e.target.error.ABORT_ERR:
169309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return;
169409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        default:
169509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            subtitle = WebInspector.UIString("'%s' error %d", reader.fileName(), e.target.error.code);
16968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        }
169709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._snapshotHeader.updateStatus(subtitle);
169809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
16998abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
17008abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
17018abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)/**
17028abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) * @constructor
170309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @implements {WebInspector.OutputStreamDelegate}
170409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!WebInspector.HeapProfileHeader} profileHeader
17058abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) */
170609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.SaveSnapshotOutputStreamDelegate = function(profileHeader)
17078abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
170809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    this._profileHeader = profileHeader;
17098abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
17108abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
171109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.SaveSnapshotOutputStreamDelegate.prototype = {
171209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    onTransferStarted: function()
17138abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    {
171409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._profileHeader._updateSaveProgress(0, 1);
17158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    },
17168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
171709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    onTransferFinished: function()
17185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
171909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._profileHeader._didCompleteSnapshotTransfer();
17205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
17215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1723a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.ChunkedReader} reader
17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    onChunkTransferred: function(reader)
17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
172709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._profileHeader._updateSaveProgress(reader.loadedSize(), reader.fileSize());
17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
17295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1731a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.ChunkedReader} reader
1732197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!Event} event
17335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
173409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    onError: function(reader, event)
17355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1736197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        WebInspector.console.error("Failed to read heap snapshot from temp file: " + /** @type {!ErrorEvent} */ (event).message);
173709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this.onTransferFinished();
17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
174053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
174153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)/**
174253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * @constructor
1743d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.VBox}
174453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * @param {!WebInspector.HeapProfileHeader} heapProfileHeader
174553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) */
174653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)WebInspector.HeapTrackingOverviewGrid = function(heapProfileHeader)
174753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
1748d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.VBox.call(this);
174953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this.registerRequiredCSS("flameChart.css");
175053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this.element.id = "heap-recording-view";
175109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    this.element.classList.add("heap-tracking-overview");
175253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
175353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this._overviewContainer = this.element.createChild("div", "overview-container");
175453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this._overviewGrid = new WebInspector.OverviewGrid("heap-recording");
1755a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this._overviewGrid.element.classList.add("fill");
175651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
175753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this._overviewCanvas = this._overviewContainer.createChild("canvas", "heap-recording-overview-canvas");
175853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this._overviewContainer.appendChild(this._overviewGrid.element);
175953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this._overviewCalculator = new WebInspector.HeapTrackingOverviewGrid.OverviewCalculator();
176053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this._overviewGrid.addEventListener(WebInspector.OverviewGrid.Events.WindowChanged, this._onWindowChanged, this);
176153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1762a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this._profileSamples = heapProfileHeader._profileSamples;
1763a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (heapProfileHeader.profileType().profileBeingRecorded() === heapProfileHeader) {
1764197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._profileType = heapProfileHeader.profileType();
176593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this._profileType.addEventListener(WebInspector.TrackingHeapSnapshotProfileType.HeapStatsUpdate, this._onHeapStatsUpdate, this);
176693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this._profileType.addEventListener(WebInspector.TrackingHeapSnapshotProfileType.TrackingStopped, this._onStopTracking, this);
176793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
176853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    var timestamps = this._profileSamples.timestamps;
176993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    var totalTime = this._profileSamples.totalTime;
177053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this._windowLeft = 0.0;
177193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    this._windowRight = totalTime && timestamps.length ? (timestamps[timestamps.length - 1] - timestamps[0]) / totalTime : 1.0;
177293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    this._overviewGrid.setWindow(this._windowLeft, this._windowRight);
1773521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._yScale = new WebInspector.HeapTrackingOverviewGrid.SmoothScale();
1774521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._xScale = new WebInspector.HeapTrackingOverviewGrid.SmoothScale();
177553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
177653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
177753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)WebInspector.HeapTrackingOverviewGrid.IdsRangeChanged = "IdsRangeChanged";
177853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
177953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)WebInspector.HeapTrackingOverviewGrid.prototype = {
178093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    _onStopTracking: function(event)
178193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
178293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this._profileType.removeEventListener(WebInspector.TrackingHeapSnapshotProfileType.HeapStatsUpdate, this._onHeapStatsUpdate, this);
178393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this._profileType.removeEventListener(WebInspector.TrackingHeapSnapshotProfileType.TrackingStopped, this._onStopTracking, this);
178493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    },
178593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
178693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    _onHeapStatsUpdate: function(event)
178793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
178893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this._profileSamples = event.data;
178993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this._scheduleUpdate();
179093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    },
179193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
179293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     /**
179353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)      * @param {number} width
179453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)      * @param {number} height
179553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)      */
179653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    _drawOverviewCanvas: function(width, height)
179753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
179893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        if (!this._profileSamples)
179993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            return;
180093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        var profileSamples = this._profileSamples;
180193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        var sizes = profileSamples.sizes;
18025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        var topSizes = profileSamples.max;
180393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        var timestamps = profileSamples.timestamps;
18045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        var startTime = timestamps[0];
18055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        var endTime = timestamps[timestamps.length - 1];
180653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1807521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var scaleFactor = this._xScale.nextScale(width / profileSamples.totalTime);
18085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        var maxSize = 0;
180953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        /**
1810a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)          * @param {!Array.<number>} sizes
181153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)          * @param {function(number, number):void} callback
181253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)          */
181353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        function aggregateAndCall(sizes, callback)
181453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        {
181553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            var size = 0;
181653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            var currentX = 0;
181753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            for (var i = 1; i < timestamps.length; ++i) {
18185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                var x = Math.floor((timestamps[i] - startTime) * scaleFactor);
181953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                if (x !== currentX) {
182053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                    if (size)
182153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                        callback(currentX, size);
182253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                    size = 0;
182353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                    currentX = x;
182453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                }
182553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                size += sizes[i];
182653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            }
182753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            callback(currentX, size);
182853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
182953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
183053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        /**
183153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)          * @param {number} x
183253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)          * @param {number} size
183353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)          */
18345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        function maxSizeCallback(x, size)
183553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        {
18365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            maxSize = Math.max(maxSize, size);
183753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
183853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
18395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        aggregateAndCall(sizes, maxSizeCallback);
184053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1841521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var yScaleFactor = this._yScale.nextScale(maxSize ? height / (maxSize * 1.1) : 0.0);
1842521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
184353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._overviewCanvas.width = width * window.devicePixelRatio;
184453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._overviewCanvas.height = height * window.devicePixelRatio;
184553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._overviewCanvas.style.width = width + "px";
184653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._overviewCanvas.style.height = height + "px";
18475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
184853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var context = this._overviewCanvas.getContext("2d");
184953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        context.scale(window.devicePixelRatio, window.devicePixelRatio);
185053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
185193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        context.beginPath();
185293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        context.lineWidth = 2;
185393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        context.strokeStyle = "rgba(192, 192, 192, 0.6)";
1854521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var currentX = (endTime - startTime) * scaleFactor;
185593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        context.moveTo(currentX, height - 1);
185693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        context.lineTo(currentX, 0);
185793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        context.stroke();
185893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        context.closePath();
185993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
186093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        var gridY;
186193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        var gridValue;
186293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        var gridLabelHeight = 14;
1863521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (yScaleFactor) {
186493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            const maxGridValue = (height - gridLabelHeight) / yScaleFactor;
186593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            // The round value calculation is a bit tricky, because
18665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            // it has a form k*10^n*1024^m, where k=[1,5], n=[0..3], m is an integer,
18675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            // e.g. a round value 10KB is 10240 bytes.
186893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            gridValue = Math.pow(1024, Math.floor(Math.log(maxGridValue) / Math.log(1024)));
18691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            gridValue *= Math.pow(10, Math.floor(Math.log(maxGridValue / gridValue) / Math.LN10));
18705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            if (gridValue * 5 <= maxGridValue)
18715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                gridValue *= 5;
187293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            gridY = Math.round(height - gridValue * yScaleFactor - 0.5) + 0.5;
187393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            context.beginPath();
187493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            context.lineWidth = 1;
187593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            context.strokeStyle = "rgba(0, 0, 0, 0.2)";
187693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            context.moveTo(0, gridY);
187793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            context.lineTo(width, gridY);
187893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            context.stroke();
187993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            context.closePath();
188093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        }
188193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
188253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        /**
188353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)          * @param {number} x
188453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)          * @param {number} size
188553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)          */
188653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        function drawBarCallback(x, size)
188753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        {
188853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            context.moveTo(x, height - 1);
188953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            context.lineTo(x, Math.round(height - size * yScaleFactor - 1));
189053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
189153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
189253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        context.beginPath();
189353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        context.lineWidth = 2;
189453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        context.strokeStyle = "rgba(192, 192, 192, 0.6)";
18955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        aggregateAndCall(topSizes, drawBarCallback);
189653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        context.stroke();
189753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        context.closePath();
189853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
189953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        context.beginPath();
190053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        context.lineWidth = 2;
190153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        context.strokeStyle = "rgba(0, 0, 192, 0.8)";
190253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        aggregateAndCall(sizes, drawBarCallback);
190353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        context.stroke();
190453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        context.closePath();
190593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
190693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        if (gridValue) {
190793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            var label = Number.bytesToString(gridValue);
190893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            var labelPadding = 4;
190993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            var labelX = 0;
191093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            var labelY = gridY - 0.5;
191193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            var labelWidth = 2 * labelPadding + context.measureText(label).width;
191293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            context.beginPath();
191393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            context.textBaseline = "bottom";
191493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            context.font = "10px " + window.getComputedStyle(this.element, null).getPropertyValue("font-family");
191593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            context.fillStyle = "rgba(255, 255, 255, 0.75)";
191693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            context.fillRect(labelX, labelY - gridLabelHeight, labelWidth, gridLabelHeight);
191793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            context.fillStyle = "rgb(64, 64, 64)";
191893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            context.fillText(label, labelX + labelPadding, labelY);
191993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            context.fill();
192093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            context.closePath();
192193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        }
192253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
192353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
192453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    onResize: function()
192553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
192653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._updateOverviewCanvas = true;
192753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._scheduleUpdate();
192853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
192953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
193053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    _onWindowChanged: function()
193153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
193253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!this._updateGridTimerId)
193353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            this._updateGridTimerId = setTimeout(this._updateGrid.bind(this), 10);
193453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
193553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
193653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    _scheduleUpdate: function()
193753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
193853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (this._updateTimerId)
193953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return;
194053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._updateTimerId = setTimeout(this.update.bind(this), 10);
194153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
194253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
194353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    _updateBoundaries: function()
194453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
194553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._windowLeft = this._overviewGrid.windowLeft();
194653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._windowRight = this._overviewGrid.windowRight();
194753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._windowWidth = this._windowRight - this._windowLeft;
194853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
194953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
195093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    update: function()
195153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
195253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._updateTimerId = null;
1953521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (!this.isShowing())
1954521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            return;
195553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._updateBoundaries();
195653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._overviewCalculator._updateBoundaries(this);
195753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._overviewGrid.updateDividers(this._overviewCalculator);
195893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this._drawOverviewCanvas(this._overviewContainer.clientWidth, this._overviewContainer.clientHeight - 20);
195953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
196053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
196153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    _updateGrid: function()
196253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
196353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._updateGridTimerId = 0;
196453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._updateBoundaries();
196553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var ids = this._profileSamples.ids;
196653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var timestamps = this._profileSamples.timestamps;
196753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var sizes = this._profileSamples.sizes;
196853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var startTime = timestamps[0];
196993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        var totalTime = this._profileSamples.totalTime;
197093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        var timeLeft = startTime + totalTime * this._windowLeft;
197193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        var timeRight = startTime + totalTime * this._windowRight;
197253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var minId = 0;
197353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var maxId = ids[ids.length - 1] + 1;
197453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var size = 0;
197593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        for (var i = 0; i < timestamps.length; ++i) {
197653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            if (!timestamps[i])
197753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                continue;
197853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            if (timestamps[i] > timeRight)
197953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                break;
198053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            maxId = ids[i];
198193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            if (timestamps[i] < timeLeft) {
198253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                minId = ids[i];
198353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                continue;
198453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            }
198553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            size += sizes[i];
198653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
198753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
198853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.HeapTrackingOverviewGrid.IdsRangeChanged, {minId: minId, maxId: maxId, size: size});
198953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
199053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1991d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    __proto__: WebInspector.VBox.prototype
199253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
199353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
199453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
199553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)/**
199653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * @constructor
1997521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) */
1998521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)WebInspector.HeapTrackingOverviewGrid.SmoothScale = function()
1999521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
2000521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._lastUpdate = 0;
2001521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._currentScale = 0.0;
2002521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
2003521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
2004521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)WebInspector.HeapTrackingOverviewGrid.SmoothScale.prototype = {
2005521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
2006521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @param {number} target
2007521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @return {number}
2008521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
2009521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    nextScale: function(target) {
2010521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        target = target || this._currentScale;
2011521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (this._currentScale) {
2012521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            var now = Date.now();
2013521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            var timeDeltaMs = now - this._lastUpdate;
2014521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            this._lastUpdate = now;
2015521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            var maxChangePerSec = 20;
2016521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            var maxChangePerDelta = Math.pow(maxChangePerSec, timeDeltaMs / 1000);
2017521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            var scaleChange = target / this._currentScale;
2018521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            this._currentScale *= Number.constrain(scaleChange, 1 / maxChangePerDelta, maxChangePerDelta);
2019521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        } else
2020521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            this._currentScale = target;
2021521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return this._currentScale;
2022521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    }
2023521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
2024521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
2025521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
2026521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)/**
2027521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * @constructor
202853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * @implements {WebInspector.TimelineGrid.Calculator}
202953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) */
203053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)WebInspector.HeapTrackingOverviewGrid.OverviewCalculator = function()
203153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
203253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
203353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
203453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)WebInspector.HeapTrackingOverviewGrid.OverviewCalculator.prototype = {
203553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    /**
2036d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @return {number}
2037d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
2038d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    paddingLeft: function()
2039d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
2040d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
2041d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
2042d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2043d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
2044a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.HeapTrackingOverviewGrid} chart
204553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     */
204653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    _updateBoundaries: function(chart)
204753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
204853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._minimumBoundaries = 0;
204993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this._maximumBoundaries = chart._profileSamples.totalTime;
205053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._xScaleFactor = chart._overviewContainer.clientWidth / this._maximumBoundaries;
205153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
205253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
205353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    /**
205453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     * @param {number} time
205509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {number}
205653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     */
205753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    computePosition: function(time)
205853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
205953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return (time - this._minimumBoundaries) * this._xScaleFactor;
206053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
206153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2062a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    /**
2063a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {number} value
2064d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {number=} precision
2065a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {string}
2066a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     */
2067d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    formatTime: function(value, precision)
206853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
2069d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return Number.secondsToString(value / 1000, !!precision);
207053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
207153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
207209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
207309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {number}
207409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
207553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    maximumBoundary: function()
207653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
207753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return this._maximumBoundaries;
207853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
207953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
208009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
208109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {number}
208209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
208353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    minimumBoundary: function()
208453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
208553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return this._minimumBoundaries;
208653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
208753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
208809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
208909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {number}
209009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
209153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    zeroTime: function()
209253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
209353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return this._minimumBoundaries;
209453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
209553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
209609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
209709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {number}
209809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
209953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    boundarySpan: function()
210053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
210153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return this._maximumBoundaries - this._minimumBoundaries;
210253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
210353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
2104d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)/**
2107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @constructor
2108d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.VBox}
2109d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) */
2110d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.HeapSnapshotStatisticsView = function()
2111d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2112d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.VBox.call(this);
211307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    this.setMinimumSize(50, 25);
21147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this._pieChart = new WebInspector.PieChart(150, WebInspector.HeapSnapshotStatisticsView._valueFormatter);
2115d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this.element.appendChild(this._pieChart.element);
2116d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._labels = this.element.createChild("div", "heap-snapshot-stats-legend");
2117d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2118d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
21197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci/**
21207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {number} value
21217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @return {string}
21227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci */
21237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebInspector.HeapSnapshotStatisticsView._valueFormatter = function(value)
21247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
21257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return WebInspector.UIString("%s KB", Number.withThousandsSeparator(Math.round(value / 1024)));
21267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
21277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.HeapSnapshotStatisticsView.prototype = {
2129d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
2130d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {number} value
2131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
2132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    setTotal: function(value)
2133d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
2134d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._pieChart.setTotal(value);
2135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
2136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2137d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
2138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {number} value
2139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {string} name
2140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {string=} color
2141d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
2142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    addRecord: function(value, name, color)
2143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
2144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (color)
2145d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            this._pieChart.addSlice(value, color);
2146d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2147d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var node = this._labels.createChild("div");
2148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var swatchDiv = node.createChild("div", "heap-snapshot-stats-swatch");
2149d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var nameDiv = node.createChild("div", "heap-snapshot-stats-name");
2150d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var sizeDiv = node.createChild("div", "heap-snapshot-stats-size");
2151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (color)
2152d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            swatchDiv.style.backgroundColor = color;
2153d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        else
2154d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            swatchDiv.classList.add("heap-snapshot-stats-empty-swatch");
2155d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        nameDiv.textContent = name;
21567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        sizeDiv.textContent = WebInspector.HeapSnapshotStatisticsView._valueFormatter(value);
2157d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
2158d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2159d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    __proto__: WebInspector.VBox.prototype
2160d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2161a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
2162a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch/**
2163a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch * @constructor
2164a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch * @extends {WebInspector.View}
21657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {?WebInspector.Target} target
2166a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch */
21677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebInspector.HeapAllocationStackView = function(target)
2168a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
2169a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    WebInspector.View.call(this);
21707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this._target = target;;
2171a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    this._linkifier = new WebInspector.Linkifier();
2172a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
2173a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
2174a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochWebInspector.HeapAllocationStackView.prototype = {
2175a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    /**
2176a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @param {!WebInspector.HeapSnapshotProxy} snapshot
2177a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @param {number} snapshotNodeIndex
2178a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     */
2179a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    setAllocatedObject: function(snapshot, snapshotNodeIndex)
2180a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    {
2181a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this.clear();
2182a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        snapshot.allocationStack(snapshotNodeIndex, this._didReceiveAllocationStack.bind(this));
2183a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    },
2184a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
2185a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    clear: function()
2186a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    {
2187a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this.element.removeChildren();
2188a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._linkifier.reset();
2189a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    },
2190a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
2191a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    /**
2192a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @param {?Array.<!WebInspector.HeapSnapshotCommon.AllocationStackFrame>} frames
2193a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     */
2194a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    _didReceiveAllocationStack: function(frames)
2195a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    {
2196a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (!frames) {
2197a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            var stackDiv = this.element.createChild("div", "no-heap-allocation-stack");
2198a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            stackDiv.createTextChild(WebInspector.UIString("Stack was not recorded for this object because it had been allocated before this profile recording started."));
2199a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            return;
2200a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        }
2201a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
2202a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var stackDiv = this.element.createChild("div", "heap-allocation-stack");
2203a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        for (var i = 0; i < frames.length; i++) {
2204a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            var frame = frames[i];
2205a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            var frameDiv = stackDiv.createChild("div", "stack-frame");
2206a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            var name = frameDiv.createChild("div");
2207a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            name.textContent = frame.functionName;
2208a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            if (frame.scriptId) {
22097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                var urlElement = this._linkifier.linkifyScriptLocation(this._target, String(frame.scriptId), frame.scriptName, frame.line - 1, frame.column - 1);
2210a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                frameDiv.appendChild(urlElement);
2211a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            }
2212a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        }
2213a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    },
2214a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
2215a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    __proto__: WebInspector.View.prototype
2216a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
2217