blob: 362b0c710146da0fb1f214de64d41eb1d4115735 [file] [log] [blame]
/*
* Copyright 2015 The Chromium Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/**
* @constructor
* @param {!WebInspector.TracingModel} tracingModel
* @param {number=} zeroTime
*/
WebInspector.FilmStripModel = function(tracingModel, zeroTime)
{
this._tracingModel = tracingModel;
this._zeroTime = zeroTime || tracingModel.minimumRecordTime();
/** @type {!Array<!WebInspector.FilmStripModel.Frame>} */
this._frames = [];
var browserProcess = tracingModel.processByName("Browser");
if (!browserProcess)
return;
var mainThread = browserProcess.threadByName("CrBrowserMain");
if (!mainThread)
return;
var events = mainThread.events();
for (var i = 0; i < events.length; ++i) {
var event = events[i];
if (event.startTime < this._zeroTime)
continue;
if (!event.hasCategory(WebInspector.FilmStripModel._category))
continue;
if (event.name === WebInspector.FilmStripModel.TraceEvents.CaptureFrame) {
var data = event.args["data"];
if (data)
this._frames.push(WebInspector.FilmStripModel.Frame._fromEvent(this, event, this._frames.length));
} else if (event.name === WebInspector.FilmStripModel.TraceEvents.Screenshot) {
this._frames.push(WebInspector.FilmStripModel.Frame._fromSnapshot(this, /** @type {!WebInspector.TracingModel.ObjectSnapshot} */ (event), this._frames.length));
}
}
}
WebInspector.FilmStripModel._category = "disabled-by-default-devtools.screenshot";
WebInspector.FilmStripModel.TraceEvents = {
CaptureFrame: "CaptureFrame",
Screenshot: "Screenshot"
}
WebInspector.FilmStripModel.prototype = {
/**
* @return {!Array<!WebInspector.FilmStripModel.Frame>}
*/
frames: function()
{
return this._frames;
},
/**
* @return {number}
*/
zeroTime: function()
{
return this._zeroTime;
},
/**
* @param {number} timestamp
* @return {?WebInspector.FilmStripModel.Frame}
*/
frameByTimestamp: function(timestamp)
{
/**
* @param {number} timestamp
* @param {!WebInspector.FilmStripModel.Frame} frame
* @return {number}
*/
function comparator(timestamp, frame)
{
return timestamp - frame.timestamp;
}
var index = this._frames.lowerBound(timestamp, comparator);
return index < this._frames.length ? this._frames[index] : null;
}
}
/**
* @constructor
* @param {!WebInspector.FilmStripModel} model
* @param {number} timestamp
* @param {number} index
*/
WebInspector.FilmStripModel.Frame = function(model, timestamp, index)
{
this._model = model;
this.timestamp = timestamp;
this.index = index;
/** @type {?string} */
this._imageData = null;
/** @type {?WebInspector.TracingModel.ObjectSnapshot} */
this._snapshot = null;
}
/**
* @param {!WebInspector.FilmStripModel} model
* @param {!WebInspector.TracingModel.Event} event
* @param {number} index
* @return {!WebInspector.FilmStripModel.Frame}
*/
WebInspector.FilmStripModel.Frame._fromEvent = function(model, event, index)
{
var frame = new WebInspector.FilmStripModel.Frame(model, event.startTime, index);
frame._imageData = event.args["data"];
return frame;
}
/**
* @param {!WebInspector.FilmStripModel} model
* @param {!WebInspector.TracingModel.ObjectSnapshot} snapshot
* @param {number} index
* @return {!WebInspector.FilmStripModel.Frame}
*/
WebInspector.FilmStripModel.Frame._fromSnapshot = function(model, snapshot, index)
{
var frame = new WebInspector.FilmStripModel.Frame(model, snapshot.startTime, index);
frame._snapshot = snapshot;
return frame;
}
WebInspector.FilmStripModel.Frame.prototype = {
/**
* @return {!WebInspector.FilmStripModel}
*/
model: function()
{
return this._model;
},
/**
* @return {!Promise<?string>}
*/
imageDataPromise: function()
{
if (this._imageData || !this._snapshot)
return Promise.resolve(this._imageData);
return /** @type {!Promise<?string>} */ (this._snapshot.objectPromise());
}
}