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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/timeline/TimelineFlameChartDataProvider.js

Issue 2873153002: DevTools: Draw screenshot independently of frames bar on flamechart. (Closed)
Patch Set: addressing nits Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698