| Index: third_party/WebKit/Source/devtools/front_end/profiler/ProfileView.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/ProfileView.js b/third_party/WebKit/Source/devtools/front_end/profiler/ProfileView.js
|
| index 6c0f189a27795feb8e4839a4d8365baec1eaf0d6..852b0ecc6c8cae4d4e795c5e1e63cd77f91deb2d 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/profiler/ProfileView.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/profiler/ProfileView.js
|
| @@ -1,24 +1,29 @@
|
| // Copyright 2016 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
| -
|
| /**
|
| - * @constructor
|
| * @implements {WebInspector.Searchable}
|
| - * @extends {WebInspector.SimpleView}
|
| + * @unrestricted
|
| */
|
| -WebInspector.ProfileView = function()
|
| -{
|
| - WebInspector.SimpleView.call(this, WebInspector.UIString("Profile"));
|
| +WebInspector.ProfileView = class extends WebInspector.SimpleView {
|
| + constructor() {
|
| + super(WebInspector.UIString('Profile'));
|
|
|
| this._searchableView = new WebInspector.SearchableView(this);
|
| - this._searchableView.setPlaceholder(WebInspector.UIString("Find by cost (>50ms), name or file"));
|
| + this._searchableView.setPlaceholder(WebInspector.UIString('Find by cost (>50ms), name or file'));
|
| this._searchableView.show(this.element);
|
|
|
| var columns = /** @type {!Array<!WebInspector.DataGrid.ColumnDescriptor>} */ ([]);
|
| - columns.push({id: "self", title: this.columnHeader("self"), width: "120px", fixedWidth: true, sortable: true, sort: WebInspector.DataGrid.Order.Descending});
|
| - columns.push({id: "total", title: this.columnHeader("total"), width: "120px", fixedWidth: true, sortable: true});
|
| - columns.push({id: "function", title: WebInspector.UIString("Function"), disclosure: true, sortable: true});
|
| + columns.push({
|
| + id: 'self',
|
| + title: this.columnHeader('self'),
|
| + width: '120px',
|
| + fixedWidth: true,
|
| + sortable: true,
|
| + sort: WebInspector.DataGrid.Order.Descending
|
| + });
|
| + columns.push({id: 'total', title: this.columnHeader('total'), width: '120px', fixedWidth: true, sortable: true});
|
| + columns.push({id: 'function', title: WebInspector.UIString('Function'), disclosure: true, sortable: true});
|
|
|
| this.dataGrid = new WebInspector.DataGrid(columns);
|
| this.dataGrid.addEventListener(WebInspector.DataGrid.Events.SortingChanged, this._sortProfile, this);
|
| @@ -27,591 +32,554 @@ WebInspector.ProfileView = function()
|
|
|
| this.viewSelectComboBox = new WebInspector.ToolbarComboBox(this._changeView.bind(this));
|
|
|
| - this.focusButton = new WebInspector.ToolbarButton(WebInspector.UIString("Focus selected function"), "visibility-toolbar-item");
|
| + this.focusButton =
|
| + new WebInspector.ToolbarButton(WebInspector.UIString('Focus selected function'), 'visibility-toolbar-item');
|
| this.focusButton.setEnabled(false);
|
| - this.focusButton.addEventListener("click", this._focusClicked, this);
|
| + this.focusButton.addEventListener('click', this._focusClicked, this);
|
|
|
| - this.excludeButton = new WebInspector.ToolbarButton(WebInspector.UIString("Exclude selected function"), "delete-toolbar-item");
|
| + this.excludeButton =
|
| + new WebInspector.ToolbarButton(WebInspector.UIString('Exclude selected function'), 'delete-toolbar-item');
|
| this.excludeButton.setEnabled(false);
|
| - this.excludeButton.addEventListener("click", this._excludeClicked, this);
|
| + this.excludeButton.addEventListener('click', this._excludeClicked, this);
|
|
|
| - this.resetButton = new WebInspector.ToolbarButton(WebInspector.UIString("Restore all functions"), "refresh-toolbar-item");
|
| + this.resetButton =
|
| + new WebInspector.ToolbarButton(WebInspector.UIString('Restore all functions'), 'refresh-toolbar-item');
|
| this.resetButton.setEnabled(false);
|
| - this.resetButton.addEventListener("click", this._resetClicked, this);
|
| + this.resetButton.addEventListener('click', this._resetClicked, this);
|
|
|
| this._linkifier = new WebInspector.Linkifier(new WebInspector.Linkifier.DefaultFormatter(30));
|
| -};
|
| -
|
| -/** @enum {string} */
|
| -WebInspector.ProfileView.ViewTypes = {
|
| - Flame: "Flame",
|
| - Tree: "Tree",
|
| - Heavy: "Heavy"
|
| -};
|
| -
|
| -/**
|
| - * @param {!Array<!{title: string, value: string}>} entryInfo
|
| - * @return {!Element}
|
| - */
|
| -WebInspector.ProfileView.buildPopoverTable = function(entryInfo)
|
| -{
|
| - var table = createElement("table");
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array<!{title: string, value: string}>} entryInfo
|
| + * @return {!Element}
|
| + */
|
| + static buildPopoverTable(entryInfo) {
|
| + var table = createElement('table');
|
| for (var entry of entryInfo) {
|
| - var row = table.createChild("tr");
|
| - row.createChild("td").textContent = entry.title;
|
| - row.createChild("td").textContent = entry.value;
|
| + var row = table.createChild('tr');
|
| + row.createChild('td').textContent = entry.title;
|
| + row.createChild('td').textContent = entry.value;
|
| }
|
| return table;
|
| -};
|
| -
|
| -WebInspector.ProfileView.prototype = {
|
| - /**
|
| - * @param {!WebInspector.ProfileDataGridNode.Formatter} nodeFormatter
|
| - * @param {!Array<string>=} viewTypes
|
| - * @protected
|
| - */
|
| - initialize: function(nodeFormatter, viewTypes)
|
| - {
|
| - this._nodeFormatter = nodeFormatter;
|
| -
|
| - this._viewType = WebInspector.settings.createSetting("profileView", WebInspector.ProfileView.ViewTypes.Heavy);
|
| - viewTypes = viewTypes || [
|
| - WebInspector.ProfileView.ViewTypes.Flame,
|
| - WebInspector.ProfileView.ViewTypes.Heavy,
|
| - WebInspector.ProfileView.ViewTypes.Tree
|
| - ];
|
| -
|
| - var optionNames = new Map([
|
| - [WebInspector.ProfileView.ViewTypes.Flame, WebInspector.UIString("Chart")],
|
| - [WebInspector.ProfileView.ViewTypes.Heavy, WebInspector.UIString("Heavy (Bottom Up)")],
|
| - [WebInspector.ProfileView.ViewTypes.Tree, WebInspector.UIString("Tree (Top Down)")],
|
| - ]);
|
| -
|
| - var options = new Map(viewTypes.map(type => [type, this.viewSelectComboBox.createOption(optionNames.get(type), "", type)]));
|
| - var optionName = this._viewType.get() || viewTypes[0];
|
| - var option = options.get(optionName) || options.get(viewTypes[0]);
|
| - this.viewSelectComboBox.select(option);
|
| -
|
| - this._changeView();
|
| - if (this._flameChart)
|
| - this._flameChart.update();
|
| - },
|
| -
|
| - focus: function()
|
| - {
|
| - if (this._flameChart)
|
| - this._flameChart.focus();
|
| - else
|
| - WebInspector.Widget.prototype.focus.call(this);
|
| - },
|
| -
|
| - /**
|
| - * @param {string} columnId
|
| - * @return {string}
|
| - */
|
| - columnHeader: function(columnId)
|
| - {
|
| - throw "Not implemented";
|
| - },
|
| -
|
| - /**
|
| - * @return {?WebInspector.Target}
|
| - */
|
| - target: function()
|
| - {
|
| - return this._profileHeader.target();
|
| - },
|
| -
|
| - /**
|
| - * @param {number} timeLeft
|
| - * @param {number} timeRight
|
| - */
|
| - selectRange: function(timeLeft, timeRight)
|
| - {
|
| - if (!this._flameChart)
|
| - return;
|
| - this._flameChart.selectRange(timeLeft, timeRight);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Array.<!WebInspector.ToolbarItem>}
|
| - */
|
| - syncToolbarItems: function()
|
| - {
|
| - return [this.viewSelectComboBox, this.focusButton, this.excludeButton, this.resetButton];
|
| - },
|
| -
|
| - /**
|
| - * @return {!WebInspector.ProfileDataGridTree}
|
| - */
|
| - _getBottomUpProfileDataGridTree: function()
|
| - {
|
| - if (!this._bottomUpProfileDataGridTree)
|
| - this._bottomUpProfileDataGridTree = new WebInspector.BottomUpProfileDataGridTree(this._nodeFormatter, this._searchableView, this.profile.root, this.adjustedTotal);
|
| - return this._bottomUpProfileDataGridTree;
|
| - },
|
| -
|
| - /**
|
| - * @return {!WebInspector.ProfileDataGridTree}
|
| - */
|
| - _getTopDownProfileDataGridTree: function()
|
| - {
|
| - if (!this._topDownProfileDataGridTree)
|
| - this._topDownProfileDataGridTree = new WebInspector.TopDownProfileDataGridTree(this._nodeFormatter, this._searchableView, this.profile.root, this.adjustedTotal);
|
| - return this._topDownProfileDataGridTree;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - willHide: function()
|
| - {
|
| - this._currentSearchResultIndex = -1;
|
| - },
|
| -
|
| - refresh: function()
|
| - {
|
| - var selectedProfileNode = this.dataGrid.selectedNode ? this.dataGrid.selectedNode.profileNode : null;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.ProfileDataGridNode.Formatter} nodeFormatter
|
| + * @param {!Array<string>=} viewTypes
|
| + * @protected
|
| + */
|
| + initialize(nodeFormatter, viewTypes) {
|
| + this._nodeFormatter = nodeFormatter;
|
| +
|
| + this._viewType = WebInspector.settings.createSetting('profileView', WebInspector.ProfileView.ViewTypes.Heavy);
|
| + viewTypes = viewTypes || [
|
| + WebInspector.ProfileView.ViewTypes.Flame, WebInspector.ProfileView.ViewTypes.Heavy,
|
| + WebInspector.ProfileView.ViewTypes.Tree
|
| + ];
|
| +
|
| + var optionNames = new Map([
|
| + [WebInspector.ProfileView.ViewTypes.Flame, WebInspector.UIString('Chart')],
|
| + [WebInspector.ProfileView.ViewTypes.Heavy, WebInspector.UIString('Heavy (Bottom Up)')],
|
| + [WebInspector.ProfileView.ViewTypes.Tree, WebInspector.UIString('Tree (Top Down)')],
|
| + ]);
|
| +
|
| + var options =
|
| + new Map(viewTypes.map(type => [type, this.viewSelectComboBox.createOption(optionNames.get(type), '', type)]));
|
| + var optionName = this._viewType.get() || viewTypes[0];
|
| + var option = options.get(optionName) || options.get(viewTypes[0]);
|
| + this.viewSelectComboBox.select(option);
|
| +
|
| + this._changeView();
|
| + if (this._flameChart)
|
| + this._flameChart.update();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + focus() {
|
| + if (this._flameChart)
|
| + this._flameChart.focus();
|
| + else
|
| + super.focus();
|
| + }
|
| +
|
| + /**
|
| + * @param {string} columnId
|
| + * @return {string}
|
| + */
|
| + columnHeader(columnId) {
|
| + throw 'Not implemented';
|
| + }
|
| +
|
| + /**
|
| + * @return {?WebInspector.Target}
|
| + */
|
| + target() {
|
| + return this._profileHeader.target();
|
| + }
|
| +
|
| + /**
|
| + * @param {number} timeLeft
|
| + * @param {number} timeRight
|
| + */
|
| + selectRange(timeLeft, timeRight) {
|
| + if (!this._flameChart)
|
| + return;
|
| + this._flameChart.selectRange(timeLeft, timeRight);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Array.<!WebInspector.ToolbarItem>}
|
| + */
|
| + syncToolbarItems() {
|
| + return [this.viewSelectComboBox, this.focusButton, this.excludeButton, this.resetButton];
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.ProfileDataGridTree}
|
| + */
|
| + _getBottomUpProfileDataGridTree() {
|
| + if (!this._bottomUpProfileDataGridTree)
|
| + this._bottomUpProfileDataGridTree = new WebInspector.BottomUpProfileDataGridTree(
|
| + this._nodeFormatter, this._searchableView, this.profile.root, this.adjustedTotal);
|
| + return this._bottomUpProfileDataGridTree;
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.ProfileDataGridTree}
|
| + */
|
| + _getTopDownProfileDataGridTree() {
|
| + if (!this._topDownProfileDataGridTree)
|
| + this._topDownProfileDataGridTree = new WebInspector.TopDownProfileDataGridTree(
|
| + this._nodeFormatter, this._searchableView, this.profile.root, this.adjustedTotal);
|
| + return this._topDownProfileDataGridTree;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + willHide() {
|
| + this._currentSearchResultIndex = -1;
|
| + }
|
| +
|
| + refresh() {
|
| + var selectedProfileNode = this.dataGrid.selectedNode ? this.dataGrid.selectedNode.profileNode : null;
|
| +
|
| + this.dataGrid.rootNode().removeChildren();
|
| +
|
| + var children = this.profileDataGridTree.children;
|
| + var count = children.length;
|
| +
|
| + for (var index = 0; index < count; ++index)
|
| + this.dataGrid.rootNode().appendChild(children[index]);
|
| +
|
| + if (selectedProfileNode)
|
| + selectedProfileNode.selected = true;
|
| + }
|
| +
|
| + refreshVisibleData() {
|
| + var child = this.dataGrid.rootNode().children[0];
|
| + while (child) {
|
| + child.refresh();
|
| + child = child.traverseNextNode(false, null, true);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.SearchableView}
|
| + */
|
| + searchableView() {
|
| + return this._searchableView;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {boolean}
|
| + */
|
| + supportsCaseSensitiveSearch() {
|
| + return true;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {boolean}
|
| + */
|
| + supportsRegexSearch() {
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + searchCanceled() {
|
| + this._searchableElement.searchCanceled();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.SearchableView.SearchConfig} searchConfig
|
| + * @param {boolean} shouldJump
|
| + * @param {boolean=} jumpBackwards
|
| + */
|
| + performSearch(searchConfig, shouldJump, jumpBackwards) {
|
| + this._searchableElement.performSearch(searchConfig, shouldJump, jumpBackwards);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + jumpToNextSearchResult() {
|
| + this._searchableElement.jumpToNextSearchResult();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + jumpToPreviousSearchResult() {
|
| + this._searchableElement.jumpToPreviousSearchResult();
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.Linkifier}
|
| + */
|
| + linkifier() {
|
| + return this._linkifier;
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.FlameChartDataProvider}
|
| + */
|
| + createFlameChartDataProvider() {
|
| + throw 'Not implemented';
|
| + }
|
| +
|
| + _ensureFlameChartCreated() {
|
| + if (this._flameChart)
|
| + return;
|
| + this._dataProvider = this.createFlameChartDataProvider();
|
| + this._flameChart = new WebInspector.CPUProfileFlameChart(this._searchableView, this._dataProvider);
|
| + this._flameChart.addEventListener(WebInspector.FlameChart.Events.EntrySelected, this._onEntrySelected.bind(this));
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.Event} event
|
| + */
|
| + _onEntrySelected(event) {
|
| + var entryIndex = event.data;
|
| + var node = this._dataProvider._entryNodes[entryIndex];
|
| + var debuggerModel = this._profileHeader._debuggerModel;
|
| + if (!node || !node.scriptId || !debuggerModel)
|
| + return;
|
| + var script = debuggerModel.scriptForId(node.scriptId);
|
| + if (!script)
|
| + return;
|
| + var location = /** @type {!WebInspector.DebuggerModel.Location} */ (
|
| + debuggerModel.createRawLocation(script, node.lineNumber, node.columnNumber));
|
| + WebInspector.Revealer.reveal(WebInspector.debuggerWorkspaceBinding.rawLocationToUILocation(location));
|
| + }
|
| +
|
| + _changeView() {
|
| + if (!this.profile)
|
| + return;
|
| +
|
| + this._searchableView.closeSearch();
|
| +
|
| + if (this._visibleView)
|
| + this._visibleView.detach();
|
| +
|
| + this._viewType.set(this.viewSelectComboBox.selectedOption().value);
|
| + switch (this._viewType.get()) {
|
| + case WebInspector.ProfileView.ViewTypes.Flame:
|
| + this._ensureFlameChartCreated();
|
| + this._visibleView = this._flameChart;
|
| + this._searchableElement = this._flameChart;
|
| + break;
|
| + case WebInspector.ProfileView.ViewTypes.Tree:
|
| + this.profileDataGridTree = this._getTopDownProfileDataGridTree();
|
| + this._sortProfile();
|
| + this._visibleView = this.dataGrid.asWidget();
|
| + this._searchableElement = this.profileDataGridTree;
|
| + break;
|
| + case WebInspector.ProfileView.ViewTypes.Heavy:
|
| + this.profileDataGridTree = this._getBottomUpProfileDataGridTree();
|
| + this._sortProfile();
|
| + this._visibleView = this.dataGrid.asWidget();
|
| + this._searchableElement = this.profileDataGridTree;
|
| + break;
|
| + }
|
|
|
| - this.dataGrid.rootNode().removeChildren();
|
| + var isFlame = this._viewType.get() === WebInspector.ProfileView.ViewTypes.Flame;
|
| + this.focusButton.setVisible(!isFlame);
|
| + this.excludeButton.setVisible(!isFlame);
|
| + this.resetButton.setVisible(!isFlame);
|
|
|
| - var children = this.profileDataGridTree.children;
|
| - var count = children.length;
|
| + this._visibleView.show(this._searchableView.element);
|
| + }
|
|
|
| - for (var index = 0; index < count; ++index)
|
| - this.dataGrid.rootNode().appendChild(children[index]);
|
| + /**
|
| + * @param {boolean} selected
|
| + */
|
| + _nodeSelected(selected) {
|
| + this.focusButton.setEnabled(selected);
|
| + this.excludeButton.setEnabled(selected);
|
| + }
|
|
|
| - if (selectedProfileNode)
|
| - selectedProfileNode.selected = true;
|
| - },
|
| + _focusClicked(event) {
|
| + if (!this.dataGrid.selectedNode)
|
| + return;
|
|
|
| - refreshVisibleData: function()
|
| - {
|
| - var child = this.dataGrid.rootNode().children[0];
|
| - while (child) {
|
| - child.refresh();
|
| - child = child.traverseNextNode(false, null, true);
|
| - }
|
| - },
|
| + this.resetButton.setEnabled(true);
|
| + this.profileDataGridTree.focus(this.dataGrid.selectedNode);
|
| + this.refresh();
|
| + this.refreshVisibleData();
|
| + }
|
|
|
| - /**
|
| - * @return {!WebInspector.SearchableView}
|
| - */
|
| - searchableView: function()
|
| - {
|
| - return this._searchableView;
|
| - },
|
| + _excludeClicked(event) {
|
| + var selectedNode = this.dataGrid.selectedNode;
|
|
|
| - /**
|
| - * @override
|
| - * @return {boolean}
|
| - */
|
| - supportsCaseSensitiveSearch: function()
|
| - {
|
| - return true;
|
| - },
|
| + if (!selectedNode)
|
| + return;
|
|
|
| - /**
|
| - * @override
|
| - * @return {boolean}
|
| - */
|
| - supportsRegexSearch: function()
|
| - {
|
| - return false;
|
| - },
|
| + selectedNode.deselect();
|
|
|
| - /**
|
| - * @override
|
| - */
|
| - searchCanceled: function()
|
| - {
|
| - this._searchableElement.searchCanceled();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.SearchableView.SearchConfig} searchConfig
|
| - * @param {boolean} shouldJump
|
| - * @param {boolean=} jumpBackwards
|
| - */
|
| - performSearch: function(searchConfig, shouldJump, jumpBackwards)
|
| - {
|
| - this._searchableElement.performSearch(searchConfig, shouldJump, jumpBackwards);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - jumpToNextSearchResult: function()
|
| - {
|
| - this._searchableElement.jumpToNextSearchResult();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - jumpToPreviousSearchResult: function()
|
| - {
|
| - this._searchableElement.jumpToPreviousSearchResult();
|
| - },
|
| -
|
| - /**
|
| - * @return {!WebInspector.Linkifier}
|
| - */
|
| - linkifier: function()
|
| - {
|
| - return this._linkifier;
|
| - },
|
| + this.resetButton.setEnabled(true);
|
| + this.profileDataGridTree.exclude(selectedNode);
|
| + this.refresh();
|
| + this.refreshVisibleData();
|
| + }
|
|
|
| - /**
|
| - * @return {!WebInspector.FlameChartDataProvider}
|
| - */
|
| - createFlameChartDataProvider: function()
|
| - {
|
| - throw "Not implemented";
|
| - },
|
| -
|
| - _ensureFlameChartCreated: function()
|
| - {
|
| - if (this._flameChart)
|
| - return;
|
| - this._dataProvider = this.createFlameChartDataProvider();
|
| - this._flameChart = new WebInspector.CPUProfileFlameChart(this._searchableView, this._dataProvider);
|
| - this._flameChart.addEventListener(WebInspector.FlameChart.Events.EntrySelected, this._onEntrySelected.bind(this));
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.Event} event
|
| - */
|
| - _onEntrySelected: function(event)
|
| - {
|
| - var entryIndex = event.data;
|
| - var node = this._dataProvider._entryNodes[entryIndex];
|
| - var debuggerModel = this._profileHeader._debuggerModel;
|
| - if (!node || !node.scriptId || !debuggerModel)
|
| - return;
|
| - var script = debuggerModel.scriptForId(node.scriptId);
|
| - if (!script)
|
| - return;
|
| - var location = /** @type {!WebInspector.DebuggerModel.Location} */ (debuggerModel.createRawLocation(script, node.lineNumber, node.columnNumber));
|
| - WebInspector.Revealer.reveal(WebInspector.debuggerWorkspaceBinding.rawLocationToUILocation(location));
|
| - },
|
| -
|
| - _changeView: function()
|
| - {
|
| - if (!this.profile)
|
| - return;
|
| -
|
| - this._searchableView.closeSearch();
|
| -
|
| - if (this._visibleView)
|
| - this._visibleView.detach();
|
| -
|
| - this._viewType.set(this.viewSelectComboBox.selectedOption().value);
|
| - switch (this._viewType.get()) {
|
| - case WebInspector.ProfileView.ViewTypes.Flame:
|
| - this._ensureFlameChartCreated();
|
| - this._visibleView = this._flameChart;
|
| - this._searchableElement = this._flameChart;
|
| - break;
|
| - case WebInspector.ProfileView.ViewTypes.Tree:
|
| - this.profileDataGridTree = this._getTopDownProfileDataGridTree();
|
| - this._sortProfile();
|
| - this._visibleView = this.dataGrid.asWidget();
|
| - this._searchableElement = this.profileDataGridTree;
|
| - break;
|
| - case WebInspector.ProfileView.ViewTypes.Heavy:
|
| - this.profileDataGridTree = this._getBottomUpProfileDataGridTree();
|
| - this._sortProfile();
|
| - this._visibleView = this.dataGrid.asWidget();
|
| - this._searchableElement = this.profileDataGridTree;
|
| - break;
|
| - }
|
| -
|
| - var isFlame = this._viewType.get() === WebInspector.ProfileView.ViewTypes.Flame;
|
| - this.focusButton.setVisible(!isFlame);
|
| - this.excludeButton.setVisible(!isFlame);
|
| - this.resetButton.setVisible(!isFlame);
|
| -
|
| - this._visibleView.show(this._searchableView.element);
|
| - },
|
| + _resetClicked(event) {
|
| + this.resetButton.setEnabled(false);
|
| + this.profileDataGridTree.restore();
|
| + this._linkifier.reset();
|
| + this.refresh();
|
| + this.refreshVisibleData();
|
| + }
|
| +
|
| + _sortProfile() {
|
| + var sortAscending = this.dataGrid.isSortOrderAscending();
|
| + var sortColumnId = this.dataGrid.sortColumnId();
|
| + var sortProperty = sortColumnId === 'function' ? 'functionName' : sortColumnId || '';
|
| + this.profileDataGridTree.sort(WebInspector.ProfileDataGridTree.propertyComparator(sortProperty, sortAscending));
|
| +
|
| + this.refresh();
|
| + }
|
| +};
|
|
|
| - /**
|
| - * @param {boolean} selected
|
| - */
|
| - _nodeSelected: function(selected)
|
| - {
|
| - this.focusButton.setEnabled(selected);
|
| - this.excludeButton.setEnabled(selected);
|
| - },
|
| -
|
| - _focusClicked: function(event)
|
| - {
|
| - if (!this.dataGrid.selectedNode)
|
| - return;
|
| -
|
| - this.resetButton.setEnabled(true);
|
| - this.profileDataGridTree.focus(this.dataGrid.selectedNode);
|
| - this.refresh();
|
| - this.refreshVisibleData();
|
| - },
|
| -
|
| - _excludeClicked: function(event)
|
| - {
|
| - var selectedNode = this.dataGrid.selectedNode;
|
| -
|
| - if (!selectedNode)
|
| - return;
|
| -
|
| - selectedNode.deselect();
|
| -
|
| - this.resetButton.setEnabled(true);
|
| - this.profileDataGridTree.exclude(selectedNode);
|
| - this.refresh();
|
| - this.refreshVisibleData();
|
| - },
|
| -
|
| - _resetClicked: function(event)
|
| - {
|
| - this.resetButton.setEnabled(false);
|
| - this.profileDataGridTree.restore();
|
| - this._linkifier.reset();
|
| - this.refresh();
|
| - this.refreshVisibleData();
|
| - },
|
| -
|
| - _sortProfile: function()
|
| - {
|
| - var sortAscending = this.dataGrid.isSortOrderAscending();
|
| - var sortColumnId = this.dataGrid.sortColumnId();
|
| - var sortProperty = sortColumnId === "function" ? "functionName" : sortColumnId || "";
|
| - this.profileDataGridTree.sort(WebInspector.ProfileDataGridTree.propertyComparator(sortProperty, sortAscending));
|
| -
|
| - this.refresh();
|
| - },
|
| -
|
| - __proto__: WebInspector.SimpleView.prototype
|
| +/** @enum {string} */
|
| +WebInspector.ProfileView.ViewTypes = {
|
| + Flame: 'Flame',
|
| + Tree: 'Tree',
|
| + Heavy: 'Heavy'
|
| };
|
|
|
| +
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.ProfileHeader}
|
| * @implements {WebInspector.OutputStream}
|
| * @implements {WebInspector.OutputStreamDelegate}
|
| - * @param {?WebInspector.Target} target
|
| - * @param {!WebInspector.ProfileType} type
|
| - * @param {string=} title
|
| + * @unrestricted
|
| */
|
| -WebInspector.WritableProfileHeader = function(target, type, title)
|
| -{
|
| - WebInspector.ProfileHeader.call(this, target, type, title || WebInspector.UIString("Profile %d", type.nextProfileUid()));
|
| +WebInspector.WritableProfileHeader = class extends WebInspector.ProfileHeader {
|
| + /**
|
| + * @param {?WebInspector.Target} target
|
| + * @param {!WebInspector.ProfileType} type
|
| + * @param {string=} title
|
| + */
|
| + constructor(target, type, title) {
|
| + super(target, type, title || WebInspector.UIString('Profile %d', type.nextProfileUid()));
|
| this._debuggerModel = WebInspector.DebuggerModel.fromTarget(target);
|
| this._tempFile = null;
|
| -};
|
| -
|
| -WebInspector.WritableProfileHeader.prototype = {
|
| - /**
|
| - * @override
|
| - */
|
| - onTransferStarted: function()
|
| - {
|
| - this._jsonifiedProfile = "";
|
| - this.updateStatus(WebInspector.UIString("Loading\u2026 %s", Number.bytesToString(this._jsonifiedProfile.length)), true);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.ChunkedReader} reader
|
| - */
|
| - onChunkTransferred: function(reader)
|
| - {
|
| - this.updateStatus(WebInspector.UIString("Loading\u2026 %d%%", Number.bytesToString(this._jsonifiedProfile.length)));
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - onTransferFinished: function()
|
| - {
|
| - this.updateStatus(WebInspector.UIString("Parsing\u2026"), true);
|
| - this._profile = JSON.parse(this._jsonifiedProfile);
|
| - this._jsonifiedProfile = null;
|
| - this.updateStatus(WebInspector.UIString("Loaded"), false);
|
| -
|
| - if (this._profileType.profileBeingRecorded() === this)
|
| - this._profileType.setProfileBeingRecorded(null);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.ChunkedReader} reader
|
| - * @param {!Event} e
|
| - */
|
| - onError: function(reader, e)
|
| - {
|
| - var subtitle;
|
| - switch (e.target.error.code) {
|
| - case e.target.error.NOT_FOUND_ERR:
|
| - subtitle = WebInspector.UIString("'%s' not found.", reader.fileName());
|
| - break;
|
| - case e.target.error.NOT_READABLE_ERR:
|
| - subtitle = WebInspector.UIString("'%s' is not readable", reader.fileName());
|
| - break;
|
| - case e.target.error.ABORT_ERR:
|
| - return;
|
| - default:
|
| - subtitle = WebInspector.UIString("'%s' error %d", reader.fileName(), e.target.error.code);
|
| - }
|
| - this.updateStatus(subtitle);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {string} text
|
| - */
|
| - write: function(text)
|
| - {
|
| - this._jsonifiedProfile += text;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - close: function() { },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - dispose: function()
|
| - {
|
| - this.removeTempFile();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.ProfileType.DataDisplayDelegate} panel
|
| - * @return {!WebInspector.ProfileSidebarTreeElement}
|
| - */
|
| - createSidebarTreeElement: function(panel)
|
| - {
|
| - return new WebInspector.ProfileSidebarTreeElement(panel, this, "profile-sidebar-tree-item");
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {boolean}
|
| - */
|
| - canSaveToFile: function()
|
| - {
|
| - return !this.fromFile() && this._protocolProfile;
|
| - },
|
| -
|
| - saveToFile: function()
|
| - {
|
| - var fileOutputStream = new WebInspector.FileOutputStream();
|
| -
|
| - /**
|
| - * @param {boolean} accepted
|
| - * @this {WebInspector.WritableProfileHeader}
|
| - */
|
| - function onOpenForSave(accepted)
|
| - {
|
| - if (!accepted)
|
| - return;
|
| - function didRead(data)
|
| - {
|
| - if (data)
|
| - fileOutputStream.write(data, fileOutputStream.close.bind(fileOutputStream));
|
| - else
|
| - fileOutputStream.close();
|
| - }
|
| - if (this._failedToCreateTempFile) {
|
| - WebInspector.console.error("Failed to open temp file with heap snapshot");
|
| - fileOutputStream.close();
|
| - } else if (this._tempFile) {
|
| - this._tempFile.read(didRead);
|
| - } else {
|
| - this._onTempFileReady = onOpenForSave.bind(this, accepted);
|
| - }
|
| - }
|
| - this._fileName = this._fileName || `${this._profileType.typeName()}-${new Date().toISO8601Compact()}${this._profileType.fileExtension()}`;
|
| - fileOutputStream.open(this._fileName, onOpenForSave.bind(this));
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!File} file
|
| - */
|
| - loadFromFile: function(file)
|
| - {
|
| - this.updateStatus(WebInspector.UIString("Loading\u2026"), true);
|
| - var fileReader = new WebInspector.ChunkedFileReader(file, 10000000, this);
|
| - fileReader.start(this);
|
| - },
|
| -
|
| - /**
|
| - * @param {*} profile
|
| - */
|
| - setProtocolProfile: function(profile)
|
| - {
|
| - this._protocolProfile = profile;
|
| - this._saveProfileDataToTempFile(profile);
|
| - if (this.canSaveToFile())
|
| - this.dispatchEventToListeners(WebInspector.ProfileHeader.Events.ProfileReceived);
|
| - },
|
| -
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + onTransferStarted() {
|
| + this._jsonifiedProfile = '';
|
| + this.updateStatus(
|
| + WebInspector.UIString('Loading\u2026 %s', Number.bytesToString(this._jsonifiedProfile.length)), true);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.ChunkedReader} reader
|
| + */
|
| + onChunkTransferred(reader) {
|
| + this.updateStatus(WebInspector.UIString('Loading\u2026 %d%%', Number.bytesToString(this._jsonifiedProfile.length)));
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + onTransferFinished() {
|
| + this.updateStatus(WebInspector.UIString('Parsing\u2026'), true);
|
| + this._profile = JSON.parse(this._jsonifiedProfile);
|
| + this._jsonifiedProfile = null;
|
| + this.updateStatus(WebInspector.UIString('Loaded'), false);
|
| +
|
| + if (this._profileType.profileBeingRecorded() === this)
|
| + this._profileType.setProfileBeingRecorded(null);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.ChunkedReader} reader
|
| + * @param {!Event} e
|
| + */
|
| + onError(reader, e) {
|
| + var subtitle;
|
| + switch (e.target.error.code) {
|
| + case e.target.error.NOT_FOUND_ERR:
|
| + subtitle = WebInspector.UIString('\'%s\' not found.', reader.fileName());
|
| + break;
|
| + case e.target.error.NOT_READABLE_ERR:
|
| + subtitle = WebInspector.UIString('\'%s\' is not readable', reader.fileName());
|
| + break;
|
| + case e.target.error.ABORT_ERR:
|
| + return;
|
| + default:
|
| + subtitle = WebInspector.UIString('\'%s\' error %d', reader.fileName(), e.target.error.code);
|
| + }
|
| + this.updateStatus(subtitle);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {string} text
|
| + */
|
| + write(text) {
|
| + this._jsonifiedProfile += text;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + close() {
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + dispose() {
|
| + this.removeTempFile();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.ProfileType.DataDisplayDelegate} panel
|
| + * @return {!WebInspector.ProfileSidebarTreeElement}
|
| + */
|
| + createSidebarTreeElement(panel) {
|
| + return new WebInspector.ProfileSidebarTreeElement(panel, this, 'profile-sidebar-tree-item');
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {boolean}
|
| + */
|
| + canSaveToFile() {
|
| + return !this.fromFile() && this._protocolProfile;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + saveToFile() {
|
| + var fileOutputStream = new WebInspector.FileOutputStream();
|
| +
|
| + /**
|
| + * @param {boolean} accepted
|
| + * @this {WebInspector.WritableProfileHeader}
|
| + */
|
| + function onOpenForSave(accepted) {
|
| + if (!accepted)
|
| + return;
|
| + function didRead(data) {
|
| + if (data)
|
| + fileOutputStream.write(data, fileOutputStream.close.bind(fileOutputStream));
|
| + else
|
| + fileOutputStream.close();
|
| + }
|
| + if (this._failedToCreateTempFile) {
|
| + WebInspector.console.error('Failed to open temp file with heap snapshot');
|
| + fileOutputStream.close();
|
| + } else if (this._tempFile) {
|
| + this._tempFile.read(didRead);
|
| + } else {
|
| + this._onTempFileReady = onOpenForSave.bind(this, accepted);
|
| + }
|
| + }
|
| + this._fileName = this._fileName ||
|
| + `${this._profileType.typeName()}-${new Date().toISO8601Compact()}${this._profileType.fileExtension()}`;
|
| + fileOutputStream.open(this._fileName, onOpenForSave.bind(this));
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!File} file
|
| + */
|
| + loadFromFile(file) {
|
| + this.updateStatus(WebInspector.UIString('Loading\u2026'), true);
|
| + var fileReader = new WebInspector.ChunkedFileReader(file, 10000000, this);
|
| + fileReader.start(this);
|
| + }
|
| +
|
| + /**
|
| + * @param {*} profile
|
| + */
|
| + setProtocolProfile(profile) {
|
| + this._protocolProfile = profile;
|
| + this._saveProfileDataToTempFile(profile);
|
| + if (this.canSaveToFile())
|
| + this.dispatchEventToListeners(WebInspector.ProfileHeader.Events.ProfileReceived);
|
| + }
|
| +
|
| + /**
|
| + * @param {*} data
|
| + */
|
| + _saveProfileDataToTempFile(data) {
|
| + var serializedData = JSON.stringify(data);
|
| +
|
| + /**
|
| + * @this {WebInspector.WritableProfileHeader}
|
| + */
|
| + function didCreateTempFile(tempFile) {
|
| + this._writeToTempFile(tempFile, serializedData);
|
| + }
|
| + WebInspector.TempFile.create('cpu-profiler', String(this.uid)).then(didCreateTempFile.bind(this));
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.TempFile} tempFile
|
| + * @param {string} serializedData
|
| + */
|
| + _writeToTempFile(tempFile, serializedData) {
|
| + this._tempFile = tempFile;
|
| + if (!tempFile) {
|
| + this._failedToCreateTempFile = true;
|
| + this._notifyTempFileReady();
|
| + return;
|
| + }
|
| /**
|
| - * @param {*} data
|
| + * @param {number} fileSize
|
| + * @this {WebInspector.WritableProfileHeader}
|
| */
|
| - _saveProfileDataToTempFile: function(data)
|
| - {
|
| - var serializedData = JSON.stringify(data);
|
| -
|
| - /**
|
| - * @this {WebInspector.WritableProfileHeader}
|
| - */
|
| - function didCreateTempFile(tempFile)
|
| - {
|
| - this._writeToTempFile(tempFile, serializedData);
|
| - }
|
| - WebInspector.TempFile.create("cpu-profiler", String(this.uid))
|
| - .then(didCreateTempFile.bind(this));
|
| - },
|
| + function didWriteToTempFile(fileSize) {
|
| + if (!fileSize)
|
| + this._failedToCreateTempFile = true;
|
| + tempFile.finishWriting();
|
| + this._notifyTempFileReady();
|
| + }
|
| + tempFile.write([serializedData], didWriteToTempFile.bind(this));
|
| + }
|
|
|
| - /**
|
| - * @param {?WebInspector.TempFile} tempFile
|
| - * @param {string} serializedData
|
| - */
|
| - _writeToTempFile: function(tempFile, serializedData)
|
| - {
|
| - this._tempFile = tempFile;
|
| - if (!tempFile) {
|
| - this._failedToCreateTempFile = true;
|
| - this._notifyTempFileReady();
|
| - return;
|
| - }
|
| - /**
|
| - * @param {number} fileSize
|
| - * @this {WebInspector.WritableProfileHeader}
|
| - */
|
| - function didWriteToTempFile(fileSize)
|
| - {
|
| - if (!fileSize)
|
| - this._failedToCreateTempFile = true;
|
| - tempFile.finishWriting();
|
| - this._notifyTempFileReady();
|
| - }
|
| - tempFile.write([serializedData], didWriteToTempFile.bind(this));
|
| - },
|
| -
|
| - _notifyTempFileReady: function()
|
| - {
|
| - if (this._onTempFileReady) {
|
| - this._onTempFileReady();
|
| - this._onTempFileReady = null;
|
| - }
|
| - },
|
| -
|
| - __proto__: WebInspector.ProfileHeader.prototype
|
| + _notifyTempFileReady() {
|
| + if (this._onTempFileReady) {
|
| + this._onTempFileReady();
|
| + this._onTempFileReady = null;
|
| + }
|
| + }
|
| };
|
|
|