Index: Source/devtools/front_end/timeline/TimelineJSProfile.js |
diff --git a/Source/devtools/front_end/timeline/TimelineJSProfile.js b/Source/devtools/front_end/timeline/TimelineJSProfile.js |
index 5af54ed1e2de23a2e3c3339bf414e61685fb19a7..f5884839cff128436932c47de91c7ef94be66d2e 100644 |
--- a/Source/devtools/front_end/timeline/TimelineJSProfile.js |
+++ b/Source/devtools/front_end/timeline/TimelineJSProfile.js |
@@ -90,3 +90,45 @@ WebInspector.TimelineJSProfileProcessor.mergeJSProfileIntoTimeline = function(ti |
timelineModel.forAllRecords(processRecord); |
} |
+ |
+/** |
+ * @param {!WebInspector.TracingTimelineModel} timelineModel |
+ * @param {!ProfilerAgent.CPUProfile} jsProfile |
+ * @return {!Array.<!WebInspector.TracingModel.Event>} |
+ */ |
+WebInspector.TimelineJSProfileProcessor.generateTracingEventsFromCpuProfile = function(timelineModel, jsProfile) |
+{ |
+ if (!jsProfile.samples) |
+ return []; |
+ var jsProfileModel = new WebInspector.CPUProfileDataModel(jsProfile); |
+ var idleNode = jsProfileModel.idleNode; |
+ var programNode = jsProfileModel.programNode; |
+ var gcNode = jsProfileModel.gcNode; |
+ var samples = jsProfileModel.samples; |
+ var timestamps = jsProfileModel.timestamps; |
+ var jsEvents = []; |
+ var mainThread = timelineModel.mainThreadEvents()[0].thread; |
+ for (var i = 0; i < samples.length; ++i) { |
+ var node = jsProfileModel.nodeByIndex(i); |
+ if (node === programNode || node === gcNode || node === idleNode) |
+ continue; |
+ var stackTrace = node._stackTraceArray; |
+ if (!stackTrace) { |
+ stackTrace = /** @type {!ConsoleAgent.StackTrace} */ (new Array(node.depth + 1)); |
+ node._stackTraceArray = stackTrace; |
+ for (var j = 0; node.parent; node = node.parent) |
+ stackTrace[j++] = /** @type {!ConsoleAgent.CallFrame} */ (node); |
+ } |
+ var payload = /** @type {!WebInspector.TracingModel.EventPayload} */ ({ |
+ ph: WebInspector.TracingModel.Phase.Instant, |
+ cat: WebInspector.TracingModel.DevToolsMetadataEventCategory, |
+ name: WebInspector.TracingTimelineModel.RecordType.JSSample, |
+ ts: timestamps[i] * 1000, |
+ args: { } |
+ }); |
+ var jsEvent = new WebInspector.TracingModel.Event(payload, 0, mainThread); |
+ jsEvent.stackTrace = stackTrace; |
+ jsEvents.push(jsEvent); |
+ } |
+ return jsEvents; |
+} |