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 3f03e83a35a66ed0c370adf13d4f88f0b7606492..6b2a31a52c32be9e203bd778cab35f071dbda1bc 100644 |
--- a/Source/devtools/front_end/timeline/TimelineFlameChart.js |
+++ b/Source/devtools/front_end/timeline/TimelineFlameChart.js |
@@ -163,9 +163,11 @@ WebInspector.TracingBasedTimelineFlameChartDataProvider.prototype = { |
{ |
var maxStackDepth = 0; |
var openEvents = []; |
- var heights = []; |
+ var levels = []; |
+ var jsHeights = []; |
var headerAppended = false; |
var level = 0; |
+ var jsStackHeight = 0; |
for (var i = 0; i < events.length; ++i) { |
var e = events[i]; |
if (!e.endTime && e.phase !== WebInspector.TracingModel.Phase.Instant) |
@@ -174,19 +176,22 @@ WebInspector.TracingBasedTimelineFlameChartDataProvider.prototype = { |
continue; |
while (openEvents.length && openEvents.peekLast().endTime <= e.startTime) { |
openEvents.pop(); |
- level = heights.pop(); |
+ level = levels.pop(); |
+ jsStackHeight = jsHeights.pop(); |
} |
if (!headerAppended) { |
this._appendHeaderRecord(headerName, this._currentLevel); |
++level; |
headerAppended = true; |
} |
- var height = this._processEvent(e, this._currentLevel + level); |
+ var jsHeightDelta = this._processEvent(e, this._currentLevel + level, jsStackHeight); |
if (e.endTime) { |
openEvents.push(e); |
- heights.push(level) |
+ jsHeights.push(jsStackHeight); |
+ levels.push(level); |
} |
- level += height; |
+ level += 1 + jsHeightDelta; |
+ jsStackHeight += jsHeightDelta; |
maxStackDepth = Math.max(maxStackDepth, level); |
} |
this._currentLevel += maxStackDepth; |
@@ -194,14 +199,15 @@ WebInspector.TracingBasedTimelineFlameChartDataProvider.prototype = { |
/** |
* @param {!WebInspector.TracingModel.Event} event |
- * @param {number} baseLevel |
+ * @param {number} level |
+ * @param {number} jsStackHeight |
* @return {number} |
*/ |
- _processEvent: function(event, baseLevel) |
+ _processEvent: function(event, level, jsStackHeight) |
{ |
- var level = baseLevel; |
+ var jsHeightDelta = 0; |
if (event.stackTrace && WebInspector.experimentsSettings.timelineJSCPUProfile.isEnabled()) { |
- for (var i = event.stackTrace.length - 1; i >= 0; --i) { |
+ for (var i = event.stackTrace.length - 1; i >= jsStackHeight; --i) { |
var payload = /** @type {!WebInspector.TracingModel.EventPayload} */ ({ |
ph: WebInspector.TracingModel.Phase.Complete, |
cat: WebInspector.TracingModel.DevToolsMetadataEventCategory, |
@@ -215,9 +221,10 @@ WebInspector.TracingBasedTimelineFlameChartDataProvider.prototype = { |
var jsFrameEvent = new WebInspector.TracingModel.Event(payload, 0, event.thread); |
this._appendEvent(jsFrameEvent, level++); |
} |
+ jsHeightDelta = event.stackTrace.length - jsStackHeight; |
} |
- this._appendEvent(event, level++) |
- return level - baseLevel; |
+ this._appendEvent(event, level) |
+ return jsHeightDelta; |
}, |
/** |