| Index: Source/devtools/front_end/TimelinePresentationModel.js
|
| diff --git a/Source/devtools/front_end/TimelinePresentationModel.js b/Source/devtools/front_end/TimelinePresentationModel.js
|
| index 314eee827696a462612ce1b0f7d58b47c07d5b21..904650cf98e8f3c6a538c02fdb485be277f3513f 100644
|
| --- a/Source/devtools/front_end/TimelinePresentationModel.js
|
| +++ b/Source/devtools/front_end/TimelinePresentationModel.js
|
| @@ -32,10 +32,13 @@
|
| /**
|
| * @constructor
|
| * @extends {WebInspector.Object}
|
| + * @param {!WebInspector.TimelineModel} model
|
| */
|
| -WebInspector.TimelinePresentationModel = function()
|
| +WebInspector.TimelinePresentationModel = function(model)
|
| {
|
| + this._model = model;
|
| this._filters = [];
|
| + this._bindings = new WebInspector.TimelinePresentationModel.InterRecordBindings();
|
| this.reset();
|
| }
|
|
|
| @@ -114,15 +117,10 @@ WebInspector.TimelinePresentationModel.prototype = {
|
|
|
| reset: function()
|
| {
|
| - this._rootRecord = new WebInspector.TimelinePresentationModel.Record(this, { type: WebInspector.TimelineModel.RecordType.Root }, null);
|
| - this._sendRequestRecords = {};
|
| - this._timerRecords = {};
|
| - this._requestAnimationFrameRecords = {};
|
| + var rootPayload = { type: WebInspector.TimelineModel.RecordType.Root };
|
| + this._rootRecord = new WebInspector.TimelinePresentationModel.Record(this._model, this._bindings, /** @type {!TimelineAgent.TimelineEvent} */ (rootPayload), null);
|
| this._eventDividerRecords = [];
|
| this._minimumRecordTime = -1;
|
| - this._layoutInvalidateStack = {};
|
| - this._lastScheduleStyleRecalculation = {};
|
| - this._webSocketCreateRecords = {};
|
| this._coalescingBuckets = {};
|
| this._mergingBuffer = new WebInspector.TimelineMergingRecordBuffer();
|
|
|
| @@ -130,6 +128,8 @@ WebInspector.TimelinePresentationModel.prototype = {
|
| this._mainThreadTasks = ([]);
|
| /** @type {!Array.<!TimelineAgent.TimelineEvent>} */
|
| this._gpuThreadTasks = ([]);
|
| +
|
| + this._bindings._reset();
|
| },
|
|
|
| /**
|
| @@ -221,7 +221,7 @@ WebInspector.TimelinePresentationModel.prototype = {
|
| if (WebInspector.TimelineUIUtils.isEventDivider(record))
|
| this._eventDividerRecords.push(record);
|
|
|
| - var formattedRecord = new WebInspector.TimelinePresentationModel.Record(this, record, parentRecord);
|
| + var formattedRecord = new WebInspector.TimelinePresentationModel.Record(this._model, this._bindings, record, parentRecord);
|
| if (record.type in WebInspector.TimelinePresentationModel._hiddenRecords) {
|
| parentRecord.children.pop();
|
| return null;
|
| @@ -289,7 +289,7 @@ WebInspector.TimelinePresentationModel.prototype = {
|
| if (record.type === WebInspector.TimelineModel.RecordType.TimeStamp)
|
| rawRecord.data.message = record.data.message;
|
|
|
| - var coalescedRecord = new WebInspector.TimelinePresentationModel.Record(this, rawRecord, null);
|
| + var coalescedRecord = new WebInspector.TimelinePresentationModel.Record(this._model, this._bindings, rawRecord, null);
|
| var parent = record.parent;
|
|
|
| coalescedRecord.coalesced = true;
|
| @@ -413,13 +413,34 @@ WebInspector.TimelinePresentationModel.prototype = {
|
|
|
| /**
|
| * @constructor
|
| - * @param {!WebInspector.TimelinePresentationModel} presentationModel
|
| - * @param {!Object} record
|
| + */
|
| +WebInspector.TimelinePresentationModel.InterRecordBindings = function()
|
| +{
|
| + this._reset();
|
| +}
|
| +
|
| +WebInspector.TimelinePresentationModel.InterRecordBindings.prototype = {
|
| + _reset: function()
|
| + {
|
| + this._sendRequestRecords = {};
|
| + this._timerRecords = {};
|
| + this._requestAnimationFrameRecords = {};
|
| + this._layoutInvalidateStack = {};
|
| + this._lastScheduleStyleRecalculation = {};
|
| + this._webSocketCreateRecords = {};
|
| + }
|
| +}
|
| +
|
| +/**
|
| + * @constructor
|
| + * @param {!WebInspector.TimelineModel} model
|
| + * @param {!WebInspector.TimelinePresentationModel.InterRecordBindings} bindings
|
| + * @param {!TimelineAgent.TimelineEvent} record
|
| * @param {?WebInspector.TimelinePresentationModel.Record} parentRecord
|
| */
|
| -WebInspector.TimelinePresentationModel.Record = function(presentationModel, record, parentRecord)
|
| +WebInspector.TimelinePresentationModel.Record = function(model, bindings, record, parentRecord)
|
| {
|
| - this._presentationModel = presentationModel;
|
| + this._model = model;
|
| this._aggregatedStats = {};
|
| this._record = /** @type {!TimelineAgent.TimelineEvent} */ (record);
|
| this._children = [];
|
| @@ -430,7 +451,7 @@ WebInspector.TimelinePresentationModel.Record = function(presentationModel, reco
|
|
|
| this._selfTime = this.endTime - this.startTime;
|
| this._lastChildEndTime = this.endTime;
|
| - this._startTimeOffset = this.startTime - presentationModel._minimumRecordTime;
|
| + this._startTimeOffset = this.startTime - model.minimumRecordTime();
|
|
|
| if (record.data) {
|
| if (record.data["url"])
|
| @@ -452,18 +473,18 @@ WebInspector.TimelinePresentationModel.Record = function(presentationModel, reco
|
| switch (record.type) {
|
| case recordTypes.ResourceSendRequest:
|
| // Make resource receive record last since request was sent; make finish record last since response received.
|
| - presentationModel._sendRequestRecords[record.data["requestId"]] = this;
|
| + bindings._sendRequestRecords[record.data["requestId"]] = this;
|
| break;
|
|
|
| case recordTypes.ResourceReceiveResponse:
|
| - var sendRequestRecord = presentationModel._sendRequestRecords[record.data["requestId"]];
|
| + var sendRequestRecord = bindings._sendRequestRecords[record.data["requestId"]];
|
| if (sendRequestRecord) // False if we started instrumentation in the middle of request.
|
| this.url = sendRequestRecord.url;
|
| break;
|
|
|
| case recordTypes.ResourceReceivedData:
|
| case recordTypes.ResourceFinish:
|
| - var sendRequestRecord = presentationModel._sendRequestRecords[record.data["requestId"]];
|
| + var sendRequestRecord = bindings._sendRequestRecords[record.data["requestId"]];
|
| if (sendRequestRecord) // False for main resource.
|
| this.url = sendRequestRecord.url;
|
| break;
|
| @@ -471,11 +492,11 @@ WebInspector.TimelinePresentationModel.Record = function(presentationModel, reco
|
| case recordTypes.TimerInstall:
|
| this.timeout = record.data["timeout"];
|
| this.singleShot = record.data["singleShot"];
|
| - presentationModel._timerRecords[record.data["timerId"]] = this;
|
| + bindings._timerRecords[record.data["timerId"]] = this;
|
| break;
|
|
|
| case recordTypes.TimerFire:
|
| - var timerInstalledRecord = presentationModel._timerRecords[record.data["timerId"]];
|
| + var timerInstalledRecord = bindings._timerRecords[record.data["timerId"]];
|
| if (timerInstalledRecord) {
|
| this.callSiteStackTrace = timerInstalledRecord.stackTrace;
|
| this.timeout = timerInstalledRecord.timeout;
|
| @@ -484,11 +505,11 @@ WebInspector.TimelinePresentationModel.Record = function(presentationModel, reco
|
| break;
|
|
|
| case recordTypes.RequestAnimationFrame:
|
| - presentationModel._requestAnimationFrameRecords[record.data["id"]] = this;
|
| + bindings._requestAnimationFrameRecords[record.data["id"]] = this;
|
| break;
|
|
|
| case recordTypes.FireAnimationFrame:
|
| - var requestAnimationRecord = presentationModel._requestAnimationFrameRecords[record.data["id"]];
|
| + var requestAnimationRecord = bindings._requestAnimationFrameRecords[record.data["id"]];
|
| if (requestAnimationRecord)
|
| this.callSiteStackTrace = requestAnimationRecord.stackTrace;
|
| break;
|
| @@ -498,11 +519,11 @@ WebInspector.TimelinePresentationModel.Record = function(presentationModel, reco
|
| break;
|
|
|
| case recordTypes.ScheduleStyleRecalculation:
|
| - presentationModel._lastScheduleStyleRecalculation[this.frameId] = this;
|
| + bindings._lastScheduleStyleRecalculation[this.frameId] = this;
|
| break;
|
|
|
| case recordTypes.RecalculateStyles:
|
| - var scheduleStyleRecalculationRecord = presentationModel._lastScheduleStyleRecalculation[this.frameId];
|
| + var scheduleStyleRecalculationRecord = bindings._lastScheduleStyleRecalculation[this.frameId];
|
| if (!scheduleStyleRecalculationRecord)
|
| break;
|
| this.callSiteStackTrace = scheduleStyleRecalculationRecord.stackTrace;
|
| @@ -512,25 +533,21 @@ WebInspector.TimelinePresentationModel.Record = function(presentationModel, reco
|
| // Consider style recalculation as a reason for layout invalidation,
|
| // but only if we had no earlier layout invalidation records.
|
| var styleRecalcStack;
|
| - if (!presentationModel._layoutInvalidateStack[this.frameId]) {
|
| - for (var outerRecord = parentRecord; outerRecord; outerRecord = record.parent) {
|
| - if (outerRecord.type === recordTypes.RecalculateStyles) {
|
| - styleRecalcStack = outerRecord.callSiteStackTrace;
|
| - break;
|
| - }
|
| - }
|
| + if (!bindings._layoutInvalidateStack[this.frameId]) {
|
| + if (parentRecord.type === recordTypes.RecalculateStyles)
|
| + styleRecalcStack = parentRecord.callSiteStackTrace;
|
| }
|
| - presentationModel._layoutInvalidateStack[this.frameId] = styleRecalcStack || this.stackTrace;
|
| + bindings._layoutInvalidateStack[this.frameId] = styleRecalcStack || this.stackTrace;
|
| break;
|
|
|
| case recordTypes.Layout:
|
| - var layoutInvalidateStack = presentationModel._layoutInvalidateStack[this.frameId];
|
| + var layoutInvalidateStack = bindings._layoutInvalidateStack[this.frameId];
|
| if (layoutInvalidateStack)
|
| this.callSiteStackTrace = layoutInvalidateStack;
|
| if (this.stackTrace)
|
| this.addWarning(WebInspector.UIString("Forced synchronous layout is a possible performance bottleneck."));
|
|
|
| - presentationModel._layoutInvalidateStack[this.frameId] = null;
|
| + bindings._layoutInvalidateStack[this.frameId] = null;
|
| this.highlightQuad = record.data.root || WebInspector.TimelinePresentationModel.quadFromRectData(record.data);
|
| this._relatedBackendNodeId = record.data["rootNode"];
|
| break;
|
| @@ -548,13 +565,13 @@ WebInspector.TimelinePresentationModel.Record = function(presentationModel, reco
|
| this.webSocketURL = record.data["url"];
|
| if (typeof record.data["webSocketProtocol"] !== "undefined")
|
| this.webSocketProtocol = record.data["webSocketProtocol"];
|
| - presentationModel._webSocketCreateRecords[record.data["identifier"]] = this;
|
| + bindings._webSocketCreateRecords[record.data["identifier"]] = this;
|
| break;
|
|
|
| case recordTypes.WebSocketSendHandshakeRequest:
|
| case recordTypes.WebSocketReceiveHandshakeResponse:
|
| case recordTypes.WebSocketDestroy:
|
| - var webSocketCreateRecord = presentationModel._webSocketCreateRecords[record.data["identifier"]];
|
| + var webSocketCreateRecord = bindings._webSocketCreateRecords[record.data["identifier"]];
|
| if (webSocketCreateRecord) { // False if we started instrumentation in the middle of request.
|
| this.webSocketURL = webSocketCreateRecord.webSocketURL;
|
| if (typeof webSocketCreateRecord.webSocketProtocol !== "undefined")
|
| @@ -634,7 +651,7 @@ WebInspector.TimelinePresentationModel.Record.prototype = {
|
| */
|
| title: function()
|
| {
|
| - return WebInspector.TimelineUIUtils.recordTitle(this._presentationModel, this._record);
|
| + return WebInspector.TimelineUIUtils.recordTitle(this._model, this._record);
|
| },
|
|
|
| /**
|
|
|