Chromium Code Reviews| Index: Source/devtools/front_end/timeline/TimelinePanel.js |
| diff --git a/Source/devtools/front_end/timeline/TimelinePanel.js b/Source/devtools/front_end/timeline/TimelinePanel.js |
| index 3123606d92cfc4857d6b5e4f98fb39212ac44ef6..b5f3e745a3f37390d99058774c9f771e0e105eab 100644 |
| --- a/Source/devtools/front_end/timeline/TimelinePanel.js |
| +++ b/Source/devtools/front_end/timeline/TimelinePanel.js |
| @@ -270,6 +270,13 @@ WebInspector.TimelinePanel.prototype = { |
| return this._lazyPaintProfilerView; |
| }, |
| + _causesView: function() |
| + { |
| + if (!this._lazyCausesView) |
| + this._lazyCausesView = new WebInspector.TimelineCausesView(); |
| + return this._lazyCausesView; |
| + }, |
| + |
| /** |
| * @param {!WebInspector.TimelineModeView} modeView |
| */ |
| @@ -347,11 +354,11 @@ WebInspector.TimelinePanel.prototype = { |
| panelStatusBarElement.appendChild(flameChartToggleButton.element); |
| } |
| - this._captureStacksSetting = WebInspector.settings.createSetting("timelineCaptureStacks", true); |
| - this._captureStacksSetting.addChangeListener(this._refreshViews, this); |
| - panelStatusBarElement.appendChild(this._createSettingCheckbox(WebInspector.UIString("Stacks"), |
| - this._captureStacksSetting, |
| - WebInspector.UIString("Capture JavaScript stack on every timeline event"))); |
| + this._captureCausesSetting = WebInspector.settings.createSetting("timelineCaptureCauses", true); |
| + this._captureCausesSetting.addChangeListener(this._refreshViews, this); |
| + panelStatusBarElement.appendChild(this._createSettingCheckbox(WebInspector.UIString("Causes"), |
| + this._captureCausesSetting, |
| + WebInspector.UIString("Capture causes for timeline events (e.g., stack traces)"))); |
| this._captureMemorySetting = WebInspector.settings.createSetting("timelineCaptureMemory", false); |
| panelStatusBarElement.appendChild(this._createSettingCheckbox(WebInspector.UIString("Memory"), |
| this._captureMemorySetting, |
| @@ -639,7 +646,7 @@ WebInspector.TimelinePanel.prototype = { |
| _startRecording: function(userInitiated) |
| { |
| this._userInitiatedRecording = userInitiated; |
| - this._model.startRecording(this._captureStacksSetting.get(), this._captureMemorySetting.get(), this._captureLayersAndPicturesSetting && this._captureLayersAndPicturesSetting.get()); |
| + this._model.startRecording(this._captureCausesSetting.get(), this._captureMemorySetting.get(), this._captureLayersAndPicturesSetting && this._captureLayersAndPicturesSetting.get()); |
| if (this._lazyFrameModel) |
| this._lazyFrameModel.setMergeRecords(false); |
| @@ -996,16 +1003,22 @@ WebInspector.TimelinePanel.prototype = { |
| { |
| var title = WebInspector.TracingTimelineUIUtils.eventStyle(event).title; |
| this.showInDetails(title, content); |
| - if (!event.picture) |
| - return; |
| - var paintProfilerView = this._paintProfilerView(); |
| - this._detailsView.appendTab("paintProfiler", WebInspector.UIString("Paint Profiler"), paintProfilerView); |
| - event.picture.requestObject(onGotObject); |
| - function onGotObject(result) |
| - { |
| - if (!result || !result["skp64"]) |
| - return; |
| - paintProfilerView.setPicture(event.thread.target(), result["skp64"]); |
| + if (event.picture) { |
| + var paintProfilerView = this._paintProfilerView(); |
| + this._detailsView.appendTab("paintProfiler", WebInspector.UIString("Paint Profiler"), paintProfilerView); |
| + event.picture.requestObject(onGotObject); |
| + function onGotObject(result) |
| + { |
| + if (!result || !result["skp64"]) |
| + return; |
| + paintProfilerView.setPicture(event.thread.target(), result["skp64"]); |
| + } |
| + } |
| + if (this._hasCauses(event)) { |
| + var causesView = this._causesView(); |
| + causesView.setContent( |
| + WebInspector.TracingTimelineUIUtils.generateCauses(event, this._detailsLinkifier)); |
| + this._detailsView.appendTab("causes", WebInspector.UIString("Causes"), causesView); |
| } |
| }, |
| @@ -1113,6 +1126,22 @@ WebInspector.TimelinePanel.prototype = { |
| this._detailsView.setContent(title, node); |
| }, |
| + /** |
| + * @param {!WebInspector.TracingModel.Event} event |
| + * @return {boolean} |
| + */ |
| + _hasCauses: function(event) |
| + { |
| + // Do not show cause data unless the setting is enabled. This gives us a |
| + // single checkbox and a consistent UI, at the cost of not showing |
| + // initiator data that might be available when the setting is disabled. |
| + if (!event || !this._captureCausesSetting.get()) |
|
caseq
2014/10/07 09:50:07
nit: drop !event check
|
| + return false; |
| + |
| + var initiatorHasStack = event.initiator && event.initiator.stackTrace; |
| + return initiatorHasStack || event.stackTrace; |
| + }, |
| + |
| __proto__: WebInspector.Panel.prototype |
| } |
| @@ -1463,3 +1492,31 @@ WebInspector.TimelinePanelFactory.prototype = { |
| return WebInspector.TimelinePanel._instance(); |
| } |
| } |
| + |
| +/** |
| + * Display information about an event's direct and indirect causes. |
| + * |
| + * @interface |
|
caseq
2014/10/07 09:50:08
s/@interface/@constructor/
|
| + * @extends {WebInspector.VBox} |
| + */ |
| +WebInspector.TimelineCausesView = function() |
| +{ |
| + WebInspector.VBox.call(this); |
| + this.element.classList.add("timeline-causes-view"); |
|
caseq
2014/10/07 09:50:07
unused?
|
| +} |
| + |
| +WebInspector.TimelineCausesView.prototype = { |
| + setContent: function(content) |
|
caseq
2014/10/07 09:50:08
Please annotate @type for content.
|
| + { |
| + this.element.removeChildren(); |
| + if (!content || !content.children || !content.children.length) { |
| + console.error("No content generator set on TimelineCausesView."); |
| + content = this.element.createChild("div", ""); |
| + content.textContent = |
| + WebInspector.UIString("No causes reported for this event."); |
| + } |
| + this.element.appendChild(content); |
|
caseq
2014/10/07 09:50:08
This will throw if (!content), so perhaps put unde
|
| + }, |
| + |
| + __proto__: WebInspector.VBox.prototype |
| +}; |