| Index: Source/devtools/front_end/timeline/TimelineFlameChart.js
|
| diff --git a/Source/devtools/front_end/timeline/TimelineFlameChart.js b/Source/devtools/front_end/timeline/TimelineFlameChart.js
|
| index bd2a2acd061aa5d2df5f86e1851c25b9c16b137f..cf1cac10ebb82c1f789d4c464bbae0180fb8125c 100644
|
| --- a/Source/devtools/front_end/timeline/TimelineFlameChart.js
|
| +++ b/Source/devtools/front_end/timeline/TimelineFlameChart.js
|
| @@ -461,6 +461,8 @@ WebInspector.TracingBasedTimelineFlameChartDataProvider = function(model, frameM
|
| this.addFilter(new WebInspector.TracingTimelineModel.ExclusiveEventNameFilter([WebInspector.TracingTimelineModel.RecordType.Program]));
|
| }
|
|
|
| +WebInspector.TracingBasedTimelineFlameChartDataProvider.InstantEventVisibleDurationMs = 0.01;
|
| +
|
| WebInspector.TracingBasedTimelineFlameChartDataProvider.prototype = {
|
| /**
|
| * @return {number}
|
| @@ -506,6 +508,8 @@ WebInspector.TracingBasedTimelineFlameChartDataProvider.prototype = {
|
| var name = WebInspector.TracingTimelineUIUtils.styleForTraceEvent(event.name).title;
|
| // TODO(yurys): support event dividers
|
| var details = WebInspector.TracingTimelineUIUtils.buildDetailsNodeForTraceEvent(event, this._linkifier, false, this._target);
|
| + if (event.name === WebInspector.TracingTimelineModel.RecordType.JSFrame && details)
|
| + return details.textContent;
|
| return details ? WebInspector.UIString("%s (%s)", name, details.textContent) : name;
|
| }
|
| var title = this._entryIndexToTitle[entryIndex];
|
| @@ -571,25 +575,61 @@ WebInspector.TracingBasedTimelineFlameChartDataProvider.prototype = {
|
| {
|
| var maxStackDepth = 0;
|
| var openEvents = [];
|
| + var heights = [];
|
| var headerAppended = false;
|
| + var level = 0;
|
| for (var i = 0; i < events.length; ++i) {
|
| var e = events[i];
|
| if (!e.endTime && e.phase !== WebInspector.TracingModel.Phase.Instant)
|
| continue;
|
| if (!this._isVisible(e))
|
| continue;
|
| - while (openEvents.length && openEvents.peekLast().endTime <= e.startTime)
|
| + while (openEvents.length && openEvents.peekLast().endTime <= e.startTime) {
|
| openEvents.pop();
|
| + level = heights.pop();
|
| + }
|
| if (!headerAppended) {
|
| - this._appendHeaderRecord(headerName, this._currentLevel++);
|
| + this._appendHeaderRecord(headerName, this._currentLevel);
|
| + ++level;
|
| headerAppended = true;
|
| }
|
| - this._appendEvent(e, this._currentLevel + openEvents.length);
|
| - maxStackDepth = Math.max(maxStackDepth, openEvents.length + 1);
|
| - if (e.endTime)
|
| + var height = this._processEvent(e, this._currentLevel + level);
|
| + if (e.endTime) {
|
| openEvents.push(e);
|
| + heights.push(level)
|
| + }
|
| + level += height;
|
| + maxStackDepth = Math.max(maxStackDepth, level);
|
| + }
|
| + this._currentLevel += maxStackDepth;
|
| + },
|
| +
|
| + /**
|
| + * @param {!WebInspector.TracingModel.Event} event
|
| + * @param {number} baseLevel
|
| + * @return {number}
|
| + */
|
| + _processEvent: function(event, baseLevel)
|
| + {
|
| + var level = baseLevel;
|
| + if (event.stackTrace && WebInspector.experimentsSettings.timelineJSCPUProfile.isEnabled()) {
|
| + for (var i = event.stackTrace.length - 1; i >= 0; --i) {
|
| + var payload = /** @type {!WebInspector.TracingModel.EventPayload} */ ({
|
| + ph: WebInspector.TracingModel.Phase.Complete,
|
| + cat: WebInspector.TracingModel.DevToolsMetadataEventCategory,
|
| + name: WebInspector.TracingTimelineModel.RecordType.JSFrame,
|
| + ts: event.startTime * 1000,
|
| + dur: event.duration * 1000,
|
| + args: {
|
| + data: event.stackTrace[i]
|
| + }
|
| + });
|
| + var jsFrameEvent = new WebInspector.TracingModel.Event(payload, 0, event.thread);
|
| + this._appendEvent(jsFrameEvent, level++);
|
| + }
|
| }
|
| - this._currentLevel += maxStackDepth + (headerAppended ? 1 : 0);
|
| + this._appendEvent(event, level++)
|
| + return level - baseLevel;
|
| },
|
|
|
| /**
|
| @@ -660,6 +700,8 @@ WebInspector.TracingBasedTimelineFlameChartDataProvider.prototype = {
|
| var event = this._entryEvents[entryIndex];
|
| if (!event)
|
| return "#555";
|
| + if (event.name === WebInspector.TracingTimelineModel.RecordType.JSFrame)
|
| + return WebInspector.TimelineFlameChartDataProvider.jsFrameColorGenerator().colorForID(event.args.data["functionName"]);
|
| var style = WebInspector.TracingTimelineUIUtils.styleForTraceEvent(event.name);
|
| return style.category.fillColorStop1;
|
| },
|
| @@ -737,7 +779,7 @@ WebInspector.TracingBasedTimelineFlameChartDataProvider.prototype = {
|
| return null;
|
| return {
|
| startTime: event.startTime,
|
| - endTime: event.endTime
|
| + endTime: event.endTime || event.startTime + WebInspector.TracingBasedTimelineFlameChartDataProvider.InstantEventVisibleDurationMs
|
| }
|
| },
|
|
|
| @@ -781,7 +823,7 @@ WebInspector.TracingBasedTimelineFlameChartDataProvider.prototype = {
|
| var index = this._entryEvents.length;
|
| this._entryEvents.push(event);
|
| this._timelineData.entryLevels[index] = level;
|
| - this._timelineData.entryTotalTimes[index] = event.duration || 1;
|
| + this._timelineData.entryTotalTimes[index] = event.duration || WebInspector.TracingBasedTimelineFlameChartDataProvider.InstantEventVisibleDurationMs;
|
| this._timelineData.entryStartTimes[index] = event.startTime;
|
| },
|
|
|
|
|