Index: Source/devtools/front_end/timeline/TimelineFrameModel.js |
diff --git a/Source/devtools/front_end/timeline/TimelineFrameModel.js b/Source/devtools/front_end/timeline/TimelineFrameModel.js |
index 933ec9911281c0b3fb1fa3289e048d7b0c61402b..3bc276138902123e909de7f80c45508b71c8f9a6 100644 |
--- a/Source/devtools/front_end/timeline/TimelineFrameModel.js |
+++ b/Source/devtools/front_end/timeline/TimelineFrameModel.js |
@@ -33,32 +33,14 @@ |
* @extends {WebInspector.TargetAwareObject} |
* @param {!WebInspector.Target} target |
*/ |
-WebInspector.TimelineFrameModel = function(target) |
+WebInspector.TimelineFrameModelBase = function(target) |
{ |
WebInspector.TargetAwareObject.call(this, target); |
this.reset(); |
} |
-WebInspector.TimelineFrameModel.Events = { |
- FrameAdded: "FrameAdded" |
-} |
- |
-WebInspector.TimelineFrameModel._mainFrameMarkers = [ |
- WebInspector.TimelineModel.RecordType.ScheduleStyleRecalculation, |
- WebInspector.TimelineModel.RecordType.InvalidateLayout, |
- WebInspector.TimelineModel.RecordType.BeginFrame, |
- WebInspector.TimelineModel.RecordType.ScrollLayer |
-]; |
- |
-WebInspector.TimelineFrameModel._tracingMainFrameMarkers = [ |
- WebInspector.TracingTimelineModel.RecordType.ScheduleStyleRecalculation, |
- WebInspector.TracingTimelineModel.RecordType.InvalidateLayout, |
- WebInspector.TracingTimelineModel.RecordType.BeginMainThreadFrame, |
- WebInspector.TracingTimelineModel.RecordType.ScrollLayer |
-]; |
- |
-WebInspector.TimelineFrameModel.prototype = { |
+WebInspector.TimelineFrameModelBase.prototype = { |
/** |
* @return {!Array.<!WebInspector.TimelineFrame>} |
*/ |
@@ -98,17 +80,8 @@ WebInspector.TimelineFrameModel.prototype = { |
return frames.slice(firstFrame, lastFrame); |
}, |
- /** |
- * @param {boolean} value |
- */ |
- setMergeRecords: function(value) |
- { |
- this._mergeRecords = value; |
- }, |
- |
reset: function() |
{ |
- this._mergeRecords = true; |
this._minimumRecordTime = Infinity; |
this._frames = []; |
this._lastFrame = null; |
@@ -117,143 +90,6 @@ WebInspector.TimelineFrameModel.prototype = { |
this._mainFrameCommitted = false; |
this._mainFrameRequested = false; |
this._aggregatedMainThreadWork = null; |
- this._mergingBuffer = new WebInspector.TimelineMergingRecordBuffer(); |
- }, |
- |
- /** |
- * @param {!Array.<!WebInspector.TimelineModel.Record>} records |
- */ |
- addRecords: function(records) |
- { |
- if (!records.length) |
- return; |
- if (records[0].startTime() < this._minimumRecordTime) |
- this._minimumRecordTime = records[0].startTime(); |
- for (var i = 0; i < records.length; ++i) |
- this.addRecord(records[i]); |
- }, |
- |
- /** |
- * @param {!WebInspector.TimelineModel.Record} record |
- */ |
- addRecord: function(record) |
- { |
- var recordTypes = WebInspector.TimelineModel.RecordType; |
- var programRecord = record.type() === recordTypes.Program ? record : null; |
- |
- // Start collecting main frame |
- if (programRecord) { |
- if (!this._aggregatedMainThreadWork && this._findRecordRecursively(WebInspector.TimelineFrameModel._mainFrameMarkers, programRecord)) |
- this._aggregatedMainThreadWork = {}; |
- } |
- /** type {Array.<!WebInspector.TimelineModel.Record>} */ |
- var records = []; |
- if (!this._mergeRecords) |
- records = [record]; |
- else |
- records = this._mergingBuffer.process(record.thread(), /** type {Array.<!WebInspector.TimelineModel.Record>} */(programRecord ? record.children() || [] : [record])); |
- for (var i = 0; i < records.length; ++i) { |
- if (records[i].thread()) |
- this._addBackgroundRecord(records[i]); |
- else |
- this._addMainThreadRecord(programRecord, records[i]); |
- } |
- }, |
- |
- /** |
- * @param {!Array.<!WebInspector.TracingModel.Event>} events |
- * @param {string} sessionId |
- */ |
- addTraceEvents: function(events, sessionId) |
- { |
- this._sessionId = sessionId; |
- for (var i = 0; i < events.length; ++i) |
- this._addTraceEvent(events[i]); |
- }, |
- |
- /** |
- * @param {!WebInspector.TracingModel.Event} event |
- */ |
- _addTraceEvent: function(event) |
- { |
- var eventNames = WebInspector.TracingTimelineModel.RecordType; |
- |
- if (event.name === eventNames.SetLayerTreeId) { |
- if (this._sessionId === event.args["sessionId"]) |
- this._layerTreeId = event.args["layerTreeId"]; |
- return; |
- } |
- if (event.name === eventNames.TracingStartedInPage) { |
- this._mainThread = event.thread; |
- return; |
- } |
- if (event.thread === this._mainThread) |
- this._addMainThreadTraceEvent(event); |
- else |
- this._addBackgroundTraceEvent(event); |
- }, |
- |
- /** |
- * @param {!WebInspector.TracingModel.Event} event |
- */ |
- _addBackgroundTraceEvent: function(event) |
- { |
- var eventNames = WebInspector.TracingTimelineModel.RecordType; |
- |
- if (event.phase === WebInspector.TracingModel.Phase.SnapshotObject && event.name === eventNames.LayerTreeHostImplSnapshot && parseInt(event.id, 0) === this._layerTreeId) { |
- this.handleLayerTreeSnapshot(new WebInspector.DeferredTracingLayerTree(this.target(), event.args["snapshot"]["active_tree"]["root_layer"])); |
- return; |
- } |
- if (this._lastFrame && event.selfTime) |
- this._lastFrame._addTimeForCategory(WebInspector.TracingTimelineUIUtils.eventStyle(event).category.name, event.selfTime); |
- |
- if (event.args["layerTreeId"] !== this._layerTreeId) |
- return; |
- |
- var timestamp = event.startTime; |
- if (event.name === eventNames.BeginFrame) |
- this.handleBeginFrame(timestamp); |
- else if (event.name === eventNames.DrawFrame) |
- this.handleDrawFrame(timestamp); |
- else if (event.name === eventNames.ActivateLayerTree) |
- this.handleActivateLayerTree(); |
- else if (event.name === eventNames.RequestMainThreadFrame) |
- this.handleRequestMainThreadFrame(); |
- }, |
- |
- /** |
- * @param {!WebInspector.TracingModel.Event} event |
- */ |
- _addMainThreadTraceEvent: function(event) |
- { |
- var eventNames = WebInspector.TracingTimelineModel.RecordType; |
- var timestamp = event.startTime; |
- var selfTime = event.selfTime || 0; |
- |
- if (!this._hasThreadedCompositing) { |
- if (event.name === eventNames.BeginMainThreadFrame) |
- this._startMainThreadFrame(timestamp); |
- if (!this._lastFrame) |
- return; |
- if (!selfTime) |
- return; |
- |
- var categoryName = WebInspector.TracingTimelineUIUtils.eventStyle(event).category.name; |
- this._lastFrame._addTimeForCategory(categoryName, selfTime); |
- return; |
- } |
- |
- if (!this._aggregatedMainThreadWork && WebInspector.TimelineFrameModel._tracingMainFrameMarkers.indexOf(event.name) >= 0) |
- this._aggregatedMainThreadWork = {}; |
- if (!this._aggregatedMainThreadWork) |
- return; |
- |
- if (selfTime) { |
- var categoryName = WebInspector.TracingTimelineUIUtils.eventStyle(event).category.name; |
- this._aggregatedMainThreadWork[categoryName] = (this._aggregatedMainThreadWork[categoryName] || 0) + selfTime; |
- } |
- if (event.name === eventNames.CompositeLayers && event.args["layerTreeId"] === this._layerTreeId) |
- this.handleCompositeLayers(); |
}, |
/** |
@@ -316,6 +152,137 @@ WebInspector.TimelineFrameModel.prototype = { |
}, |
/** |
+ * @param {number} startTime |
+ */ |
+ _startBackgroundFrame: function(startTime) |
+ { |
+ if (!this._hasThreadedCompositing) { |
+ this._lastFrame = null; |
+ this._hasThreadedCompositing = true; |
+ } |
+ if (this._lastFrame) |
+ this._flushFrame(this._lastFrame, startTime); |
+ |
+ this._lastFrame = new WebInspector.TimelineFrame(startTime, startTime - this._minimumRecordTime); |
+ }, |
+ |
+ /** |
+ * @param {number} startTime |
+ */ |
+ _startMainThreadFrame: function(startTime) |
+ { |
+ if (this._lastFrame) |
+ this._flushFrame(this._lastFrame, startTime); |
+ this._lastFrame = new WebInspector.TimelineFrame(startTime, startTime - this._minimumRecordTime); |
+ }, |
+ |
+ /** |
+ * @param {!WebInspector.TimelineFrame} frame |
+ * @param {number} endTime |
+ */ |
+ _flushFrame: function(frame, endTime) |
+ { |
+ frame._setLayerTree(this._lastLayerTree); |
+ frame._setEndTime(endTime); |
+ this._frames.push(frame); |
+ }, |
+ |
+ /** |
+ * @param {!Array.<string>} types |
+ * @param {!WebInspector.TimelineModel.Record} record |
+ * @return {?WebInspector.TimelineModel.Record} record |
+ */ |
+ _findRecordRecursively: function(types, record) |
+ { |
+ if (types.indexOf(record.type()) >= 0) |
+ return record; |
+ if (!record.children()) |
+ return null; |
+ for (var i = 0; i < record.children().length; ++i) { |
+ var result = this._findRecordRecursively(types, record.children()[i]); |
+ if (result) |
+ return result; |
+ } |
+ return null; |
+ }, |
+ |
+ __proto__: WebInspector.TargetAwareObject.prototype |
+} |
+ |
+/** |
+ * @constructor |
+ * @param {!WebInspector.Target} target |
+ * @extends {WebInspector.TimelineFrameModelBase} |
+ */ |
+WebInspector.TimelineFrameModel = function(target) |
+{ |
+ WebInspector.TimelineFrameModelBase.call(this, target); |
+} |
+ |
+WebInspector.TimelineFrameModel._mainFrameMarkers = [ |
+ WebInspector.TimelineModel.RecordType.ScheduleStyleRecalculation, |
+ WebInspector.TimelineModel.RecordType.InvalidateLayout, |
+ WebInspector.TimelineModel.RecordType.BeginFrame, |
+ WebInspector.TimelineModel.RecordType.ScrollLayer |
+]; |
+ |
+WebInspector.TimelineFrameModel.prototype = { |
+ reset: function() |
+ { |
+ this._mergeRecords = true; |
+ this._mergingBuffer = new WebInspector.TimelineMergingRecordBuffer(); |
+ WebInspector.TimelineFrameModelBase.prototype.reset.call(this); |
+ }, |
+ |
+ /** |
+ * @param {boolean} value |
+ */ |
+ setMergeRecords: function(value) |
+ { |
+ this._mergeRecords = value; |
+ }, |
+ |
+ /** |
+ * @param {!Array.<!WebInspector.TimelineModel.Record>} records |
+ */ |
+ addRecords: function(records) |
+ { |
+ if (!records.length) |
+ return; |
+ if (records[0].startTime() < this._minimumRecordTime) |
+ this._minimumRecordTime = records[0].startTime(); |
+ for (var i = 0; i < records.length; ++i) |
+ this.addRecord(records[i]); |
+ }, |
+ |
+ /** |
+ * @param {!WebInspector.TimelineModel.Record} record |
+ */ |
+ addRecord: function(record) |
+ { |
+ var recordTypes = WebInspector.TimelineModel.RecordType; |
+ var programRecord = record.type() === recordTypes.Program ? record : null; |
+ |
+ // Start collecting main frame |
+ if (programRecord) { |
+ if (!this._aggregatedMainThreadWork && this._findRecordRecursively(WebInspector.TimelineFrameModel._mainFrameMarkers, programRecord)) |
+ this._aggregatedMainThreadWork = {}; |
+ } |
+ /** type {Array.<!WebInspector.TimelineModel.Record>} */ |
+ var records = []; |
+ if (!this._mergeRecords) |
+ records = [record]; |
+ else |
+ records = this._mergingBuffer.process(record.thread(), /** type {Array.<!WebInspector.TimelineModel.Record>} */(programRecord ? record.children() || [] : [record])); |
+ for (var i = 0; i < records.length; ++i) { |
+ if (records[i].thread()) |
+ this._addBackgroundRecord(records[i]); |
+ else |
+ this._addMainThreadRecord(programRecord, records[i]); |
+ } |
+ }, |
+ |
+ /** |
* @param {!WebInspector.TimelineModel.Record} record |
*/ |
_addBackgroundRecord: function(record) |
@@ -381,63 +348,124 @@ WebInspector.TimelineFrameModel.prototype = { |
return programRecord.endTime() - programRecord.startTime() - accounted; |
}, |
+ __proto__: WebInspector.TimelineFrameModelBase.prototype, |
+}; |
+ |
+/** |
+ * @constructor |
+ * @param {!WebInspector.Target} target |
+ * @extends {WebInspector.TimelineFrameModelBase} |
+ */ |
+WebInspector.TracingTimelineFrameModel = function(target) |
+{ |
+ WebInspector.TimelineFrameModelBase.call(this, target); |
+} |
+ |
+WebInspector.TracingTimelineFrameModel._mainFrameMarkers = [ |
+ WebInspector.TracingTimelineModel.RecordType.ScheduleStyleRecalculation, |
+ WebInspector.TracingTimelineModel.RecordType.InvalidateLayout, |
+ WebInspector.TracingTimelineModel.RecordType.BeginMainThreadFrame, |
+ WebInspector.TracingTimelineModel.RecordType.ScrollLayer |
+]; |
+ |
+WebInspector.TracingTimelineFrameModel.prototype = { |
/** |
- * @param {number} startTime |
+ * @param {!Array.<!WebInspector.TracingModel.Event>} events |
+ * @param {string} sessionId |
*/ |
- _startBackgroundFrame: function(startTime) |
+ addTraceEvents: function(events, sessionId) |
{ |
- if (!this._hasThreadedCompositing) { |
- this._lastFrame = null; |
- this._hasThreadedCompositing = true; |
- } |
- if (this._lastFrame) |
- this._flushFrame(this._lastFrame, startTime); |
- |
- this._lastFrame = new WebInspector.TimelineFrame(startTime, startTime - this._minimumRecordTime); |
+ this._sessionId = sessionId; |
+ for (var i = 0; i < events.length; ++i) |
+ this._addTraceEvent(events[i]); |
}, |
/** |
- * @param {number} startTime |
+ * @param {!WebInspector.TracingModel.Event} event |
*/ |
- _startMainThreadFrame: function(startTime) |
+ _addTraceEvent: function(event) |
{ |
- if (this._lastFrame) |
- this._flushFrame(this._lastFrame, startTime); |
- this._lastFrame = new WebInspector.TimelineFrame(startTime, startTime - this._minimumRecordTime); |
+ var eventNames = WebInspector.TracingTimelineModel.RecordType; |
+ |
+ if (event.name === eventNames.SetLayerTreeId) { |
+ if (this._sessionId === event.args["sessionId"]) |
+ this._layerTreeId = event.args["layerTreeId"]; |
+ return; |
+ } |
+ if (event.name === eventNames.TracingStartedInPage) { |
+ this._mainThread = event.thread; |
+ return; |
+ } |
+ if (event.thread === this._mainThread) |
+ this._addMainThreadTraceEvent(event); |
+ else |
+ this._addBackgroundTraceEvent(event); |
}, |
/** |
- * @param {!WebInspector.TimelineFrame} frame |
- * @param {number} endTime |
+ * @param {!WebInspector.TracingModel.Event} event |
*/ |
- _flushFrame: function(frame, endTime) |
+ _addBackgroundTraceEvent: function(event) |
{ |
- frame._setLayerTree(this._lastLayerTree); |
- frame._setEndTime(endTime); |
- this._frames.push(frame); |
- this.dispatchEventToListeners(WebInspector.TimelineFrameModel.Events.FrameAdded, frame); |
+ var eventNames = WebInspector.TracingTimelineModel.RecordType; |
+ |
+ if (event.phase === WebInspector.TracingModel.Phase.SnapshotObject && event.name === eventNames.LayerTreeHostImplSnapshot && parseInt(event.id, 0) === this._layerTreeId) { |
+ this.handleLayerTreeSnapshot(new WebInspector.DeferredTracingLayerTree(this.target(), event.args["snapshot"]["active_tree"]["root_layer"])); |
+ return; |
+ } |
+ if (this._lastFrame && event.selfTime) |
+ this._lastFrame._addTimeForCategory(WebInspector.TracingTimelineUIUtils.eventStyle(event).category.name, event.selfTime); |
+ |
+ if (event.args["layerTreeId"] !== this._layerTreeId) |
+ return; |
+ |
+ var timestamp = event.startTime; |
+ if (event.name === eventNames.BeginFrame) |
+ this.handleBeginFrame(timestamp); |
+ else if (event.name === eventNames.DrawFrame) |
+ this.handleDrawFrame(timestamp); |
+ else if (event.name === eventNames.ActivateLayerTree) |
+ this.handleActivateLayerTree(); |
+ else if (event.name === eventNames.RequestMainThreadFrame) |
+ this.handleRequestMainThreadFrame(); |
}, |
/** |
- * @param {!Array.<string>} types |
- * @param {!WebInspector.TimelineModel.Record} record |
- * @return {?WebInspector.TimelineModel.Record} record |
+ * @param {!WebInspector.TracingModel.Event} event |
*/ |
- _findRecordRecursively: function(types, record) |
+ _addMainThreadTraceEvent: function(event) |
{ |
- if (types.indexOf(record.type()) >= 0) |
- return record; |
- if (!record.children()) |
- return null; |
- for (var i = 0; i < record.children().length; ++i) { |
- var result = this._findRecordRecursively(types, record.children()[i]); |
- if (result) |
- return result; |
+ var eventNames = WebInspector.TracingTimelineModel.RecordType; |
+ var timestamp = event.startTime; |
+ var selfTime = event.selfTime || 0; |
+ |
+ if (!this._hasThreadedCompositing) { |
+ if (event.name === eventNames.BeginMainThreadFrame) |
+ this._startMainThreadFrame(timestamp); |
+ if (!this._lastFrame) |
+ return; |
+ if (!selfTime) |
+ return; |
+ |
+ var categoryName = WebInspector.TracingTimelineUIUtils.eventStyle(event).category.name; |
+ this._lastFrame._addTimeForCategory(categoryName, selfTime); |
+ return; |
} |
- return null; |
+ |
+ if (!this._aggregatedMainThreadWork && WebInspector.TracingTimelineFrameModel._mainFrameMarkers.indexOf(event.name) >= 0) |
+ this._aggregatedMainThreadWork = {}; |
+ if (!this._aggregatedMainThreadWork) |
+ return; |
+ |
+ if (selfTime) { |
+ var categoryName = WebInspector.TracingTimelineUIUtils.eventStyle(event).category.name; |
+ this._aggregatedMainThreadWork[categoryName] = (this._aggregatedMainThreadWork[categoryName] || 0) + selfTime; |
+ } |
+ if (event.name === eventNames.CompositeLayers && event.args["layerTreeId"] === this._layerTreeId) |
+ this.handleCompositeLayers(); |
}, |
- __proto__: WebInspector.TargetAwareObject.prototype |
+ __proto__: WebInspector.TimelineFrameModelBase.prototype |
} |
/** |