OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2014 Google Inc. All rights reserved. | 2 * Copyright (C) 2014 Google 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 are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 font: font, | 69 font: font, |
70 nestingLevel: 0, | 70 nestingLevel: 0, |
71 shareHeaderLine: true | 71 shareHeaderLine: true |
72 }; | 72 }; |
73 return /** @type {!PerfUI.FlameChart.GroupStyle} */ (Object.assign(default
GroupStyle, extra)); | 73 return /** @type {!PerfUI.FlameChart.GroupStyle} */ (Object.assign(default
GroupStyle, extra)); |
74 } | 74 } |
75 | 75 |
76 this._headerLevel1 = buildGroupStyle({shareHeaderLine: false}); | 76 this._headerLevel1 = buildGroupStyle({shareHeaderLine: false}); |
77 this._headerLevel2 = buildGroupStyle({padding: 2, nestingLevel: 1, collapsib
le: false}); | 77 this._headerLevel2 = buildGroupStyle({padding: 2, nestingLevel: 1, collapsib
le: false}); |
78 this._staticHeader = buildGroupStyle({collapsible: false}); | 78 this._staticHeader = buildGroupStyle({collapsible: false}); |
79 this._framesHeader = buildGroupStyle({useFirstLineForOverview: true, shareHe
aderLine: true, itemsHeight: 150}); | 79 this._framesHeader = buildGroupStyle({useFirstLineForOverview: true}); |
| 80 this._screenshotsHeader = |
| 81 buildGroupStyle({useFirstLineForOverview: true, nestingLevel: 1, collaps
ible: false, itemsHeight: 150}); |
80 this._interactionsHeaderLevel1 = buildGroupStyle({useFirstLineForOverview: t
rue}); | 82 this._interactionsHeaderLevel1 = buildGroupStyle({useFirstLineForOverview: t
rue}); |
81 this._interactionsHeaderLevel2 = buildGroupStyle({padding: 2, nestingLevel:
1}); | 83 this._interactionsHeaderLevel2 = buildGroupStyle({padding: 2, nestingLevel:
1}); |
82 | 84 |
83 /** @type {!Map<string, number>} */ | 85 /** @type {!Map<string, number>} */ |
84 this._flowEventIndexById = new Map(); | 86 this._flowEventIndexById = new Map(); |
85 } | 87 } |
86 | 88 |
87 /** | 89 /** |
88 * @param {?Timeline.PerformanceModel} performanceModel | 90 * @param {?Timeline.PerformanceModel} performanceModel |
89 */ | 91 */ |
90 setModel(performanceModel) { | 92 setModel(performanceModel) { |
91 this.reset(); | 93 this.reset(); |
92 this._performanceModel = performanceModel; | 94 this._performanceModel = performanceModel; |
93 this._model = performanceModel && performanceModel.timelineModel(); | 95 this._model = performanceModel && performanceModel.timelineModel(); |
94 } | 96 } |
95 | 97 |
96 /** | 98 /** |
97 * @override | 99 * @override |
98 * @param {number} entryIndex | 100 * @param {number} entryIndex |
99 * @return {?string} | 101 * @return {?string} |
100 */ | 102 */ |
101 entryTitle(entryIndex) { | 103 entryTitle(entryIndex) { |
| 104 var entryTypes = Timeline.TimelineFlameChartDataProvider.EntryType; |
102 var entryType = this._entryType(entryIndex); | 105 var entryType = this._entryType(entryIndex); |
103 if (entryType === Timeline.TimelineFlameChartEntryType.Event) { | 106 if (entryType === entryTypes.Event) { |
104 var event = /** @type {!SDK.TracingModel.Event} */ (this._entryData[entryI
ndex]); | 107 var event = /** @type {!SDK.TracingModel.Event} */ (this._entryData[entryI
ndex]); |
105 if (event.phase === SDK.TracingModel.Phase.AsyncStepInto || event.phase ==
= SDK.TracingModel.Phase.AsyncStepPast) | 108 if (event.phase === SDK.TracingModel.Phase.AsyncStepInto || event.phase ==
= SDK.TracingModel.Phase.AsyncStepPast) |
106 return event.name + ':' + event.args['step']; | 109 return event.name + ':' + event.args['step']; |
107 if (event._blackboxRoot) | 110 if (event._blackboxRoot) |
108 return Common.UIString('Blackboxed'); | 111 return Common.UIString('Blackboxed'); |
109 var name = Timeline.TimelineUIUtils.eventStyle(event).title; | 112 var name = Timeline.TimelineUIUtils.eventStyle(event).title; |
110 // TODO(yurys): support event dividers | 113 // TODO(yurys): support event dividers |
111 var detailsText = Timeline.TimelineUIUtils.buildDetailsTextForTraceEvent(e
vent, this._model.targetByEvent(event)); | 114 var detailsText = Timeline.TimelineUIUtils.buildDetailsTextForTraceEvent(e
vent, this._model.targetByEvent(event)); |
112 if (event.name === TimelineModel.TimelineModel.RecordType.JSFrame && detai
lsText) | 115 if (event.name === TimelineModel.TimelineModel.RecordType.JSFrame && detai
lsText) |
113 return detailsText; | 116 return detailsText; |
114 return detailsText ? Common.UIString('%s (%s)', name, detailsText) : name; | 117 return detailsText ? Common.UIString('%s (%s)', name, detailsText) : name; |
115 } | 118 } |
116 if (entryType === Timeline.TimelineFlameChartEntryType.ExtensionEvent) { | 119 if (entryType === entryTypes.ExtensionEvent) { |
117 var event = /** @type {!SDK.TracingModel.Event} */ (this._entryData[entryI
ndex]); | 120 var event = /** @type {!SDK.TracingModel.Event} */ (this._entryData[entryI
ndex]); |
118 return event.name; | 121 return event.name; |
119 } | 122 } |
| 123 if (entryType === entryTypes.Screenshot) |
| 124 return ''; |
120 var title = this._entryIndexToTitle[entryIndex]; | 125 var title = this._entryIndexToTitle[entryIndex]; |
121 if (!title) { | 126 if (!title) { |
122 title = Common.UIString('Unexpected entryIndex %d', entryIndex); | 127 title = Common.UIString('Unexpected entryIndex %d', entryIndex); |
123 console.error(title); | 128 console.error(title); |
124 } | 129 } |
125 return title; | 130 return title; |
126 } | 131 } |
127 | 132 |
128 /** | 133 /** |
129 * @override | 134 * @override |
(...skipping 10 matching lines...) Expand all Loading... |
140 * @param {number} index | 145 * @param {number} index |
141 * @return {?string} | 146 * @return {?string} |
142 */ | 147 */ |
143 entryFont(index) { | 148 entryFont(index) { |
144 return this._font; | 149 return this._font; |
145 } | 150 } |
146 | 151 |
147 reset() { | 152 reset() { |
148 this._currentLevel = 0; | 153 this._currentLevel = 0; |
149 this._timelineData = null; | 154 this._timelineData = null; |
150 /** @type {!Array<!SDK.TracingModel.Event|!TimelineModel.TimelineFrame|!Time
lineModel.TimelineIRModel.Phases>} */ | 155 /** @type {!Array<!SDK.FilmStripModel.Frame|!SDK.TracingModel.Event|!Timelin
eModel.TimelineFrame|!TimelineModel.TimelineIRModel.Phases>} */ |
151 this._entryData = []; | 156 this._entryData = []; |
152 /** @type {!Array<!SDK.TracingModel.Event>} */ | 157 /** @type {!Array<!SDK.TracingModel.Event>} */ |
153 this._entryParent = []; | 158 this._entryParent = []; |
154 /** @type {!Array<!Timeline.TimelineFlameChartEntryType>} */ | 159 /** @type {!Array<!Timeline.TimelineFlameChartDataProvider.EntryType>} */ |
155 this._entryTypeByLevel = []; | 160 this._entryTypeByLevel = []; |
156 /** @type {!Array<string>} */ | 161 /** @type {!Array<string>} */ |
157 this._entryIndexToTitle = []; | 162 this._entryIndexToTitle = []; |
158 /** @type {!Array<!Timeline.TimelineFlameChartMarker>} */ | 163 /** @type {!Array<!Timeline.TimelineFlameChartMarker>} */ |
159 this._markers = []; | 164 this._markers = []; |
160 /** @type {!Map<!Timeline.TimelineCategory, string>} */ | 165 /** @type {!Map<!Timeline.TimelineCategory, string>} */ |
161 this._asyncColorByCategory = new Map(); | 166 this._asyncColorByCategory = new Map(); |
162 /** @type {!Map<!TimelineModel.TimelineIRModel.Phases, string>} */ | 167 /** @type {!Map<!TimelineModel.TimelineIRModel.Phases, string>} */ |
163 this._asyncColorByInteractionPhase = new Map(); | 168 this._asyncColorByInteractionPhase = new Map(); |
164 /** @type {!Array<!{title: string, model: !SDK.TracingModel}>} */ | 169 /** @type {!Array<!{title: string, model: !SDK.TracingModel}>} */ |
165 this._extensionInfo = []; | 170 this._extensionInfo = []; |
166 /** @type {!Map<!TimelineModel.TimelineFrame, ?Image>} */ | 171 /** @type {!Map<!SDK.FilmStripModel.Frame, ?Image>} */ |
167 this._frameImageCache = new Map(); | 172 this._screenshotImageCache = new Map(); |
168 } | 173 } |
169 | 174 |
170 /** | 175 /** |
171 * @override | 176 * @override |
172 * @return {number} | 177 * @return {number} |
173 */ | 178 */ |
174 maxStackDepth() { | 179 maxStackDepth() { |
175 return this._currentLevel; | 180 return this._currentLevel; |
176 } | 181 } |
177 | 182 |
178 /** | 183 /** |
179 * @override | 184 * @override |
180 * @return {!PerfUI.FlameChart.TimelineData} | 185 * @return {!PerfUI.FlameChart.TimelineData} |
181 */ | 186 */ |
182 timelineData() { | 187 timelineData() { |
183 if (this._timelineData) | 188 if (this._timelineData) |
184 return this._timelineData; | 189 return this._timelineData; |
185 | 190 |
186 this._timelineData = new PerfUI.FlameChart.TimelineData([], [], [], []); | 191 this._timelineData = new PerfUI.FlameChart.TimelineData([], [], [], []); |
187 if (!this._model) | 192 if (!this._model) |
188 return this._timelineData; | 193 return this._timelineData; |
189 | 194 |
190 this._flowEventIndexById.clear(); | 195 this._flowEventIndexById.clear(); |
191 | 196 |
192 this._minimumBoundary = this._model.minimumRecordTime(); | 197 this._minimumBoundary = this._model.minimumRecordTime(); |
193 this._timeSpan = this._model.isEmpty() ? 1000 : this._model.maximumRecordTim
e() - this._minimumBoundary; | 198 this._timeSpan = this._model.isEmpty() ? 1000 : this._model.maximumRecordTim
e() - this._minimumBoundary; |
194 this._currentLevel = 0; | 199 this._currentLevel = 0; |
195 | 200 |
196 this._appendFrameBars(this._performanceModel.frames()); | 201 this._appendFrameBars(); |
197 | 202 |
198 this._appendHeader(Common.UIString('Interactions'), this._interactionsHeader
Level1); | 203 this._appendHeader(Common.UIString('Interactions'), this._interactionsHeader
Level1); |
199 this._appendInteractionRecords(); | 204 this._appendInteractionRecords(); |
200 | 205 |
201 var eventEntryType = Timeline.TimelineFlameChartEntryType.Event; | 206 var eventEntryType = Timeline.TimelineFlameChartDataProvider.EntryType.Event
; |
202 | 207 |
203 var asyncEventGroups = TimelineModel.TimelineModel.AsyncEventGroup; | 208 var asyncEventGroups = TimelineModel.TimelineModel.AsyncEventGroup; |
204 var inputLatencies = this._model.mainThreadAsyncEvents().get(asyncEventGroup
s.input); | 209 var inputLatencies = this._model.mainThreadAsyncEvents().get(asyncEventGroup
s.input); |
205 if (inputLatencies && inputLatencies.length) { | 210 if (inputLatencies && inputLatencies.length) { |
206 var title = Timeline.TimelineUIUtils.titleForAsyncEventGroup(asyncEventGro
ups.input); | 211 var title = Timeline.TimelineUIUtils.titleForAsyncEventGroup(asyncEventGro
ups.input); |
207 this._appendAsyncEventsGroup(title, inputLatencies, this._interactionsHead
erLevel2, eventEntryType); | 212 this._appendAsyncEventsGroup(title, inputLatencies, this._interactionsHead
erLevel2, eventEntryType); |
208 } | 213 } |
209 var animations = this._model.mainThreadAsyncEvents().get(asyncEventGroups.an
imation); | 214 var animations = this._model.mainThreadAsyncEvents().get(asyncEventGroups.an
imation); |
210 if (animations && animations.length) { | 215 if (animations && animations.length) { |
211 var title = Timeline.TimelineUIUtils.titleForAsyncEventGroup(asyncEventGro
ups.animation); | 216 var title = Timeline.TimelineUIUtils.titleForAsyncEventGroup(asyncEventGro
ups.animation); |
(...skipping 24 matching lines...) Expand all Loading... |
236 } | 241 } |
237 this._appendGPUEvents(); | 242 this._appendGPUEvents(); |
238 | 243 |
239 otherThreads.forEach( | 244 otherThreads.forEach( |
240 thread => this._appendThreadTimelineData( | 245 thread => this._appendThreadTimelineData( |
241 thread.name || Common.UIString('Thread %d', thread.id), thread.event
s, thread.asyncEventsByGroup)); | 246 thread.name || Common.UIString('Thread %d', thread.id), thread.event
s, thread.asyncEventsByGroup)); |
242 | 247 |
243 for (let extensionIndex = 0; extensionIndex < this._extensionInfo.length; ex
tensionIndex++) | 248 for (let extensionIndex = 0; extensionIndex < this._extensionInfo.length; ex
tensionIndex++) |
244 this._innerAppendExtensionEvents(extensionIndex); | 249 this._innerAppendExtensionEvents(extensionIndex); |
245 | 250 |
246 /** | 251 this._markers.sort((a, b) => a.startTime() - b.startTime()); |
247 * @param {!Timeline.TimelineFlameChartMarker} a | |
248 * @param {!Timeline.TimelineFlameChartMarker} b | |
249 */ | |
250 function compareStartTime(a, b) { | |
251 return a.startTime() - b.startTime(); | |
252 } | |
253 | |
254 this._markers.sort(compareStartTime); | |
255 this._timelineData.markers = this._markers; | 252 this._timelineData.markers = this._markers; |
256 this._flowEventIndexById.clear(); | 253 this._flowEventIndexById.clear(); |
257 | 254 |
258 return this._timelineData; | 255 return this._timelineData; |
259 } | 256 } |
260 | 257 |
261 /** | 258 /** |
262 * @override | 259 * @override |
263 * @return {number} | 260 * @return {number} |
264 */ | 261 */ |
(...skipping 12 matching lines...) Expand all Loading... |
277 /** | 274 /** |
278 * @param {number} level | 275 * @param {number} level |
279 * @param {!TimelineModel.TimelineModel.PageFrame} frame | 276 * @param {!TimelineModel.TimelineModel.PageFrame} frame |
280 */ | 277 */ |
281 _appendFrameEvents(level, frame) { | 278 _appendFrameEvents(level, frame) { |
282 var events = this._model.eventsForFrame(frame.id); | 279 var events = this._model.eventsForFrame(frame.id); |
283 var clonedHeader = Object.assign({}, this._headerLevel1); | 280 var clonedHeader = Object.assign({}, this._headerLevel1); |
284 clonedHeader.nestingLevel = level; | 281 clonedHeader.nestingLevel = level; |
285 this._appendSyncEvents( | 282 this._appendSyncEvents( |
286 events, Timeline.TimelineUIUtils.displayNameForFrame(frame), | 283 events, Timeline.TimelineUIUtils.displayNameForFrame(frame), |
287 /** @type {!PerfUI.FlameChart.GroupStyle} */ (clonedHeader), Timeline.Ti
melineFlameChartEntryType.Event); | 284 /** @type {!PerfUI.FlameChart.GroupStyle} */ (clonedHeader), |
| 285 Timeline.TimelineFlameChartDataProvider.EntryType.Event); |
288 frame.children.forEach(this._appendFrameEvents.bind(this, level + 1)); | 286 frame.children.forEach(this._appendFrameEvents.bind(this, level + 1)); |
289 } | 287 } |
290 | 288 |
291 /** | 289 /** |
292 * @param {string} threadTitle | 290 * @param {string} threadTitle |
293 * @param {!Array<!SDK.TracingModel.Event>} syncEvents | 291 * @param {!Array<!SDK.TracingModel.Event>} syncEvents |
294 * @param {!Map<!TimelineModel.TimelineModel.AsyncEventGroup, !Array<!SDK.Trac
ingModel.AsyncEvent>>} asyncEvents | 292 * @param {!Map<!TimelineModel.TimelineModel.AsyncEventGroup, !Array<!SDK.Trac
ingModel.AsyncEvent>>} asyncEvents |
295 * @param {boolean=} forceExpanded | 293 * @param {boolean=} forceExpanded |
296 */ | 294 */ |
297 _appendThreadTimelineData(threadTitle, syncEvents, asyncEvents, forceExpanded)
{ | 295 _appendThreadTimelineData(threadTitle, syncEvents, asyncEvents, forceExpanded)
{ |
298 var entryType = Timeline.TimelineFlameChartEntryType.Event; | 296 var entryType = Timeline.TimelineFlameChartDataProvider.EntryType.Event; |
299 this._appendAsyncEvents(asyncEvents); | 297 this._appendAsyncEvents(asyncEvents); |
300 this._appendSyncEvents(syncEvents, threadTitle, this._headerLevel1, entryTyp
e, forceExpanded); | 298 this._appendSyncEvents(syncEvents, threadTitle, this._headerLevel1, entryTyp
e, forceExpanded); |
301 } | 299 } |
302 | 300 |
303 /** | 301 /** |
304 * @param {!Array<!SDK.TracingModel.Event>} events | 302 * @param {!Array<!SDK.TracingModel.Event>} events |
305 * @param {string} title | 303 * @param {string} title |
306 * @param {!PerfUI.FlameChart.GroupStyle} style | 304 * @param {!PerfUI.FlameChart.GroupStyle} style |
307 * @param {!Timeline.TimelineFlameChartEntryType} entryType | 305 * @param {!Timeline.TimelineFlameChartDataProvider.EntryType} entryType |
308 * @param {boolean=} forceExpanded | 306 * @param {boolean=} forceExpanded |
309 */ | 307 */ |
310 _appendSyncEvents(events, title, style, entryType, forceExpanded) { | 308 _appendSyncEvents(events, title, style, entryType, forceExpanded) { |
311 var isExtension = entryType === Timeline.TimelineFlameChartEntryType.Extensi
onEvent; | 309 var isExtension = entryType === Timeline.TimelineFlameChartDataProvider.Entr
yType.ExtensionEvent; |
312 var openEvents = []; | 310 var openEvents = []; |
313 var flowEventsEnabled = Runtime.experiments.isEnabled('timelineFlowEvents'); | 311 var flowEventsEnabled = Runtime.experiments.isEnabled('timelineFlowEvents'); |
314 var blackboxingEnabled = !isExtension && Runtime.experiments.isEnabled('blac
kboxJSFramesOnTimeline'); | 312 var blackboxingEnabled = !isExtension && Runtime.experiments.isEnabled('blac
kboxJSFramesOnTimeline'); |
315 var maxStackDepth = 0; | 313 var maxStackDepth = 0; |
316 for (var i = 0; i < events.length; ++i) { | 314 for (var i = 0; i < events.length; ++i) { |
317 var e = events[i]; | 315 var e = events[i]; |
318 if (!isExtension && TimelineModel.TimelineModel.isMarkerEvent(e)) { | 316 if (!isExtension && TimelineModel.TimelineModel.isMarkerEvent(e)) { |
319 this._markers.push(new Timeline.TimelineFlameChartMarker( | 317 this._markers.push(new Timeline.TimelineFlameChartMarker( |
320 e.startTime, e.startTime - this._model.minimumRecordTime(), | 318 e.startTime, e.startTime - this._model.minimumRecordTime(), |
321 Timeline.TimelineUIUtils.markerStyleForEvent(e))); | 319 Timeline.TimelineUIUtils.markerStyleForEvent(e))); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 * @return {boolean} | 374 * @return {boolean} |
377 */ | 375 */ |
378 _isBlackboxedURL(url) { | 376 _isBlackboxedURL(url) { |
379 return Bindings.blackboxManager.isBlackboxedURL(url); | 377 return Bindings.blackboxManager.isBlackboxedURL(url); |
380 } | 378 } |
381 | 379 |
382 /** | 380 /** |
383 * @param {!Map<!TimelineModel.TimelineModel.AsyncEventGroup, !Array<!SDK.Trac
ingModel.AsyncEvent>>} asyncEvents | 381 * @param {!Map<!TimelineModel.TimelineModel.AsyncEventGroup, !Array<!SDK.Trac
ingModel.AsyncEvent>>} asyncEvents |
384 */ | 382 */ |
385 _appendAsyncEvents(asyncEvents) { | 383 _appendAsyncEvents(asyncEvents) { |
386 var entryType = Timeline.TimelineFlameChartEntryType.Event; | 384 var entryType = Timeline.TimelineFlameChartDataProvider.EntryType.Event; |
387 var groups = TimelineModel.TimelineModel.AsyncEventGroup; | 385 var groups = TimelineModel.TimelineModel.AsyncEventGroup; |
388 var groupArray = Object.keys(groups).map(key => groups[key]); | 386 var groupArray = Object.keys(groups).map(key => groups[key]); |
389 | 387 |
390 groupArray.remove(groups.animation); | 388 groupArray.remove(groups.animation); |
391 groupArray.remove(groups.input); | 389 groupArray.remove(groups.input); |
392 | 390 |
393 for (var groupIndex = 0; groupIndex < groupArray.length; ++groupIndex) { | 391 for (var groupIndex = 0; groupIndex < groupArray.length; ++groupIndex) { |
394 var group = groupArray[groupIndex]; | 392 var group = groupArray[groupIndex]; |
395 var events = asyncEvents.get(group); | 393 var events = asyncEvents.get(group); |
396 if (!events) | 394 if (!events) |
397 continue; | 395 continue; |
398 var title = Timeline.TimelineUIUtils.titleForAsyncEventGroup(group); | 396 var title = Timeline.TimelineUIUtils.titleForAsyncEventGroup(group); |
399 this._appendAsyncEventsGroup(title, events, this._headerLevel1, entryType)
; | 397 this._appendAsyncEventsGroup(title, events, this._headerLevel1, entryType)
; |
400 } | 398 } |
401 } | 399 } |
402 | 400 |
403 /** | 401 /** |
404 * @param {string} header | 402 * @param {string} header |
405 * @param {!Array<!SDK.TracingModel.AsyncEvent>} events | 403 * @param {!Array<!SDK.TracingModel.AsyncEvent>} events |
406 * @param {!PerfUI.FlameChart.GroupStyle} style | 404 * @param {!PerfUI.FlameChart.GroupStyle} style |
407 * @param {!Timeline.TimelineFlameChartEntryType} entryType | 405 * @param {!Timeline.TimelineFlameChartDataProvider.EntryType} entryType |
408 */ | 406 */ |
409 _appendAsyncEventsGroup(header, events, style, entryType) { | 407 _appendAsyncEventsGroup(header, events, style, entryType) { |
410 var lastUsedTimeByLevel = []; | 408 var lastUsedTimeByLevel = []; |
411 var groupHeaderAppended = false; | 409 var groupHeaderAppended = false; |
412 for (var i = 0; i < events.length; ++i) { | 410 for (var i = 0; i < events.length; ++i) { |
413 var asyncEvent = events[i]; | 411 var asyncEvent = events[i]; |
414 if (!this._isVisible(asyncEvent)) | 412 if (!this._isVisible(asyncEvent)) |
415 continue; | 413 continue; |
416 if (!groupHeaderAppended) { | 414 if (!groupHeaderAppended) { |
417 this._appendHeader(header, style); | 415 this._appendHeader(header, style); |
418 groupHeaderAppended = true; | 416 groupHeaderAppended = true; |
419 } | 417 } |
420 var startTime = asyncEvent.startTime; | 418 var startTime = asyncEvent.startTime; |
421 var level; | 419 var level; |
422 for (level = 0; level < lastUsedTimeByLevel.length && lastUsedTimeByLevel[
level] > startTime; ++level) { | 420 for (level = 0; level < lastUsedTimeByLevel.length && lastUsedTimeByLevel[
level] > startTime; ++level) { |
423 } | 421 } |
424 this._appendAsyncEvent(asyncEvent, this._currentLevel + level); | 422 this._appendAsyncEvent(asyncEvent, this._currentLevel + level); |
425 lastUsedTimeByLevel[level] = asyncEvent.endTime; | 423 lastUsedTimeByLevel[level] = asyncEvent.endTime; |
426 } | 424 } |
427 this._entryTypeByLevel.length = this._currentLevel + lastUsedTimeByLevel.len
gth; | 425 this._entryTypeByLevel.length = this._currentLevel + lastUsedTimeByLevel.len
gth; |
428 this._entryTypeByLevel.fill(entryType, this._currentLevel); | 426 this._entryTypeByLevel.fill(entryType, this._currentLevel); |
429 this._currentLevel += lastUsedTimeByLevel.length; | 427 this._currentLevel += lastUsedTimeByLevel.length; |
430 } | 428 } |
431 | 429 |
432 _appendGPUEvents() { | 430 _appendGPUEvents() { |
433 var eventType = Timeline.TimelineFlameChartEntryType.Event; | 431 var eventType = Timeline.TimelineFlameChartDataProvider.EntryType.Event; |
434 var gpuEvents = this._model.gpuEvents(); | 432 var gpuEvents = this._model.gpuEvents(); |
435 if (this._appendSyncEvents(gpuEvents, Common.UIString('GPU'), this._headerLe
vel1, eventType, false)) | 433 if (this._appendSyncEvents(gpuEvents, Common.UIString('GPU'), this._headerLe
vel1, eventType, false)) |
436 ++this._currentLevel; | 434 ++this._currentLevel; |
437 } | 435 } |
438 | 436 |
439 _appendInteractionRecords() { | 437 _appendInteractionRecords() { |
440 this._performanceModel.interactionRecords().forEach(this._appendSegment, thi
s); | 438 this._performanceModel.interactionRecords().forEach(this._appendSegment, thi
s); |
441 this._entryTypeByLevel[this._currentLevel++] = Timeline.TimelineFlameChartEn
tryType.InteractionRecord; | 439 this._entryTypeByLevel[this._currentLevel++] = Timeline.TimelineFlameChartDa
taProvider.EntryType.InteractionRecord; |
442 } | 440 } |
443 | 441 |
444 /** | 442 _appendFrameBars() { |
445 * @param {!Array.<!TimelineModel.TimelineFrame>} frames | 443 var screenshots = this._performanceModel.filmStripModel().frames(); |
446 */ | 444 var hasFilmStrip = !!screenshots.length; |
447 _appendFrameBars(frames) { | |
448 var hasFilmStrip = !!this._performanceModel.filmStripModel().frames().length
; | |
449 this._framesHeader.collapsible = hasFilmStrip; | 445 this._framesHeader.collapsible = hasFilmStrip; |
450 this._appendHeader(Common.UIString('Frames'), this._framesHeader); | 446 this._appendHeader(Common.UIString('Frames'), this._framesHeader); |
451 this._frameGroup = this._timelineData.groups.peekLast(); | 447 this._frameGroup = this._timelineData.groups.peekLast(); |
452 var style = Timeline.TimelineUIUtils.markerStyleForFrame(); | 448 var style = Timeline.TimelineUIUtils.markerStyleForFrame(); |
453 this._entryTypeByLevel[this._currentLevel] = Timeline.TimelineFlameChartEntr
yType.Frame; | 449 this._entryTypeByLevel[this._currentLevel] = Timeline.TimelineFlameChartData
Provider.EntryType.Frame; |
454 for (var frame of frames) { | 450 for (var frame of this._performanceModel.frames()) { |
455 this._markers.push(new Timeline.TimelineFlameChartMarker( | 451 this._markers.push(new Timeline.TimelineFlameChartMarker( |
456 frame.startTime, frame.startTime - this._model.minimumRecordTime(), st
yle)); | 452 frame.startTime, frame.startTime - this._model.minimumRecordTime(), st
yle)); |
457 this._appendFrame(frame); | 453 this._appendFrame(frame); |
458 } | 454 } |
459 ++this._currentLevel; | 455 ++this._currentLevel; |
| 456 if (!hasFilmStrip) |
| 457 return; |
| 458 this._appendHeader('', this._screenshotsHeader); |
| 459 this._entryTypeByLevel[this._currentLevel] = Timeline.TimelineFlameChartData
Provider.EntryType.Screenshot; |
| 460 var prevTimestamp; |
| 461 for (var screenshot of screenshots) { |
| 462 var index = this._entryData.length; |
| 463 this._entryData.push(screenshot); |
| 464 this._timelineData.entryLevels[index] = this._currentLevel; |
| 465 this._timelineData.entryStartTimes[index] = screenshot.timestamp; |
| 466 if (prevTimestamp) |
| 467 this._timelineData.entryTotalTimes[index - 1] = screenshot.timestamp - p
revTimestamp; |
| 468 prevTimestamp = screenshot.timestamp; |
| 469 } |
| 470 this._timelineData.entryTotalTimes[this._timelineData.entryTotalTimes.length
- 1] = |
| 471 this._model.maximumRecordTime() - prevTimestamp; |
| 472 ++this._currentLevel; |
460 } | 473 } |
461 | 474 |
462 /** | 475 /** |
463 * @param {number} entryIndex | 476 * @param {number} entryIndex |
464 * @return {!Timeline.TimelineFlameChartEntryType} | 477 * @return {!Timeline.TimelineFlameChartDataProvider.EntryType} |
465 */ | 478 */ |
466 _entryType(entryIndex) { | 479 _entryType(entryIndex) { |
467 return this._entryTypeByLevel[this._timelineData.entryLevels[entryIndex]]; | 480 return this._entryTypeByLevel[this._timelineData.entryLevels[entryIndex]]; |
468 } | 481 } |
469 | 482 |
470 /** | 483 /** |
471 * @override | 484 * @override |
472 * @param {number} entryIndex | 485 * @param {number} entryIndex |
473 * @return {?Element} | 486 * @return {?Element} |
474 */ | 487 */ |
475 prepareHighlightedEntryInfo(entryIndex) { | 488 prepareHighlightedEntryInfo(entryIndex) { |
476 var time = ''; | 489 var time = ''; |
477 var title; | 490 var title; |
478 var warning; | 491 var warning; |
479 var type = this._entryType(entryIndex); | 492 var type = this._entryType(entryIndex); |
480 if (type === Timeline.TimelineFlameChartEntryType.Event) { | 493 if (type === Timeline.TimelineFlameChartDataProvider.EntryType.Event) { |
481 var event = /** @type {!SDK.TracingModel.Event} */ (this._entryData[entryI
ndex]); | 494 var event = /** @type {!SDK.TracingModel.Event} */ (this._entryData[entryI
ndex]); |
482 var totalTime = event.duration; | 495 var totalTime = event.duration; |
483 var selfTime = event.selfTime; | 496 var selfTime = event.selfTime; |
484 var /** @const */ eps = 1e-6; | 497 var /** @const */ eps = 1e-6; |
485 if (typeof totalTime === 'number') { | 498 if (typeof totalTime === 'number') { |
486 time = Math.abs(totalTime - selfTime) > eps && selfTime > eps ? | 499 time = Math.abs(totalTime - selfTime) > eps && selfTime > eps ? |
487 Common.UIString( | 500 Common.UIString( |
488 '%s (self %s)', Number.millisToString(totalTime, true), Number.m
illisToString(selfTime, true)) : | 501 '%s (self %s)', Number.millisToString(totalTime, true), Number.m
illisToString(selfTime, true)) : |
489 Number.millisToString(totalTime, true); | 502 Number.millisToString(totalTime, true); |
490 } | 503 } |
491 title = this.entryTitle(entryIndex); | 504 title = this.entryTitle(entryIndex); |
492 warning = Timeline.TimelineUIUtils.eventWarning(event); | 505 warning = Timeline.TimelineUIUtils.eventWarning(event); |
493 } else if (type === Timeline.TimelineFlameChartEntryType.Frame) { | 506 } else if (type === Timeline.TimelineFlameChartDataProvider.EntryType.Frame)
{ |
494 var frame = /** @type {!TimelineModel.TimelineFrame} */ (this._entryData[e
ntryIndex]); | 507 var frame = /** @type {!TimelineModel.TimelineFrame} */ (this._entryData[e
ntryIndex]); |
495 time = Common.UIString( | 508 time = Common.UIString( |
496 '%s ~ %.0f\xa0fps', Number.preciseMillisToString(frame.duration, 1), (
1000 / frame.duration)); | 509 '%s ~ %.0f\xa0fps', Number.preciseMillisToString(frame.duration, 1), (
1000 / frame.duration)); |
497 title = frame.idle ? Common.UIString('Idle Frame') : Common.UIString('Fram
e'); | 510 title = frame.idle ? Common.UIString('Idle Frame') : Common.UIString('Fram
e'); |
498 if (frame.hasWarnings()) { | 511 if (frame.hasWarnings()) { |
499 warning = createElement('span'); | 512 warning = createElement('span'); |
500 warning.textContent = Common.UIString('Long frame'); | 513 warning.textContent = Common.UIString('Long frame'); |
501 } | 514 } |
502 } else { | 515 } else { |
503 return null; | 516 return null; |
(...skipping 20 matching lines...) Expand all Loading... |
524 function patchColorAndCache(cache, key, lookupColor) { | 537 function patchColorAndCache(cache, key, lookupColor) { |
525 var color = cache.get(key); | 538 var color = cache.get(key); |
526 if (color) | 539 if (color) |
527 return color; | 540 return color; |
528 var parsedColor = Common.Color.parse(lookupColor(key)); | 541 var parsedColor = Common.Color.parse(lookupColor(key)); |
529 color = parsedColor.setAlpha(0.7).asString(Common.Color.Format.RGBA) || ''
; | 542 color = parsedColor.setAlpha(0.7).asString(Common.Color.Format.RGBA) || ''
; |
530 cache.set(key, color); | 543 cache.set(key, color); |
531 return color; | 544 return color; |
532 } | 545 } |
533 | 546 |
| 547 var entryTypes = Timeline.TimelineFlameChartDataProvider.EntryType; |
534 var type = this._entryType(entryIndex); | 548 var type = this._entryType(entryIndex); |
535 if (type === Timeline.TimelineFlameChartEntryType.Event) { | 549 if (type === entryTypes.Event) { |
536 var event = /** @type {!SDK.TracingModel.Event} */ (this._entryData[entryI
ndex]); | 550 var event = /** @type {!SDK.TracingModel.Event} */ (this._entryData[entryI
ndex]); |
537 if (!SDK.TracingModel.isAsyncPhase(event.phase)) | 551 if (!SDK.TracingModel.isAsyncPhase(event.phase)) |
538 return this._colorForEvent(event); | 552 return this._colorForEvent(event); |
539 if (event.hasCategory(TimelineModel.TimelineModel.Category.Console) || | 553 if (event.hasCategory(TimelineModel.TimelineModel.Category.Console) || |
540 event.hasCategory(TimelineModel.TimelineModel.Category.UserTiming)) | 554 event.hasCategory(TimelineModel.TimelineModel.Category.UserTiming)) |
541 return this._consoleColorGenerator.colorForID(event.name); | 555 return this._consoleColorGenerator.colorForID(event.name); |
542 if (event.hasCategory(TimelineModel.TimelineModel.Category.LatencyInfo)) { | 556 if (event.hasCategory(TimelineModel.TimelineModel.Category.LatencyInfo)) { |
543 var phase = | 557 var phase = |
544 TimelineModel.TimelineIRModel.phaseForEvent(event) || TimelineModel.
TimelineIRModel.Phases.Uncategorized; | 558 TimelineModel.TimelineIRModel.phaseForEvent(event) || TimelineModel.
TimelineIRModel.Phases.Uncategorized; |
545 return patchColorAndCache( | 559 return patchColorAndCache( |
546 this._asyncColorByInteractionPhase, phase, Timeline.TimelineUIUtils.
interactionPhaseColor); | 560 this._asyncColorByInteractionPhase, phase, Timeline.TimelineUIUtils.
interactionPhaseColor); |
547 } | 561 } |
548 var category = Timeline.TimelineUIUtils.eventStyle(event).category; | 562 var category = Timeline.TimelineUIUtils.eventStyle(event).category; |
549 return patchColorAndCache(this._asyncColorByCategory, category, () => cate
gory.color); | 563 return patchColorAndCache(this._asyncColorByCategory, category, () => cate
gory.color); |
550 } | 564 } |
551 if (type === Timeline.TimelineFlameChartEntryType.Frame) | 565 if (type === entryTypes.Frame) |
552 return 'white'; | 566 return 'white'; |
553 if (type === Timeline.TimelineFlameChartEntryType.InteractionRecord) | 567 if (type === entryTypes.InteractionRecord) |
554 return 'transparent'; | 568 return 'transparent'; |
555 if (type === Timeline.TimelineFlameChartEntryType.ExtensionEvent) { | 569 if (type === entryTypes.ExtensionEvent) { |
556 var event = /** @type {!SDK.TracingModel.Event} */ (this._entryData[entryI
ndex]); | 570 var event = /** @type {!SDK.TracingModel.Event} */ (this._entryData[entryI
ndex]); |
557 return this._extensionColorGenerator.colorForID(event.name); | 571 return this._extensionColorGenerator.colorForID(event.name); |
558 } | 572 } |
559 return ''; | 573 return ''; |
560 } | 574 } |
561 | 575 |
562 /** | 576 /** |
563 * @param {number} entryIndex | 577 * @param {number} entryIndex |
564 * @param {!CanvasRenderingContext2D} context | 578 * @param {!CanvasRenderingContext2D} context |
565 * @param {?string} text | 579 * @param {?string} text |
566 * @param {number} barX | 580 * @param {number} barX |
567 * @param {number} barY | 581 * @param {number} barY |
568 * @param {number} barWidth | 582 * @param {number} barWidth |
569 * @param {number} barHeight | 583 * @param {number} barHeight |
570 */ | 584 */ |
571 _drawFrame(entryIndex, context, text, barX, barY, barWidth, barHeight) { | 585 _drawFrame(entryIndex, context, text, barX, barY, barWidth, barHeight) { |
572 var /** @const */ hPadding = 1; | 586 var /** @const */ hPadding = 1; |
573 var frame = /** @type {!TimelineModel.TimelineFrame} */ (this._entryData[ent
ryIndex]); | 587 var frame = /** @type {!TimelineModel.TimelineFrame} */ (this._entryData[ent
ryIndex]); |
574 barX += hPadding; | 588 barX += hPadding; |
575 barWidth -= 2 * hPadding; | 589 barWidth -= 2 * hPadding; |
576 context.fillStyle = frame.idle ? 'white' : (frame.hasWarnings() ? '#fad1d1'
: '#d7f0d1'); | 590 context.fillStyle = frame.idle ? 'white' : (frame.hasWarnings() ? '#fad1d1'
: '#d7f0d1'); |
577 context.fillRect(barX, barY, barWidth, barHeight); | 591 context.fillRect(barX, barY, barWidth, barHeight); |
578 | 592 |
579 var headerHeight = 17; | |
580 var frameDurationText = Number.preciseMillisToString(frame.duration, 1); | 593 var frameDurationText = Number.preciseMillisToString(frame.duration, 1); |
581 var textWidth = context.measureText(frameDurationText).width; | 594 var textWidth = context.measureText(frameDurationText).width; |
582 if (textWidth <= barWidth) { | 595 if (textWidth <= barWidth) { |
583 var font = this.entryFont(entryIndex); | |
584 if (font) | |
585 context.font = font; | |
586 context.fillStyle = this.textColor(entryIndex); | 596 context.fillStyle = this.textColor(entryIndex); |
587 context.fillText(frameDurationText, barX + (barWidth - textWidth) / 2, bar
Y + headerHeight - 4); | 597 context.fillText(frameDurationText, barX + (barWidth - textWidth) / 2, bar
Y + barHeight - 4); |
588 } | 598 } |
| 599 } |
589 | 600 |
590 var imageHeight = barHeight - headerHeight; | 601 /** |
591 if (imageHeight < headerHeight) | 602 * @param {number} entryIndex |
| 603 * @param {!CanvasRenderingContext2D} context |
| 604 * @param {number} barX |
| 605 * @param {number} barY |
| 606 * @param {number} barWidth |
| 607 * @param {number} barHeight |
| 608 */ |
| 609 async _drawScreenshot(entryIndex, context, barX, barY, barWidth, barHeight) { |
| 610 var screenshot = /** @type {!SDK.FilmStripModel.Frame} */ (this._entryData[e
ntryIndex]); |
| 611 if (!this._screenshotImageCache.has(screenshot)) { |
| 612 this._screenshotImageCache.set(screenshot, null); |
| 613 var data = await screenshot.imageDataPromise(); |
| 614 var image = await UI.loadImageFromData(data); |
| 615 this._screenshotImageCache.set(screenshot, image); |
| 616 this.dispatchEventToListeners(Timeline.TimelineFlameChartDataProvider.Even
ts.DataChanged); |
592 return; | 617 return; |
593 if (!this._frameImageCache.has(frame)) { | |
594 this._frameImageCache.set(frame, null); // Mark the image promise is in f
light. | |
595 var modelFrame = this._performanceModel.filmStripModelFrame(frame); | |
596 if (modelFrame) { | |
597 modelFrame.imageDataPromise().then(data => UI.loadImageFromData(data)).t
hen(image => { | |
598 this._frameImageCache.set(frame, image); | |
599 this.dispatchEventToListeners(Timeline.TimelineFlameChartDataProvider.
Events.DataChanged); | |
600 }); | |
601 } | |
602 } | 618 } |
603 var image = this._frameImageCache.get(frame); | 619 context.fillStyle = '#eee'; |
| 620 context.fillRect(barX, barY, barWidth, barHeight); |
| 621 var image = this._screenshotImageCache.get(screenshot); |
604 if (!image) | 622 if (!image) |
605 return; | 623 return; |
606 var imageX = barX; | 624 var imageX = barX + 1; |
607 var imageY = barY + headerHeight; | 625 var imageY = barY + 1; |
| 626 var imageHeight = barHeight - 2; |
608 var scale = imageHeight / image.naturalHeight; | 627 var scale = imageHeight / image.naturalHeight; |
609 var imageWidth = image.naturalWidth * scale; | 628 var imageWidth = image.naturalWidth * scale; |
610 context.save(); | 629 context.save(); |
611 context.beginPath(); | 630 context.beginPath(); |
612 context.rect(imageX, imageY, barWidth, imageHeight); | 631 context.rect(imageX, imageY, barWidth - 2, imageHeight); |
613 context.clip(); | 632 context.clip(); |
614 context.drawImage(image, imageX, imageY, imageWidth, imageHeight); | 633 context.drawImage(image, imageX, imageY, imageWidth, imageHeight); |
615 context.restore(); | 634 context.restore(); |
616 } | 635 } |
617 | 636 |
618 /** | 637 /** |
619 * @override | 638 * @override |
620 * @param {number} entryIndex | 639 * @param {number} entryIndex |
621 * @param {!CanvasRenderingContext2D} context | 640 * @param {!CanvasRenderingContext2D} context |
622 * @param {?string} text | 641 * @param {?string} text |
623 * @param {number} barX | 642 * @param {number} barX |
624 * @param {number} barY | 643 * @param {number} barY |
625 * @param {number} barWidth | 644 * @param {number} barWidth |
626 * @param {number} barHeight | 645 * @param {number} barHeight |
627 * @param {number} unclippedBarX | 646 * @param {number} unclippedBarX |
628 * @param {number} timeToPixels | 647 * @param {number} timeToPixels |
629 * @return {boolean} | 648 * @return {boolean} |
630 */ | 649 */ |
631 decorateEntry(entryIndex, context, text, barX, barY, barWidth, barHeight, uncl
ippedBarX, timeToPixels) { | 650 decorateEntry(entryIndex, context, text, barX, barY, barWidth, barHeight, uncl
ippedBarX, timeToPixels) { |
632 var data = this._entryData[entryIndex]; | 651 var data = this._entryData[entryIndex]; |
633 var type = this._entryType(entryIndex); | 652 var type = this._entryType(entryIndex); |
634 if (type === Timeline.TimelineFlameChartEntryType.Frame) { | 653 var entryTypes = Timeline.TimelineFlameChartDataProvider.EntryType; |
| 654 |
| 655 if (type === entryTypes.Frame) { |
635 this._drawFrame(entryIndex, context, text, barX, barY, barWidth, barHeight
); | 656 this._drawFrame(entryIndex, context, text, barX, barY, barWidth, barHeight
); |
636 return true; | 657 return true; |
637 } | 658 } |
638 | 659 |
639 if (type === Timeline.TimelineFlameChartEntryType.InteractionRecord) { | 660 if (type === entryTypes.Screenshot) { |
| 661 this._drawScreenshot(entryIndex, context, barX, barY, barWidth, barHeight)
; |
| 662 return true; |
| 663 } |
| 664 |
| 665 if (type === entryTypes.InteractionRecord) { |
640 var color = Timeline.TimelineUIUtils.interactionPhaseColor( | 666 var color = Timeline.TimelineUIUtils.interactionPhaseColor( |
641 /** @type {!TimelineModel.TimelineIRModel.Phases} */ (data)); | 667 /** @type {!TimelineModel.TimelineIRModel.Phases} */ (data)); |
642 context.fillStyle = color; | 668 context.fillStyle = color; |
643 context.fillRect(barX, barY, barWidth - 1, 2); | 669 context.fillRect(barX, barY, barWidth - 1, 2); |
644 context.fillRect(barX, barY - 3, 2, 3); | 670 context.fillRect(barX, barY - 3, 2, 3); |
645 context.fillRect(barX + barWidth - 3, barY - 3, 2, 3); | 671 context.fillRect(barX + barWidth - 3, barY - 3, 2, 3); |
646 return false; | 672 return false; |
647 } | 673 } |
648 | 674 |
649 if (type === Timeline.TimelineFlameChartEntryType.Event) { | 675 if (type === entryTypes.Event) { |
650 var event = /** @type {!SDK.TracingModel.Event} */ (data); | 676 var event = /** @type {!SDK.TracingModel.Event} */ (data); |
651 if (event.hasCategory(TimelineModel.TimelineModel.Category.LatencyInfo)) { | 677 if (event.hasCategory(TimelineModel.TimelineModel.Category.LatencyInfo)) { |
652 var timeWaitingForMainThread = TimelineModel.TimelineData.forEvent(event
).timeWaitingForMainThread; | 678 var timeWaitingForMainThread = TimelineModel.TimelineData.forEvent(event
).timeWaitingForMainThread; |
653 if (timeWaitingForMainThread) { | 679 if (timeWaitingForMainThread) { |
654 context.fillStyle = 'hsla(0, 70%, 60%, 1)'; | 680 context.fillStyle = 'hsla(0, 70%, 60%, 1)'; |
655 var width = Math.floor(unclippedBarX - barX + timeWaitingForMainThread
* timeToPixels); | 681 var width = Math.floor(unclippedBarX - barX + timeWaitingForMainThread
* timeToPixels); |
656 context.fillRect(barX, barY + barHeight - 3, width, 2); | 682 context.fillRect(barX, barY + barHeight - 3, width, 2); |
657 } | 683 } |
658 } | 684 } |
659 if (TimelineModel.TimelineData.forEvent(event).warning) | 685 if (TimelineModel.TimelineData.forEvent(event).warning) |
(...skipping 21 matching lines...) Expand all Loading... |
681 | 707 |
682 return false; | 708 return false; |
683 } | 709 } |
684 | 710 |
685 /** | 711 /** |
686 * @override | 712 * @override |
687 * @param {number} entryIndex | 713 * @param {number} entryIndex |
688 * @return {boolean} | 714 * @return {boolean} |
689 */ | 715 */ |
690 forceDecoration(entryIndex) { | 716 forceDecoration(entryIndex) { |
| 717 var entryTypes = Timeline.TimelineFlameChartDataProvider.EntryType; |
691 var type = this._entryType(entryIndex); | 718 var type = this._entryType(entryIndex); |
692 if (type === Timeline.TimelineFlameChartEntryType.Frame) | 719 if (type === entryTypes.Frame) |
| 720 return true; |
| 721 if (type === entryTypes.Screenshot) |
693 return true; | 722 return true; |
694 | 723 |
695 if (type === Timeline.TimelineFlameChartEntryType.Event) { | 724 if (type === entryTypes.Event) { |
696 var event = /** @type {!SDK.TracingModel.Event} */ (this._entryData[entryI
ndex]); | 725 var event = /** @type {!SDK.TracingModel.Event} */ (this._entryData[entryI
ndex]); |
697 return !!TimelineModel.TimelineData.forEvent(event).warning; | 726 return !!TimelineModel.TimelineData.forEvent(event).warning; |
698 } | 727 } |
699 return false; | 728 return false; |
700 } | 729 } |
701 | 730 |
702 /** | 731 /** |
703 * @param {!{title: string, model: !SDK.TracingModel}} entry | 732 * @param {!{title: string, model: !SDK.TracingModel}} entry |
704 */ | 733 */ |
705 appendExtensionEvents(entry) { | 734 appendExtensionEvents(entry) { |
706 this._extensionInfo.push(entry); | 735 this._extensionInfo.push(entry); |
707 if (this._timelineData) | 736 if (this._timelineData) |
708 this._innerAppendExtensionEvents(this._extensionInfo.length - 1); | 737 this._innerAppendExtensionEvents(this._extensionInfo.length - 1); |
709 } | 738 } |
710 | 739 |
711 /** | 740 /** |
712 * @param {number} index | 741 * @param {number} index |
713 */ | 742 */ |
714 _innerAppendExtensionEvents(index) { | 743 _innerAppendExtensionEvents(index) { |
715 var entry = this._extensionInfo[index]; | 744 var entry = this._extensionInfo[index]; |
716 var entryType = Timeline.TimelineFlameChartEntryType.ExtensionEvent; | 745 var entryType = Timeline.TimelineFlameChartDataProvider.EntryType.ExtensionE
vent; |
717 var allThreads = [].concat(...entry.model.sortedProcesses().map(process => p
rocess.sortedThreads())); | 746 var allThreads = [].concat(...entry.model.sortedProcesses().map(process => p
rocess.sortedThreads())); |
718 if (!allThreads.length) | 747 if (!allThreads.length) |
719 return; | 748 return; |
720 | 749 |
721 this._appendHeader(entry.title, this._headerLevel1); | 750 this._appendHeader(entry.title, this._headerLevel1); |
722 for (let thread of allThreads) { | 751 for (let thread of allThreads) { |
723 this._appendAsyncEventsGroup(thread.name(), thread.asyncEvents(), this._he
aderLevel2, entryType); | 752 this._appendAsyncEventsGroup(thread.name(), thread.asyncEvents(), this._he
aderLevel2, entryType); |
724 this._appendSyncEvents(thread.events(), thread.name(), this._headerLevel2,
entryType, false); | 753 this._appendSyncEvents(thread.events(), thread.name(), this._headerLevel2,
entryType, false); |
725 } | 754 } |
726 } | 755 } |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
838 this._timelineData.entryStartTimes[index] = segment.begin; | 867 this._timelineData.entryStartTimes[index] = segment.begin; |
839 } | 868 } |
840 | 869 |
841 /** | 870 /** |
842 * @param {number} entryIndex | 871 * @param {number} entryIndex |
843 * @return {?Timeline.TimelineSelection} | 872 * @return {?Timeline.TimelineSelection} |
844 */ | 873 */ |
845 createSelection(entryIndex) { | 874 createSelection(entryIndex) { |
846 var type = this._entryType(entryIndex); | 875 var type = this._entryType(entryIndex); |
847 var timelineSelection = null; | 876 var timelineSelection = null; |
848 if (type === Timeline.TimelineFlameChartEntryType.Event) { | 877 if (type === Timeline.TimelineFlameChartDataProvider.EntryType.Event) { |
849 timelineSelection = Timeline.TimelineSelection.fromTraceEvent( | 878 timelineSelection = Timeline.TimelineSelection.fromTraceEvent( |
850 /** @type {!SDK.TracingModel.Event} */ (this._entryData[entryIndex])); | 879 /** @type {!SDK.TracingModel.Event} */ (this._entryData[entryIndex])); |
851 } else if (type === Timeline.TimelineFlameChartEntryType.Frame) { | 880 } else if (type === Timeline.TimelineFlameChartDataProvider.EntryType.Frame)
{ |
852 timelineSelection = Timeline.TimelineSelection.fromFrame( | 881 timelineSelection = Timeline.TimelineSelection.fromFrame( |
853 /** @type {!TimelineModel.TimelineFrame} */ (this._entryData[entryInde
x])); | 882 /** @type {!TimelineModel.TimelineFrame} */ (this._entryData[entryInde
x])); |
854 } | 883 } |
855 if (timelineSelection) | 884 if (timelineSelection) |
856 this._lastSelection = new Timeline.TimelineFlameChartView.Selection(timeli
neSelection, entryIndex); | 885 this._lastSelection = new Timeline.TimelineFlameChartView.Selection(timeli
neSelection, entryIndex); |
857 return timelineSelection; | 886 return timelineSelection; |
858 } | 887 } |
859 | 888 |
860 /** | 889 /** |
861 * @override | 890 * @override |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
954 */ | 983 */ |
955 _eventParent(event) { | 984 _eventParent(event) { |
956 return this._entryParent[event[Timeline.TimelineFlameChartDataProvider._inde
xSymbol]] || null; | 985 return this._entryParent[event[Timeline.TimelineFlameChartDataProvider._inde
xSymbol]] || null; |
957 } | 986 } |
958 | 987 |
959 /** | 988 /** |
960 * @param {number} entryIndex | 989 * @param {number} entryIndex |
961 * @return {?SDK.TracingModel.Event} | 990 * @return {?SDK.TracingModel.Event} |
962 */ | 991 */ |
963 eventByIndex(entryIndex) { | 992 eventByIndex(entryIndex) { |
964 return this._entryType(entryIndex) === Timeline.TimelineFlameChartEntryType.
Event ? | 993 return this._entryType(entryIndex) === Timeline.TimelineFlameChartDataProvid
er.EntryType.Event ? |
965 /** @type {!SDK.TracingModel.Event} */ (this._entryData[entryIndex]) : | 994 /** @type {!SDK.TracingModel.Event} */ (this._entryData[entryIndex]) : |
966 null; | 995 null; |
967 } | 996 } |
968 | 997 |
969 /** | 998 /** |
970 * @param {function(!SDK.TracingModel.Event):string} colorForEvent | 999 * @param {function(!SDK.TracingModel.Event):string} colorForEvent |
971 */ | 1000 */ |
972 setEventColorMapping(colorForEvent) { | 1001 setEventColorMapping(colorForEvent) { |
973 this._colorForEvent = colorForEvent; | 1002 this._colorForEvent = colorForEvent; |
974 } | 1003 } |
975 }; | 1004 }; |
976 | 1005 |
977 Timeline.TimelineFlameChartDataProvider.InstantEventVisibleDurationMs = 0.001; | 1006 Timeline.TimelineFlameChartDataProvider.InstantEventVisibleDurationMs = 0.001; |
978 Timeline.TimelineFlameChartDataProvider._indexSymbol = Symbol('index'); | 1007 Timeline.TimelineFlameChartDataProvider._indexSymbol = Symbol('index'); |
979 | 1008 |
980 /** @enum {symbol} */ | 1009 /** @enum {symbol} */ |
981 Timeline.TimelineFlameChartDataProvider.Events = { | 1010 Timeline.TimelineFlameChartDataProvider.Events = { |
982 DataChanged: Symbol('DataChanged') | 1011 DataChanged: Symbol('DataChanged') |
983 }; | 1012 }; |
| 1013 |
| 1014 /** @enum {symbol} */ |
| 1015 Timeline.TimelineFlameChartDataProvider.EntryType = { |
| 1016 Frame: Symbol('Frame'), |
| 1017 Event: Symbol('Event'), |
| 1018 InteractionRecord: Symbol('InteractionRecord'), |
| 1019 ExtensionEvent: Symbol('ExtensionEvent'), |
| 1020 Screenshot: Symbol('Screenshot'), |
| 1021 }; |
OLD | NEW |