| 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 |