| Index: Source/devtools/front_end/TimelineFrameController.js
 | 
| diff --git a/Source/devtools/front_end/TimelineFrameController.js b/Source/devtools/front_end/TimelineFrameController.js
 | 
| index 057d4a8c7c81d013ca24c216a5e8f3a21ac633e6..274116977a19c1728ba5c31387e0db8deaa740f7 100644
 | 
| --- a/Source/devtools/front_end/TimelineFrameController.js
 | 
| +++ b/Source/devtools/front_end/TimelineFrameController.js
 | 
| @@ -1,5 +1,5 @@
 | 
|  /*
 | 
| - * Copyright (C) 2012 Google Inc. All rights reserved.
 | 
| + * Copyright (C) 2013 Google Inc. All rights reserved.
 | 
|   *
 | 
|   * Redistribution and use in source and binary forms, with or without
 | 
|   * modification, are permitted provided that the following conditions are
 | 
| @@ -36,7 +36,8 @@
 | 
|   */
 | 
|  WebInspector.TimelineFrameController = function(model, overviewPane, presentationModel)
 | 
|  {
 | 
| -    this._lastFrame = null;
 | 
| +    this._lastMainThreadFrame = null;
 | 
| +    this._lastBackgroundFrame = null;
 | 
|      this._model = model;
 | 
|      this._overviewPane = overviewPane;
 | 
|      this._presentationModel = presentationModel;
 | 
| @@ -56,19 +57,18 @@ WebInspector.TimelineFrameController.prototype = {
 | 
|  
 | 
|      _onRecordsCleared: function()
 | 
|      {
 | 
| -        this._lastFrame = null;
 | 
| +        this._lastMainThreadFrame = null;
 | 
| +        this._lastBackgroundFrame = null;
 | 
|      },
 | 
|  
 | 
|      _addRecord: function(record)
 | 
|      {
 | 
| -        if (record.isBackground)
 | 
| -            return;
 | 
|          var records;
 | 
|          var programRecord;
 | 
|          if (record.type === WebInspector.TimelineModel.RecordType.Program) {
 | 
|              programRecord = record;
 | 
| -            if (this._lastFrame)
 | 
| -                this._lastFrame.timeByCategory["other"] += WebInspector.TimelineModel.durationInSeconds(programRecord);
 | 
| +            if (this._lastMainThreadFrame)
 | 
| +                this._lastMainThreadFrame.timeByCategory["other"] += WebInspector.TimelineModel.durationInSeconds(programRecord);
 | 
|              records = record["children"] || [];
 | 
|          } else
 | 
|              records = [record];
 | 
| @@ -83,34 +83,44 @@ WebInspector.TimelineFrameController.prototype = {
 | 
|      {
 | 
|          var isFrameRecord = record.type === WebInspector.TimelineModel.RecordType.BeginFrame;
 | 
|          var programTimeCarryover = isFrameRecord && programRecord ? WebInspector.TimelineModel.endTimeInSeconds(programRecord) - WebInspector.TimelineModel.startTimeInSeconds(record) : 0;
 | 
| -        if (isFrameRecord && this._lastFrame)
 | 
| -            this._flushFrame(record, programTimeCarryover);
 | 
| -        else {
 | 
| -            if (!this._lastFrame)
 | 
| -                this._lastFrame = this._createFrame(record, programTimeCarryover);
 | 
| -            if (!record.thread)
 | 
| -                WebInspector.TimelineModel.aggregateTimeForRecord(this._lastFrame.timeByCategory, record);
 | 
| -            var duration = WebInspector.TimelineModel.durationInSeconds(record);
 | 
| -            this._lastFrame.cpuTime += duration;
 | 
| -            this._lastFrame.timeByCategory["other"] -= duration;
 | 
| +        var lastFrame = record.thread ? this._lastBackgroundFrame : this._lastMainThreadFrame;
 | 
| +        if (isFrameRecord && lastFrame) {
 | 
| +            this._flushFrame(lastFrame, record, programTimeCarryover);
 | 
| +            lastFrame = this._createFrame(record, programTimeCarryover);
 | 
| +        } else if (record.type === WebInspector.TimelineModel.RecordType.ActivateLayerTree) {
 | 
| +            if (lastFrame)
 | 
| +                lastFrame.mainThreadFrameId = record.data.id;
 | 
| +        } else {
 | 
| +            if (!lastFrame)
 | 
| +                lastFrame = this._createFrame(record, programTimeCarryover);
 | 
| +            if (!record.thread) {
 | 
| +                WebInspector.TimelineModel.aggregateTimeForRecord(lastFrame.timeByCategory, record);
 | 
| +                var duration = WebInspector.TimelineModel.durationInSeconds(record);
 | 
| +                lastFrame.cpuTime += duration;
 | 
| +                lastFrame.timeByCategory["other"] -= duration;
 | 
| +            }
 | 
|          }
 | 
| +        if (record.thread)
 | 
| +            this._lastBackgroundFrame = lastFrame;
 | 
| +        else
 | 
| +            this._lastMainThreadFrame = lastFrame;
 | 
|      },
 | 
|  
 | 
|      /**
 | 
| +     * @param {WebInspector.TimelineFrame} frame
 | 
|       * @param {Object} record
 | 
|       * @param {number} programTimeCarryover
 | 
|       */
 | 
| -    _flushFrame: function(record, programTimeCarryover)
 | 
| +    _flushFrame: function(frame, record, programTimeCarryover)
 | 
|      {
 | 
| -        this._lastFrame.endTime = WebInspector.TimelineModel.startTimeInSeconds(record);
 | 
| -        this._lastFrame.duration = this._lastFrame.endTime - this._lastFrame.startTime;
 | 
| -        this._lastFrame.timeByCategory["other"] -= programTimeCarryover;
 | 
| +        frame.endTime = WebInspector.TimelineModel.startTimeInSeconds(record);
 | 
| +        frame.duration = frame.endTime - frame.startTime;
 | 
| +        frame.timeByCategory["other"] -= programTimeCarryover;
 | 
|          // Alternatively, we could compute CPU time as sum of all Program events.
 | 
|          // This way it's a bit more flexible, as it works in case there's no program events.
 | 
| -        this._lastFrame.cpuTime += this._lastFrame.timeByCategory["other"];
 | 
| -        this._overviewPane.addFrame(this._lastFrame);
 | 
| -        this._presentationModel.addFrame(this._lastFrame);
 | 
| -        this._lastFrame = this._createFrame(record, programTimeCarryover);
 | 
| +        frame.cpuTime += frame.timeByCategory["other"];
 | 
| +        this._overviewPane.addFrame(frame);
 | 
| +        this._presentationModel.addFrame(frame);
 | 
|      },
 | 
|  
 | 
|      /**
 | 
| @@ -123,6 +133,8 @@ WebInspector.TimelineFrameController.prototype = {
 | 
|          frame.startTime = WebInspector.TimelineModel.startTimeInSeconds(record);
 | 
|          frame.startTimeOffset = this._model.recordOffsetInSeconds(record);
 | 
|          frame.timeByCategory["other"] = programTimeCarryover;
 | 
| +        frame.isBackground = !!record.thread;
 | 
| +        frame.id = record.data && record.data["id"];
 | 
|          return frame;
 | 
|      },
 | 
|  
 | 
| @@ -169,4 +181,6 @@ WebInspector.TimelineFrame = function()
 | 
|  {
 | 
|      this.timeByCategory = {};
 | 
|      this.cpuTime = 0;
 | 
| +    /** @type {string} */
 | 
| +    this.mainThreadFrameId;
 | 
|  }
 | 
| 
 |