Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(580)

Unified Diff: Source/devtools/front_end/TimelineModel.js

Issue 180273023: DevTools: encapsulate presentation model in timeline view. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Review comments addressed. Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/devtools/front_end/TimelineModel.js
diff --git a/Source/devtools/front_end/TimelineModel.js b/Source/devtools/front_end/TimelineModel.js
index 65c852780ca4c75c689834c6bec8a20c7fe8bca6..8ce8b1f9a99c30c12f5120392477e99240575895 100644
--- a/Source/devtools/front_end/TimelineModel.js
+++ b/Source/devtools/front_end/TimelineModel.js
@@ -34,13 +34,11 @@
*/
WebInspector.TimelineModel = function()
{
- this._payloads = [];
- this._records = [];
- this._minimumRecordTime = -1;
- this._maximumRecordTime = -1;
- this._stringPool = {};
+ this._filters = [];
this._bindings = new WebInspector.TimelineModel.InterRecordBindings();
+ this.reset();
+
WebInspector.timelineManager.addEventListener(WebInspector.TimelineManager.EventTypes.TimelineEventRecorded, this._onRecordAdded, this);
WebInspector.timelineManager.addEventListener(WebInspector.TimelineManager.EventTypes.TimelineStarted, this._onStarted, this);
WebInspector.timelineManager.addEventListener(WebInspector.TimelineManager.EventTypes.TimelineStopped, this._onStopped, this);
@@ -114,7 +112,8 @@ WebInspector.TimelineModel.Events = {
RecordAdded: "RecordAdded",
RecordsCleared: "RecordsCleared",
RecordingStarted: "RecordingStarted",
- RecordingStopped: "RecordingStopped"
+ RecordingStopped: "RecordingStopped",
+ RecordFilterChanged: "RecordFilterChanged"
}
/**
@@ -124,27 +123,25 @@ WebInspector.TimelineModel.Events = {
*/
WebInspector.TimelineModel.forAllRecords = function(recordsArray, preOrderCallback, postOrderCallback)
{
- if (!recordsArray)
- return;
- var stack = [{array: recordsArray, index: 0}];
- while (stack.length) {
- var entry = stack[stack.length - 1];
- var records = entry.array;
- if (entry.index < records.length) {
- var record = records[entry.index];
- if (preOrderCallback && preOrderCallback(record, stack.length))
- return;
- if (record.children)
- stack.push({array: record.children, index: 0, record: record});
- else if (postOrderCallback && postOrderCallback(record, stack.length))
- return;
- ++entry.index;
- } else {
- if (entry.record && postOrderCallback && postOrderCallback(entry.record, stack.length))
- return;
- stack.pop();
+ /**
+ * @param {!Array.<!WebInspector.TimelineModel.Record>} records
+ * @param {number} depth
+ * @return {boolean}
+ */
+ function processRecords(records, depth)
+ {
+ for (var i = 0; i < records.length; ++i) {
+ var record = records[i];
+ if (preOrderCallback && preOrderCallback(record, depth))
+ return true;
+ if (processRecords(record.children, depth + 1))
+ return true;
+ if (postOrderCallback && postOrderCallback(record, depth))
+ return true;
}
+ return false;
}
+ processRecords(recordsArray, 0);
}
WebInspector.TimelineModel.prototype = {
@@ -158,6 +155,63 @@ WebInspector.TimelineModel.prototype = {
},
/**
+ * @param {!WebInspector.TimelineModel.Filter} filter
+ */
+ addFilter: function(filter)
+ {
+ this._filters.push(filter);
+ filter._model = this;
+ },
+
+ /**
+ * @param {function(!WebInspector.TimelineModel.Record)|function(!WebInspector.TimelineModel.Record,number)} callback
+ */
+ forAllFilteredRecords: function(callback)
+ {
+ /**
+ * @param {!WebInspector.TimelineModel.Record} record
+ * @param {number} depth
+ * @this {WebInspector.TimelineModel}
+ * @return {boolean}
+ */
+ function processRecord(record, depth)
+ {
+ var visible = this.isVisible(record);
+ if (visible) {
+ if (callback(record, depth))
+ return true;
+ }
+
+ for (var i = 0; i < record.children.length; ++i) {
+ if (processRecord.call(this, record.children[i], visible ? depth + 1 : depth))
+ return true;
+ }
+ return false;
+ }
+
+ for (var i = 0; i < this._records.length; ++i)
+ processRecord.call(this, this._records[i], 0);
+ },
+
+ /**
+ * @param {!WebInspector.TimelineModel.Record} record
+ * @return {boolean}
+ */
+ isVisible: function(record)
+ {
+ for (var i = 0; i < this._filters.length; ++i) {
+ if (!this._filters[i].accept(record))
+ return false;
+ }
+ return true;
+ },
+
+ _filterChanged: function()
+ {
+ this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordFilterChanged);
+ },
+
+ /**
* @param {boolean=} includeCounters
*/
startRecording: function(includeCounters)
@@ -252,6 +306,10 @@ WebInspector.TimelineModel.prototype = {
var record = this._innerAddRecord(payload, null);
this._records.push(record);
+ if (record.type === WebInspector.TimelineModel.RecordType.Program)
+ this._mainThreadTasks.push(record);
+ if (record.type === WebInspector.TimelineModel.RecordType.GPUTask)
+ this._gpuThreadTasks.push(record);
this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordAdded, record);
},
@@ -265,6 +323,9 @@ WebInspector.TimelineModel.prototype = {
_innerAddRecord: function(payload, parentRecord)
{
var record = new WebInspector.TimelineModel.Record(this, payload, parentRecord);
+ if (WebInspector.TimelineUIUtils.isEventDivider(record))
+ this._eventDividerRecords.push(record);
+
for (var i = 0; payload.children && i < payload.children.length; ++i)
this._innerAddRecord.call(this, payload.children[i], record);
@@ -335,6 +396,12 @@ WebInspector.TimelineModel.prototype = {
this._minimumRecordTime = -1;
this._maximumRecordTime = -1;
this._bindings._reset();
+ /** @type {!Array.<!WebInspector.TimelineModel.Record>} */
+ this._mainThreadTasks = [];
+ /** @type {!Array.<!WebInspector.TimelineModel.Record>} */
+ this._gpuThreadTasks = [];
+ /** @type {!Array.<!WebInspector.TimelineModel.Record>} */
+ this._eventDividerRecords = [];
this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordsCleared);
},
@@ -369,12 +436,27 @@ WebInspector.TimelineModel.prototype = {
},
/**
- * @param {!Object} rawRecord
- * @return {number}
+ * @return {!Array.<!WebInspector.TimelineModel.Record>}
+ */
+ mainThreadTasks: function()
+ {
+ return this._mainThreadTasks;
+ },
+
+ /**
+ * @return {!Array.<!WebInspector.TimelineModel.Record>}
+ */
+ gpuThreadTasks: function()
+ {
+ return this._gpuThreadTasks;
+ },
+
+ /**
+ * @return {!Array.<!WebInspector.TimelineModel.Record>}
*/
- recordOffsetInMillis: function(rawRecord)
+ eventDividerRecords: function()
{
- return rawRecord.startTime - this._minimumRecordTime;
+ return this._eventDividerRecords;
},
/**
@@ -811,6 +893,32 @@ WebInspector.TimelineModel.Record.prototype = {
}
}
+
+/**
+ * @constructor
+ */
+WebInspector.TimelineModel.Filter = function()
+{
+ /** @type {!WebInspector.TimelineModel} */
+ this._model;
+}
+
+WebInspector.TimelineModel.Filter.prototype = {
+ /**
+ * @param {!WebInspector.TimelineModel.Record} record
+ * @return {boolean}
+ */
+ accept: function(record)
+ {
+ return true;
+ },
+
+ notifyFilterChanged: function()
+ {
+ this._model._filterChanged();
+ }
+}
+
/**
* @constructor
* @implements {WebInspector.OutputStream}

Powered by Google App Engine
This is Rietveld 408576698