| Index: Source/devtools/front_end/TimelineFlameChart.js
|
| diff --git a/Source/devtools/front_end/TimelineFlameChart.js b/Source/devtools/front_end/TimelineFlameChart.js
|
| index ff5218dceba12c4b65ceb77743432d2a3d3161ab..57558cad0280c1966d0e18d797f2bd4cdfe2af2b 100644
|
| --- a/Source/devtools/front_end/TimelineFlameChart.js
|
| +++ b/Source/devtools/front_end/TimelineFlameChart.js
|
| @@ -186,7 +186,7 @@ WebInspector.TimelineFlameChartDataProvider.prototype = {
|
|
|
| this._startTime = this._startTime ? Math.min(this._startTime, record.startTime) : record.startTime;
|
| this._zeroTime = this._startTime;
|
| - var recordEndTime = record.endTime || record.startTime;
|
| + var recordEndTime = record.endTime;
|
| this._endTime = Math.max(this._endTime, recordEndTime);
|
| this._totalTime = Math.max(1000, this._endTime - this._startTime);
|
|
|
| @@ -194,17 +194,29 @@ WebInspector.TimelineFlameChartDataProvider.prototype = {
|
| if (record.type === WebInspector.TimelineModel.RecordType.GPUTask || !!record.thread)
|
| return;
|
| } else {
|
| - if (record.type === WebInspector.TimelineModel.RecordType.Program || !record.thread)
|
| + if (record.type === WebInspector.TimelineModel.RecordType.Program || !record.thread || record.thread === "gpu")
|
| return;
|
| }
|
|
|
| + var recordIndex = this._pushRecord(record, true, level, record.startTime, record.endTime);
|
| var currentTime = record.startTime;
|
| for (var i = 0; i < record.children.length; ++i) {
|
| var childRecord = record.children[i];
|
| var childStartTime = childRecord.startTime;
|
| - if (currentTime !== childStartTime)
|
| - this._pushRecord(record, true, level, currentTime, childStartTime);
|
| - var childEndTime = childRecord.endTime || childRecord.startTime;
|
| + var childEndTime = childRecord.endTime;
|
| + if (childStartTime === childEndTime) {
|
| + this._appendRecord(childRecord, level + 1);
|
| + continue;
|
| + }
|
| +
|
| + if (currentTime !== childStartTime) {
|
| + if (recordIndex !== -1) {
|
| + this._timelineData.entryTotalTimes[recordIndex] = childStartTime - record.startTime;
|
| + recordIndex = -1;
|
| + } else {
|
| + this._pushRecord(record, true, level, currentTime, childStartTime);
|
| + }
|
| + }
|
| this._pushRecord(record, false, level, childStartTime, childEndTime);
|
| this._appendRecord(childRecord, level + 1);
|
| currentTime = childEndTime;
|
| @@ -221,6 +233,7 @@ WebInspector.TimelineFlameChartDataProvider.prototype = {
|
| * @param {number} level
|
| * @param {number} startTime
|
| * @param {number} endTime
|
| + * @return {number}
|
| */
|
| _pushRecord: function(record, isSelfSegment, level, startTime, endTime)
|
| {
|
| @@ -230,6 +243,7 @@ WebInspector.TimelineFlameChartDataProvider.prototype = {
|
| this._timelineData.entryLevels[index] = level;
|
| this._timelineData.entryTotalTimes[index] = endTime - startTime;
|
| this._isSelfSegment[index] = isSelfSegment;
|
| + return index;
|
| },
|
|
|
| /**
|
| @@ -252,21 +266,25 @@ WebInspector.TimelineFlameChartDataProvider.prototype = {
|
|
|
| /**
|
| * @param {number} entryIndex
|
| - * @return {?Object}
|
| + * @return {!string}
|
| */
|
| - entryData: function(entryIndex)
|
| + entryColor: function(entryIndex)
|
| {
|
| - return null;
|
| + var category = WebInspector.TimelineUIUtils.categoryForRecord(this._records[entryIndex]);
|
| + return this._isSelfSegment[entryIndex] ? category.fillColorStop1 : category.backgroundColor;
|
| },
|
|
|
| /**
|
| * @param {number} entryIndex
|
| - * @return {!string}
|
| + * @return {!{startTimeOffset: number, endTimeOffset: number}}
|
| */
|
| - entryColor: function(entryIndex)
|
| + highlightTimeRange: function(entryIndex)
|
| {
|
| - var category = WebInspector.TimelineUIUtils.categoryForRecord(this._records[entryIndex]);
|
| - return this._isSelfSegment[entryIndex] ? category.fillColorStop1 : category.backgroundColor;
|
| + var record = this._records[entryIndex];
|
| + return {
|
| + startTimeOffset: record.startTime - this._zeroTime,
|
| + endTimeOffset: record.endTime - this._zeroTime
|
| + };
|
| },
|
|
|
| /**
|
| @@ -283,7 +301,7 @@ WebInspector.TimelineFlameChartDataProvider.prototype = {
|
| * @constructor
|
| * @extends {WebInspector.View}
|
| * @implements {WebInspector.TimelineModeView}
|
| - * @implements {WebInspector.TimeRangeController}
|
| + * @implements {WebInspector.FlameChartDelegate}
|
| * @param {!WebInspector.TimelineModeViewDelegate} delegate
|
| * @param {!WebInspector.TimelineModel} model
|
| * @param {!WebInspector.TimelineFrameModel} frameModel
|
| @@ -292,12 +310,15 @@ WebInspector.TimelineFlameChartDataProvider.prototype = {
|
| WebInspector.TimelineFlameChart = function(delegate, model, frameModel, mainThread)
|
| {
|
| WebInspector.View.call(this);
|
| + this.element.classList.add("timeline-flamechart");
|
| + this.registerRequiredCSS("flameChart.css");
|
| this._delegate = delegate;
|
| this._model = model;
|
| this._dataProvider = new WebInspector.TimelineFlameChartDataProvider(model, frameModel, mainThread);
|
| this._mainView = new WebInspector.FlameChart.MainPane(this._dataProvider, this, true, true);
|
| this._mainView.show(this.element);
|
| this._model.addEventListener(WebInspector.TimelineModel.Events.RecordingStarted, this._onRecordingStarted, this);
|
| + this._mainView.addEventListener(WebInspector.FlameChart.Events.EntrySelected, this._onEntrySelected, this);
|
| }
|
|
|
| WebInspector.TimelineFlameChart.prototype = {
|
| @@ -316,7 +337,8 @@ WebInspector.TimelineFlameChart.prototype = {
|
| refreshRecords: function(textFilter)
|
| {
|
| this._dataProvider.reset();
|
| - this._mainView._scheduleUpdate();
|
| + this._mainView.reset();
|
| + this.setSelectedRecord(this._selectedRecord);
|
| },
|
|
|
| reset: function()
|
| @@ -324,6 +346,7 @@ WebInspector.TimelineFlameChart.prototype = {
|
| this._automaticallySizeWindow = true;
|
| this._dataProvider.reset();
|
| this._mainView.setWindowTimes(0, Infinity);
|
| + delete this._selectedRecord;
|
| },
|
|
|
| _onRecordingStarted: function()
|
| @@ -389,6 +412,29 @@ WebInspector.TimelineFlameChart.prototype = {
|
| */
|
| setSelectedRecord: function(record)
|
| {
|
| + this._selectedRecord = record;
|
| + var entryRecords = this._dataProvider._records;
|
| + for (var entryIndex = 0; entryIndex < entryRecords.length; ++entryIndex) {
|
| + if (entryRecords[entryIndex] === record) {
|
| + this._mainView.setSelectedEntry(entryIndex);
|
| + return;
|
| + }
|
| + }
|
| + this._mainView.setSelectedEntry(-1);
|
| + if (this._selectedElement) {
|
| + this._selectedElement.remove();
|
| + delete this._selectedElement;
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * @param {!WebInspector.Event} event
|
| + */
|
| + _onEntrySelected: function(event)
|
| + {
|
| + var entryIndex = event.data;
|
| + var record = this._dataProvider._records[entryIndex];
|
| + this._delegate.selectRecord(record);
|
| },
|
|
|
| __proto__: WebInspector.View.prototype
|
|
|