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

Side by Side Diff: Source/devtools/front_end/timeline/TracingTimelineModel.js

Issue 620123002: DevTools: Support JS frames save/load for tracing timeline. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Addressing comment. Created 6 years, 2 months 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 | « Source/devtools/front_end/timeline/TracingModel.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * @constructor 6 * @constructor
7 * @param {!WebInspector.TracingManager} tracingManager 7 * @param {!WebInspector.TracingManager} tracingManager
8 * @param {!WebInspector.TracingModel} tracingModel 8 * @param {!WebInspector.TracingModel} tracingModel
9 * @param {!WebInspector.TimelineModel.Filter} recordFilter 9 * @param {!WebInspector.TimelineModel.Filter} recordFilter
10 * @extends {WebInspector.TimelineModel} 10 * @extends {WebInspector.TimelineModel}
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 TracingStartedInPage: "TracingStartedInPage", 92 TracingStartedInPage: "TracingStartedInPage",
93 TracingSessionIdForWorker: "TracingSessionIdForWorker", 93 TracingSessionIdForWorker: "TracingSessionIdForWorker",
94 94
95 DecodeImage: "Decode Image", 95 DecodeImage: "Decode Image",
96 ResizeImage: "Resize Image", 96 ResizeImage: "Resize Image",
97 DrawLazyPixelRef: "Draw LazyPixelRef", 97 DrawLazyPixelRef: "Draw LazyPixelRef",
98 DecodeLazyPixelRef: "Decode LazyPixelRef", 98 DecodeLazyPixelRef: "Decode LazyPixelRef",
99 99
100 LazyPixelRef: "LazyPixelRef", 100 LazyPixelRef: "LazyPixelRef",
101 LayerTreeHostImplSnapshot: "cc::LayerTreeHostImpl", 101 LayerTreeHostImplSnapshot: "cc::LayerTreeHostImpl",
102 PictureSnapshot: "cc::Picture" 102 PictureSnapshot: "cc::Picture",
103
104 // CpuProfile is a virtual event created on frontend to support
105 // serialization of CPU Profiles within tracing timeline data.
106 CpuProfile: "CpuProfile"
103 }; 107 };
104 108
105 /** 109 /**
106 * @constructor 110 * @constructor
107 * @param {string} name 111 * @param {string} name
108 */ 112 */
109 WebInspector.TracingTimelineModel.VirtualThread = function(name) 113 WebInspector.TracingTimelineModel.VirtualThread = function(name)
110 { 114 {
111 this.name = name; 115 this.name = name;
112 /** @type {!Array.<!WebInspector.TracingModel.Event>} */ 116 /** @type {!Array.<!WebInspector.TracingModel.Event>} */
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 disabledByDefault("devtools.timeline.layers"), 151 disabledByDefault("devtools.timeline.layers"),
148 disabledByDefault("devtools.timeline.picture"), 152 disabledByDefault("devtools.timeline.picture"),
149 disabledByDefault("blink.graphics_context_annotations")]); 153 disabledByDefault("blink.graphics_context_annotations")]);
150 } 154 }
151 var categories = categoriesArray.join(","); 155 var categories = categoriesArray.join(",");
152 this._startRecordingWithCategories(categories); 156 this._startRecordingWithCategories(categories);
153 }, 157 },
154 158
155 stopRecording: function() 159 stopRecording: function()
156 { 160 {
157 this._stopCallbackBarrier = new CallbackBarrier();
158 if (this._jsProfilerStarted) { 161 if (this._jsProfilerStarted) {
162 this._stopCallbackBarrier = new CallbackBarrier();
159 this._currentTarget.profilerAgent().stop(this._stopCallbackBarrier.c reateCallback(this._didStopRecordingJSSamples.bind(this))); 163 this._currentTarget.profilerAgent().stop(this._stopCallbackBarrier.c reateCallback(this._didStopRecordingJSSamples.bind(this)));
160 this._jsProfilerStarted = false; 164 this._jsProfilerStarted = false;
161 } 165 }
162 this._tracingManager.stop(); 166 this._tracingManager.stop();
163 }, 167 },
164 168
165 /** 169 /**
166 * @param {!Array.<!WebInspector.TracingManager.EventPayload>} events 170 * @param {!Array.<!WebInspector.TracingManager.EventPayload>} events
167 */ 171 */
168 setEventsForTest: function(events) 172 setEventsForTest: function(events)
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 * @param {!WebInspector.Event} event 207 * @param {!WebInspector.Event} event
204 */ 208 */
205 _onEventsCollected: function(event) 209 _onEventsCollected: function(event)
206 { 210 {
207 var traceEvents = /** @type {!Array.<!WebInspector.TracingManager.EventP ayload>} */ (event.data); 211 var traceEvents = /** @type {!Array.<!WebInspector.TracingManager.EventP ayload>} */ (event.data);
208 this._tracingModel.addEvents(traceEvents); 212 this._tracingModel.addEvents(traceEvents);
209 }, 213 },
210 214
211 _onTracingComplete: function() 215 _onTracingComplete: function()
212 { 216 {
213 this._tracingModel.tracingComplete();
214 if (this._stopCallbackBarrier) 217 if (this._stopCallbackBarrier)
215 this._stopCallbackBarrier.callWhenDone(this._didStopRecordingTraceEv ents.bind(this)); 218 this._stopCallbackBarrier.callWhenDone(this._didStopRecordingTraceEv ents.bind(this));
216 else 219 else
217 this._didStopRecordingTraceEvents(); 220 this._didStopRecordingTraceEvents();
218 }, 221 },
219 222
220 /** 223 /**
221 * @param {?Protocol.Error} error 224 * @param {?Protocol.Error} error
222 * @param {?ProfilerAgent.CPUProfile} cpuProfile 225 * @param {?ProfilerAgent.CPUProfile} cpuProfile
223 */ 226 */
224 _didStopRecordingJSSamples: function(error, cpuProfile) 227 _didStopRecordingJSSamples: function(error, cpuProfile)
225 { 228 {
226 if (error) 229 if (error)
227 WebInspector.console.error(error); 230 WebInspector.console.error(error);
228 this._cpuProfile = cpuProfile; 231 this._recordedCpuProfile = cpuProfile;
229 }, 232 },
230 233
231 _didStopRecordingTraceEvents: function() 234 _didStopRecordingTraceEvents: function()
232 { 235 {
233 this._stopCallbackBarrier = null; 236 this._stopCallbackBarrier = null;
237
238 if (this._recordedCpuProfile) {
239 this._injectCpuProfileEvent(this._recordedCpuProfile);
240 this._recordedCpuProfile = null;
241 }
242 this._tracingModel.tracingComplete();
243
234 var events = this._tracingModel.devtoolsPageMetadataEvents(); 244 var events = this._tracingModel.devtoolsPageMetadataEvents();
235 var workerMetadataEvents = this._tracingModel.devtoolsWorkerMetadataEven ts(); 245 var workerMetadataEvents = this._tracingModel.devtoolsWorkerMetadataEven ts();
236 246
237 this._resetProcessingState(); 247 this._resetProcessingState();
238 for (var i = 0, length = events.length; i < length; i++) { 248 for (var i = 0, length = events.length; i < length; i++) {
239 var event = events[i]; 249 var event = events[i];
240 var process = event.thread.process(); 250 var process = event.thread.process();
241 var startTime = event.startTime; 251 var startTime = event.startTime;
242 252
243 var endTime = Infinity; 253 var endTime = Infinity;
244 if (i + 1 < length) 254 if (i + 1 < length)
245 endTime = events[i + 1].startTime; 255 endTime = events[i + 1].startTime;
246 256
247 var threads = process.sortedThreads(); 257 var threads = process.sortedThreads();
248 for (var j = 0; j < threads.length; j++) { 258 for (var j = 0; j < threads.length; j++) {
249 var thread = threads[j]; 259 var thread = threads[j];
250 if (thread.name() === "WebCore: Worker" && !workerMetadataEvents .some(function(e) { return e.args["data"]["workerThreadId"] === thread.id(); })) 260 if (thread.name() === "WebCore: Worker" && !workerMetadataEvents .some(function(e) { return e.args["data"]["workerThreadId"] === thread.id(); }))
251 continue; 261 continue;
252 this._processThreadEvents(startTime, endTime, event.thread, thre ad); 262 this._processThreadEvents(startTime, endTime, event.thread, thre ad);
253 } 263 }
254 } 264 }
255 this._resetProcessingState(); 265 this._resetProcessingState();
256 266
257 this._inspectedTargetEvents.sort(WebInspector.TracingModel.Event.compare StartTime); 267 this._inspectedTargetEvents.sort(WebInspector.TracingModel.Event.compare StartTime);
258 268
259 if (this._cpuProfile) { 269 if (this._cpuProfile) {
260 var jsSamples = WebInspector.TimelineJSProfileProcessor.generateTrac ingEventsFromCpuProfile(this, this._cpuProfile); 270 this._processCpuProfile(this._cpuProfile);
261 this._inspectedTargetEvents = this._inspectedTargetEvents.mergeOrder ed(jsSamples, WebInspector.TracingModel.Event.orderedCompareStartTime);
262 this._setMainThreadEvents(this.mainThreadEvents().mergeOrdered(jsSam ples, WebInspector.TracingModel.Event.orderedCompareStartTime));
263 this._cpuProfile = null; 271 this._cpuProfile = null;
264 } 272 }
265
266 this._buildTimelineRecords(); 273 this._buildTimelineRecords();
267 this.dispatchEventToListeners(WebInspector.TimelineModel.Events.Recordin gStopped); 274 this.dispatchEventToListeners(WebInspector.TimelineModel.Events.Recordin gStopped);
268 }, 275 },
269 276
270 /** 277 /**
278 * @param {!ProfilerAgent.CPUProfile} cpuProfile
279 */
280 _injectCpuProfileEvent: function(cpuProfile)
281 {
282 var metaEvent = this._tracingModel.devtoolsPageMetadataEvents().peekLast ();
283 if (!metaEvent)
284 return;
285 var cpuProfileEvent = /** @type {!WebInspector.TracingManager.EventPaylo ad} */ ({
286 cat: WebInspector.TracingModel.DevToolsMetadataEventCategory,
287 ph: WebInspector.TracingModel.Phase.Instant,
288 ts: this._tracingModel.maximumRecordTime() * 1000,
289 pid: metaEvent.thread.process().id(),
290 tid: metaEvent.thread.id(),
291 name: WebInspector.TracingTimelineModel.RecordType.CpuProfile,
292 args: { data: { cpuProfile: cpuProfile } }
293 });
294 this._tracingModel.addEvents([cpuProfileEvent]);
295 },
296
297 /**
298 * @param {!ProfilerAgent.CPUProfile} cpuProfile
299 */
300 _processCpuProfile: function(cpuProfile)
301 {
302 var jsSamples = WebInspector.TimelineJSProfileProcessor.generateTracingE ventsFromCpuProfile(this, cpuProfile);
303 this._inspectedTargetEvents = this._inspectedTargetEvents.mergeOrdered(j sSamples, WebInspector.TracingModel.Event.orderedCompareStartTime);
304 this._setMainThreadEvents(this.mainThreadEvents().mergeOrdered(jsSamples , WebInspector.TracingModel.Event.orderedCompareStartTime));
305 },
306
307 /**
271 * @return {number} 308 * @return {number}
272 */ 309 */
273 minimumRecordTime: function() 310 minimumRecordTime: function()
274 { 311 {
275 return this._tracingModel.minimumRecordTime(); 312 return this._tracingModel.minimumRecordTime();
276 }, 313 },
277 314
278 /** 315 /**
279 * @return {number} 316 * @return {number}
280 */ 317 */
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
511 if (this._currentScriptEvent && event.startTime > this._currentScriptEve nt.endTime) 548 if (this._currentScriptEvent && event.startTime > this._currentScriptEve nt.endTime)
512 this._currentScriptEvent = null; 549 this._currentScriptEvent = null;
513 550
514 switch (event.name) { 551 switch (event.name) {
515 case recordTypes.CallStack: 552 case recordTypes.CallStack:
516 var lastMainThreadEvent = this.mainThreadEvents().peekLast(); 553 var lastMainThreadEvent = this.mainThreadEvents().peekLast();
517 if (lastMainThreadEvent && event.args["stack"] && event.args["stack" ].length) 554 if (lastMainThreadEvent && event.args["stack"] && event.args["stack" ].length)
518 lastMainThreadEvent.stackTrace = event.args["stack"]; 555 lastMainThreadEvent.stackTrace = event.args["stack"];
519 break; 556 break;
520 557
558 case recordTypes.CpuProfile:
559 this._cpuProfile = event.args["data"]["cpuProfile"];
560 break;
561
521 case recordTypes.ResourceSendRequest: 562 case recordTypes.ResourceSendRequest:
522 this._sendRequestEvents[event.args["data"]["requestId"]] = event; 563 this._sendRequestEvents[event.args["data"]["requestId"]] = event;
523 event.imageURL = event.args["data"]["url"]; 564 event.imageURL = event.args["data"]["url"];
524 break; 565 break;
525 566
526 case recordTypes.ResourceReceiveResponse: 567 case recordTypes.ResourceReceiveResponse:
527 case recordTypes.ResourceReceivedData: 568 case recordTypes.ResourceReceivedData:
528 case recordTypes.ResourceFinish: 569 case recordTypes.ResourceFinish:
529 event.initiator = this._sendRequestEvents[event.args["data"]["reques tId"]]; 570 event.initiator = this._sendRequestEvents[event.args["data"]["reques tId"]];
530 if (event.initiator) 571 if (event.initiator)
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after
1057 * @param {!WebInspector.ChunkedReader} reader 1098 * @param {!WebInspector.ChunkedReader} reader
1058 */ 1099 */
1059 onChunkTransferred: function(reader) { }, 1100 onChunkTransferred: function(reader) { },
1060 1101
1061 /** 1102 /**
1062 * @param {!WebInspector.ChunkedReader} reader 1103 * @param {!WebInspector.ChunkedReader} reader
1063 * @param {!Event} event 1104 * @param {!Event} event
1064 */ 1105 */
1065 onError: function(reader, event) { }, 1106 onError: function(reader, event) { },
1066 } 1107 }
OLDNEW
« no previous file with comments | « Source/devtools/front_end/timeline/TracingModel.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698