OLD | NEW |
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 WebInspector.TimelineJSProfileProcessor = { }; | 6 WebInspector.TimelineJSProfileProcessor = { }; |
7 | 7 |
8 /** | 8 /** |
9 * @param {!WebInspector.TracingTimelineModel} timelineModel | 9 * @param {!WebInspector.TimelineModel} timelineModel |
10 * @param {!ProfilerAgent.CPUProfile} jsProfile | 10 * @param {!ProfilerAgent.CPUProfile} jsProfile |
11 * @return {!Array.<!WebInspector.TracingModel.Event>} | 11 * @return {!Array.<!WebInspector.TracingModel.Event>} |
12 */ | 12 */ |
13 WebInspector.TimelineJSProfileProcessor.generateTracingEventsFromCpuProfile = fu
nction(timelineModel, jsProfile) | 13 WebInspector.TimelineJSProfileProcessor.generateTracingEventsFromCpuProfile = fu
nction(timelineModel, jsProfile) |
14 { | 14 { |
15 if (!jsProfile.samples) | 15 if (!jsProfile.samples) |
16 return []; | 16 return []; |
17 var jsProfileModel = new WebInspector.CPUProfileDataModel(jsProfile); | 17 var jsProfileModel = new WebInspector.CPUProfileDataModel(jsProfile); |
18 var idleNode = jsProfileModel.idleNode; | 18 var idleNode = jsProfileModel.idleNode; |
19 var programNode = jsProfileModel.programNode; | 19 var programNode = jsProfileModel.programNode; |
20 var gcNode = jsProfileModel.gcNode; | 20 var gcNode = jsProfileModel.gcNode; |
21 var samples = jsProfileModel.samples; | 21 var samples = jsProfileModel.samples; |
22 var timestamps = jsProfileModel.timestamps; | 22 var timestamps = jsProfileModel.timestamps; |
23 var jsEvents = []; | 23 var jsEvents = []; |
24 var mainThread = timelineModel.mainThreadEvents()[0].thread; | 24 var mainThread = timelineModel.mainThreadEvents()[0].thread; |
25 for (var i = 0; i < samples.length; ++i) { | 25 for (var i = 0; i < samples.length; ++i) { |
26 var node = jsProfileModel.nodeByIndex(i); | 26 var node = jsProfileModel.nodeByIndex(i); |
27 if (node === programNode || node === gcNode || node === idleNode) | 27 if (node === programNode || node === gcNode || node === idleNode) |
28 continue; | 28 continue; |
29 var stackTrace = node._stackTraceArray; | 29 var stackTrace = node._stackTraceArray; |
30 if (!stackTrace) { | 30 if (!stackTrace) { |
31 stackTrace = /** @type {!ConsoleAgent.StackTrace} */ (new Array(node
.depth + 1)); | 31 stackTrace = /** @type {!ConsoleAgent.StackTrace} */ (new Array(node
.depth + 1)); |
32 node._stackTraceArray = stackTrace; | 32 node._stackTraceArray = stackTrace; |
33 for (var j = 0; node.parent; node = node.parent) | 33 for (var j = 0; node.parent; node = node.parent) |
34 stackTrace[j++] = /** @type {!ConsoleAgent.CallFrame} */ (node); | 34 stackTrace[j++] = /** @type {!ConsoleAgent.CallFrame} */ (node); |
35 } | 35 } |
36 var jsEvent = new WebInspector.TracingModel.Event(WebInspector.TracingMo
del.DevToolsMetadataEventCategory, WebInspector.TracingTimelineModel.RecordType.
JSSample, | 36 var jsEvent = new WebInspector.TracingModel.Event(WebInspector.TracingMo
del.DevToolsMetadataEventCategory, WebInspector.TimelineModel.RecordType.JSSampl
e, |
37 WebInspector.TracingModel.Phase.Instant, timestamps[i], mainThread); | 37 WebInspector.TracingModel.Phase.Instant, timestamps[i], mainThread); |
38 jsEvent.stackTrace = stackTrace; | 38 jsEvent.stackTrace = stackTrace; |
39 jsEvents.push(jsEvent); | 39 jsEvents.push(jsEvent); |
40 } | 40 } |
41 return jsEvents; | 41 return jsEvents; |
42 } | 42 } |
43 | 43 |
44 /** | 44 /** |
45 * @param {!Array.<!WebInspector.TracingModel.Event>} events | 45 * @param {!Array.<!WebInspector.TracingModel.Event>} events |
46 * @return {!Array.<!WebInspector.TracingModel.Event>} | 46 * @return {!Array.<!WebInspector.TracingModel.Event>} |
47 */ | 47 */ |
48 WebInspector.TimelineJSProfileProcessor.generateJSFrameEvents = function(events) | 48 WebInspector.TimelineJSProfileProcessor.generateJSFrameEvents = function(events) |
49 { | 49 { |
50 function equalFrames(frame1, frame2) | 50 function equalFrames(frame1, frame2) |
51 { | 51 { |
52 return frame1.scriptId === frame2.scriptId && frame1.functionName === fr
ame2.functionName; | 52 return frame1.scriptId === frame2.scriptId && frame1.functionName === fr
ame2.functionName; |
53 } | 53 } |
54 | 54 |
55 function eventEndTime(e) | 55 function eventEndTime(e) |
56 { | 56 { |
57 return e.endTime || e.startTime; | 57 return e.endTime || e.startTime; |
58 } | 58 } |
59 | 59 |
60 function isJSInvocationEvent(e) | 60 function isJSInvocationEvent(e) |
61 { | 61 { |
62 switch (e.name) { | 62 switch (e.name) { |
63 case WebInspector.TracingTimelineModel.RecordType.FunctionCall: | 63 case WebInspector.TimelineModel.RecordType.FunctionCall: |
64 case WebInspector.TracingTimelineModel.RecordType.EvaluateScript: | 64 case WebInspector.TimelineModel.RecordType.EvaluateScript: |
65 return true; | 65 return true; |
66 } | 66 } |
67 return false; | 67 return false; |
68 } | 68 } |
69 | 69 |
70 var jsFrameEvents = []; | 70 var jsFrameEvents = []; |
71 var jsFramesStack = []; | 71 var jsFramesStack = []; |
72 var coalesceThresholdMs = WebInspector.TimelineFlameChartDataProvider.JSFram
eCoalesceThresholdMs; | 72 var coalesceThresholdMs = WebInspector.TimelineFlameChartDataProvider.JSFram
eCoalesceThresholdMs; |
73 | 73 |
74 function onStartEvent(e) | 74 function onStartEvent(e) |
75 { | 75 { |
76 extractStackTrace(e); | 76 extractStackTrace(e); |
77 } | 77 } |
78 | 78 |
79 function onInstantEvent(e, top) | 79 function onInstantEvent(e, top) |
80 { | 80 { |
81 if (e.name === WebInspector.TracingTimelineModel.RecordType.JSSample &&
top && !isJSInvocationEvent(top)) | 81 if (e.name === WebInspector.TimelineModel.RecordType.JSSample && top &&
!isJSInvocationEvent(top)) |
82 return; | 82 return; |
83 extractStackTrace(e); | 83 extractStackTrace(e); |
84 } | 84 } |
85 | 85 |
86 function onEndEvent(e) | 86 function onEndEvent(e) |
87 { | 87 { |
88 if (isJSInvocationEvent(e)) | 88 if (isJSInvocationEvent(e)) |
89 jsFramesStack.length = 0; | 89 jsFramesStack.length = 0; |
90 } | 90 } |
91 | 91 |
(...skipping 10 matching lines...) Expand all Loading... |
102 for (j = 0; j < minFrames; ++j) { | 102 for (j = 0; j < minFrames; ++j) { |
103 var newFrame = e.stackTrace[numFrames - 1 - j]; | 103 var newFrame = e.stackTrace[numFrames - 1 - j]; |
104 var oldFrame = jsFramesStack[j].args["data"]; | 104 var oldFrame = jsFramesStack[j].args["data"]; |
105 if (!equalFrames(newFrame, oldFrame)) | 105 if (!equalFrames(newFrame, oldFrame)) |
106 break; | 106 break; |
107 jsFramesStack[j].setEndTime(Math.max(jsFramesStack[j].endTime, endTi
me)); | 107 jsFramesStack[j].setEndTime(Math.max(jsFramesStack[j].endTime, endTi
me)); |
108 } | 108 } |
109 jsFramesStack.length = j; | 109 jsFramesStack.length = j; |
110 for (; j < numFrames; ++j) { | 110 for (; j < numFrames; ++j) { |
111 var frame = e.stackTrace[numFrames - 1 - j]; | 111 var frame = e.stackTrace[numFrames - 1 - j]; |
112 var jsFrameEvent = new WebInspector.TracingModel.Event(WebInspector.
TracingModel.DevToolsMetadataEventCategory, WebInspector.TracingTimelineModel.Re
cordType.JSFrame, | 112 var jsFrameEvent = new WebInspector.TracingModel.Event(WebInspector.
TracingModel.DevToolsMetadataEventCategory, WebInspector.TimelineModel.RecordTyp
e.JSFrame, |
113 WebInspector.TracingModel.Phase.Complete, e.startTime, e.thread)
; | 113 WebInspector.TracingModel.Phase.Complete, e.startTime, e.thread)
; |
114 jsFrameEvent.addArgs({ data: frame }); | 114 jsFrameEvent.addArgs({ data: frame }); |
115 jsFrameEvent.setEndTime(endTime); | 115 jsFrameEvent.setEndTime(endTime); |
116 jsFramesStack.push(jsFrameEvent); | 116 jsFramesStack.push(jsFrameEvent); |
117 jsFrameEvents.push(jsFrameEvent); | 117 jsFrameEvents.push(jsFrameEvent); |
118 } | 118 } |
119 } | 119 } |
120 | 120 |
121 var stack = []; | 121 var stack = []; |
122 for (var i = 0; i < events.length; ++i) { | 122 for (var i = 0; i < events.length; ++i) { |
123 var e = events[i]; | 123 var e = events[i]; |
124 var top = stack.peekLast(); | 124 var top = stack.peekLast(); |
125 if (top && top.endTime <= e.startTime) | 125 if (top && top.endTime <= e.startTime) |
126 onEndEvent(stack.pop()); | 126 onEndEvent(stack.pop()); |
127 if (e.duration) { | 127 if (e.duration) { |
128 onStartEvent(e); | 128 onStartEvent(e); |
129 stack.push(e); | 129 stack.push(e); |
130 } else { | 130 } else { |
131 onInstantEvent(e, stack.peekLast()); | 131 onInstantEvent(e, stack.peekLast()); |
132 } | 132 } |
133 } | 133 } |
134 while (stack.length) | 134 while (stack.length) |
135 onEndEvent(stack.pop()); | 135 onEndEvent(stack.pop()); |
136 | 136 |
137 return jsFrameEvents; | 137 return jsFrameEvents; |
138 } | 138 } |
OLD | NEW |