Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Side by Side Diff: Source/devtools/front_end/CallStackSidebarPane.js

Issue 102833003: DevTools: Add a checkbox to enable async stacks in the sidebar header. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | Source/devtools/front_end/DebuggerModel.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 14 matching lines...) Expand all
25 25
26 /** 26 /**
27 * @constructor 27 * @constructor
28 * @extends {WebInspector.SidebarPane} 28 * @extends {WebInspector.SidebarPane}
29 */ 29 */
30 WebInspector.CallStackSidebarPane = function() 30 WebInspector.CallStackSidebarPane = function()
31 { 31 {
32 WebInspector.SidebarPane.call(this, WebInspector.UIString("Call Stack")); 32 WebInspector.SidebarPane.call(this, WebInspector.UIString("Call Stack"));
33 this.bodyElement.addEventListener("keydown", this._keyDown.bind(this), true) ; 33 this.bodyElement.addEventListener("keydown", this._keyDown.bind(this), true) ;
34 this.bodyElement.tabIndex = 0; 34 this.bodyElement.tabIndex = 0;
35
36 var asyncCheckbox = this.titleElement.appendChild(WebInspector.SettingsTab.c reateSettingCheckbox(WebInspector.UIString("Async"), WebInspector.settings.enabl eAsyncStackTraces, true, undefined, WebInspector.UIString("Capture async stack t races")));
37 asyncCheckbox.classList.add("async");
pfeldman 2013/12/09 16:56:44 Please use full-qualified styles: scripts-callstac
aandrey 2013/12/09 17:03:29 Done.
38 asyncCheckbox.addEventListener("click", consumeEvent, false);
39
40 WebInspector.settings.enableAsyncStackTraces.addChangeListener(this._asyncSt ackTracesStateChanged, this);
35 } 41 }
36 42
37 WebInspector.CallStackSidebarPane.Events = { 43 WebInspector.CallStackSidebarPane.Events = {
38 CallFrameRestarted: "CallFrameRestarted", 44 CallFrameRestarted: "CallFrameRestarted",
39 CallFrameSelected: "CallFrameSelected" 45 CallFrameSelected: "CallFrameSelected"
40 } 46 }
41 47
42 WebInspector.CallStackSidebarPane.prototype = { 48 WebInspector.CallStackSidebarPane.prototype = {
43 /** 49 /**
44 * @param {?Array.<!WebInspector.DebuggerModel.CallFrame>} callFrames 50 * @param {?Array.<!WebInspector.DebuggerModel.CallFrame>} callFrames
45 * @param {?WebInspector.DebuggerModel.StackTrace} asyncStackTrace 51 * @param {?WebInspector.DebuggerModel.StackTrace} asyncStackTrace
46 */ 52 */
47 update: function(callFrames, asyncStackTrace) 53 update: function(callFrames, asyncStackTrace)
48 { 54 {
49 this.bodyElement.removeChildren(); 55 this.bodyElement.removeChildren();
50 delete this._statusMessageElement; 56 delete this._statusMessageElement;
51 /** @type {!Array.<!WebInspector.CallStackSidebarPane.Placard>} */ 57 /** @type {!Array.<!WebInspector.CallStackSidebarPane.Placard>} */
52 this.placards = []; 58 this.placards = [];
53 59
54 if (!callFrames) { 60 if (!callFrames) {
55 var infoElement = this.bodyElement.createChild("div", "info"); 61 var infoElement = this.bodyElement.createChild("div", "info");
56 infoElement.textContent = WebInspector.UIString("Not Paused"); 62 infoElement.textContent = WebInspector.UIString("Not Paused");
57 return; 63 return;
58 } 64 }
59 65
60 this._appendSidebarPlacards(callFrames, this.bodyElement); 66 this._appendSidebarPlacards(callFrames);
61 67
62 while (asyncStackTrace) { 68 while (asyncStackTrace) {
63 var asyncPlacards = this._appendSidebarPlacards(asyncStackTrace.call Frames); 69 var asyncPlacard = new WebInspector.Placard(WebInspector.UIString("[ Async Call]"), "");
64 var group = new WebInspector.PlacardGroup(WebInspector.UIString("[As ync Call]"), asyncPlacards); 70 this.bodyElement.appendChild(asyncPlacard.element);
65 group.element.addEventListener("contextmenu", this._placardContextMe nu.bind(this, asyncPlacards[0]), true); 71 this._appendSidebarPlacards(asyncStackTrace.callFrames, asyncPlacard );
66 this.bodyElement.appendChild(group.element);
67 asyncStackTrace = asyncStackTrace.asyncStackTrace; 72 asyncStackTrace = asyncStackTrace.asyncStackTrace;
68 } 73 }
69 }, 74 },
70 75
71 /** 76 /**
72 * @param {!Array.<!WebInspector.DebuggerModel.CallFrame>} callFrames 77 * @param {!Array.<!WebInspector.DebuggerModel.CallFrame>} callFrames
73 * @param {!Element=} parentElement 78 * @param {!WebInspector.Placard=} asyncPlacard
74 * @return {!Array.<!WebInspector.CallStackSidebarPane.Placard>}
75 */ 79 */
76 _appendSidebarPlacards: function(callFrames, parentElement) 80 _appendSidebarPlacards: function(callFrames, asyncPlacard)
77 { 81 {
78 var result = [];
79 for (var i = 0, n = callFrames.length; i < n; ++i) { 82 for (var i = 0, n = callFrames.length; i < n; ++i) {
80 var placard = new WebInspector.CallStackSidebarPane.Placard(callFram es[i]); 83 var placard = new WebInspector.CallStackSidebarPane.Placard(callFram es[i], asyncPlacard);
81 placard.element.addEventListener("click", this._placardSelected.bind (this, placard), false); 84 placard.element.addEventListener("click", this._placardSelected.bind (this, placard), false);
82 placard.element.addEventListener("contextmenu", this._placardContext Menu.bind(this, placard), true); 85 placard.element.addEventListener("contextmenu", this._placardContext Menu.bind(this, placard), true);
83 result.push(placard); 86 if (!i && asyncPlacard) {
87 asyncPlacard.element.addEventListener("click", this._placardSele cted.bind(this, placard), false);
88 asyncPlacard.element.addEventListener("contextmenu", this._placa rdContextMenu.bind(this, placard), true);
89 }
84 this.placards.push(placard); 90 this.placards.push(placard);
85 if (parentElement) 91 this.bodyElement.appendChild(placard.element);
86 parentElement.appendChild(placard.element);
87 } 92 }
88 return result;
89 }, 93 },
90 94
91 /** 95 /**
92 * @param {!WebInspector.CallStackSidebarPane.Placard} placard 96 * @param {!WebInspector.CallStackSidebarPane.Placard} placard
93 */ 97 */
94 _placardContextMenu: function(placard, event) 98 _placardContextMenu: function(placard, event)
95 { 99 {
96 var contextMenu = new WebInspector.ContextMenu(event); 100 var contextMenu = new WebInspector.ContextMenu(event);
97 101
98 if (!placard._callFrame.isAsync() && WebInspector.debuggerModel.canSetSc riptSource()) 102 if (!placard._callFrame.isAsync() && WebInspector.debuggerModel.canSetSc riptSource())
99 contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCa seMenuTitles() ? "Restart frame" : "Restart Frame"), this._restartFrame.bind(thi s, placard)); 103 contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCa seMenuTitles() ? "Restart frame" : "Restart Frame"), this._restartFrame.bind(thi s, placard));
100 104
101 contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMe nuTitles() ? "Copy stack trace" : "Copy Stack Trace"), this._copyStackTrace.bind (this)); 105 contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMe nuTitles() ? "Copy stack trace" : "Copy Stack Trace"), this._copyStackTrace.bind (this));
102 contextMenu.appendSeparator();
103
104 var asyncStacksEnabled = WebInspector.settings.enableAsyncStackTraces.ge t();
105 if (asyncStacksEnabled)
106 contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCa seMenuTitles() ? "Disable async stack traces" : "Disable Async Stack Traces"), t his._enableAsyncStacks.bind(this, false));
107 else
108 contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCa seMenuTitles() ? "Enable async stack traces" : "Enable Async Stack Traces"), thi s._enableAsyncStacks.bind(this, true));
109
110 contextMenu.show(); 106 contextMenu.show();
111 }, 107 },
112 108
113 /** 109 /**
114 * @param {!WebInspector.CallStackSidebarPane.Placard} placard 110 * @param {!WebInspector.CallStackSidebarPane.Placard} placard
115 */ 111 */
116 _restartFrame: function(placard) 112 _restartFrame: function(placard)
117 { 113 {
118 placard._callFrame.restart(); 114 placard._callFrame.restart();
119 this.dispatchEventToListeners(WebInspector.CallStackSidebarPane.Events.C allFrameRestarted, placard._callFrame); 115 this.dispatchEventToListeners(WebInspector.CallStackSidebarPane.Events.C allFrameRestarted, placard._callFrame);
120 }, 116 },
121 117
122 /** 118 _asyncStackTracesStateChanged: function()
123 * @param {boolean} enable
124 */
125 _enableAsyncStacks: function(enable)
126 { 119 {
127 WebInspector.settings.enableAsyncStackTraces.set(enable); 120 var enabled = WebInspector.settings.enableAsyncStackTraces.get();
121 if (!enabled && this.placards.length)
pfeldman 2013/12/09 16:59:31 this.placards is null here in case of no stack.
aandrey 2013/12/09 17:03:29 Thanks! Done.
122 this._removeAsyncPlacards();
123 },
124
125 _removeAsyncPlacards: function()
126 {
127 var shouldSelectTopFrame = false;
128 var lastSyncPlacardIndex = -1;
129 for (var i = 0; i < this.placards.length; ++i) {
130 var placard = this.placards[i];
131 if (placard._asyncPlacard) {
132 if (placard.selected)
133 shouldSelectTopFrame = true;
134 placard._asyncPlacard.element.remove();
135 placard.element.remove();
136 } else {
137 lastSyncPlacardIndex = i;
138 }
139 }
140 this.placards.length = lastSyncPlacardIndex + 1;
141 if (shouldSelectTopFrame)
142 this._selectPlacardByIndex(0);
128 }, 143 },
129 144
130 /** 145 /**
131 * @param {WebInspector.DebuggerModel.CallFrame} x 146 * @param {WebInspector.DebuggerModel.CallFrame} x
132 */ 147 */
133 setSelectedCallFrame: function(x) 148 setSelectedCallFrame: function(x)
134 { 149 {
135 for (var i = 0; i < this.placards.length; ++i) { 150 for (var i = 0; i < this.placards.length; ++i) {
136 var placard = this.placards[i]; 151 var placard = this.placards[i];
137 placard.selected = (placard._callFrame === x); 152 placard.selected = (placard._callFrame === x);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 */ 210 */
196 _placardSelected: function(placard) 211 _placardSelected: function(placard)
197 { 212 {
198 this.dispatchEventToListeners(WebInspector.CallStackSidebarPane.Events.C allFrameSelected, placard._callFrame); 213 this.dispatchEventToListeners(WebInspector.CallStackSidebarPane.Events.C allFrameSelected, placard._callFrame);
199 }, 214 },
200 215
201 _copyStackTrace: function() 216 _copyStackTrace: function()
202 { 217 {
203 var text = ""; 218 var text = "";
204 for (var i = 0; i < this.placards.length; ++i) { 219 for (var i = 0; i < this.placards.length; ++i) {
205 if (i && this.placards[i].group() !== this.placards[i - 1].group()) 220 if (i && this.placards[i]._asyncPlacard !== this.placards[i - 1]._as yncPlacard)
206 text += this.placards[i].group().title() + "\n"; 221 text += this.placards[i]._asyncPlacard.title + "\n";
207 text += this.placards[i].title + " (" + this.placards[i].subtitle + ")\n"; 222 text += this.placards[i].title + " (" + this.placards[i].subtitle + ")\n";
208 } 223 }
209 InspectorFrontendHost.copyText(text); 224 InspectorFrontendHost.copyText(text);
210 }, 225 },
211 226
212 /** 227 /**
213 * @param {function(!Array.<!WebInspector.KeyboardShortcut.Descriptor>, func tion(Event=):boolean)} registerShortcutDelegate 228 * @param {function(!Array.<!WebInspector.KeyboardShortcut.Descriptor>, func tion(Event=):boolean)} registerShortcutDelegate
214 */ 229 */
215 registerShortcuts: function(registerShortcutDelegate) 230 registerShortcuts: function(registerShortcutDelegate)
216 { 231 {
(...skipping 30 matching lines...) Expand all
247 } 262 }
248 }, 263 },
249 264
250 __proto__: WebInspector.SidebarPane.prototype 265 __proto__: WebInspector.SidebarPane.prototype
251 } 266 }
252 267
253 /** 268 /**
254 * @constructor 269 * @constructor
255 * @extends {WebInspector.Placard} 270 * @extends {WebInspector.Placard}
256 * @param {!WebInspector.DebuggerModel.CallFrame} callFrame 271 * @param {!WebInspector.DebuggerModel.CallFrame} callFrame
272 * @param {!WebInspector.Placard=} asyncPlacard
257 */ 273 */
258 WebInspector.CallStackSidebarPane.Placard = function(callFrame) 274 WebInspector.CallStackSidebarPane.Placard = function(callFrame, asyncPlacard)
259 { 275 {
260 WebInspector.Placard.call(this, callFrame.functionName || WebInspector.UIStr ing("(anonymous function)"), ""); 276 WebInspector.Placard.call(this, callFrame.functionName || WebInspector.UIStr ing("(anonymous function)"), "");
261 callFrame.createLiveLocation(this._update.bind(this)); 277 callFrame.createLiveLocation(this._update.bind(this));
262 this._callFrame = callFrame; 278 this._callFrame = callFrame;
279 this._asyncPlacard = asyncPlacard;
263 } 280 }
264 281
265 WebInspector.CallStackSidebarPane.Placard.prototype = { 282 WebInspector.CallStackSidebarPane.Placard.prototype = {
266 /** 283 /**
267 * @param {!WebInspector.UILocation} uiLocation 284 * @param {!WebInspector.UILocation} uiLocation
268 */ 285 */
269 _update: function(uiLocation) 286 _update: function(uiLocation)
270 { 287 {
271 this.subtitle = uiLocation.linkText().trimMiddle(100); 288 this.subtitle = uiLocation.linkText().trimMiddle(100);
272 }, 289 },
273 290
274 __proto__: WebInspector.Placard.prototype 291 __proto__: WebInspector.Placard.prototype
275 } 292 }
OLDNEW
« no previous file with comments | « no previous file | Source/devtools/front_end/DebuggerModel.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698