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

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

Issue 310313003: Introduce TracingTimelineModel (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 6 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
OLDNEW
(Empty)
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.
4
5 /**
6 * @constructor
7 */
8 WebInspector.TimelineTraceEventBindings = function()
9 {
10 this._reset();
11 }
12
13 WebInspector.TimelineTraceEventBindings.RecordType = {
14 Program: "Program",
15 EventDispatch: "EventDispatch",
16
17 GPUTask: "GPUTask",
18
19 RequestMainThreadFrame: "RequestMainThreadFrame",
20 BeginFrame: "BeginFrame",
21 BeginMainThreadFrame: "BeginMainThreadFrame",
22 ActivateLayerTree: "ActivateLayerTree",
23 DrawFrame: "DrawFrame",
24 ScheduleStyleRecalculation: "ScheduleStyleRecalculation",
25 RecalculateStyles: "RecalculateStyles",
26 InvalidateLayout: "InvalidateLayout",
27 Layout: "Layout",
28 UpdateLayerTree: "UpdateLayerTree",
29 PaintSetup: "PaintSetup",
30 Paint: "Paint",
31 PaintImage: "PaintImage",
32 Rasterize: "Rasterize",
33 RasterTask: "RasterTask",
34 ScrollLayer: "ScrollLayer",
35 CompositeLayers: "CompositeLayers",
36
37 ParseHTML: "ParseHTML",
38
39 TimerInstall: "TimerInstall",
40 TimerRemove: "TimerRemove",
41 TimerFire: "TimerFire",
42
43 XHRReadyStateChange: "XHRReadyStateChange",
44 XHRLoad: "XHRLoad",
45 EvaluateScript: "EvaluateScript",
46
47 MarkLoad: "MarkLoad",
48 MarkDOMContent: "MarkDOMContent",
49 MarkFirstPaint: "MarkFirstPaint",
50
51 TimeStamp: "TimeStamp",
52 ConsoleTime: "ConsoleTime",
53
54 ResourceSendRequest: "ResourceSendRequest",
55 ResourceReceiveResponse: "ResourceReceiveResponse",
56 ResourceReceivedData: "ResourceReceivedData",
57 ResourceFinish: "ResourceFinish",
58
59 FunctionCall: "FunctionCall",
60 GCEvent: "GCEvent",
61 JSFrame: "JSFrame",
62
63 UpdateCounters: "UpdateCounters",
64
65 RequestAnimationFrame: "RequestAnimationFrame",
66 CancelAnimationFrame: "CancelAnimationFrame",
67 FireAnimationFrame: "FireAnimationFrame",
68
69 WebSocketCreate : "WebSocketCreate",
70 WebSocketSendHandshakeRequest : "WebSocketSendHandshakeRequest",
71 WebSocketReceiveHandshakeResponse : "WebSocketReceiveHandshakeResponse",
72 WebSocketDestroy : "WebSocketDestroy",
73
74 EmbedderCallback : "EmbedderCallback",
75
76 CallStack: "CallStack",
77 SetLayerTreeId: "SetLayerTreeId",
78 TracingStartedInPage: "TracingStartedInPage",
79
80 DecodeImage: "Decode Image",
81 ResizeImage: "Resize Image",
82 DrawLazyPixelRef: "Draw LazyPixelRef",
83 DecodeLazyPixelRef: "Decode LazyPixelRef",
84
85 LazyPixelRef: "LazyPixelRef",
86 LayerTreeHostImplSnapshot: "cc::LayerTreeHostImpl"
87 };
88
89
90 WebInspector.TimelineTraceEventBindings.prototype = {
91 /**
92 * @return {!Array.<!WebInspector.TracingModel.Event>}
93 */
94 mainThreadEvents: function()
95 {
96 return this._mainThreadEvents;
97 },
98
99 _reset: function()
100 {
101 this._resetProcessingState();
102 this._mainThreadEvents = [];
103 },
104
105 _resetProcessingState: function()
106 {
107 this._sendRequestEvents = {};
108 this._timerEvents = {};
109 this._requestAnimationFrameEvents = {};
110 this._layoutInvalidate = {};
111 this._lastScheduleStyleRecalculation = {};
112 this._webSocketCreateEvents = {};
113 this._paintImageEventByPixelRefId = {};
114
115 this._lastRecalculateStylesEvent = null;
116 this._currentScriptEvent = null;
117 this._eventStack = [];
118 },
119
120 /**
121 * @param {!Array.<!WebInspector.TracingModel.Event>} events
122 */
123 setEvents: function(events)
124 {
125 this._resetProcessingState();
126 for (var i = 0, length = events.length; i < length; i++)
127 this._processEvent(events[i]);
128 this._resetProcessingState();
129 },
130
131 /**
132 * @param {!WebInspector.TracingModel.Event} event
133 */
134 _processEvent: function(event)
135 {
136 var recordTypes = WebInspector.TimelineTraceEventBindings.RecordType;
137
138 var eventStack = this._eventStack;
139 while (eventStack.length && eventStack.peekLast().endTime < event.startT ime)
140 eventStack.pop();
141 var duration = event.duration;
142 if (duration) {
143 if (eventStack.length) {
144 var parent = eventStack.peekLast();
145 parent.selfTime -= duration;
146 }
147 event.selfTime = duration;
148 eventStack.push(event);
149 }
150
151 if (this._currentScriptEvent && event.startTime > this._currentScriptEve nt.endTime)
152 this._currentScriptEvent = null;
153
154 switch (event.name) {
155 case recordTypes.CallStack:
156 var lastMainThreadEvent = this._mainThreadEvents.peekLast();
157 if (lastMainThreadEvent)
158 lastMainThreadEvent.stackTrace = event.args.stack;
159 break;
160
161 case recordTypes.ResourceSendRequest:
162 this._sendRequestEvents[event.args.data["requestId"]] = event;
163 event.imageURL = event.args.data["url"];
164 break;
165
166 case recordTypes.ResourceReceiveResponse:
167 case recordTypes.ResourceReceivedData:
168 case recordTypes.ResourceFinish:
169 event.initiator = this._sendRequestEvents[event.args.data["requestId "]];
170 if (event.initiator)
171 event.imageURL = event.initiator.imageURL;
172 break;
173
174 case recordTypes.TimerInstall:
175 this._timerEvents[event.args.data["timerId"]] = event;
176 break;
177
178 case recordTypes.TimerFire:
179 event.initiator = this._timerEvents[event.args.data["timerId"]];
180 break;
181
182 case recordTypes.RequestAnimationFrame:
183 this._requestAnimationFrameEvents[event.args.data["id"]] = event;
184 break;
185
186 case recordTypes.FireAnimationFrame:
187 event.initiator = this._requestAnimationFrameEvents[event.args.data[ "id"]];
188 break;
189
190 case recordTypes.ScheduleStyleRecalculation:
191 this._lastScheduleStyleRecalculation[event.args.frame] = event;
192 break;
193
194 case recordTypes.RecalculateStyles:
195 event.initiator = this._lastScheduleStyleRecalculation[event.args.fr ame];
196 this._lastRecalculateStylesEvent = event;
197 break;
198
199 case recordTypes.InvalidateLayout:
200 // Consider style recalculation as a reason for layout invalidation,
201 // but only if we had no earlier layout invalidation records.
202 var layoutInitator = event;
203 var frameId = event.args.frame;
204 if (!this._layoutInvalidate[frameId] && this._lastRecalculateStylesE vent && this._lastRecalculateStylesEvent.endTime > event.startTime)
205 layoutInitator = this._lastRecalculateStylesEvent.initiator;
206 this._layoutInvalidate[frameId] = layoutInitator;
207 break;
208
209 case recordTypes.Layout:
210 var frameId = event.args["beginData"]["frame"];
211 event.initiator = this._layoutInvalidate[frameId];
212 event.backendNodeId = event.args["endData"]["rootNode"];
213 this._layoutInvalidate[frameId] = null;
214 if (this._currentScriptEvent)
215 event.warning = WebInspector.UIString("Forced synchronous layout is a possible performance bottleneck.");
216 break;
217
218 case recordTypes.WebSocketCreate:
219 this._webSocketCreateEvents[event.args.data["identifier"]] = event;
220 break;
221
222 case recordTypes.WebSocketSendHandshakeRequest:
223 case recordTypes.WebSocketReceiveHandshakeResponse:
224 case recordTypes.WebSocketDestroy:
225 event.initiator = this._webSocketCreateEvents[event.args.data["ident ifier"]];
226 break;
227
228 case recordTypes.EvaluateScript:
229 case recordTypes.FunctionCall:
230 if (!this._currentScriptEvent)
231 this._currentScriptEvent = event;
232 break;
233
234 case recordTypes.SetLayerTreeId:
235 this._inspectedTargetLayerTreeId = event.args["layerTreeId"];
236 break;
237
238 case recordTypes.TracingStartedInPage:
239 this._mainThread = event.thread;
240 break;
241
242 case recordTypes.Paint:
243 case recordTypes.ScrollLayer:
244 event.backendNodeId = event.args["data"]["nodeId"];
245 break;
246
247 case recordTypes.PaintImage:
248 event.backendNodeId = event.args["data"]["nodeId"];
249 event.imageURL = event.args["data"]["url"];
250 break;
251
252 case recordTypes.DecodeImage:
253 case recordTypes.ResizeImage:
254 var paintImageEvent = this._findAncestorEvent(recordTypes.PaintImage );
255 if (!paintImageEvent) {
256 var decodeLazyPixelRefEvent = this._findAncestorEvent(recordType s.DecodeLazyPixelRef);
257 paintImageEvent = decodeLazyPixelRefEvent && this._paintImageEve ntByPixelRefId[decodeLazyPixelRefEvent.args["LazyPixelRef"]];
258 }
259 if (!paintImageEvent)
260 break;
261 event.backendNodeId = paintImageEvent.backendNodeId;
262 event.imageURL = paintImageEvent.imageURL;
263 break;
264
265 case recordTypes.DrawLazyPixelRef:
266 var paintImageEvent = this._findAncestorEvent(recordTypes.PaintImage );
267 if (!paintImageEvent)
268 break;
269 this._paintImageEventByPixelRefId[event.args["LazyPixelRef"]] = pain tImageEvent;
270 event.backendNodeId = paintImageEvent.backendNodeId;
271 event.imageURL = paintImageEvent.imageURL;
272 break;
273 }
274 if (this._mainThread === event.thread)
275 this._mainThreadEvents.push(event);
276 },
277
278 /**
279 * @param {string} name
280 * @return {?WebInspector.TracingModel.Event}
281 */
282 _findAncestorEvent: function(name)
283 {
284 for (var i = this._eventStack.length - 1; i >= 0; --i) {
285 var event = this._eventStack[i];
286 if (event.name === name)
287 return event;
288 }
289 return null;
290 }
291 }
292
OLDNEW
« no previous file with comments | « Source/devtools/front_end/timeline/TimelinePanel.js ('k') | Source/devtools/front_end/timeline/TimelineUIUtils.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698