1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 * @extends {WebInspector.VBox}
9 WebInspector.PromisePane = function()
11 WebInspector.VBox.call(this);
12 this.registerRequiredCSS("promises/promisePane.css");
13 this.element.classList.add("promises");
15 var statusBar = this.element.createChild("div", "panel-status-bar");
16 this._recordButton = new WebInspector.StatusBarButton(WebInspector.UIString("Record Promises"), "record-profile-status-bar-item");
17 this._recordButton.addEventListener("click", this._recordButtonClicked.bind(this));
18 statusBar.appendChild(this._recordButton.element);
19 var clearButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear"), "clear-status-bar-item");
20 clearButton.addEventListener("click", this._clearButtonClicked.bind(this));
21 statusBar.appendChild(clearButton.element);
22 this._refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
23 this._refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this));
24 this._refreshButton.setEnabled(false);
25 statusBar.appendChild(this._refreshButton.element);
26 this._liveCheckbox = new WebInspector.StatusBarCheckbox(WebInspector.UIString("Live"));
27 this._liveCheckbox.element.title = WebInspector.UIString("Live Recording");
28 this._liveCheckbox.inputElement.disabled = true;
29 statusBar.appendChild(this._liveCheckbox.element);
31 this._dataGridContainer = new WebInspector.VBox();
32 this._dataGridContainer.show(this.element);
34 { id: "location", title: WebInspector.UIString("Location"), disclosure: true },
35 { id: "status", title: WebInspector.UIString("Status") },
36 { id: "tts", title: WebInspector.UIString("Time to settle") }
38 this._dataGrid = new WebInspector.DataGrid(columns, undefined, undefined, undefined, this._onContextMenu.bind(this));
39 this._dataGrid.show(this._dataGridContainer.element);
41 this._linkifier = new WebInspector.Linkifier();
44 WebInspector.PromisePane.prototype = {
45 _recordButtonClicked: function(event)
47 var recording = !this._recordButton.toggled;
48 this._recordButton.toggled = recording;
49 this._refreshButton.setEnabled(recording);
51 this._enablePromiseTracker();
53 this._disablePromiseTracker();
56 _refreshButtonClicked: function(event)
61 _clearButtonClicked: function(event)
66 _enablePromiseTracker: function()
68 var mainTarget = WebInspector.targetManager.mainTarget();
70 mainTarget.debuggerAgent().enablePromiseTracker();
71 this._target = mainTarget;
75 _disablePromiseTracker: function()
78 this._target.debuggerAgent().disablePromiseTracker();
85 * @param {!DebuggerAgent.PromiseDetails} p1
86 * @param {!DebuggerAgent.PromiseDetails} p2
89 _comparePromises: function(p1, p2) {
90 var t1 = p1.creationTime || 0;
91 var t2 = p2.creationTime || 0;
95 _updateData: function()
98 * @param {?Protocol.Error} error
99 * @param {?Array.<!DebuggerAgent.PromiseDetails>} promiseData
100 * @this {WebInspector.PromisePane}
102 function callback(error, promiseData)
104 if (error || !promiseData)
107 promiseData.sort(this._comparePromises);
108 var nodesToInsert = { __proto__: null };
109 for (var i = 0; i < promiseData.length; i++) {
110 var promise = promiseData[i];
111 var status = createElementWithClass("div", "status");
112 status.classList.add(promise.status);
113 status.createTextChild(promise.status);
115 promiseId: promise.id,
118 if (promise.callFrame)
119 data.location = this._linkifier.linkifyConsoleCallFrame(this._target, promise.callFrame);
120 if (promise.creationTime && promise.settlementTime && promise.settlementTime >= promise.creationTime)
121 data.tts = Number.millisToString(promise.settlementTime - promise.creationTime, true);
122 var node = new WebInspector.DataGridNode(data, false);
123 nodesToInsert[promise.id] = { node: node, parentId: promise.parentId };
126 var rootNode = this._dataGrid.rootNode();
128 for (var id in nodesToInsert) {
129 var node = nodesToInsert[id].node;
130 var parentId = nodesToInsert[id].parentId;
131 var parentNode = (parentId && nodesToInsert[parentId]) ? nodesToInsert[parentId].node : rootNode;
132 parentNode.appendChild(node);
133 parentNode.expanded = true;
139 this._target.debuggerAgent().getPromises(callback.bind(this));
144 this._dataGrid.rootNode().removeChildren();
145 this._linkifier.reset();
149 * @param {!WebInspector.ContextMenu} contextMenu
150 * @param {!WebInspector.DataGridNode} node
152 _onContextMenu: function(contextMenu, node)
156 var promiseId = node.data.promiseId;
158 contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Show in console" : "Show In Console"), showPromiseInConsole.bind(this));
162 * @this {WebInspector.PromisePane}
164 function showPromiseInConsole()
167 this._target.debuggerAgent().getPromiseById(promiseId, "console", didGetPromiseById.bind(this));
171 * @param {?Protocol.Error} error
172 * @param {?RuntimeAgent.RemoteObject} promise
173 * @this {WebInspector.PromisePane}
175 function didGetPromiseById(error, promise)
177 if (error || !promise)
183 this._target.consoleAgent().setLastEvaluationResult(promise.objectId);
184 var message = new WebInspector.ConsoleMessage(this._target,
185 WebInspector.ConsoleMessage.MessageSource.Other,
186 WebInspector.ConsoleMessage.MessageLevel.Log,
188 WebInspector.ConsoleMessage.MessageType.Log,
194 this._target.consoleModel.addMessage(message);
195 WebInspector.console.show();
199 __proto__: WebInspector.VBox.prototype