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

Unified Diff: third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js

Issue 2563383003: DevTools: add extension API to contribute trace events to timeline (Closed)
Patch Set: lint + new compiler warnings Created 4 years 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: third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js
index 32353c988ecd8895ae0523d030d83fff19860eb4..8da01edab31c8be39d96ffc22d5e51c94d76bfdf 100644
--- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js
+++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js
@@ -67,10 +67,11 @@ Timeline.TimelinePanel = class extends UI.Panel {
new TimelineModel.TimelineFrameModel(event => Timeline.TimelineUIUtils.eventStyle(event).category.name);
this._filmStripModel = new Components.FilmStripModel(this._tracingModel);
this._irModel = new TimelineModel.TimelineIRModel();
-
+ /** @type {!Array<!{title: string, model: !SDK.TracingModel}>} */
+ this._extensionTracingModels = [];
this._cpuThrottlingManager = new Timeline.CPUThrottlingManager();
- /** @type {!Array.<!Timeline.TimelineModeView>} */
+ /** @type {!Array<!Timeline.TimelineModeView>} */
this._currentViews = [];
this._captureNetworkSetting = Common.settings.createSetting('timelineCaptureNetwork', false);
@@ -118,6 +119,9 @@ Timeline.TimelinePanel = class extends UI.Panel {
this._onModeChanged();
this._recreateToolbarItems();
+ Extensions.extensionServer.addEventListener(
+ Extensions.ExtensionServer.Events.TraceProviderAdded, this._recreateToolbarItems, this);
+
this._captureNetworkSetting.addChangeListener(this._onNetworkChanged, this);
this._captureMemorySetting.addChangeListener(this._onModeChanged, this);
this._captureFilmStripSetting.addChangeListener(this._onModeChanged, this);
@@ -131,6 +135,10 @@ Timeline.TimelinePanel = class extends UI.Panel {
this._selectedSearchResult;
/** @type {!Array<!SDK.TracingModel.Event>}|undefined */
this._searchResults;
+ /** @type {?symbol} */
+ this._sessionGeneration = null;
+ /** @type {number} */
+ this._recordingStartTime = 0;
}
/**
@@ -383,6 +391,15 @@ Timeline.TimelinePanel = class extends UI.Panel {
Common.UIString('CSS coverage'), this._markUnusedCSS, Common.UIString('Mark unused CSS in souces.')));
}
+ const traceProviders = Extensions.extensionServer.traceProviders();
+ if (traceProviders.length) {
+ this._panelToolbar.appendSeparator();
+ for (let provider of traceProviders) {
+ const setting = Timeline.TimelinePanel._settingForTraceProvider(provider);
+ const checkbox = this._createSettingCheckbox(provider.shortDisplayName(), setting, provider.longDisplayName());
+ this._panelToolbar.appendToolbarItem(checkbox);
+ }
+ }
this._panelToolbar.appendSeparator();
this._panelToolbar.appendToolbarItem(UI.Toolbar.createActionButtonForId('components.collect-garbage'));
@@ -395,6 +412,20 @@ Timeline.TimelinePanel = class extends UI.Panel {
}
/**
+ * @param {!Extensions.ExtensionTraceProvider} traceProvider
+ * @return {!Common.Setting<boolean>}
+ */
+ static _settingForTraceProvider(traceProvider) {
+ var setting = traceProvider[Timeline.TimelinePanel._traceProviderSettingSymbol];
+ if (!setting) {
+ var providerId = traceProvider.persistentIdentifier();
+ setting = Common.settings.createSetting(providerId, false);
+ traceProvider[Timeline.TimelinePanel._traceProviderSettingSymbol] = setting;
+ }
+ return setting;
+ }
+
+ /**
* @return {!UI.ToolbarComboBox}
*/
_createNetworkConditionsSelect() {
@@ -530,8 +561,8 @@ Timeline.TimelinePanel = class extends UI.Panel {
// Set up the main view.
this._removeAllModeViews();
- this._flameChart =
- new Timeline.TimelineFlameChartView(this, this._model, this._frameModel, this._irModel, this._filters);
+ this._flameChart = new Timeline.TimelineFlameChartView(
+ this, this._model, this._frameModel, this._irModel, this._extensionTracingModels, this._filters);
this._flameChart.enableNetworkPane(this._captureNetworkSetting.get());
this._addModeView(this._flameChart);
@@ -583,12 +614,22 @@ Timeline.TimelinePanel = class extends UI.Panel {
if (Runtime.experiments.isEnabled('timelineRuleUsageRecording') && this._markUnusedCSS.get())
SDK.CSSModel.fromTarget(mainTarget).startRuleUsageTracking();
+ this._sessionGeneration = Symbol('timelineSessionGeneration');
this._autoRecordGeneration = userInitiated ? null : Symbol('Generation');
+ var enabledTraceProviders = Extensions.extensionServer.traceProviders().filter(
+ provider => Timeline.TimelinePanel._settingForTraceProvider(provider).get());
+
+ var captureOptions = {
+ captureCauses: true,
+ enableJSSampling: this._captureJSProfileSetting.get(),
+ captureMemory: this._captureMemorySetting.get(),
+ capturePictures: this._captureLayersAndPicturesSetting.get(),
+ captureFilmStrip: this._captureFilmStripSetting.get()
+ };
+
this._controller = new Timeline.TimelineController(mainTarget, this, this._tracingModel);
- this._controller.startRecording(
- true, this._captureJSProfileSetting.get(), this._captureMemorySetting.get(),
- this._captureLayersAndPicturesSetting.get(),
- this._captureFilmStripSetting && this._captureFilmStripSetting.get());
+ this._controller.startRecording(captureOptions, enabledTraceProviders);
+ this._recordingStartTime = Date.now();
for (var i = 0; i < this._overviewControls.length; ++i)
this._overviewControls[i].timelineStarted();
@@ -634,6 +675,8 @@ Timeline.TimelinePanel = class extends UI.Panel {
_clear() {
this._showRecordingHelpMessage();
this._detailsSplitWidget.hideSidebar();
+ this._sessionGeneration = null;
+ this._recordingStartTime = 0;
this._reset();
}
@@ -644,6 +687,9 @@ Timeline.TimelinePanel = class extends UI.Panel {
Components.LineLevelProfile.instance().reset();
this._tracingModel.reset();
this._model.reset();
+ for (let extensionEntry of this._extensionTracingModels)
+ extensionEntry.model.reset();
+ this._extensionTracingModels.splice(0);
this.requestWindowTimes(0, Infinity);
delete this._selection;
@@ -676,6 +722,29 @@ Timeline.TimelinePanel = class extends UI.Panel {
this._statusPane.updateProgressBar(Common.UIString('Buffer usage'), usage * 100);
}
+ /**
+ * @override
+ * @param {string} title
+ * @param {!SDK.TracingModel} tracingModel
+ * @param {number} timeOffset
+ */
+ addExtensionEvents(title, tracingModel, timeOffset) {
+ this._extensionTracingModels.push({title: title, model: tracingModel, timeOffset: timeOffset});
+ if (this._state !== Timeline.TimelinePanel.State.Idle)
+ return;
+ tracingModel.adjustTime(this._model.minimumRecordTime() + (timeOffset / 1000) - this._recordingStartTime);
+ for (let view of this._currentViews)
+ view.extensionDataAdded();
+ }
+
+ /**
+ * @override
+ * @return {?symbol}
+ */
+ sessionGeneration() {
+ return this._sessionGeneration;
+ }
+
_showRecordingHelpMessage() {
if (Runtime.experiments.isEnabled('timelineLandingPage')) {
this._showLandingPage();
@@ -797,6 +866,10 @@ Timeline.TimelinePanel = class extends UI.Panel {
if (this._statusPane)
this._statusPane.hide();
delete this._statusPane;
+
+ for (let entry of this._extensionTracingModels)
+ entry.model.adjustTime(this._model.minimumRecordTime() + (entry.timeOffset / 1000) - this._recordingStartTime);
+
this._flameChart.resizeToPreferredHeights();
this._overviewPane.reset();
this._overviewPane.setBounds(this._model.minimumRecordTime(), this._model.maximumRecordTime());
@@ -1299,6 +1372,26 @@ Timeline.TimelinePanel.headerHeight = 20;
/**
* @interface
*/
+Timeline.LoaderClient = function() {};
+
+Timeline.LoaderClient.prototype = {
+ loadingStarted() {},
+
+ /**
+ * @param {number=} progress
+ */
+ loadingProgress(progress) {},
+
+ /**
+ * @param {boolean} success
+ */
+ loadingComplete(success) {},
+};
+
+/**
+ * @interface
+ * @extends {Timeline.LoaderClient}
+ */
Timeline.TimelineLifecycleDelegate = function() {};
Timeline.TimelineLifecycleDelegate.prototype = {
@@ -1309,17 +1402,15 @@ Timeline.TimelineLifecycleDelegate.prototype = {
*/
recordingProgress(usage) {},
- loadingStarted() {},
-
/**
- * @param {number=} progress
+ * @param {string} title
+ * @param {!SDK.TracingModel} tracingModel
+ * @param {number} timeOffset
*/
- loadingProgress(progress) {},
+ addExtensionEvents(title, tracingModel, timeOffset) {},
- /**
- * @param {boolean} success
- */
- loadingComplete(success) {},
+ /** @return {?symbol} */
+ sessionGeneration() {}
};
/**
@@ -1533,6 +1624,8 @@ Timeline.TimelineModeView.prototype = {
refreshRecords() {},
+ extensionDataAdded() {},
+
/**
* @param {?SDK.TracingModel.Event} event
* @param {string=} regex
@@ -1922,6 +2015,8 @@ Timeline.TimelineFilters = class extends Common.Object {
}
};
+Timeline.TimelinePanel._traceProviderSettingSymbol = Symbol('traceProviderSetting');
+
/** @enum {symbol} */
Timeline.TimelineFilters.Events = {
FilterChanged: Symbol('FilterChanged')

Powered by Google App Engine
This is Rietveld 408576698