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 4eba6ced8090252ada88093c5c18b8188ffa6fb3..2bfacb47cb4437074bfbef9edf766b7de3be6296 100644 |
--- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js |
+++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js |
@@ -28,41 +28,43 @@ |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
- |
/** |
- * @constructor |
- * @extends {WebInspector.Panel} |
* @implements {WebInspector.TimelineLifecycleDelegate} |
* @implements {WebInspector.TimelineModeViewDelegate} |
* @implements {WebInspector.Searchable} |
+ * @unrestricted |
*/ |
-WebInspector.TimelinePanel = function() |
-{ |
- WebInspector.Panel.call(this, "timeline"); |
- this.registerRequiredCSS("timeline/timelinePanel.css"); |
- this.element.addEventListener("contextmenu", this._contextMenu.bind(this), false); |
- this._dropTarget = new WebInspector.DropTarget(this.element, [WebInspector.DropTarget.Types.Files, WebInspector.DropTarget.Types.URIList], WebInspector.UIString("Drop timeline file or URL here"), this._handleDrop.bind(this)); |
+WebInspector.TimelinePanel = class extends WebInspector.Panel { |
+ constructor() { |
+ super('timeline'); |
+ this.registerRequiredCSS('timeline/timelinePanel.css'); |
+ this.element.addEventListener('contextmenu', this._contextMenu.bind(this), false); |
+ this._dropTarget = new WebInspector.DropTarget( |
+ this.element, [WebInspector.DropTarget.Types.Files, WebInspector.DropTarget.Types.URIList], |
+ WebInspector.UIString('Drop timeline file or URL here'), this._handleDrop.bind(this)); |
this._state = WebInspector.TimelinePanel.State.Idle; |
this._detailsLinkifier = new WebInspector.Linkifier(); |
this._windowStartTime = 0; |
this._windowEndTime = Infinity; |
this._millisecondsToRecordAfterLoadEvent = 3000; |
- this._toggleRecordAction = /** @type {!WebInspector.Action }*/ (WebInspector.actionRegistry.action("timeline.toggle-recording")); |
+ this._toggleRecordAction = |
+ /** @type {!WebInspector.Action }*/ (WebInspector.actionRegistry.action('timeline.toggle-recording')); |
this._customCPUThrottlingRate = 0; |
/** @type {!Array<!WebInspector.TimelineModel.Filter>} */ |
this._filters = []; |
- if (!Runtime.experiments.isEnabled("timelineShowAllEvents")) { |
- this._filters.push(WebInspector.TimelineUIUtils.visibleEventsFilter()); |
- this._filters.push(new WebInspector.ExcludeTopLevelFilter()); |
+ if (!Runtime.experiments.isEnabled('timelineShowAllEvents')) { |
+ this._filters.push(WebInspector.TimelineUIUtils.visibleEventsFilter()); |
+ this._filters.push(new WebInspector.ExcludeTopLevelFilter()); |
} |
// Create models. |
- this._tracingModelBackingStorage = new WebInspector.TempFileBackingStorage("tracing"); |
+ this._tracingModelBackingStorage = new WebInspector.TempFileBackingStorage('tracing'); |
this._tracingModel = new WebInspector.TracingModel(this._tracingModelBackingStorage); |
this._model = new WebInspector.TimelineModel(WebInspector.TimelineUIUtils.visibleEventsFilter()); |
- this._frameModel = new WebInspector.TimelineFrameModel(event => WebInspector.TimelineUIUtils.eventStyle(event).category.name); |
+ this._frameModel = |
+ new WebInspector.TimelineFrameModel(event => WebInspector.TimelineUIUtils.eventStyle(event).category.name); |
this._filmStripModel = new WebInspector.FilmStripModel(this._tracingModel); |
this._irModel = new WebInspector.TimelineIRModel(); |
@@ -71,1501 +73,1451 @@ WebInspector.TimelinePanel = function() |
/** @type {!Array.<!WebInspector.TimelineModeView>} */ |
this._currentViews = []; |
- this._captureNetworkSetting = WebInspector.settings.createSetting("timelineCaptureNetwork", false); |
- this._captureJSProfileSetting = WebInspector.settings.createSetting("timelineEnableJSSampling", true); |
- this._captureMemorySetting = WebInspector.settings.createSetting("timelineCaptureMemory", false); |
- this._captureLayersAndPicturesSetting = WebInspector.settings.createSetting("timelineCaptureLayersAndPictures", false); |
- this._captureFilmStripSetting = WebInspector.settings.createSetting("timelineCaptureFilmStrip", false); |
+ this._captureNetworkSetting = WebInspector.settings.createSetting('timelineCaptureNetwork', false); |
+ this._captureJSProfileSetting = WebInspector.settings.createSetting('timelineEnableJSSampling', true); |
+ this._captureMemorySetting = WebInspector.settings.createSetting('timelineCaptureMemory', false); |
+ this._captureLayersAndPicturesSetting = |
+ WebInspector.settings.createSetting('timelineCaptureLayersAndPictures', false); |
+ this._captureFilmStripSetting = WebInspector.settings.createSetting('timelineCaptureFilmStrip', false); |
- this._panelToolbar = new WebInspector.Toolbar("", this.element); |
+ this._panelToolbar = new WebInspector.Toolbar('', this.element); |
this._createToolbarItems(); |
var timelinePane = new WebInspector.VBox(); |
timelinePane.show(this.element); |
- var topPaneElement = timelinePane.element.createChild("div", "hbox"); |
- topPaneElement.id = "timeline-overview-panel"; |
+ var topPaneElement = timelinePane.element.createChild('div', 'hbox'); |
+ topPaneElement.id = 'timeline-overview-panel'; |
// Create top overview component. |
- this._overviewPane = new WebInspector.TimelineOverviewPane("timeline"); |
- this._overviewPane.addEventListener(WebInspector.TimelineOverviewPane.Events.WindowChanged, this._onWindowChanged.bind(this)); |
+ this._overviewPane = new WebInspector.TimelineOverviewPane('timeline'); |
+ this._overviewPane.addEventListener( |
+ WebInspector.TimelineOverviewPane.Events.WindowChanged, this._onWindowChanged.bind(this)); |
this._overviewPane.show(topPaneElement); |
- this._statusPaneContainer = timelinePane.element.createChild("div", "status-pane-container fill"); |
+ this._statusPaneContainer = timelinePane.element.createChild('div', 'status-pane-container fill'); |
this._createFileSelector(); |
- WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.PageReloadRequested, this._pageReloadRequested, this); |
+ WebInspector.targetManager.addEventListener( |
+ WebInspector.TargetManager.Events.PageReloadRequested, this._pageReloadRequested, this); |
WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.Load, this._loadEventFired, this); |
// Create top level properties splitter. |
- this._detailsSplitWidget = new WebInspector.SplitWidget(false, true, "timelinePanelDetailsSplitViewState"); |
- this._detailsSplitWidget.element.classList.add("timeline-details-split"); |
+ this._detailsSplitWidget = new WebInspector.SplitWidget(false, true, 'timelinePanelDetailsSplitViewState'); |
+ this._detailsSplitWidget.element.classList.add('timeline-details-split'); |
this._detailsView = new WebInspector.TimelineDetailsView(this._model, this._filters, this); |
this._detailsSplitWidget.installResizer(this._detailsView.headerElement()); |
this._detailsSplitWidget.setSidebarWidget(this._detailsView); |
this._searchableView = new WebInspector.SearchableView(this); |
this._searchableView.setMinimumSize(0, 100); |
- this._searchableView.element.classList.add("searchable-view"); |
+ this._searchableView.element.classList.add('searchable-view'); |
this._detailsSplitWidget.setMainWidget(this._searchableView); |
this._stackView = new WebInspector.StackView(false); |
- this._stackView.element.classList.add("timeline-view-stack"); |
+ this._stackView.element.classList.add('timeline-view-stack'); |
this._stackView.show(this._searchableView.element); |
this._onModeChanged(); |
this._detailsSplitWidget.show(timelinePane.element); |
this._detailsSplitWidget.hideSidebar(); |
- WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.SuspendStateChanged, this._onSuspendStateChanged, this); |
+ WebInspector.targetManager.addEventListener( |
+ WebInspector.TargetManager.Events.SuspendStateChanged, this._onSuspendStateChanged, this); |
this._showRecordingHelpMessage(); |
/** @type {!WebInspector.TracingModel.Event}|undefined */ |
this._selectedSearchResult; |
/** @type {!Array<!WebInspector.TracingModel.Event>}|undefined */ |
this._searchResults; |
-}; |
- |
-/** |
- * @enum {string} |
- */ |
-WebInspector.TimelinePanel.Perspectives = { |
- Load: "Load", |
- Responsiveness: "Responsiveness", |
- Custom: "Custom" |
-}; |
- |
-/** |
- * @enum {string} |
- */ |
-WebInspector.TimelinePanel.DetailsTab = { |
- Details: "Details", |
- Events: "Events", |
- CallTree: "CallTree", |
- BottomUp: "BottomUp", |
- PaintProfiler: "PaintProfiler", |
- LayerViewer: "LayerViewer" |
-}; |
- |
-/** |
- * @enum {symbol} |
- */ |
-WebInspector.TimelinePanel.State = { |
- Idle: Symbol("Idle"), |
- StartPending: Symbol("StartPending"), |
- Recording: Symbol("Recording"), |
- StopPending: Symbol("StopPending"), |
- Loading: Symbol("Loading") |
-}; |
- |
-// Define row and header height, should be in sync with styles for timeline graphs. |
-WebInspector.TimelinePanel.rowHeight = 18; |
-WebInspector.TimelinePanel.headerHeight = 20; |
- |
-WebInspector.TimelinePanel.prototype = { |
- /** |
- * @override |
- * @return {?WebInspector.SearchableView} |
- */ |
- searchableView: function() |
- { |
- return this._searchableView; |
- }, |
- |
- wasShown: function() |
- { |
- WebInspector.context.setFlavor(WebInspector.TimelinePanel, this); |
- }, |
+ } |
- willHide: function() |
- { |
- WebInspector.context.setFlavor(WebInspector.TimelinePanel, null); |
- }, |
- |
- /** |
- * @return {number} |
- */ |
- windowStartTime: function() |
- { |
- if (this._windowStartTime) |
- return this._windowStartTime; |
- return this._model.minimumRecordTime(); |
- }, |
- |
- /** |
- * @return {number} |
- */ |
- windowEndTime: function() |
- { |
- if (this._windowEndTime < Infinity) |
- return this._windowEndTime; |
- return this._model.maximumRecordTime() || Infinity; |
- }, |
- |
- /** |
- * @param {!WebInspector.Event} event |
- */ |
- _onWindowChanged: function(event) |
- { |
- this._windowStartTime = event.data.startTime; |
- this._windowEndTime = event.data.endTime; |
- |
- for (var i = 0; i < this._currentViews.length; ++i) |
- this._currentViews[i].setWindowTimes(this._windowStartTime, this._windowEndTime); |
- |
- if (!this._selection || this._selection.type() === WebInspector.TimelineSelection.Type.Range) |
- this.select(null); |
- }, |
+ /** |
+ * @return {!WebInspector.TimelinePanel} |
+ */ |
+ static instance() { |
+ return /** @type {!WebInspector.TimelinePanel} */ (self.runtime.sharedInstance(WebInspector.TimelinePanel)); |
+ } |
+ |
+ /** |
+ * @override |
+ * @return {?WebInspector.SearchableView} |
+ */ |
+ searchableView() { |
+ return this._searchableView; |
+ } |
+ |
+ /** |
+ * @override |
+ */ |
+ wasShown() { |
+ WebInspector.context.setFlavor(WebInspector.TimelinePanel, this); |
+ } |
+ |
+ /** |
+ * @override |
+ */ |
+ willHide() { |
+ WebInspector.context.setFlavor(WebInspector.TimelinePanel, null); |
+ } |
+ |
+ /** |
+ * @return {number} |
+ */ |
+ windowStartTime() { |
+ if (this._windowStartTime) |
+ return this._windowStartTime; |
+ return this._model.minimumRecordTime(); |
+ } |
+ |
+ /** |
+ * @return {number} |
+ */ |
+ windowEndTime() { |
+ if (this._windowEndTime < Infinity) |
+ return this._windowEndTime; |
+ return this._model.maximumRecordTime() || Infinity; |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.Event} event |
+ */ |
+ _onWindowChanged(event) { |
+ this._windowStartTime = event.data.startTime; |
+ this._windowEndTime = event.data.endTime; |
+ |
+ for (var i = 0; i < this._currentViews.length; ++i) |
+ this._currentViews[i].setWindowTimes(this._windowStartTime, this._windowEndTime); |
+ |
+ if (!this._selection || this._selection.type() === WebInspector.TimelineSelection.Type.Range) |
+ this.select(null); |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.Event} event |
+ */ |
+ _onOverviewSelectionChanged(event) { |
+ var selection = /** @type {!WebInspector.TimelineSelection} */ (event.data); |
+ this.select(selection); |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {number} windowStartTime |
+ * @param {number} windowEndTime |
+ */ |
+ requestWindowTimes(windowStartTime, windowEndTime) { |
+ this._overviewPane.requestWindowTimes(windowStartTime, windowEndTime); |
+ } |
+ |
+ /** |
+ * @return {!WebInspector.Widget} |
+ */ |
+ _layersView() { |
+ if (this._lazyLayersView) |
+ return this._lazyLayersView; |
+ this._lazyLayersView = |
+ new WebInspector.TimelineLayersView(this._model, this._showSnapshotInPaintProfiler.bind(this)); |
+ return this._lazyLayersView; |
+ } |
+ |
+ _paintProfilerView() { |
+ if (this._lazyPaintProfilerView) |
+ return this._lazyPaintProfilerView; |
+ this._lazyPaintProfilerView = new WebInspector.TimelinePaintProfilerView(this._frameModel); |
+ return this._lazyPaintProfilerView; |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.TimelineModeView} modeView |
+ */ |
+ _addModeView(modeView) { |
+ modeView.setWindowTimes(this.windowStartTime(), this.windowEndTime()); |
+ modeView.refreshRecords(); |
+ var splitWidget = |
+ this._stackView.appendView(modeView.view(), 'timelinePanelTimelineStackSplitViewState', undefined, 112); |
+ var resizer = modeView.resizerElement(); |
+ if (splitWidget && resizer) { |
+ splitWidget.hideDefaultResizer(); |
+ splitWidget.installResizer(resizer); |
+ } |
+ this._currentViews.push(modeView); |
+ } |
- /** |
- * @param {!WebInspector.Event} event |
- */ |
- _onOverviewSelectionChanged: function(event) |
- { |
- var selection = /** @type {!WebInspector.TimelineSelection} */ (event.data); |
- this.select(selection); |
- }, |
+ _removeAllModeViews() { |
+ this._currentViews.forEach(view => view.dispose()); |
+ this._currentViews = []; |
+ this._stackView.detachChildWidgets(); |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.TimelinePanel.State} state |
+ */ |
+ _setState(state) { |
+ this._state = state; |
+ this._updateTimelineControls(); |
+ } |
+ |
+ /** |
+ * @param {string} name |
+ * @param {!WebInspector.Setting} setting |
+ * @param {string} tooltip |
+ * @return {!WebInspector.ToolbarItem} |
+ */ |
+ _createSettingCheckbox(name, setting, tooltip) { |
+ if (!this._recordingOptionUIControls) |
+ this._recordingOptionUIControls = []; |
+ var checkboxItem = new WebInspector.ToolbarCheckbox(name, tooltip, setting); |
+ this._recordingOptionUIControls.push(checkboxItem); |
+ return checkboxItem; |
+ } |
+ |
+ _createToolbarItems() { |
+ this._panelToolbar.removeToolbarItems(); |
+ |
+ var perspectiveSetting = |
+ WebInspector.settings.createSetting('timelinePerspective', WebInspector.TimelinePanel.Perspectives.Load); |
+ if (Runtime.experiments.isEnabled('timelineRecordingPerspectives')) { |
+ /** |
+ * @this {!WebInspector.TimelinePanel} |
+ */ |
+ function onPerspectiveChanged() { |
+ perspectiveSetting.set(perspectiveCombobox.selectElement().value); |
+ this._createToolbarItems(); |
+ } |
+ |
+ /** |
+ * @param {string} id |
+ * @param {string} title |
+ */ |
+ function addPerspectiveOption(id, title) { |
+ var option = perspectiveCombobox.createOption(title, '', id); |
+ perspectiveCombobox.addOption(option); |
+ if (id === perspectiveSetting.get()) |
+ perspectiveCombobox.select(option); |
+ } |
+ |
+ var perspectiveCombobox = new WebInspector.ToolbarComboBox(onPerspectiveChanged.bind(this)); |
+ addPerspectiveOption(WebInspector.TimelinePanel.Perspectives.Load, WebInspector.UIString('Page Load')); |
+ addPerspectiveOption( |
+ WebInspector.TimelinePanel.Perspectives.Responsiveness, WebInspector.UIString('Responsiveness')); |
+ addPerspectiveOption(WebInspector.TimelinePanel.Perspectives.Custom, WebInspector.UIString('Custom')); |
+ this._panelToolbar.appendToolbarItem(perspectiveCombobox); |
+ |
+ switch (perspectiveSetting.get()) { |
+ case WebInspector.TimelinePanel.Perspectives.Load: |
+ this._captureNetworkSetting.set(true); |
+ this._captureJSProfileSetting.set(true); |
+ this._captureMemorySetting.set(false); |
+ this._captureLayersAndPicturesSetting.set(false); |
+ this._captureFilmStripSetting.set(true); |
+ break; |
+ case WebInspector.TimelinePanel.Perspectives.Responsiveness: |
+ this._captureNetworkSetting.set(true); |
+ this._captureJSProfileSetting.set(true); |
+ this._captureMemorySetting.set(false); |
+ this._captureLayersAndPicturesSetting.set(false); |
+ this._captureFilmStripSetting.set(false); |
+ break; |
+ } |
+ } |
+ if (Runtime.experiments.isEnabled('timelineRecordingPerspectives') && |
+ perspectiveSetting.get() === WebInspector.TimelinePanel.Perspectives.Load) { |
+ this._reloadButton = |
+ new WebInspector.ToolbarButton(WebInspector.UIString('Record & Reload'), 'refresh-toolbar-item'); |
+ this._reloadButton.addEventListener('click', () => WebInspector.targetManager.reloadPage()); |
+ this._panelToolbar.appendToolbarItem(this._reloadButton); |
+ } else { |
+ this._panelToolbar.appendToolbarItem(WebInspector.Toolbar.createActionButton(this._toggleRecordAction)); |
+ } |
- /** |
- * @override |
- * @param {number} windowStartTime |
- * @param {number} windowEndTime |
- */ |
- requestWindowTimes: function(windowStartTime, windowEndTime) |
- { |
- this._overviewPane.requestWindowTimes(windowStartTime, windowEndTime); |
- }, |
+ this._updateTimelineControls(); |
+ var clearButton = new WebInspector.ToolbarButton(WebInspector.UIString('Clear recording'), 'clear-toolbar-item'); |
+ clearButton.addEventListener('click', this._clear, this); |
+ this._panelToolbar.appendToolbarItem(clearButton); |
+ |
+ this._panelToolbar.appendSeparator(); |
+ |
+ this._panelToolbar.appendText(WebInspector.UIString('Capture:')); |
+ |
+ var screenshotCheckbox = this._createSettingCheckbox( |
+ WebInspector.UIString('Screenshots'), this._captureFilmStripSetting, |
+ WebInspector.UIString('Capture screenshots while recording. (Has small performance overhead)')); |
+ |
+ if (!Runtime.experiments.isEnabled('timelineRecordingPerspectives') || |
+ perspectiveSetting.get() === WebInspector.TimelinePanel.Perspectives.Custom) { |
+ this._panelToolbar.appendToolbarItem(this._createSettingCheckbox( |
+ WebInspector.UIString('Network'), this._captureNetworkSetting, |
+ WebInspector.UIString('Show network requests information'))); |
+ this._panelToolbar.appendToolbarItem(this._createSettingCheckbox( |
+ WebInspector.UIString('JS Profile'), this._captureJSProfileSetting, |
+ WebInspector.UIString('Capture JavaScript stacks with sampling profiler. (Has small performance overhead)'))); |
+ this._panelToolbar.appendToolbarItem(screenshotCheckbox); |
+ this._panelToolbar.appendToolbarItem(this._createSettingCheckbox( |
+ WebInspector.UIString('Memory'), this._captureMemorySetting, |
+ WebInspector.UIString('Capture memory information on every timeline event.'))); |
+ this._panelToolbar.appendToolbarItem(this._createSettingCheckbox( |
+ WebInspector.UIString('Paint'), this._captureLayersAndPicturesSetting, |
+ WebInspector.UIString( |
+ 'Capture graphics layer positions and rasterization draw calls. (Has large performance overhead)'))); |
+ } else { |
+ this._panelToolbar.appendToolbarItem(screenshotCheckbox); |
+ } |
- /** |
- * @return {!WebInspector.Widget} |
- */ |
- _layersView: function() |
- { |
- if (this._lazyLayersView) |
- return this._lazyLayersView; |
- this._lazyLayersView = new WebInspector.TimelineLayersView(this._model, this._showSnapshotInPaintProfiler.bind(this)); |
- return this._lazyLayersView; |
- }, |
- |
- _paintProfilerView: function() |
- { |
- if (this._lazyPaintProfilerView) |
- return this._lazyPaintProfilerView; |
- this._lazyPaintProfilerView = new WebInspector.TimelinePaintProfilerView(this._frameModel); |
- return this._lazyPaintProfilerView; |
- }, |
+ this._captureNetworkSetting.addChangeListener(this._onNetworkChanged, this); |
+ this._captureMemorySetting.addChangeListener(this._onModeChanged, this); |
+ this._captureFilmStripSetting.addChangeListener(this._onModeChanged, this); |
- /** |
- * @param {!WebInspector.TimelineModeView} modeView |
- */ |
- _addModeView: function(modeView) |
- { |
- modeView.setWindowTimes(this.windowStartTime(), this.windowEndTime()); |
- modeView.refreshRecords(); |
- var splitWidget = this._stackView.appendView(modeView.view(), "timelinePanelTimelineStackSplitViewState", undefined, 112); |
- var resizer = modeView.resizerElement(); |
- if (splitWidget && resizer) { |
- splitWidget.hideDefaultResizer(); |
- splitWidget.installResizer(resizer); |
- } |
- this._currentViews.push(modeView); |
- }, |
+ this._panelToolbar.appendSeparator(); |
+ var garbageCollectButton = |
+ new WebInspector.ToolbarButton(WebInspector.UIString('Collect garbage'), 'garbage-collect-toolbar-item'); |
+ garbageCollectButton.addEventListener('click', this._garbageCollectButtonClicked, this); |
+ this._panelToolbar.appendToolbarItem(garbageCollectButton); |
- _removeAllModeViews: function() |
- { |
- this._currentViews.forEach(view => view.dispose()); |
- this._currentViews = []; |
- this._stackView.detachChildWidgets(); |
- }, |
- |
- /** |
- * @param {!WebInspector.TimelinePanel.State} state |
- */ |
- _setState: function(state) |
- { |
- this._state = state; |
- this._updateTimelineControls(); |
- }, |
+ this._panelToolbar.appendSeparator(); |
+ this._cpuThrottlingCombobox = new WebInspector.ToolbarComboBox(this._onCPUThrottlingChanged.bind(this)); |
+ this._panelToolbar.appendToolbarItem(this._cpuThrottlingCombobox); |
+ this._populateCPUThrottingCombobox(); |
+ } |
+ _populateCPUThrottingCombobox() { |
+ var cpuThrottlingCombobox = this._cpuThrottlingCombobox; |
+ cpuThrottlingCombobox.removeOptions(); |
+ var currentRate = this._cpuThrottlingManager.rate(); |
+ var hasSelection = false; |
/** |
* @param {string} name |
- * @param {!WebInspector.Setting} setting |
- * @param {string} tooltip |
- * @return {!WebInspector.ToolbarItem} |
- */ |
- _createSettingCheckbox: function(name, setting, tooltip) |
- { |
- if (!this._recordingOptionUIControls) |
- this._recordingOptionUIControls = []; |
- var checkboxItem = new WebInspector.ToolbarCheckbox(name, tooltip, setting); |
- this._recordingOptionUIControls.push(checkboxItem); |
- return checkboxItem; |
- }, |
- |
- _createToolbarItems: function() |
- { |
- this._panelToolbar.removeToolbarItems(); |
- |
- var perspectiveSetting = WebInspector.settings.createSetting("timelinePerspective", WebInspector.TimelinePanel.Perspectives.Load); |
- if (Runtime.experiments.isEnabled("timelineRecordingPerspectives")) { |
- /** |
- * @this {!WebInspector.TimelinePanel} |
- */ |
- function onPerspectiveChanged() |
- { |
- perspectiveSetting.set(perspectiveCombobox.selectElement().value); |
- this._createToolbarItems(); |
- } |
- |
- /** |
- * @param {string} id |
- * @param {string} title |
- */ |
- function addPerspectiveOption(id, title) |
- { |
- var option = perspectiveCombobox.createOption(title, "", id); |
- perspectiveCombobox.addOption(option); |
- if (id === perspectiveSetting.get()) |
- perspectiveCombobox.select(option); |
- } |
- |
- var perspectiveCombobox = new WebInspector.ToolbarComboBox(onPerspectiveChanged.bind(this)); |
- addPerspectiveOption(WebInspector.TimelinePanel.Perspectives.Load, WebInspector.UIString("Page Load")); |
- addPerspectiveOption(WebInspector.TimelinePanel.Perspectives.Responsiveness, WebInspector.UIString("Responsiveness")); |
- addPerspectiveOption(WebInspector.TimelinePanel.Perspectives.Custom, WebInspector.UIString("Custom")); |
- this._panelToolbar.appendToolbarItem(perspectiveCombobox); |
- |
- switch (perspectiveSetting.get()) { |
- case WebInspector.TimelinePanel.Perspectives.Load: |
- this._captureNetworkSetting.set(true); |
- this._captureJSProfileSetting.set(true); |
- this._captureMemorySetting.set(false); |
- this._captureLayersAndPicturesSetting.set(false); |
- this._captureFilmStripSetting.set(true); |
- break; |
- case WebInspector.TimelinePanel.Perspectives.Responsiveness: |
- this._captureNetworkSetting.set(true); |
- this._captureJSProfileSetting.set(true); |
- this._captureMemorySetting.set(false); |
- this._captureLayersAndPicturesSetting.set(false); |
- this._captureFilmStripSetting.set(false); |
- break; |
- } |
- } |
- if (Runtime.experiments.isEnabled("timelineRecordingPerspectives") && perspectiveSetting.get() === WebInspector.TimelinePanel.Perspectives.Load) { |
- this._reloadButton = new WebInspector.ToolbarButton(WebInspector.UIString("Record & Reload"), "refresh-toolbar-item"); |
- this._reloadButton.addEventListener("click", () => WebInspector.targetManager.reloadPage()); |
- this._panelToolbar.appendToolbarItem(this._reloadButton); |
- } else { |
- this._panelToolbar.appendToolbarItem(WebInspector.Toolbar.createActionButton(this._toggleRecordAction)); |
- } |
- |
- this._updateTimelineControls(); |
- var clearButton = new WebInspector.ToolbarButton(WebInspector.UIString("Clear recording"), "clear-toolbar-item"); |
- clearButton.addEventListener("click", this._clear, this); |
- this._panelToolbar.appendToolbarItem(clearButton); |
- |
- this._panelToolbar.appendSeparator(); |
- |
- this._panelToolbar.appendText(WebInspector.UIString("Capture:")); |
- |
- var screenshotCheckbox = this._createSettingCheckbox( |
- WebInspector.UIString("Screenshots"), this._captureFilmStripSetting, WebInspector.UIString("Capture screenshots while recording. (Has small performance overhead)")); |
- |
- if (!Runtime.experiments.isEnabled("timelineRecordingPerspectives") || perspectiveSetting.get() === WebInspector.TimelinePanel.Perspectives.Custom) { |
- this._panelToolbar.appendToolbarItem(this._createSettingCheckbox( |
- WebInspector.UIString("Network"), this._captureNetworkSetting, WebInspector.UIString("Show network requests information"))); |
- this._panelToolbar.appendToolbarItem(this._createSettingCheckbox( |
- WebInspector.UIString("JS Profile"), this._captureJSProfileSetting, WebInspector.UIString("Capture JavaScript stacks with sampling profiler. (Has small performance overhead)"))); |
- this._panelToolbar.appendToolbarItem(screenshotCheckbox); |
- this._panelToolbar.appendToolbarItem(this._createSettingCheckbox( |
- WebInspector.UIString("Memory"), this._captureMemorySetting, WebInspector.UIString("Capture memory information on every timeline event."))); |
- this._panelToolbar.appendToolbarItem(this._createSettingCheckbox( |
- WebInspector.UIString("Paint"), this._captureLayersAndPicturesSetting, WebInspector.UIString("Capture graphics layer positions and rasterization draw calls. (Has large performance overhead)"))); |
- } else { |
- this._panelToolbar.appendToolbarItem(screenshotCheckbox); |
- } |
- |
- this._captureNetworkSetting.addChangeListener(this._onNetworkChanged, this); |
- this._captureMemorySetting.addChangeListener(this._onModeChanged, this); |
- this._captureFilmStripSetting.addChangeListener(this._onModeChanged, this); |
- |
- this._panelToolbar.appendSeparator(); |
- var garbageCollectButton = new WebInspector.ToolbarButton(WebInspector.UIString("Collect garbage"), "garbage-collect-toolbar-item"); |
- garbageCollectButton.addEventListener("click", this._garbageCollectButtonClicked, this); |
- this._panelToolbar.appendToolbarItem(garbageCollectButton); |
- |
- this._panelToolbar.appendSeparator(); |
- this._cpuThrottlingCombobox = new WebInspector.ToolbarComboBox(this._onCPUThrottlingChanged.bind(this)); |
- this._panelToolbar.appendToolbarItem(this._cpuThrottlingCombobox); |
- this._populateCPUThrottingCombobox(); |
- }, |
- |
- _populateCPUThrottingCombobox: function() |
- { |
- var cpuThrottlingCombobox = this._cpuThrottlingCombobox; |
- cpuThrottlingCombobox.removeOptions(); |
- var currentRate = this._cpuThrottlingManager.rate(); |
- var hasSelection = false; |
- /** |
- * @param {string} name |
- * @param {number} value |
- */ |
- function addGroupingOption(name, value) |
- { |
- var option = cpuThrottlingCombobox.createOption(name, "", String(value)); |
- cpuThrottlingCombobox.addOption(option); |
- if (hasSelection || (value && value !== currentRate)) |
- return; |
- cpuThrottlingCombobox.select(option); |
- hasSelection = true; |
- } |
- var predefinedRates = new Map([ |
- [1, WebInspector.UIString("No CPU throttling")], |
- [2, WebInspector.UIString("High end device (2\xD7 slowdown)")], |
- [5, WebInspector.UIString("Low end device (5\xD7 slowdown)")] |
- ]); |
- for (var rate of predefinedRates) |
- addGroupingOption(rate[1], rate[0]); |
- if (this._customCPUThrottlingRate && !predefinedRates.has(this._customCPUThrottlingRate)) |
- addGroupingOption(WebInspector.UIString("Custom rate (%d\xD7 slowdown)", this._customCPUThrottlingRate), this._customCPUThrottlingRate); |
- addGroupingOption(WebInspector.UIString("Set custom rate\u2026"), 0); |
- }, |
- |
- _prepareToLoadTimeline: function() |
- { |
- console.assert(this._state === WebInspector.TimelinePanel.State.Idle); |
- this._setState(WebInspector.TimelinePanel.State.Loading); |
- }, |
- |
- _createFileSelector: function() |
- { |
- if (this._fileSelectorElement) |
- this._fileSelectorElement.remove(); |
- this._fileSelectorElement = WebInspector.createFileSelectorElement(this._loadFromFile.bind(this)); |
- this.element.appendChild(this._fileSelectorElement); |
- }, |
- |
- /** |
- * @param {!Event} event |
- */ |
- _contextMenu: function(event) |
- { |
- var contextMenu = new WebInspector.ContextMenu(event); |
- contextMenu.appendItemsAtLocation("timelineMenu"); |
- contextMenu.show(); |
- }, |
- |
- /** |
- * @return {boolean} |
- */ |
- _saveToFile: function() |
- { |
- if (this._state !== WebInspector.TimelinePanel.State.Idle) |
- return true; |
- if (this._model.isEmpty()) |
- return true; |
- |
- var now = new Date(); |
- var fileName = "TimelineRawData-" + now.toISO8601Compact() + ".json"; |
- var stream = new WebInspector.FileOutputStream(); |
- |
- /** |
- * @param {boolean} accepted |
- * @this {WebInspector.TimelinePanel} |
- */ |
- function callback(accepted) |
- { |
- if (!accepted) |
- return; |
- var saver = new WebInspector.TracingTimelineSaver(); |
- this._tracingModelBackingStorage.writeToStream(stream, saver); |
- } |
- stream.open(fileName, callback.bind(this)); |
- return true; |
- }, |
- |
- /** |
- * @return {boolean} |
- */ |
- _selectFileToLoad: function() |
- { |
- this._fileSelectorElement.click(); |
- return true; |
- }, |
- |
- /** |
- * @param {!File} file |
- */ |
- _loadFromFile: function(file) |
- { |
- if (this._state !== WebInspector.TimelinePanel.State.Idle) |
- return; |
- this._prepareToLoadTimeline(); |
- this._loader = WebInspector.TimelineLoader.loadFromFile(this._tracingModel, file, this); |
- this._createFileSelector(); |
- }, |
- |
- /** |
- * @param {string} url |
+ * @param {number} value |
*/ |
- _loadFromURL: function(url) |
- { |
- if (this._state !== WebInspector.TimelinePanel.State.Idle) |
- return; |
- this._prepareToLoadTimeline(); |
- this._loader = WebInspector.TimelineLoader.loadFromURL(this._tracingModel, url, this); |
- }, |
- |
- _refreshViews: function() |
- { |
- for (var i = 0; i < this._currentViews.length; ++i) { |
- var view = this._currentViews[i]; |
- view.refreshRecords(); |
- } |
- this._updateSelectionDetails(); |
- }, |
- |
- _onModeChanged: function() |
- { |
- // Set up overview controls. |
- this._overviewControls = []; |
- this._overviewControls.push(new WebInspector.TimelineEventOverview.Responsiveness(this._model, this._frameModel)); |
- if (Runtime.experiments.isEnabled("inputEventsOnTimelineOverview")) |
- this._overviewControls.push(new WebInspector.TimelineEventOverview.Input(this._model)); |
- this._overviewControls.push(new WebInspector.TimelineEventOverview.Frames(this._model, this._frameModel)); |
- this._overviewControls.push(new WebInspector.TimelineEventOverview.CPUActivity(this._model)); |
- this._overviewControls.push(new WebInspector.TimelineEventOverview.Network(this._model)); |
- if (this._captureFilmStripSetting.get()) |
- this._overviewControls.push(new WebInspector.TimelineFilmStripOverview(this._model, this._filmStripModel)); |
- if (this._captureMemorySetting.get()) |
- this._overviewControls.push(new WebInspector.TimelineEventOverview.Memory(this._model)); |
- this._overviewPane.setOverviewControls(this._overviewControls); |
- |
- // Set up the main view. |
- this._removeAllModeViews(); |
- this._flameChart = new WebInspector.TimelineFlameChartView(this, this._model, this._frameModel, this._irModel, this._filters); |
- this._flameChart.enableNetworkPane(this._captureNetworkSetting.get()); |
- this._addModeView(this._flameChart); |
- |
- if (this._captureMemorySetting.get()) |
- this._addModeView(new WebInspector.MemoryCountersGraph(this, this._model, [WebInspector.TimelineUIUtils.visibleEventsFilter()])); |
- |
- this.doResize(); |
- this.select(null); |
- }, |
- |
- _onNetworkChanged: function() |
- { |
- if (this._flameChart) |
- this._flameChart.enableNetworkPane(this._captureNetworkSetting.get(), true); |
- }, |
- |
- _onCPUThrottlingChanged: function() |
- { |
- if (!this._cpuThrottlingManager) |
- return; |
- var value = this._cpuThrottlingCombobox.selectedOption().value; |
- var isLastOption = this._cpuThrottlingCombobox.selectedIndex() === this._cpuThrottlingCombobox.size() - 1; |
+ function addGroupingOption(name, value) { |
+ var option = cpuThrottlingCombobox.createOption(name, '', String(value)); |
+ cpuThrottlingCombobox.addOption(option); |
+ if (hasSelection || (value && value !== currentRate)) |
+ return; |
+ cpuThrottlingCombobox.select(option); |
+ hasSelection = true; |
+ } |
+ var predefinedRates = new Map([ |
+ [1, WebInspector.UIString('No CPU throttling')], [2, WebInspector.UIString('High end device (2\xD7 slowdown)')], |
+ [5, WebInspector.UIString('Low end device (5\xD7 slowdown)')] |
+ ]); |
+ for (var rate of predefinedRates) |
+ addGroupingOption(rate[1], rate[0]); |
+ if (this._customCPUThrottlingRate && !predefinedRates.has(this._customCPUThrottlingRate)) |
+ addGroupingOption( |
+ WebInspector.UIString('Custom rate (%d\xD7 slowdown)', this._customCPUThrottlingRate), |
+ this._customCPUThrottlingRate); |
+ addGroupingOption(WebInspector.UIString('Set custom rate\u2026'), 0); |
+ } |
+ |
+ _prepareToLoadTimeline() { |
+ console.assert(this._state === WebInspector.TimelinePanel.State.Idle); |
+ this._setState(WebInspector.TimelinePanel.State.Loading); |
+ } |
+ |
+ _createFileSelector() { |
+ if (this._fileSelectorElement) |
+ this._fileSelectorElement.remove(); |
+ this._fileSelectorElement = WebInspector.createFileSelectorElement(this._loadFromFile.bind(this)); |
+ this.element.appendChild(this._fileSelectorElement); |
+ } |
+ |
+ /** |
+ * @param {!Event} event |
+ */ |
+ _contextMenu(event) { |
+ var contextMenu = new WebInspector.ContextMenu(event); |
+ contextMenu.appendItemsAtLocation('timelineMenu'); |
+ contextMenu.show(); |
+ } |
+ |
+ /** |
+ * @return {boolean} |
+ */ |
+ _saveToFile() { |
+ if (this._state !== WebInspector.TimelinePanel.State.Idle) |
+ return true; |
+ if (this._model.isEmpty()) |
+ return true; |
+ |
+ var now = new Date(); |
+ var fileName = 'TimelineRawData-' + now.toISO8601Compact() + '.json'; |
+ var stream = new WebInspector.FileOutputStream(); |
+ |
+ /** |
+ * @param {boolean} accepted |
+ * @this {WebInspector.TimelinePanel} |
+ */ |
+ function callback(accepted) { |
+ if (!accepted) |
+ return; |
+ var saver = new WebInspector.TracingTimelineSaver(); |
+ this._tracingModelBackingStorage.writeToStream(stream, saver); |
+ } |
+ stream.open(fileName, callback.bind(this)); |
+ return true; |
+ } |
+ |
+ /** |
+ * @return {boolean} |
+ */ |
+ _selectFileToLoad() { |
+ this._fileSelectorElement.click(); |
+ return true; |
+ } |
+ |
+ /** |
+ * @param {!File} file |
+ */ |
+ _loadFromFile(file) { |
+ if (this._state !== WebInspector.TimelinePanel.State.Idle) |
+ return; |
+ this._prepareToLoadTimeline(); |
+ this._loader = WebInspector.TimelineLoader.loadFromFile(this._tracingModel, file, this); |
+ this._createFileSelector(); |
+ } |
+ |
+ /** |
+ * @param {string} url |
+ */ |
+ _loadFromURL(url) { |
+ if (this._state !== WebInspector.TimelinePanel.State.Idle) |
+ return; |
+ this._prepareToLoadTimeline(); |
+ this._loader = WebInspector.TimelineLoader.loadFromURL(this._tracingModel, url, this); |
+ } |
+ |
+ _refreshViews() { |
+ for (var i = 0; i < this._currentViews.length; ++i) { |
+ var view = this._currentViews[i]; |
+ view.refreshRecords(); |
+ } |
+ this._updateSelectionDetails(); |
+ } |
+ |
+ _onModeChanged() { |
+ // Set up overview controls. |
+ this._overviewControls = []; |
+ this._overviewControls.push(new WebInspector.TimelineEventOverviewResponsiveness(this._model, this._frameModel)); |
+ if (Runtime.experiments.isEnabled('inputEventsOnTimelineOverview')) |
+ this._overviewControls.push(new WebInspector.TimelineEventOverviewInput(this._model)); |
+ this._overviewControls.push(new WebInspector.TimelineEventOverviewFrames(this._model, this._frameModel)); |
+ this._overviewControls.push(new WebInspector.TimelineEventOverviewCPUActivity(this._model)); |
+ this._overviewControls.push(new WebInspector.TimelineEventOverviewNetwork(this._model)); |
+ if (this._captureFilmStripSetting.get()) |
+ this._overviewControls.push(new WebInspector.TimelineFilmStripOverview(this._model, this._filmStripModel)); |
+ if (this._captureMemorySetting.get()) |
+ this._overviewControls.push(new WebInspector.TimelineEventOverviewMemory(this._model)); |
+ this._overviewPane.setOverviewControls(this._overviewControls); |
+ |
+ // Set up the main view. |
+ this._removeAllModeViews(); |
+ this._flameChart = |
+ new WebInspector.TimelineFlameChartView(this, this._model, this._frameModel, this._irModel, this._filters); |
+ this._flameChart.enableNetworkPane(this._captureNetworkSetting.get()); |
+ this._addModeView(this._flameChart); |
+ |
+ if (this._captureMemorySetting.get()) |
+ this._addModeView(new WebInspector.MemoryCountersGraph( |
+ this, this._model, [WebInspector.TimelineUIUtils.visibleEventsFilter()])); |
+ |
+ this.doResize(); |
+ this.select(null); |
+ } |
+ |
+ _onNetworkChanged() { |
+ if (this._flameChart) |
+ this._flameChart.enableNetworkPane(this._captureNetworkSetting.get(), true); |
+ } |
+ |
+ _onCPUThrottlingChanged() { |
+ if (!this._cpuThrottlingManager) |
+ return; |
+ var value = this._cpuThrottlingCombobox.selectedOption().value; |
+ var isLastOption = this._cpuThrottlingCombobox.selectedIndex() === this._cpuThrottlingCombobox.size() - 1; |
+ this._populateCPUThrottingCombobox(); |
+ var resultPromise = isLastOption ? |
+ WebInspector.TimelinePanel.CustomCPUThrottlingRateDialog.show(this._cpuThrottlingCombobox.element) : |
+ Promise.resolve(value); |
+ resultPromise.then(text => { |
+ var value = Number.parseFloat(text); |
+ if (value >= 1) { |
+ if (isLastOption) |
+ this._customCPUThrottlingRate = value; |
+ this._cpuThrottlingManager.setRate(value); |
this._populateCPUThrottingCombobox(); |
- var resultPromise = isLastOption |
- ? WebInspector.TimelinePanel.CustomCPUThrottlingRateDialog.show(this._cpuThrottlingCombobox.element) |
- : Promise.resolve(value); |
- resultPromise.then(text => { |
- var value = Number.parseFloat(text); |
- if (value >= 1) { |
- if (isLastOption) |
- this._customCPUThrottlingRate = value; |
- this._cpuThrottlingManager.setRate(value); |
- this._populateCPUThrottingCombobox(); |
- } |
- }); |
- }, |
- |
- /** |
- * @param {boolean} enabled |
- */ |
- _setUIControlsEnabled: function(enabled) |
- { |
- /** |
- * @param {!WebInspector.ToolbarButton} toolbarButton |
- */ |
- function handler(toolbarButton) |
- { |
- toolbarButton.setEnabled(enabled); |
- } |
- this._recordingOptionUIControls.forEach(handler); |
- }, |
- |
- /** |
- * @param {boolean} userInitiated |
- */ |
- _startRecording: function(userInitiated) |
- { |
- console.assert(!this._statusPane, "Status pane is already opened."); |
- var mainTarget = WebInspector.targetManager.mainTarget(); |
- if (!mainTarget) |
- return; |
- this._setState(WebInspector.TimelinePanel.State.StartPending); |
- this._showRecordingStarted(); |
- |
- this._autoRecordGeneration = userInitiated ? null : Symbol("Generation"); |
- this._controller = new WebInspector.TimelineController(mainTarget, this, this._tracingModel); |
- this._controller.startRecording(true, this._captureJSProfileSetting.get(), this._captureMemorySetting.get(), this._captureLayersAndPicturesSetting.get(), this._captureFilmStripSetting && this._captureFilmStripSetting.get()); |
- |
- for (var i = 0; i < this._overviewControls.length; ++i) |
- this._overviewControls[i].timelineStarted(); |
- |
- if (userInitiated) |
- WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.TimelineStarted); |
- this._setUIControlsEnabled(false); |
- this._hideRecordingHelpMessage(); |
- }, |
- |
- _stopRecording: function() |
- { |
- if (this._statusPane) { |
- this._statusPane.finish(); |
- this._statusPane.updateStatus(WebInspector.UIString("Stopping timeline\u2026")); |
- this._statusPane.updateProgressBar(WebInspector.UIString("Received"), 0); |
- } |
- this._setState(WebInspector.TimelinePanel.State.StopPending); |
- this._autoRecordGeneration = null; |
- this._controller.stopRecording(); |
- this._controller = null; |
- this._setUIControlsEnabled(true); |
- }, |
- |
- _onSuspendStateChanged: function() |
- { |
- this._updateTimelineControls(); |
- }, |
- |
- _updateTimelineControls: function() |
- { |
- var state = WebInspector.TimelinePanel.State; |
- this._toggleRecordAction.setToggled(this._state === state.Recording); |
- this._toggleRecordAction.setEnabled(this._state === state.Recording || this._state === state.Idle); |
- this._panelToolbar.setEnabled(this._state !== state.Loading); |
- this._dropTarget.setEnabled(this._state === state.Idle); |
- }, |
- |
- _toggleRecording: function() |
- { |
- if (this._state === WebInspector.TimelinePanel.State.Idle) |
- this._startRecording(true); |
- else if (this._state === WebInspector.TimelinePanel.State.Recording) |
- this._stopRecording(); |
- }, |
- |
- _garbageCollectButtonClicked: function() |
- { |
- var targets = WebInspector.targetManager.targets(); |
- for (var i = 0; i < targets.length; ++i) |
- targets[i].heapProfilerAgent().collectGarbage(); |
- }, |
- |
- _clear: function() |
- { |
- WebInspector.LineLevelProfile.instance().reset(); |
- this._tracingModel.reset(); |
- this._model.reset(); |
- this._showRecordingHelpMessage(); |
- |
- this.requestWindowTimes(0, Infinity); |
- delete this._selection; |
- this._frameModel.reset(); |
- this._filmStripModel.reset(this._tracingModel); |
- this._overviewPane.reset(); |
- for (var i = 0; i < this._currentViews.length; ++i) |
- this._currentViews[i].reset(); |
- for (var i = 0; i < this._overviewControls.length; ++i) |
- this._overviewControls[i].reset(); |
- this.select(null); |
- this._detailsSplitWidget.hideSidebar(); |
- }, |
- |
- /** |
- * @override |
- */ |
- recordingStarted: function() |
- { |
- this._clear(); |
- this._setState(WebInspector.TimelinePanel.State.Recording); |
- this._showRecordingStarted(); |
- this._statusPane.updateStatus(WebInspector.UIString("Recording\u2026")); |
- this._statusPane.updateProgressBar(WebInspector.UIString("Buffer usage"), 0); |
- this._statusPane.startTimer(); |
- this._hideRecordingHelpMessage(); |
- }, |
- |
- /** |
- * @override |
- * @param {number} usage |
- */ |
- recordingProgress: function(usage) |
- { |
- this._statusPane.updateProgressBar(WebInspector.UIString("Buffer usage"), usage * 100); |
- }, |
- |
- _showRecordingHelpMessage: function() |
- { |
- /** |
- * @param {string} tagName |
- * @param {string} contents |
- * @return {!Element} |
- */ |
- function encloseWithTag(tagName, contents) |
- { |
- var e = createElement(tagName); |
- e.textContent = contents; |
- return e; |
- } |
- |
- var recordNode = encloseWithTag("b", WebInspector.shortcutRegistry.shortcutDescriptorsForAction("timeline.toggle-recording")[0].name); |
- var reloadNode = encloseWithTag("b", WebInspector.shortcutRegistry.shortcutDescriptorsForAction("main.reload")[0].name); |
- var navigateNode = encloseWithTag("b", WebInspector.UIString("WASD (ZQSD)")); |
- var hintText = createElementWithClass("div"); |
- hintText.appendChild(WebInspector.formatLocalized("To capture a new timeline, click the record toolbar button or hit %s.", [recordNode])); |
- hintText.createChild("br"); |
- hintText.appendChild(WebInspector.formatLocalized("To evaluate page load performance, hit %s to record the reload.", [reloadNode])); |
- hintText.createChild("p"); |
- hintText.appendChild(WebInspector.formatLocalized("After recording, select an area of interest in the overview by dragging.", [])); |
- hintText.createChild("br"); |
- hintText.appendChild(WebInspector.formatLocalized("Then, zoom and pan the timeline with the mousewheel and %s keys.", [navigateNode])); |
- this._hideRecordingHelpMessage(); |
- this._helpMessageElement = this._searchableView.element.createChild("div", "full-widget-dimmed-banner timeline-status-pane"); |
- this._helpMessageElement.appendChild(hintText); |
- }, |
- |
- _hideRecordingHelpMessage: function() |
- { |
- if (this._helpMessageElement) |
- this._helpMessageElement.remove(); |
- delete this._helpMessageElement; |
- }, |
- |
- /** |
- * @override |
- */ |
- loadingStarted: function() |
- { |
- this._hideRecordingHelpMessage(); |
- |
- if (this._statusPane) |
- this._statusPane.hide(); |
- this._statusPane = new WebInspector.TimelinePanel.StatusPane(false, this._cancelLoading.bind(this)); |
- this._statusPane.showPane(this._statusPaneContainer); |
- this._statusPane.updateStatus(WebInspector.UIString("Loading timeline\u2026")); |
- // FIXME: make loading from backend cancelable as well. |
- if (!this._loader) |
- this._statusPane.finish(); |
- this.loadingProgress(0); |
- }, |
+ } |
+ }); |
+ } |
+ /** |
+ * @param {boolean} enabled |
+ */ |
+ _setUIControlsEnabled(enabled) { |
/** |
- * @override |
- * @param {number=} progress |
+ * @param {!WebInspector.ToolbarButton} toolbarButton |
*/ |
- loadingProgress: function(progress) |
- { |
- if (typeof progress === "number") |
- this._statusPane.updateProgressBar(WebInspector.UIString("Received"), progress * 100); |
- }, |
- |
- /** |
- * @override |
- * @param {boolean} success |
- */ |
- loadingComplete: function(success) |
- { |
- var loadedFromFile = !!this._loader; |
- delete this._loader; |
- this._setState(WebInspector.TimelinePanel.State.Idle); |
- |
- if (!success) { |
- this._statusPane.hide(); |
- delete this._statusPane; |
- this._clear(); |
- return; |
- } |
- |
- if (this._statusPane) |
- this._statusPane.updateStatus(WebInspector.UIString("Processing timeline\u2026")); |
- this._model.setEvents(this._tracingModel, loadedFromFile); |
- this._frameModel.reset(); |
- this._frameModel.addTraceEvents(WebInspector.targetManager.mainTarget(), this._model.inspectedTargetEvents(), this._model.sessionId() || ""); |
- this._filmStripModel.reset(this._tracingModel); |
- var groups = WebInspector.TimelineModel.AsyncEventGroup; |
- var asyncEventsByGroup = this._model.mainThreadAsyncEvents(); |
- this._irModel.populate(asyncEventsByGroup.get(groups.input), asyncEventsByGroup.get(groups.animation)); |
- this._model.cpuProfiles().forEach(profile => WebInspector.LineLevelProfile.instance().appendCPUProfile(profile)); |
- if (this._statusPane) |
- this._statusPane.hide(); |
- delete this._statusPane; |
- this._overviewPane.reset(); |
- this._overviewPane.setBounds(this._model.minimumRecordTime(), this._model.maximumRecordTime()); |
- this._setAutoWindowTimes(); |
- this._refreshViews(); |
- for (var i = 0; i < this._overviewControls.length; ++i) |
- this._overviewControls[i].timelineStopped(); |
- this._setMarkers(); |
- this._overviewPane.scheduleUpdate(); |
- this._updateSearchHighlight(false, true); |
- this._detailsSplitWidget.showBoth(); |
- }, |
- |
- _showRecordingStarted: function() |
- { |
- if (this._statusPane) |
- return; |
- this._statusPane = new WebInspector.TimelinePanel.StatusPane(true, this._stopRecording.bind(this)); |
- this._statusPane.showPane(this._statusPaneContainer); |
- this._statusPane.updateStatus(WebInspector.UIString("Initializing recording\u2026")); |
- }, |
- |
- _cancelLoading: function() |
- { |
- if (this._loader) |
- this._loader.cancel(); |
- }, |
- |
- _setMarkers: function() |
- { |
- var markers = new Map(); |
- var recordTypes = WebInspector.TimelineModel.RecordType; |
- var zeroTime = this._model.minimumRecordTime(); |
- for (var record of this._model.eventDividerRecords()) { |
- if (record.type() === recordTypes.TimeStamp || record.type() === recordTypes.ConsoleTime) |
- continue; |
- markers.set(record.startTime(), WebInspector.TimelineUIUtils.createDividerForRecord(record, zeroTime, 0)); |
- } |
- this._overviewPane.setMarkers(markers); |
- }, |
- |
- /** |
- * @param {!WebInspector.Event} event |
- */ |
- _pageReloadRequested: function(event) |
- { |
- if (this._state !== WebInspector.TimelinePanel.State.Idle || !this.isShowing()) |
- return; |
- this._startRecording(false); |
- }, |
- |
- /** |
- * @param {!WebInspector.Event} event |
- */ |
- _loadEventFired: function(event) |
- { |
- if (this._state !== WebInspector.TimelinePanel.State.Recording || !this._autoRecordGeneration) |
- return; |
- setTimeout(stopRecordingOnReload.bind(this, this._autoRecordGeneration), this._millisecondsToRecordAfterLoadEvent); |
- |
- /** |
- * @this {WebInspector.TimelinePanel} |
- * @param {!Object} recordGeneration |
- */ |
- function stopRecordingOnReload(recordGeneration) |
- { |
- // Check if we're still in the same recording session. |
- if (this._state !== WebInspector.TimelinePanel.State.Recording || this._autoRecordGeneration !== recordGeneration) |
- return; |
- this._stopRecording(); |
- } |
- }, |
- |
- // WebInspector.Searchable implementation |
- |
- /** |
- * @override |
- */ |
- jumpToNextSearchResult: function() |
- { |
- if (!this._searchResults || !this._searchResults.length) |
- return; |
- var index = this._selectedSearchResult ? this._searchResults.indexOf(this._selectedSearchResult) : -1; |
- this._jumpToSearchResult(index + 1); |
- }, |
- |
- /** |
- * @override |
- */ |
- jumpToPreviousSearchResult: function() |
- { |
- if (!this._searchResults || !this._searchResults.length) |
- return; |
- var index = this._selectedSearchResult ? this._searchResults.indexOf(this._selectedSearchResult) : 0; |
- this._jumpToSearchResult(index - 1); |
- }, |
- |
- /** |
- * @override |
- * @return {boolean} |
- */ |
- supportsCaseSensitiveSearch: function() |
- { |
- return false; |
- }, |
- |
- /** |
- * @override |
- * @return {boolean} |
- */ |
- supportsRegexSearch: function() |
- { |
- return false; |
- }, |
- |
- /** |
- * @param {number} index |
- */ |
- _jumpToSearchResult: function(index) |
- { |
- this._selectSearchResult((index + this._searchResults.length) % this._searchResults.length); |
- this._currentViews[0].highlightSearchResult(this._selectedSearchResult, this._searchRegex, true); |
- }, |
- |
- /** |
- * @param {number} index |
- */ |
- _selectSearchResult: function(index) |
- { |
- this._selectedSearchResult = this._searchResults[index]; |
- this._searchableView.updateCurrentMatchIndex(index); |
- }, |
- |
- _clearHighlight: function() |
- { |
- this._currentViews[0].highlightSearchResult(null); |
- }, |
- |
- /** |
- * @param {boolean} revealRecord |
- * @param {boolean} shouldJump |
- * @param {boolean=} jumpBackwards |
- */ |
- _updateSearchHighlight: function(revealRecord, shouldJump, jumpBackwards) |
- { |
- if (!this._searchRegex) { |
- this._clearHighlight(); |
- return; |
- } |
- |
- if (!this._searchResults) |
- this._updateSearchResults(shouldJump, jumpBackwards); |
- this._currentViews[0].highlightSearchResult(this._selectedSearchResult, this._searchRegex, revealRecord); |
- }, |
- |
- /** |
- * @param {boolean} shouldJump |
- * @param {boolean=} jumpBackwards |
- */ |
- _updateSearchResults: function(shouldJump, jumpBackwards) |
- { |
- if (!this._searchRegex) |
- return; |
- |
- // FIXME: search on all threads. |
- var events = this._model.mainThreadEvents(); |
- var filters = this._filters.concat([new WebInspector.TimelineTextFilter(this._searchRegex)]); |
- var matches = []; |
- for (var index = events.lowerBound(this._windowStartTime, (time, event) => time - event.startTime); index < events.length; ++index) { |
- var event = events[index]; |
- if (event.startTime > this._windowEndTime) |
- break; |
- if (WebInspector.TimelineModel.isVisible(filters, event)) |
- matches.push(event); |
- } |
+ function handler(toolbarButton) { |
+ toolbarButton.setEnabled(enabled); |
+ } |
+ this._recordingOptionUIControls.forEach(handler); |
+ } |
+ |
+ /** |
+ * @param {boolean} userInitiated |
+ */ |
+ _startRecording(userInitiated) { |
+ console.assert(!this._statusPane, 'Status pane is already opened.'); |
+ var mainTarget = WebInspector.targetManager.mainTarget(); |
+ if (!mainTarget) |
+ return; |
+ this._setState(WebInspector.TimelinePanel.State.StartPending); |
+ this._showRecordingStarted(); |
+ |
+ this._autoRecordGeneration = userInitiated ? null : Symbol('Generation'); |
+ this._controller = new WebInspector.TimelineController(mainTarget, this, this._tracingModel); |
+ this._controller.startRecording( |
+ true, this._captureJSProfileSetting.get(), this._captureMemorySetting.get(), |
+ this._captureLayersAndPicturesSetting.get(), |
+ this._captureFilmStripSetting && this._captureFilmStripSetting.get()); |
+ |
+ for (var i = 0; i < this._overviewControls.length; ++i) |
+ this._overviewControls[i].timelineStarted(); |
+ |
+ if (userInitiated) |
+ WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.TimelineStarted); |
+ this._setUIControlsEnabled(false); |
+ this._hideRecordingHelpMessage(); |
+ } |
+ |
+ _stopRecording() { |
+ if (this._statusPane) { |
+ this._statusPane.finish(); |
+ this._statusPane.updateStatus(WebInspector.UIString('Stopping timeline\u2026')); |
+ this._statusPane.updateProgressBar(WebInspector.UIString('Received'), 0); |
+ } |
+ this._setState(WebInspector.TimelinePanel.State.StopPending); |
+ this._autoRecordGeneration = null; |
+ this._controller.stopRecording(); |
+ this._controller = null; |
+ this._setUIControlsEnabled(true); |
+ } |
+ |
+ _onSuspendStateChanged() { |
+ this._updateTimelineControls(); |
+ } |
+ |
+ _updateTimelineControls() { |
+ var state = WebInspector.TimelinePanel.State; |
+ this._toggleRecordAction.setToggled(this._state === state.Recording); |
+ this._toggleRecordAction.setEnabled(this._state === state.Recording || this._state === state.Idle); |
+ this._panelToolbar.setEnabled(this._state !== state.Loading); |
+ this._dropTarget.setEnabled(this._state === state.Idle); |
+ } |
+ |
+ _toggleRecording() { |
+ if (this._state === WebInspector.TimelinePanel.State.Idle) |
+ this._startRecording(true); |
+ else if (this._state === WebInspector.TimelinePanel.State.Recording) |
+ this._stopRecording(); |
+ } |
+ |
+ _garbageCollectButtonClicked() { |
+ var targets = WebInspector.targetManager.targets(); |
+ for (var i = 0; i < targets.length; ++i) |
+ targets[i].heapProfilerAgent().collectGarbage(); |
+ } |
+ |
+ _clear() { |
+ WebInspector.LineLevelProfile.instance().reset(); |
+ this._tracingModel.reset(); |
+ this._model.reset(); |
+ this._showRecordingHelpMessage(); |
- var matchesCount = matches.length; |
- if (matchesCount) { |
- this._searchResults = matches; |
- this._searchableView.updateSearchMatchesCount(matchesCount); |
- |
- var selectedIndex = matches.indexOf(this._selectedSearchResult); |
- if (shouldJump && selectedIndex === -1) |
- selectedIndex = jumpBackwards ? this._searchResults.length - 1 : 0; |
- this._selectSearchResult(selectedIndex); |
- } else { |
- this._searchableView.updateSearchMatchesCount(0); |
- delete this._selectedSearchResult; |
- } |
- }, |
+ this.requestWindowTimes(0, Infinity); |
+ delete this._selection; |
+ this._frameModel.reset(); |
+ this._filmStripModel.reset(this._tracingModel); |
+ this._overviewPane.reset(); |
+ for (var i = 0; i < this._currentViews.length; ++i) |
+ this._currentViews[i].reset(); |
+ for (var i = 0; i < this._overviewControls.length; ++i) |
+ this._overviewControls[i].reset(); |
+ this.select(null); |
+ this._detailsSplitWidget.hideSidebar(); |
+ } |
+ |
+ /** |
+ * @override |
+ */ |
+ recordingStarted() { |
+ this._clear(); |
+ this._setState(WebInspector.TimelinePanel.State.Recording); |
+ this._showRecordingStarted(); |
+ this._statusPane.updateStatus(WebInspector.UIString('Recording\u2026')); |
+ this._statusPane.updateProgressBar(WebInspector.UIString('Buffer usage'), 0); |
+ this._statusPane.startTimer(); |
+ this._hideRecordingHelpMessage(); |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {number} usage |
+ */ |
+ recordingProgress(usage) { |
+ this._statusPane.updateProgressBar(WebInspector.UIString('Buffer usage'), usage * 100); |
+ } |
+ |
+ _showRecordingHelpMessage() { |
+ /** |
+ * @param {string} tagName |
+ * @param {string} contents |
+ * @return {!Element} |
+ */ |
+ function encloseWithTag(tagName, contents) { |
+ var e = createElement(tagName); |
+ e.textContent = contents; |
+ return e; |
+ } |
- /** |
- * @override |
- */ |
- searchCanceled: function() |
- { |
- this._clearHighlight(); |
- delete this._searchResults; |
- delete this._selectedSearchResult; |
- delete this._searchRegex; |
- }, |
+ var recordNode = encloseWithTag( |
+ 'b', WebInspector.shortcutRegistry.shortcutDescriptorsForAction('timeline.toggle-recording')[0].name); |
+ var reloadNode = |
+ encloseWithTag('b', WebInspector.shortcutRegistry.shortcutDescriptorsForAction('main.reload')[0].name); |
+ var navigateNode = encloseWithTag('b', WebInspector.UIString('WASD (ZQSD)')); |
+ var hintText = createElementWithClass('div'); |
+ hintText.appendChild(WebInspector.formatLocalized( |
+ 'To capture a new timeline, click the record toolbar button or hit %s.', [recordNode])); |
+ hintText.createChild('br'); |
+ hintText.appendChild( |
+ WebInspector.formatLocalized('To evaluate page load performance, hit %s to record the reload.', [reloadNode])); |
+ hintText.createChild('p'); |
+ hintText.appendChild( |
+ WebInspector.formatLocalized('After recording, select an area of interest in the overview by dragging.', [])); |
+ hintText.createChild('br'); |
+ hintText.appendChild(WebInspector.formatLocalized( |
+ 'Then, zoom and pan the timeline with the mousewheel and %s keys.', [navigateNode])); |
+ this._hideRecordingHelpMessage(); |
+ this._helpMessageElement = |
+ this._searchableView.element.createChild('div', 'full-widget-dimmed-banner timeline-status-pane'); |
+ this._helpMessageElement.appendChild(hintText); |
+ } |
+ |
+ _hideRecordingHelpMessage() { |
+ if (this._helpMessageElement) |
+ this._helpMessageElement.remove(); |
+ delete this._helpMessageElement; |
+ } |
+ |
+ /** |
+ * @override |
+ */ |
+ loadingStarted() { |
+ this._hideRecordingHelpMessage(); |
+ |
+ if (this._statusPane) |
+ this._statusPane.hide(); |
+ this._statusPane = new WebInspector.TimelinePanel.StatusPane(false, this._cancelLoading.bind(this)); |
+ this._statusPane.showPane(this._statusPaneContainer); |
+ this._statusPane.updateStatus(WebInspector.UIString('Loading timeline\u2026')); |
+ // FIXME: make loading from backend cancelable as well. |
+ if (!this._loader) |
+ this._statusPane.finish(); |
+ this.loadingProgress(0); |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {number=} progress |
+ */ |
+ loadingProgress(progress) { |
+ if (typeof progress === 'number') |
+ this._statusPane.updateProgressBar(WebInspector.UIString('Received'), progress * 100); |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {boolean} success |
+ */ |
+ loadingComplete(success) { |
+ var loadedFromFile = !!this._loader; |
+ delete this._loader; |
+ this._setState(WebInspector.TimelinePanel.State.Idle); |
+ |
+ if (!success) { |
+ this._statusPane.hide(); |
+ delete this._statusPane; |
+ this._clear(); |
+ return; |
+ } |
- /** |
- * @override |
- * @param {!WebInspector.SearchableView.SearchConfig} searchConfig |
- * @param {boolean} shouldJump |
- * @param {boolean=} jumpBackwards |
- */ |
- performSearch: function(searchConfig, shouldJump, jumpBackwards) |
- { |
- var query = searchConfig.query; |
- this._searchRegex = createPlainTextSearchRegex(query, "i"); |
- delete this._searchResults; |
- this._updateSearchHighlight(true, shouldJump, jumpBackwards); |
- }, |
- |
- _updateSelectionDetails: function() |
- { |
- switch (this._selection.type()) { |
- case WebInspector.TimelineSelection.Type.TraceEvent: |
- var event = /** @type {!WebInspector.TracingModel.Event} */ (this._selection.object()); |
- WebInspector.TimelineUIUtils.buildTraceEventDetails(event, this._model, this._detailsLinkifier, true, this._appendDetailsTabsForTraceEventAndShowDetails.bind(this, event)); |
- break; |
- case WebInspector.TimelineSelection.Type.Frame: |
- var frame = /** @type {!WebInspector.TimelineFrame} */ (this._selection.object()); |
- var screenshotTime = frame.idle ? frame.startTime : frame.endTime; // For idle frames, look at the state at the beginning of the frame. |
- var filmStripFrame = filmStripFrame = this._filmStripModel.frameByTimestamp(screenshotTime); |
- if (filmStripFrame && filmStripFrame.timestamp - frame.endTime > 10) |
- filmStripFrame = null; |
- this.showInDetails(WebInspector.TimelineUIUtils.generateDetailsContentForFrame(this._frameModel, frame, filmStripFrame)); |
- if (frame.layerTree) { |
- var layersView = this._layersView(); |
- layersView.showLayerTree(frame.layerTree); |
- if (!this._detailsView.hasTab(WebInspector.TimelinePanel.DetailsTab.LayerViewer)) |
- this._detailsView.appendTab(WebInspector.TimelinePanel.DetailsTab.LayerViewer, WebInspector.UIString("Layers"), layersView); |
- } |
- break; |
- case WebInspector.TimelineSelection.Type.NetworkRequest: |
- var request = /** @type {!WebInspector.TimelineModel.NetworkRequest} */ (this._selection.object()); |
- WebInspector.TimelineUIUtils.buildNetworkRequestDetails(request, this._model, this._detailsLinkifier) |
- .then(this.showInDetails.bind(this)); |
- break; |
- case WebInspector.TimelineSelection.Type.Range: |
- this._updateSelectedRangeStats(this._selection._startTime, this._selection._endTime); |
- break; |
- } |
+ if (this._statusPane) |
+ this._statusPane.updateStatus(WebInspector.UIString('Processing timeline\u2026')); |
+ this._model.setEvents(this._tracingModel, loadedFromFile); |
+ this._frameModel.reset(); |
+ this._frameModel.addTraceEvents( |
+ WebInspector.targetManager.mainTarget(), this._model.inspectedTargetEvents(), this._model.sessionId() || ''); |
+ this._filmStripModel.reset(this._tracingModel); |
+ var groups = WebInspector.TimelineModel.AsyncEventGroup; |
+ var asyncEventsByGroup = this._model.mainThreadAsyncEvents(); |
+ this._irModel.populate(asyncEventsByGroup.get(groups.input), asyncEventsByGroup.get(groups.animation)); |
+ this._model.cpuProfiles().forEach(profile => WebInspector.LineLevelProfile.instance().appendCPUProfile(profile)); |
+ if (this._statusPane) |
+ this._statusPane.hide(); |
+ delete this._statusPane; |
+ this._overviewPane.reset(); |
+ this._overviewPane.setBounds(this._model.minimumRecordTime(), this._model.maximumRecordTime()); |
+ this._setAutoWindowTimes(); |
+ this._refreshViews(); |
+ for (var i = 0; i < this._overviewControls.length; ++i) |
+ this._overviewControls[i].timelineStopped(); |
+ this._setMarkers(); |
+ this._overviewPane.scheduleUpdate(); |
+ this._updateSearchHighlight(false, true); |
+ this._detailsSplitWidget.showBoth(); |
+ } |
+ |
+ _showRecordingStarted() { |
+ if (this._statusPane) |
+ return; |
+ this._statusPane = new WebInspector.TimelinePanel.StatusPane(true, this._stopRecording.bind(this)); |
+ this._statusPane.showPane(this._statusPaneContainer); |
+ this._statusPane.updateStatus(WebInspector.UIString('Initializing recording\u2026')); |
+ } |
+ |
+ _cancelLoading() { |
+ if (this._loader) |
+ this._loader.cancel(); |
+ } |
+ |
+ _setMarkers() { |
+ var markers = new Map(); |
+ var recordTypes = WebInspector.TimelineModel.RecordType; |
+ var zeroTime = this._model.minimumRecordTime(); |
+ for (var record of this._model.eventDividerRecords()) { |
+ if (record.type() === recordTypes.TimeStamp || record.type() === recordTypes.ConsoleTime) |
+ continue; |
+ markers.set(record.startTime(), WebInspector.TimelineUIUtils.createDividerForRecord(record, zeroTime, 0)); |
+ } |
+ this._overviewPane.setMarkers(markers); |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.Event} event |
+ */ |
+ _pageReloadRequested(event) { |
+ if (this._state !== WebInspector.TimelinePanel.State.Idle || !this.isShowing()) |
+ return; |
+ this._startRecording(false); |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.Event} event |
+ */ |
+ _loadEventFired(event) { |
+ if (this._state !== WebInspector.TimelinePanel.State.Recording || !this._autoRecordGeneration) |
+ return; |
+ setTimeout(stopRecordingOnReload.bind(this, this._autoRecordGeneration), this._millisecondsToRecordAfterLoadEvent); |
+ |
+ /** |
+ * @this {WebInspector.TimelinePanel} |
+ * @param {!Object} recordGeneration |
+ */ |
+ function stopRecordingOnReload(recordGeneration) { |
+ // Check if we're still in the same recording session. |
+ if (this._state !== WebInspector.TimelinePanel.State.Recording || this._autoRecordGeneration !== recordGeneration) |
+ return; |
+ this._stopRecording(); |
+ } |
+ } |
+ |
+ // WebInspector.Searchable implementation |
+ |
+ /** |
+ * @override |
+ */ |
+ jumpToNextSearchResult() { |
+ if (!this._searchResults || !this._searchResults.length) |
+ return; |
+ var index = this._selectedSearchResult ? this._searchResults.indexOf(this._selectedSearchResult) : -1; |
+ this._jumpToSearchResult(index + 1); |
+ } |
+ |
+ /** |
+ * @override |
+ */ |
+ jumpToPreviousSearchResult() { |
+ if (!this._searchResults || !this._searchResults.length) |
+ return; |
+ var index = this._selectedSearchResult ? this._searchResults.indexOf(this._selectedSearchResult) : 0; |
+ this._jumpToSearchResult(index - 1); |
+ } |
+ |
+ /** |
+ * @override |
+ * @return {boolean} |
+ */ |
+ supportsCaseSensitiveSearch() { |
+ return false; |
+ } |
+ |
+ /** |
+ * @override |
+ * @return {boolean} |
+ */ |
+ supportsRegexSearch() { |
+ return false; |
+ } |
+ |
+ /** |
+ * @param {number} index |
+ */ |
+ _jumpToSearchResult(index) { |
+ this._selectSearchResult((index + this._searchResults.length) % this._searchResults.length); |
+ this._currentViews[0].highlightSearchResult(this._selectedSearchResult, this._searchRegex, true); |
+ } |
+ |
+ /** |
+ * @param {number} index |
+ */ |
+ _selectSearchResult(index) { |
+ this._selectedSearchResult = this._searchResults[index]; |
+ this._searchableView.updateCurrentMatchIndex(index); |
+ } |
+ |
+ _clearHighlight() { |
+ this._currentViews[0].highlightSearchResult(null); |
+ } |
+ |
+ /** |
+ * @param {boolean} revealRecord |
+ * @param {boolean} shouldJump |
+ * @param {boolean=} jumpBackwards |
+ */ |
+ _updateSearchHighlight(revealRecord, shouldJump, jumpBackwards) { |
+ if (!this._searchRegex) { |
+ this._clearHighlight(); |
+ return; |
+ } |
- this._detailsView.updateContents(this._selection); |
- }, |
+ if (!this._searchResults) |
+ this._updateSearchResults(shouldJump, jumpBackwards); |
+ this._currentViews[0].highlightSearchResult(this._selectedSearchResult, this._searchRegex, revealRecord); |
+ } |
+ |
+ /** |
+ * @param {boolean} shouldJump |
+ * @param {boolean=} jumpBackwards |
+ */ |
+ _updateSearchResults(shouldJump, jumpBackwards) { |
+ if (!this._searchRegex) |
+ return; |
+ |
+ // FIXME: search on all threads. |
+ var events = this._model.mainThreadEvents(); |
+ var filters = this._filters.concat([new WebInspector.TimelineTextFilter(this._searchRegex)]); |
+ var matches = []; |
+ for (var index = events.lowerBound(this._windowStartTime, (time, event) => time - event.startTime); |
+ index < events.length; ++index) { |
+ var event = events[index]; |
+ if (event.startTime > this._windowEndTime) |
+ break; |
+ if (WebInspector.TimelineModel.isVisible(filters, event)) |
+ matches.push(event); |
+ } |
- /** |
- * @param {!WebInspector.TimelineSelection} selection |
- * @return {?WebInspector.TimelineFrame} |
- */ |
- _frameForSelection: function(selection) |
- { |
- switch (selection.type()) { |
- case WebInspector.TimelineSelection.Type.Frame: |
- return /** @type {!WebInspector.TimelineFrame} */ (selection.object()); |
- case WebInspector.TimelineSelection.Type.Range: |
- return null; |
- case WebInspector.TimelineSelection.Type.TraceEvent: |
- return this._frameModel.filteredFrames(selection._endTime, selection._endTime)[0]; |
- default: |
- console.assert(false, "Should never be reached"); |
- return null; |
+ var matchesCount = matches.length; |
+ if (matchesCount) { |
+ this._searchResults = matches; |
+ this._searchableView.updateSearchMatchesCount(matchesCount); |
+ |
+ var selectedIndex = matches.indexOf(this._selectedSearchResult); |
+ if (shouldJump && selectedIndex === -1) |
+ selectedIndex = jumpBackwards ? this._searchResults.length - 1 : 0; |
+ this._selectSearchResult(selectedIndex); |
+ } else { |
+ this._searchableView.updateSearchMatchesCount(0); |
+ delete this._selectedSearchResult; |
+ } |
+ } |
+ |
+ /** |
+ * @override |
+ */ |
+ searchCanceled() { |
+ this._clearHighlight(); |
+ delete this._searchResults; |
+ delete this._selectedSearchResult; |
+ delete this._searchRegex; |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {!WebInspector.SearchableView.SearchConfig} searchConfig |
+ * @param {boolean} shouldJump |
+ * @param {boolean=} jumpBackwards |
+ */ |
+ performSearch(searchConfig, shouldJump, jumpBackwards) { |
+ var query = searchConfig.query; |
+ this._searchRegex = createPlainTextSearchRegex(query, 'i'); |
+ delete this._searchResults; |
+ this._updateSearchHighlight(true, shouldJump, jumpBackwards); |
+ } |
+ |
+ _updateSelectionDetails() { |
+ switch (this._selection.type()) { |
+ case WebInspector.TimelineSelection.Type.TraceEvent: |
+ var event = /** @type {!WebInspector.TracingModel.Event} */ (this._selection.object()); |
+ WebInspector.TimelineUIUtils.buildTraceEventDetails( |
+ event, this._model, this._detailsLinkifier, true, |
+ this._appendDetailsTabsForTraceEventAndShowDetails.bind(this, event)); |
+ break; |
+ case WebInspector.TimelineSelection.Type.Frame: |
+ var frame = /** @type {!WebInspector.TimelineFrame} */ (this._selection.object()); |
+ var screenshotTime = frame.idle ? |
+ frame.startTime : |
+ frame.endTime; // For idle frames, look at the state at the beginning of the frame. |
+ var filmStripFrame = filmStripFrame = this._filmStripModel.frameByTimestamp(screenshotTime); |
+ if (filmStripFrame && filmStripFrame.timestamp - frame.endTime > 10) |
+ filmStripFrame = null; |
+ this.showInDetails( |
+ WebInspector.TimelineUIUtils.generateDetailsContentForFrame(this._frameModel, frame, filmStripFrame)); |
+ if (frame.layerTree) { |
+ var layersView = this._layersView(); |
+ layersView.showLayerTree(frame.layerTree); |
+ if (!this._detailsView.hasTab(WebInspector.TimelinePanel.DetailsTab.LayerViewer)) |
+ this._detailsView.appendTab( |
+ WebInspector.TimelinePanel.DetailsTab.LayerViewer, WebInspector.UIString('Layers'), layersView); |
} |
- }, |
- |
- /** |
- * @param {number} offset |
- */ |
- _jumpToFrame: function(offset) |
- { |
- var currentFrame = this._frameForSelection(this._selection); |
- if (!currentFrame) |
- return; |
- var frames = this._frameModel.frames(); |
- var index = frames.indexOf(currentFrame); |
- console.assert(index >= 0, "Can't find current frame in the frame list"); |
- index = Number.constrain(index + offset, 0, frames.length - 1); |
- var frame = frames[index]; |
- this._revealTimeRange(frame.startTime, frame.endTime); |
- this.select(WebInspector.TimelineSelection.fromFrame(frame)); |
- return true; |
- }, |
- |
- /** |
- * @param {!WebInspector.PaintProfilerSnapshot} snapshot |
- */ |
- _showSnapshotInPaintProfiler: function(snapshot) |
- { |
- var paintProfilerView = this._paintProfilerView(); |
- var hasProfileData = paintProfilerView.setSnapshot(snapshot); |
- if (!this._detailsView.hasTab(WebInspector.TimelinePanel.DetailsTab.PaintProfiler)) |
- this._detailsView.appendTab(WebInspector.TimelinePanel.DetailsTab.PaintProfiler, WebInspector.UIString("Paint Profiler"), paintProfilerView, undefined, undefined, true); |
- this._detailsView.selectTab(WebInspector.TimelinePanel.DetailsTab.PaintProfiler, true); |
- }, |
- |
- /** |
- * @param {!WebInspector.TracingModel.Event} event |
- * @param {!Node} content |
- */ |
- _appendDetailsTabsForTraceEventAndShowDetails: function(event, content) |
- { |
- this.showInDetails(content); |
- if (event.name === WebInspector.TimelineModel.RecordType.Paint || event.name === WebInspector.TimelineModel.RecordType.RasterTask) |
- this._showEventInPaintProfiler(event); |
- }, |
- |
- /** |
- * @param {!WebInspector.TracingModel.Event} event |
- */ |
- _showEventInPaintProfiler: function(event) |
- { |
- var target = WebInspector.targetManager.mainTarget(); |
- if (!target) |
- return; |
- var paintProfilerView = this._paintProfilerView(); |
- var hasProfileData = paintProfilerView.setEvent(target, event); |
- if (!hasProfileData) |
- return; |
- if (!this._detailsView.hasTab(WebInspector.TimelinePanel.DetailsTab.PaintProfiler)) |
- this._detailsView.appendTab(WebInspector.TimelinePanel.DetailsTab.PaintProfiler, WebInspector.UIString("Paint Profiler"), paintProfilerView, undefined, undefined, false); |
- }, |
- |
- /** |
- * @param {number} startTime |
- * @param {number} endTime |
- */ |
- _updateSelectedRangeStats: function(startTime, endTime) |
- { |
- this.showInDetails(WebInspector.TimelineUIUtils.buildRangeStats(this._model, startTime, endTime)); |
- }, |
+ break; |
+ case WebInspector.TimelineSelection.Type.NetworkRequest: |
+ var request = /** @type {!WebInspector.TimelineModel.NetworkRequest} */ (this._selection.object()); |
+ WebInspector.TimelineUIUtils.buildNetworkRequestDetails(request, this._model, this._detailsLinkifier) |
+ .then(this.showInDetails.bind(this)); |
+ break; |
+ case WebInspector.TimelineSelection.Type.Range: |
+ this._updateSelectedRangeStats(this._selection._startTime, this._selection._endTime); |
+ break; |
+ } |
- /** |
- * @override |
- * @param {?WebInspector.TimelineSelection} selection |
- * @param {!WebInspector.TimelinePanel.DetailsTab=} preferredTab |
- */ |
- select: function(selection, preferredTab) |
- { |
- if (!selection) |
- selection = WebInspector.TimelineSelection.fromRange(this._windowStartTime, this._windowEndTime); |
- this._selection = selection; |
- this._detailsLinkifier.reset(); |
- if (preferredTab) |
- this._detailsView.setPreferredTab(preferredTab); |
- |
- for (var view of this._currentViews) |
- view.setSelection(selection); |
- this._updateSelectionDetails(); |
- }, |
+ this._detailsView.updateContents(this._selection); |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.TimelineSelection} selection |
+ * @return {?WebInspector.TimelineFrame} |
+ */ |
+ _frameForSelection(selection) { |
+ switch (selection.type()) { |
+ case WebInspector.TimelineSelection.Type.Frame: |
+ return /** @type {!WebInspector.TimelineFrame} */ (selection.object()); |
+ case WebInspector.TimelineSelection.Type.Range: |
+ return null; |
+ case WebInspector.TimelineSelection.Type.TraceEvent: |
+ return this._frameModel.filteredFrames(selection._endTime, selection._endTime)[0]; |
+ default: |
+ console.assert(false, 'Should never be reached'); |
+ return null; |
+ } |
+ } |
+ |
+ /** |
+ * @param {number} offset |
+ */ |
+ _jumpToFrame(offset) { |
+ var currentFrame = this._frameForSelection(this._selection); |
+ if (!currentFrame) |
+ return; |
+ var frames = this._frameModel.frames(); |
+ var index = frames.indexOf(currentFrame); |
+ console.assert(index >= 0, 'Can\'t find current frame in the frame list'); |
+ index = Number.constrain(index + offset, 0, frames.length - 1); |
+ var frame = frames[index]; |
+ this._revealTimeRange(frame.startTime, frame.endTime); |
+ this.select(WebInspector.TimelineSelection.fromFrame(frame)); |
+ return true; |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.PaintProfilerSnapshot} snapshot |
+ */ |
+ _showSnapshotInPaintProfiler(snapshot) { |
+ var paintProfilerView = this._paintProfilerView(); |
+ var hasProfileData = paintProfilerView.setSnapshot(snapshot); |
+ if (!this._detailsView.hasTab(WebInspector.TimelinePanel.DetailsTab.PaintProfiler)) |
+ this._detailsView.appendTab( |
+ WebInspector.TimelinePanel.DetailsTab.PaintProfiler, WebInspector.UIString('Paint Profiler'), |
+ paintProfilerView, undefined, undefined, true); |
+ this._detailsView.selectTab(WebInspector.TimelinePanel.DetailsTab.PaintProfiler, true); |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.TracingModel.Event} event |
+ * @param {!Node} content |
+ */ |
+ _appendDetailsTabsForTraceEventAndShowDetails(event, content) { |
+ this.showInDetails(content); |
+ if (event.name === WebInspector.TimelineModel.RecordType.Paint || |
+ event.name === WebInspector.TimelineModel.RecordType.RasterTask) |
+ this._showEventInPaintProfiler(event); |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.TracingModel.Event} event |
+ */ |
+ _showEventInPaintProfiler(event) { |
+ var target = WebInspector.targetManager.mainTarget(); |
+ if (!target) |
+ return; |
+ var paintProfilerView = this._paintProfilerView(); |
+ var hasProfileData = paintProfilerView.setEvent(target, event); |
+ if (!hasProfileData) |
+ return; |
+ if (!this._detailsView.hasTab(WebInspector.TimelinePanel.DetailsTab.PaintProfiler)) |
+ this._detailsView.appendTab( |
+ WebInspector.TimelinePanel.DetailsTab.PaintProfiler, WebInspector.UIString('Paint Profiler'), |
+ paintProfilerView, undefined, undefined, false); |
+ } |
+ |
+ /** |
+ * @param {number} startTime |
+ * @param {number} endTime |
+ */ |
+ _updateSelectedRangeStats(startTime, endTime) { |
+ this.showInDetails(WebInspector.TimelineUIUtils.buildRangeStats(this._model, startTime, endTime)); |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {?WebInspector.TimelineSelection} selection |
+ * @param {!WebInspector.TimelinePanel.DetailsTab=} preferredTab |
+ */ |
+ select(selection, preferredTab) { |
+ if (!selection) |
+ selection = WebInspector.TimelineSelection.fromRange(this._windowStartTime, this._windowEndTime); |
+ this._selection = selection; |
+ this._detailsLinkifier.reset(); |
+ if (preferredTab) |
+ this._detailsView.setPreferredTab(preferredTab); |
+ |
+ for (var view of this._currentViews) |
+ view.setSelection(selection); |
+ this._updateSelectionDetails(); |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {number} time |
+ */ |
+ selectEntryAtTime(time) { |
+ var events = this._model.mainThreadEvents(); |
+ // Find best match, then backtrack to the first visible entry. |
+ for (var index = events.upperBound(time, (time, event) => time - event.startTime) - 1; index >= 0; --index) { |
+ var event = events[index]; |
+ var endTime = event.endTime || event.startTime; |
+ if (WebInspector.TracingModel.isTopLevelEvent(event) && endTime < time) |
+ break; |
+ if (WebInspector.TimelineModel.isVisible(this._filters, event) && endTime >= time) { |
+ this.select(WebInspector.TimelineSelection.fromTraceEvent(event)); |
+ return; |
+ } |
+ } |
+ this.select(null); |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {?WebInspector.TracingModel.Event} event |
+ */ |
+ highlightEvent(event) { |
+ for (var view of this._currentViews) |
+ view.highlightEvent(event); |
+ } |
+ |
+ /** |
+ * @param {number} startTime |
+ * @param {number} endTime |
+ */ |
+ _revealTimeRange(startTime, endTime) { |
+ var timeShift = 0; |
+ if (this._windowEndTime < endTime) |
+ timeShift = endTime - this._windowEndTime; |
+ else if (this._windowStartTime > startTime) |
+ timeShift = startTime - this._windowStartTime; |
+ if (timeShift) |
+ this.requestWindowTimes(this._windowStartTime + timeShift, this._windowEndTime + timeShift); |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {!Node} node |
+ */ |
+ showInDetails(node) { |
+ this._detailsView.setContent(node); |
+ } |
+ |
+ /** |
+ * @param {!DataTransfer} dataTransfer |
+ */ |
+ _handleDrop(dataTransfer) { |
+ var items = dataTransfer.items; |
+ if (!items.length) |
+ return; |
+ var item = items[0]; |
+ if (item.kind === 'string') { |
+ var url = dataTransfer.getData('text/uri-list'); |
+ if (new WebInspector.ParsedURL(url).isValid) |
+ this._loadFromURL(url); |
+ } else if (item.kind === 'file') { |
+ var entry = items[0].webkitGetAsEntry(); |
+ if (!entry.isFile) |
+ return; |
+ entry.file(this._loadFromFile.bind(this)); |
+ } |
+ } |
+ _setAutoWindowTimes() { |
+ var tasks = this._model.mainThreadTasks(); |
+ if (!tasks.length) { |
+ this.requestWindowTimes(this._tracingModel.minimumRecordTime(), this._tracingModel.maximumRecordTime()); |
+ return; |
+ } |
/** |
- * @override |
- * @param {number} time |
+ * @param {number} startIndex |
+ * @param {number} stopIndex |
+ * @return {number} |
*/ |
- selectEntryAtTime: function(time) |
- { |
- var events = this._model.mainThreadEvents(); |
- // Find best match, then backtrack to the first visible entry. |
- for (var index = events.upperBound(time, (time, event) => time - event.startTime) - 1; index >= 0; --index) { |
- var event = events[index]; |
- var endTime = event.endTime || event.startTime; |
- if (WebInspector.TracingModel.isTopLevelEvent(event) && endTime < time) |
- break; |
- if (WebInspector.TimelineModel.isVisible(this._filters, event) && endTime >= time) { |
- this.select(WebInspector.TimelineSelection.fromTraceEvent(event)); |
- return; |
- } |
+ function findLowUtilizationRegion(startIndex, stopIndex) { |
+ var /** @const */ threshold = 0.1; |
+ var cutIndex = startIndex; |
+ var cutTime = (tasks[cutIndex].startTime() + tasks[cutIndex].endTime()) / 2; |
+ var usedTime = 0; |
+ var step = Math.sign(stopIndex - startIndex); |
+ for (var i = startIndex; i !== stopIndex; i += step) { |
+ var task = tasks[i]; |
+ var taskTime = (task.startTime() + task.endTime()) / 2; |
+ var interval = Math.abs(cutTime - taskTime); |
+ if (usedTime < threshold * interval) { |
+ cutIndex = i; |
+ cutTime = taskTime; |
+ usedTime = 0; |
} |
- this.select(null); |
- }, |
- |
- /** |
- * @override |
- * @param {?WebInspector.TracingModel.Event} event |
- */ |
- highlightEvent: function(event) |
- { |
- for (var view of this._currentViews) |
- view.highlightEvent(event); |
- }, |
- |
- /** |
- * @param {number} startTime |
- * @param {number} endTime |
- */ |
- _revealTimeRange: function(startTime, endTime) |
- { |
- var timeShift = 0; |
- if (this._windowEndTime < endTime) |
- timeShift = endTime - this._windowEndTime; |
- else if (this._windowStartTime > startTime) |
- timeShift = startTime - this._windowStartTime; |
- if (timeShift) |
- this.requestWindowTimes(this._windowStartTime + timeShift, this._windowEndTime + timeShift); |
- }, |
+ usedTime += task.endTime() - task.startTime(); |
+ } |
+ return cutIndex; |
+ } |
+ var rightIndex = findLowUtilizationRegion(tasks.length - 1, 0); |
+ var leftIndex = findLowUtilizationRegion(0, rightIndex); |
+ var leftTime = tasks[leftIndex].startTime(); |
+ var rightTime = tasks[rightIndex].endTime(); |
+ var span = rightTime - leftTime; |
+ var totalSpan = this._tracingModel.maximumRecordTime() - this._tracingModel.minimumRecordTime(); |
+ if (span < totalSpan * 0.1) { |
+ leftTime = this._tracingModel.minimumRecordTime(); |
+ rightTime = this._tracingModel.maximumRecordTime(); |
+ } else { |
+ leftTime = Math.max(leftTime - 0.05 * span, this._tracingModel.minimumRecordTime()); |
+ rightTime = Math.min(rightTime + 0.05 * span, this._tracingModel.maximumRecordTime()); |
+ } |
+ this.requestWindowTimes(leftTime, rightTime); |
+ } |
+}; |
- /** |
- * @override |
- * @param {!Node} node |
- */ |
- showInDetails: function(node) |
- { |
- this._detailsView.setContent(node); |
- }, |
+/** |
+ * @enum {string} |
+ */ |
+WebInspector.TimelinePanel.Perspectives = { |
+ Load: 'Load', |
+ Responsiveness: 'Responsiveness', |
+ Custom: 'Custom' |
+}; |
- /** |
- * @param {!DataTransfer} dataTransfer |
- */ |
- _handleDrop: function(dataTransfer) |
- { |
- var items = dataTransfer.items; |
- if (!items.length) |
- return; |
- var item = items[0]; |
- if (item.kind === "string") { |
- var url = dataTransfer.getData("text/uri-list"); |
- if (new WebInspector.ParsedURL(url).isValid) |
- this._loadFromURL(url); |
- } else if (item.kind === "file") { |
- var entry = items[0].webkitGetAsEntry(); |
- if (!entry.isFile) |
- return; |
- entry.file(this._loadFromFile.bind(this)); |
- } |
- }, |
- |
- _setAutoWindowTimes: function() |
- { |
- var tasks = this._model.mainThreadTasks(); |
- if (!tasks.length) { |
- this.requestWindowTimes(this._tracingModel.minimumRecordTime(), this._tracingModel.maximumRecordTime()); |
- return; |
- } |
- /** |
- * @param {number} startIndex |
- * @param {number} stopIndex |
- * @return {number} |
- */ |
- function findLowUtilizationRegion(startIndex, stopIndex) |
- { |
- var /** @const */ threshold = 0.1; |
- var cutIndex = startIndex; |
- var cutTime = (tasks[cutIndex].startTime() + tasks[cutIndex].endTime()) / 2; |
- var usedTime = 0; |
- var step = Math.sign(stopIndex - startIndex); |
- for (var i = startIndex; i !== stopIndex; i += step) { |
- var task = tasks[i]; |
- var taskTime = (task.startTime() + task.endTime()) / 2; |
- var interval = Math.abs(cutTime - taskTime); |
- if (usedTime < threshold * interval) { |
- cutIndex = i; |
- cutTime = taskTime; |
- usedTime = 0; |
- } |
- usedTime += task.endTime() - task.startTime(); |
- } |
- return cutIndex; |
- } |
- var rightIndex = findLowUtilizationRegion(tasks.length - 1, 0); |
- var leftIndex = findLowUtilizationRegion(0, rightIndex); |
- var leftTime = tasks[leftIndex].startTime(); |
- var rightTime = tasks[rightIndex].endTime(); |
- var span = rightTime - leftTime; |
- var totalSpan = this._tracingModel.maximumRecordTime() - this._tracingModel.minimumRecordTime(); |
- if (span < totalSpan * 0.1) { |
- leftTime = this._tracingModel.minimumRecordTime(); |
- rightTime = this._tracingModel.maximumRecordTime(); |
- } else { |
- leftTime = Math.max(leftTime - 0.05 * span, this._tracingModel.minimumRecordTime()); |
- rightTime = Math.min(rightTime + 0.05 * span, this._tracingModel.maximumRecordTime()); |
- } |
- this.requestWindowTimes(leftTime, rightTime); |
- }, |
+/** |
+ * @enum {string} |
+ */ |
+WebInspector.TimelinePanel.DetailsTab = { |
+ Details: 'Details', |
+ Events: 'Events', |
+ CallTree: 'CallTree', |
+ BottomUp: 'BottomUp', |
+ PaintProfiler: 'PaintProfiler', |
+ LayerViewer: 'LayerViewer' |
+}; |
- __proto__: WebInspector.Panel.prototype |
+/** |
+ * @enum {symbol} |
+ */ |
+WebInspector.TimelinePanel.State = { |
+ Idle: Symbol('Idle'), |
+ StartPending: Symbol('StartPending'), |
+ Recording: Symbol('Recording'), |
+ StopPending: Symbol('StopPending'), |
+ Loading: Symbol('Loading') |
}; |
+// Define row and header height, should be in sync with styles for timeline graphs. |
+WebInspector.TimelinePanel.rowHeight = 18; |
+WebInspector.TimelinePanel.headerHeight = 20; |
+ |
/** |
* @interface |
*/ |
-WebInspector.TimelineLifecycleDelegate = function() |
-{ |
-}; |
+WebInspector.TimelineLifecycleDelegate = function() {}; |
WebInspector.TimelineLifecycleDelegate.prototype = { |
- recordingStarted: function() {}, |
+ recordingStarted: function() {}, |
- /** |
- * @param {number} usage |
- */ |
- recordingProgress: function(usage) {}, |
+ /** |
+ * @param {number} usage |
+ */ |
+ recordingProgress: function(usage) {}, |
- loadingStarted: function() {}, |
+ loadingStarted: function() {}, |
- /** |
- * @param {number=} progress |
- */ |
- loadingProgress: function(progress) {}, |
+ /** |
+ * @param {number=} progress |
+ */ |
+ loadingProgress: function(progress) {}, |
- /** |
- * @param {boolean} success |
- */ |
- loadingComplete: function(success) {}, |
+ /** |
+ * @param {boolean} success |
+ */ |
+ loadingComplete: function(success) {}, |
}; |
- |
/** |
- * @constructor |
- * @extends {WebInspector.TabbedPane} |
- * @param {!WebInspector.TimelineModel} timelineModel |
- * @param {!Array<!WebInspector.TimelineModel.Filter>} filters |
- * @param {!WebInspector.TimelineModeViewDelegate} delegate |
+ * @unrestricted |
*/ |
-WebInspector.TimelineDetailsView = function(timelineModel, filters, delegate) |
-{ |
- WebInspector.TabbedPane.call(this); |
- this.element.classList.add("timeline-details"); |
+WebInspector.TimelineDetailsView = class extends WebInspector.TabbedPane { |
+ /** |
+ * @param {!WebInspector.TimelineModel} timelineModel |
+ * @param {!Array<!WebInspector.TimelineModel.Filter>} filters |
+ * @param {!WebInspector.TimelineModeViewDelegate} delegate |
+ */ |
+ constructor(timelineModel, filters, delegate) { |
+ super(); |
+ this.element.classList.add('timeline-details'); |
var tabIds = WebInspector.TimelinePanel.DetailsTab; |
this._defaultDetailsWidget = new WebInspector.VBox(); |
- this._defaultDetailsWidget.element.classList.add("timeline-details-view"); |
- this._defaultDetailsContentElement = this._defaultDetailsWidget.element.createChild("div", "timeline-details-view-body vbox"); |
- this.appendTab(tabIds.Details, WebInspector.UIString("Summary"), this._defaultDetailsWidget); |
+ this._defaultDetailsWidget.element.classList.add('timeline-details-view'); |
+ this._defaultDetailsContentElement = |
+ this._defaultDetailsWidget.element.createChild('div', 'timeline-details-view-body vbox'); |
+ this.appendTab(tabIds.Details, WebInspector.UIString('Summary'), this._defaultDetailsWidget); |
this.setPreferredTab(tabIds.Details); |
/** @type Map<string, WebInspector.TimelineTreeView> */ |
this._rangeDetailViews = new Map(); |
var bottomUpView = new WebInspector.BottomUpTimelineTreeView(timelineModel, filters); |
- this.appendTab(tabIds.BottomUp, WebInspector.UIString("Bottom-Up"), bottomUpView); |
+ this.appendTab(tabIds.BottomUp, WebInspector.UIString('Bottom-Up'), bottomUpView); |
this._rangeDetailViews.set(tabIds.BottomUp, bottomUpView); |
var callTreeView = new WebInspector.CallTreeTimelineTreeView(timelineModel, filters); |
- this.appendTab(tabIds.CallTree, WebInspector.UIString("Call Tree"), callTreeView); |
+ this.appendTab(tabIds.CallTree, WebInspector.UIString('Call Tree'), callTreeView); |
this._rangeDetailViews.set(tabIds.CallTree, callTreeView); |
var eventsView = new WebInspector.EventsTimelineTreeView(timelineModel, filters, delegate); |
- this.appendTab(tabIds.Events, WebInspector.UIString("Event Log"), eventsView); |
+ this.appendTab(tabIds.Events, WebInspector.UIString('Event Log'), eventsView); |
this._rangeDetailViews.set(tabIds.Events, eventsView); |
this.addEventListener(WebInspector.TabbedPane.Events.TabSelected, this._tabSelected, this); |
-}; |
- |
-WebInspector.TimelineDetailsView.prototype = { |
- /** |
- * @param {!Node} node |
- */ |
- setContent: function(node) |
- { |
- var allTabs = this.otherTabs(WebInspector.TimelinePanel.DetailsTab.Details); |
- for (var i = 0; i < allTabs.length; ++i) { |
- if (!this._rangeDetailViews.has(allTabs[i])) |
- this.closeTab(allTabs[i]); |
- } |
- this._defaultDetailsContentElement.removeChildren(); |
- this._defaultDetailsContentElement.appendChild(node); |
- }, |
- |
- /** |
- * @param {!WebInspector.TimelineSelection} selection |
- */ |
- updateContents: function(selection) |
- { |
- this._selection = selection; |
- var view = this.selectedTabId ? this._rangeDetailViews.get(this.selectedTabId) : null; |
- if (view) |
- view.updateContents(selection); |
- }, |
- |
- /** |
- * @override |
- * @param {string} id |
- * @param {string} tabTitle |
- * @param {!WebInspector.Widget} view |
- * @param {string=} tabTooltip |
- * @param {boolean=} userGesture |
- * @param {boolean=} isCloseable |
- */ |
- appendTab: function(id, tabTitle, view, tabTooltip, userGesture, isCloseable) |
- { |
- WebInspector.TabbedPane.prototype.appendTab.call(this, id, tabTitle, view, tabTooltip, userGesture, isCloseable); |
- if (this._preferredTabId !== this.selectedTabId) |
- this.selectTab(id); |
- }, |
- |
- /** |
- * @param {string} tabId |
- */ |
- setPreferredTab: function(tabId) |
- { |
- this._preferredTabId = tabId; |
- }, |
- |
- /** |
- * @param {!WebInspector.Event} event |
- */ |
- _tabSelected: function(event) |
- { |
- if (!event.data.isUserGesture) |
- return; |
- this.setPreferredTab(event.data.tabId); |
- this.updateContents(this._selection); |
- }, |
- |
- __proto__: WebInspector.TabbedPane.prototype |
+ } |
+ |
+ /** |
+ * @param {!Node} node |
+ */ |
+ setContent(node) { |
+ var allTabs = this.otherTabs(WebInspector.TimelinePanel.DetailsTab.Details); |
+ for (var i = 0; i < allTabs.length; ++i) { |
+ if (!this._rangeDetailViews.has(allTabs[i])) |
+ this.closeTab(allTabs[i]); |
+ } |
+ this._defaultDetailsContentElement.removeChildren(); |
+ this._defaultDetailsContentElement.appendChild(node); |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.TimelineSelection} selection |
+ */ |
+ updateContents(selection) { |
+ this._selection = selection; |
+ var view = this.selectedTabId ? this._rangeDetailViews.get(this.selectedTabId) : null; |
+ if (view) |
+ view.updateContents(selection); |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {string} id |
+ * @param {string} tabTitle |
+ * @param {!WebInspector.Widget} view |
+ * @param {string=} tabTooltip |
+ * @param {boolean=} userGesture |
+ * @param {boolean=} isCloseable |
+ */ |
+ appendTab(id, tabTitle, view, tabTooltip, userGesture, isCloseable) { |
+ super.appendTab(id, tabTitle, view, tabTooltip, userGesture, isCloseable); |
+ if (this._preferredTabId !== this.selectedTabId) |
+ this.selectTab(id); |
+ } |
+ |
+ /** |
+ * @param {string} tabId |
+ */ |
+ setPreferredTab(tabId) { |
+ this._preferredTabId = tabId; |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.Event} event |
+ */ |
+ _tabSelected(event) { |
+ if (!event.data.isUserGesture) |
+ return; |
+ this.setPreferredTab(event.data.tabId); |
+ this.updateContents(this._selection); |
+ } |
}; |
/** |
- * @constructor |
- * @param {!WebInspector.TimelineSelection.Type} type |
- * @param {number} startTime |
- * @param {number} endTime |
- * @param {!Object=} object |
+ * @unrestricted |
*/ |
-WebInspector.TimelineSelection = function(type, startTime, endTime, object) |
-{ |
+WebInspector.TimelineSelection = class { |
+ /** |
+ * @param {!WebInspector.TimelineSelection.Type} type |
+ * @param {number} startTime |
+ * @param {number} endTime |
+ * @param {!Object=} object |
+ */ |
+ constructor(type, startTime, endTime, object) { |
this._type = type; |
this._startTime = startTime; |
this._endTime = endTime; |
this._object = object || null; |
-}; |
+ } |
-/** |
- * @enum {string} |
- */ |
-WebInspector.TimelineSelection.Type = { |
- Frame: "Frame", |
- NetworkRequest: "NetworkRequest", |
- TraceEvent: "TraceEvent", |
- Range: "Range" |
-}; |
- |
-/** |
- * @param {!WebInspector.TimelineFrame} frame |
- * @return {!WebInspector.TimelineSelection} |
- */ |
-WebInspector.TimelineSelection.fromFrame = function(frame) |
-{ |
+ /** |
+ * @param {!WebInspector.TimelineFrame} frame |
+ * @return {!WebInspector.TimelineSelection} |
+ */ |
+ static fromFrame(frame) { |
return new WebInspector.TimelineSelection( |
- WebInspector.TimelineSelection.Type.Frame, |
- frame.startTime, frame.endTime, |
- frame); |
-}; |
- |
-/** |
- * @param {!WebInspector.TimelineModel.NetworkRequest} request |
- * @return {!WebInspector.TimelineSelection} |
- */ |
-WebInspector.TimelineSelection.fromNetworkRequest = function(request) |
-{ |
+ WebInspector.TimelineSelection.Type.Frame, frame.startTime, frame.endTime, frame); |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.TimelineModel.NetworkRequest} request |
+ * @return {!WebInspector.TimelineSelection} |
+ */ |
+ static fromNetworkRequest(request) { |
return new WebInspector.TimelineSelection( |
- WebInspector.TimelineSelection.Type.NetworkRequest, |
- request.startTime, request.endTime || request.startTime, |
+ WebInspector.TimelineSelection.Type.NetworkRequest, request.startTime, request.endTime || request.startTime, |
request); |
-}; |
+ } |
-/** |
- * @param {!WebInspector.TracingModel.Event} event |
- * @return {!WebInspector.TimelineSelection} |
- */ |
-WebInspector.TimelineSelection.fromTraceEvent = function(event) |
-{ |
+ /** |
+ * @param {!WebInspector.TracingModel.Event} event |
+ * @return {!WebInspector.TimelineSelection} |
+ */ |
+ static fromTraceEvent(event) { |
return new WebInspector.TimelineSelection( |
- WebInspector.TimelineSelection.Type.TraceEvent, |
- event.startTime, event.endTime || (event.startTime + 1), |
- event); |
+ WebInspector.TimelineSelection.Type.TraceEvent, event.startTime, event.endTime || (event.startTime + 1), event); |
+ } |
+ |
+ /** |
+ * @param {number} startTime |
+ * @param {number} endTime |
+ * @return {!WebInspector.TimelineSelection} |
+ */ |
+ static fromRange(startTime, endTime) { |
+ return new WebInspector.TimelineSelection(WebInspector.TimelineSelection.Type.Range, startTime, endTime); |
+ } |
+ |
+ /** |
+ * @return {!WebInspector.TimelineSelection.Type} |
+ */ |
+ type() { |
+ return this._type; |
+ } |
+ |
+ /** |
+ * @return {?Object} |
+ */ |
+ object() { |
+ return this._object; |
+ } |
+ |
+ /** |
+ * @return {number} |
+ */ |
+ startTime() { |
+ return this._startTime; |
+ } |
+ |
+ /** |
+ * @return {number} |
+ */ |
+ endTime() { |
+ return this._endTime; |
+ } |
}; |
/** |
- * @param {number} startTime |
- * @param {number} endTime |
- * @return {!WebInspector.TimelineSelection} |
+ * @enum {string} |
*/ |
-WebInspector.TimelineSelection.fromRange = function(startTime, endTime) |
-{ |
- return new WebInspector.TimelineSelection( |
- WebInspector.TimelineSelection.Type.Range, |
- startTime, endTime); |
+WebInspector.TimelineSelection.Type = { |
+ Frame: 'Frame', |
+ NetworkRequest: 'NetworkRequest', |
+ TraceEvent: 'TraceEvent', |
+ Range: 'Range' |
}; |
-WebInspector.TimelineSelection.prototype = { |
- /** |
- * @return {!WebInspector.TimelineSelection.Type} |
- */ |
- type: function() |
- { |
- return this._type; |
- }, |
- |
- /** |
- * @return {?Object} |
- */ |
- object: function() |
- { |
- return this._object; |
- }, |
- |
- /** |
- * @return {number} |
- */ |
- startTime: function() |
- { |
- return this._startTime; |
- }, |
- |
- /** |
- * @return {number} |
- */ |
- endTime: function() |
- { |
- return this._endTime; |
- } |
-}; |
/** |
* @interface |
* @extends {WebInspector.EventTarget} |
*/ |
-WebInspector.TimelineModeView = function() |
-{ |
-}; |
+WebInspector.TimelineModeView = function() {}; |
WebInspector.TimelineModeView.prototype = { |
- /** |
- * @return {!WebInspector.Widget} |
- */ |
- view: function() {}, |
- |
- dispose: function() {}, |
- |
- /** |
- * @return {?Element} |
- */ |
- resizerElement: function() {}, |
- |
- reset: function() {}, |
- |
- refreshRecords: function() {}, |
- |
- /** |
- * @param {?WebInspector.TracingModel.Event} event |
- * @param {string=} regex |
- * @param {boolean=} select |
- */ |
- highlightSearchResult: function(event, regex, select) {}, |
- |
- /** |
- * @param {number} startTime |
- * @param {number} endTime |
- */ |
- setWindowTimes: function(startTime, endTime) {}, |
- |
- /** |
- * @param {?WebInspector.TimelineSelection} selection |
- */ |
- setSelection: function(selection) {}, |
- |
- /** |
- * @param {?WebInspector.TracingModel.Event} event |
- */ |
- highlightEvent: function(event) { } |
+ /** |
+ * @return {!WebInspector.Widget} |
+ */ |
+ view: function() {}, |
+ |
+ dispose: function() {}, |
+ |
+ /** |
+ * @return {?Element} |
+ */ |
+ resizerElement: function() {}, |
+ |
+ reset: function() {}, |
+ |
+ refreshRecords: function() {}, |
+ |
+ /** |
+ * @param {?WebInspector.TracingModel.Event} event |
+ * @param {string=} regex |
+ * @param {boolean=} select |
+ */ |
+ highlightSearchResult: function(event, regex, select) {}, |
+ |
+ /** |
+ * @param {number} startTime |
+ * @param {number} endTime |
+ */ |
+ setWindowTimes: function(startTime, endTime) {}, |
+ |
+ /** |
+ * @param {?WebInspector.TimelineSelection} selection |
+ */ |
+ setSelection: function(selection) {}, |
+ |
+ /** |
+ * @param {?WebInspector.TracingModel.Event} event |
+ */ |
+ highlightEvent: function(event) {} |
}; |
/** |
@@ -1574,300 +1526,256 @@ WebInspector.TimelineModeView.prototype = { |
WebInspector.TimelineModeViewDelegate = function() {}; |
WebInspector.TimelineModeViewDelegate.prototype = { |
- /** |
- * @param {number} startTime |
- * @param {number} endTime |
- */ |
- requestWindowTimes: function(startTime, endTime) {}, |
- |
- /** |
- * @param {?WebInspector.TimelineSelection} selection |
- * @param {!WebInspector.TimelinePanel.DetailsTab=} preferredTab |
- */ |
- select: function(selection, preferredTab) {}, |
- |
- /** |
- * @param {number} time |
- */ |
- selectEntryAtTime: function(time) {}, |
- |
- /** |
- * @param {!Node} node |
- */ |
- showInDetails: function(node) {}, |
- |
- /** |
- * @param {?WebInspector.TracingModel.Event} event |
- */ |
- highlightEvent: function(event) {} |
+ /** |
+ * @param {number} startTime |
+ * @param {number} endTime |
+ */ |
+ requestWindowTimes: function(startTime, endTime) {}, |
+ |
+ /** |
+ * @param {?WebInspector.TimelineSelection} selection |
+ * @param {!WebInspector.TimelinePanel.DetailsTab=} preferredTab |
+ */ |
+ select: function(selection, preferredTab) {}, |
+ |
+ /** |
+ * @param {number} time |
+ */ |
+ selectEntryAtTime: function(time) {}, |
+ |
+ /** |
+ * @param {!Node} node |
+ */ |
+ showInDetails: function(node) {}, |
+ |
+ /** |
+ * @param {?WebInspector.TracingModel.Event} event |
+ */ |
+ highlightEvent: function(event) {} |
}; |
/** |
- * @constructor |
- * @extends {WebInspector.TimelineModel.Filter} |
+ * @unrestricted |
*/ |
-WebInspector.TimelineCategoryFilter = function() |
-{ |
- WebInspector.TimelineModel.Filter.call(this); |
-}; |
- |
-WebInspector.TimelineCategoryFilter.prototype = { |
- /** |
- * @override |
- * @param {!WebInspector.TracingModel.Event} event |
- * @return {boolean} |
- */ |
- accept: function(event) |
- { |
- return !WebInspector.TimelineUIUtils.eventStyle(event).category.hidden; |
- }, |
- |
- __proto__: WebInspector.TimelineModel.Filter.prototype |
+WebInspector.TimelineCategoryFilter = class extends WebInspector.TimelineModel.Filter { |
+ constructor() { |
+ super(); |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {!WebInspector.TracingModel.Event} event |
+ * @return {boolean} |
+ */ |
+ accept(event) { |
+ return !WebInspector.TimelineUIUtils.eventStyle(event).category.hidden; |
+ } |
}; |
/** |
- * @constructor |
- * @extends {WebInspector.TimelineModel.Filter} |
+ * @unrestricted |
*/ |
-WebInspector.TimelineIsLongFilter = function() |
-{ |
- WebInspector.TimelineModel.Filter.call(this); |
+WebInspector.TimelineIsLongFilter = class extends WebInspector.TimelineModel.Filter { |
+ constructor() { |
+ super(); |
this._minimumRecordDuration = 0; |
-}; |
- |
-WebInspector.TimelineIsLongFilter.prototype = { |
- /** |
- * @param {number} value |
- */ |
- setMinimumRecordDuration: function(value) |
- { |
- this._minimumRecordDuration = value; |
- }, |
- |
- /** |
- * @override |
- * @param {!WebInspector.TracingModel.Event} event |
- * @return {boolean} |
- */ |
- accept: function(event) |
- { |
- var duration = event.endTime ? event.endTime - event.startTime : 0; |
- return duration >= this._minimumRecordDuration; |
- }, |
- |
- __proto__: WebInspector.TimelineModel.Filter.prototype |
- |
+ } |
+ |
+ /** |
+ * @param {number} value |
+ */ |
+ setMinimumRecordDuration(value) { |
+ this._minimumRecordDuration = value; |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {!WebInspector.TracingModel.Event} event |
+ * @return {boolean} |
+ */ |
+ accept(event) { |
+ var duration = event.endTime ? event.endTime - event.startTime : 0; |
+ return duration >= this._minimumRecordDuration; |
+ } |
}; |
/** |
- * @constructor |
- * @extends {WebInspector.TimelineModel.Filter} |
- * @param {!RegExp=} regExp |
+ * @unrestricted |
*/ |
-WebInspector.TimelineTextFilter = function(regExp) |
-{ |
- WebInspector.TimelineModel.Filter.call(this); |
+WebInspector.TimelineTextFilter = class extends WebInspector.TimelineModel.Filter { |
+ /** |
+ * @param {!RegExp=} regExp |
+ */ |
+ constructor(regExp) { |
+ super(); |
this._setRegExp(regExp || null); |
-}; |
- |
-WebInspector.TimelineTextFilter.prototype = { |
- /** |
- * @param {?RegExp} regExp |
- */ |
- _setRegExp: function(regExp) |
- { |
- this._regExp = regExp; |
- }, |
- |
- /** |
- * @override |
- * @param {!WebInspector.TracingModel.Event} event |
- * @return {boolean} |
- */ |
- accept: function(event) |
- { |
- return !this._regExp || WebInspector.TimelineUIUtils.testContentMatching(event, this._regExp); |
- }, |
- |
- __proto__: WebInspector.TimelineModel.Filter.prototype |
+ } |
+ |
+ /** |
+ * @param {?RegExp} regExp |
+ */ |
+ _setRegExp(regExp) { |
+ this._regExp = regExp; |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {!WebInspector.TracingModel.Event} event |
+ * @return {boolean} |
+ */ |
+ accept(event) { |
+ return !this._regExp || WebInspector.TimelineUIUtils.testContentMatching(event, this._regExp); |
+ } |
}; |
/** |
- * @constructor |
- * @extends {WebInspector.VBox} |
- * @param {boolean} showTimer |
- * @param {function()} stopCallback |
+ * @unrestricted |
*/ |
-WebInspector.TimelinePanel.StatusPane = function(showTimer, stopCallback) |
-{ |
- WebInspector.VBox.call(this, true); |
- this.registerRequiredCSS("timeline/timelineStatusDialog.css"); |
- this.contentElement.classList.add("timeline-status-dialog"); |
- |
- var statusLine = this.contentElement.createChild("div", "status-dialog-line status"); |
- statusLine.createChild("div", "label").textContent = WebInspector.UIString("Status"); |
- this._status = statusLine.createChild("div", "content"); |
+WebInspector.TimelinePanel.StatusPane = class extends WebInspector.VBox { |
+ /** |
+ * @param {boolean} showTimer |
+ * @param {function()} stopCallback |
+ */ |
+ constructor(showTimer, stopCallback) { |
+ super(true); |
+ this.registerRequiredCSS('timeline/timelineStatusDialog.css'); |
+ this.contentElement.classList.add('timeline-status-dialog'); |
+ |
+ var statusLine = this.contentElement.createChild('div', 'status-dialog-line status'); |
+ statusLine.createChild('div', 'label').textContent = WebInspector.UIString('Status'); |
+ this._status = statusLine.createChild('div', 'content'); |
if (showTimer) { |
- var timeLine = this.contentElement.createChild("div", "status-dialog-line time"); |
- timeLine.createChild("div", "label").textContent = WebInspector.UIString("Time"); |
- this._time = timeLine.createChild("div", "content"); |
+ var timeLine = this.contentElement.createChild('div', 'status-dialog-line time'); |
+ timeLine.createChild('div', 'label').textContent = WebInspector.UIString('Time'); |
+ this._time = timeLine.createChild('div', 'content'); |
} |
- var progressLine = this.contentElement.createChild("div", "status-dialog-line progress"); |
- this._progressLabel = progressLine.createChild("div", "label"); |
- this._progressBar = progressLine.createChild("div", "indicator-container").createChild("div", "indicator"); |
- |
- this._stopButton = createTextButton(WebInspector.UIString("Stop"), stopCallback); |
- this.contentElement.createChild("div", "stop-button").appendChild(this._stopButton); |
+ var progressLine = this.contentElement.createChild('div', 'status-dialog-line progress'); |
+ this._progressLabel = progressLine.createChild('div', 'label'); |
+ this._progressBar = progressLine.createChild('div', 'indicator-container').createChild('div', 'indicator'); |
+ |
+ this._stopButton = createTextButton(WebInspector.UIString('Stop'), stopCallback); |
+ this.contentElement.createChild('div', 'stop-button').appendChild(this._stopButton); |
+ } |
+ |
+ finish() { |
+ this._stopTimer(); |
+ this._stopButton.disabled = true; |
+ } |
+ |
+ hide() { |
+ this.element.parentNode.classList.remove('tinted'); |
+ this.element.remove(); |
+ } |
+ |
+ /** |
+ * @param {!Element} parent |
+ */ |
+ showPane(parent) { |
+ this.show(parent); |
+ parent.classList.add('tinted'); |
+ } |
+ |
+ /** |
+ * @param {string} text |
+ */ |
+ updateStatus(text) { |
+ this._status.textContent = text; |
+ } |
+ |
+ /** |
+ * @param {string} activity |
+ * @param {number} percent |
+ */ |
+ updateProgressBar(activity, percent) { |
+ this._progressLabel.textContent = activity; |
+ this._progressBar.style.width = percent.toFixed(1) + '%'; |
+ this._updateTimer(); |
+ } |
+ |
+ startTimer() { |
+ this._startTime = Date.now(); |
+ this._timeUpdateTimer = setInterval(this._updateTimer.bind(this, false), 1000); |
+ this._updateTimer(); |
+ } |
+ |
+ _stopTimer() { |
+ if (!this._timeUpdateTimer) |
+ return; |
+ clearInterval(this._timeUpdateTimer); |
+ this._updateTimer(true); |
+ delete this._timeUpdateTimer; |
+ } |
+ |
+ /** |
+ * @param {boolean=} precise |
+ */ |
+ _updateTimer(precise) { |
+ if (!this._timeUpdateTimer) |
+ return; |
+ var elapsed = (Date.now() - this._startTime) / 1000; |
+ this._time.textContent = WebInspector.UIString('%s\u2009sec', elapsed.toFixed(precise ? 1 : 0)); |
+ } |
}; |
-WebInspector.TimelinePanel.StatusPane.prototype = { |
- finish: function() |
- { |
- this._stopTimer(); |
- this._stopButton.disabled = true; |
- }, |
- |
- hide: function() |
- { |
- this.element.parentNode.classList.remove("tinted"); |
- this.element.remove(); |
- }, |
- |
- /** |
- * @param {!Element} parent |
- */ |
- showPane: function(parent) |
- { |
- this.show(parent); |
- parent.classList.add("tinted"); |
- }, |
- |
- /** |
- * @param {string} text |
- */ |
- updateStatus: function(text) |
- { |
- this._status.textContent = text; |
- }, |
- |
- /** |
- * @param {string} activity |
- * @param {number} percent |
- */ |
- updateProgressBar: function(activity, percent) |
- { |
- this._progressLabel.textContent = activity; |
- this._progressBar.style.width = percent.toFixed(1) + "%"; |
- this._updateTimer(); |
- }, |
- |
- startTimer: function() |
- { |
- this._startTime = Date.now(); |
- this._timeUpdateTimer = setInterval(this._updateTimer.bind(this, false), 1000); |
- this._updateTimer(); |
- }, |
- |
- _stopTimer: function() |
- { |
- if (!this._timeUpdateTimer) |
- return; |
- clearInterval(this._timeUpdateTimer); |
- this._updateTimer(true); |
- delete this._timeUpdateTimer; |
- }, |
- |
- /** |
- * @param {boolean=} precise |
- */ |
- _updateTimer: function(precise) |
- { |
- if (!this._timeUpdateTimer) |
- return; |
- var elapsed = (Date.now() - this._startTime) / 1000; |
- this._time.textContent = WebInspector.UIString("%s\u2009sec", elapsed.toFixed(precise ? 1 : 0)); |
- }, |
- |
- __proto__: WebInspector.VBox.prototype |
-}; |
- |
-/** |
- * @return {!WebInspector.TimelinePanel} |
- */ |
-WebInspector.TimelinePanel.instance = function() |
-{ |
- return /** @type {!WebInspector.TimelinePanel} */ (self.runtime.sharedInstance(WebInspector.TimelinePanel)); |
-}; |
/** |
- * @constructor |
* @implements {WebInspector.QueryParamHandler} |
+ * @unrestricted |
*/ |
-WebInspector.LoadTimelineHandler = function() |
-{ |
-}; |
- |
-WebInspector.LoadTimelineHandler.prototype = { |
- /** |
- * @override |
- * @param {string} value |
- */ |
- handleQueryParam: function(value) |
- { |
- WebInspector.viewManager.showView("timeline").then(() => { |
- WebInspector.TimelinePanel.instance()._loadFromURL(window.decodeURIComponent(value)); |
- }); |
- } |
+WebInspector.LoadTimelineHandler = class { |
+ /** |
+ * @override |
+ * @param {string} value |
+ */ |
+ handleQueryParam(value) { |
+ WebInspector.viewManager.showView('timeline').then(() => { |
+ WebInspector.TimelinePanel.instance()._loadFromURL(window.decodeURIComponent(value)); |
+ }); |
+ } |
}; |
/** |
- * @constructor |
* @implements {WebInspector.ActionDelegate} |
+ * @unrestricted |
*/ |
-WebInspector.TimelinePanel.ActionDelegate = function() |
-{ |
-}; |
- |
-WebInspector.TimelinePanel.ActionDelegate.prototype = { |
- /** |
- * @override |
- * @param {!WebInspector.Context} context |
- * @param {string} actionId |
- * @return {boolean} |
- */ |
- handleAction: function(context, actionId) |
- { |
- var panel = WebInspector.context.flavor(WebInspector.TimelinePanel); |
- console.assert(panel && panel instanceof WebInspector.TimelinePanel); |
- switch (actionId) { |
- case "timeline.toggle-recording": |
- panel._toggleRecording(); |
- return true; |
- case "timeline.save-to-file": |
- panel._saveToFile(); |
- return true; |
- case "timeline.load-from-file": |
- panel._selectFileToLoad(); |
- return true; |
- case "timeline.jump-to-previous-frame": |
- panel._jumpToFrame(-1); |
- return true; |
- case "timeline.jump-to-next-frame": |
- panel._jumpToFrame(1); |
- return true; |
- } |
- return false; |
+WebInspector.TimelinePanel.ActionDelegate = class { |
+ /** |
+ * @override |
+ * @param {!WebInspector.Context} context |
+ * @param {string} actionId |
+ * @return {boolean} |
+ */ |
+ handleAction(context, actionId) { |
+ var panel = WebInspector.context.flavor(WebInspector.TimelinePanel); |
+ console.assert(panel && panel instanceof WebInspector.TimelinePanel); |
+ switch (actionId) { |
+ case 'timeline.toggle-recording': |
+ panel._toggleRecording(); |
+ return true; |
+ case 'timeline.save-to-file': |
+ panel._saveToFile(); |
+ return true; |
+ case 'timeline.load-from-file': |
+ panel._selectFileToLoad(); |
+ return true; |
+ case 'timeline.jump-to-previous-frame': |
+ panel._jumpToFrame(-1); |
+ return true; |
+ case 'timeline.jump-to-next-frame': |
+ panel._jumpToFrame(1); |
+ return true; |
} |
+ return false; |
+ } |
}; |
/** |
- * @constructor |
- * @extends {WebInspector.Object} |
+ * @unrestricted |
*/ |
-WebInspector.TimelineFilters = function() |
-{ |
- WebInspector.Object.call(this); |
+WebInspector.TimelineFilters = class extends WebInspector.Object { |
+ constructor() { |
+ super(); |
this._categoryFilter = new WebInspector.TimelineCategoryFilter(); |
this._durationFilter = new WebInspector.TimelineIsLongFilter(); |
@@ -1875,248 +1783,225 @@ WebInspector.TimelineFilters = function() |
this._filters = [this._categoryFilter, this._durationFilter, this._textFilter]; |
this._createFilterBar(); |
-}; |
- |
-/** @enum {symbol} */ |
-WebInspector.TimelineFilters.Events = { |
- FilterChanged: Symbol("FilterChanged") |
-}; |
- |
-WebInspector.TimelineFilters._durationFilterPresetsMs = [0, 1, 15]; |
- |
-WebInspector.TimelineFilters.prototype = { |
- /** |
- * @return {!Array<!WebInspector.TimelineModel.Filter>} |
- */ |
- filters: function() |
- { |
- return this._filters; |
- }, |
+ } |
+ |
+ /** |
+ * @return {!Array<!WebInspector.TimelineModel.Filter>} |
+ */ |
+ filters() { |
+ return this._filters; |
+ } |
+ |
+ /** |
+ * @return {?RegExp} |
+ */ |
+ searchRegExp() { |
+ return this._textFilter._regExp; |
+ } |
+ |
+ /** |
+ * @return {!WebInspector.ToolbarItem} |
+ */ |
+ filterButton() { |
+ return this._filterBar.filterButton(); |
+ } |
+ |
+ /** |
+ * @return {!WebInspector.Widget} |
+ */ |
+ filtersWidget() { |
+ return this._filterBar; |
+ } |
+ |
+ _createFilterBar() { |
+ this._filterBar = new WebInspector.FilterBar('timelinePanel'); |
+ |
+ this._textFilterUI = new WebInspector.TextFilterUI(); |
+ this._textFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged, textFilterChanged, this); |
+ this._filterBar.addFilter(this._textFilterUI); |
+ |
+ var durationOptions = []; |
+ for (var durationMs of WebInspector.TimelineFilters._durationFilterPresetsMs) { |
+ var durationOption = {}; |
+ if (!durationMs) { |
+ durationOption.label = WebInspector.UIString('All'); |
+ durationOption.title = WebInspector.UIString('Show all records'); |
+ } else { |
+ durationOption.label = WebInspector.UIString('\u2265 %dms', durationMs); |
+ durationOption.title = WebInspector.UIString('Hide records shorter than %dms', durationMs); |
+ } |
+ durationOption.value = durationMs; |
+ durationOptions.push(durationOption); |
+ } |
+ var durationFilterUI = new WebInspector.ComboBoxFilterUI(durationOptions); |
+ durationFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged, durationFilterChanged, this); |
+ this._filterBar.addFilter(durationFilterUI); |
+ |
+ var categoryFiltersUI = {}; |
+ var categories = WebInspector.TimelineUIUtils.categories(); |
+ for (var categoryName in categories) { |
+ var category = categories[categoryName]; |
+ if (!category.visible) |
+ continue; |
+ var filter = new WebInspector.CheckboxFilterUI(category.name, category.title); |
+ filter.setColor(category.color, 'rgba(0, 0, 0, 0.2)'); |
+ categoryFiltersUI[category.name] = filter; |
+ filter.addEventListener( |
+ WebInspector.FilterUI.Events.FilterChanged, categoriesFilterChanged.bind(this, categoryName)); |
+ this._filterBar.addFilter(filter); |
+ } |
+ return this._filterBar; |
/** |
- * @return {?RegExp} |
+ * @this {WebInspector.TimelineFilters} |
*/ |
- searchRegExp: function() |
- { |
- return this._textFilter._regExp; |
- }, |
+ function textFilterChanged() { |
+ var searchQuery = this._textFilterUI.value(); |
+ this._textFilter._setRegExp(searchQuery ? createPlainTextSearchRegex(searchQuery, 'i') : null); |
+ this._notifyFiltersChanged(); |
+ } |
/** |
- * @return {!WebInspector.ToolbarItem} |
+ * @this {WebInspector.TimelineFilters} |
*/ |
- filterButton: function() |
- { |
- return this._filterBar.filterButton(); |
- }, |
+ function durationFilterChanged() { |
+ var duration = durationFilterUI.value(); |
+ var minimumRecordDuration = parseInt(duration, 10); |
+ this._durationFilter.setMinimumRecordDuration(minimumRecordDuration); |
+ this._notifyFiltersChanged(); |
+ } |
/** |
- * @return {!WebInspector.Widget} |
+ * @param {string} name |
+ * @this {WebInspector.TimelineFilters} |
*/ |
- filtersWidget: function() |
- { |
- return this._filterBar; |
- }, |
- |
- _createFilterBar: function() |
- { |
- this._filterBar = new WebInspector.FilterBar("timelinePanel"); |
- |
- this._textFilterUI = new WebInspector.TextFilterUI(); |
- this._textFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged, textFilterChanged, this); |
- this._filterBar.addFilter(this._textFilterUI); |
- |
- var durationOptions = []; |
- for (var durationMs of WebInspector.TimelineFilters._durationFilterPresetsMs) { |
- var durationOption = {}; |
- if (!durationMs) { |
- durationOption.label = WebInspector.UIString("All"); |
- durationOption.title = WebInspector.UIString("Show all records"); |
- } else { |
- durationOption.label = WebInspector.UIString("\u2265 %dms", durationMs); |
- durationOption.title = WebInspector.UIString("Hide records shorter than %dms", durationMs); |
- } |
- durationOption.value = durationMs; |
- durationOptions.push(durationOption); |
- } |
- var durationFilterUI = new WebInspector.ComboBoxFilterUI(durationOptions); |
- durationFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged, durationFilterChanged, this); |
- this._filterBar.addFilter(durationFilterUI); |
- |
- var categoryFiltersUI = {}; |
- var categories = WebInspector.TimelineUIUtils.categories(); |
- for (var categoryName in categories) { |
- var category = categories[categoryName]; |
- if (!category.visible) |
- continue; |
- var filter = new WebInspector.CheckboxFilterUI(category.name, category.title); |
- filter.setColor(category.color, "rgba(0, 0, 0, 0.2)"); |
- categoryFiltersUI[category.name] = filter; |
- filter.addEventListener(WebInspector.FilterUI.Events.FilterChanged, categoriesFilterChanged.bind(this, categoryName)); |
- this._filterBar.addFilter(filter); |
- } |
- return this._filterBar; |
- |
- /** |
- * @this {WebInspector.TimelineFilters} |
- */ |
- function textFilterChanged() |
- { |
- var searchQuery = this._textFilterUI.value(); |
- this._textFilter._setRegExp(searchQuery ? createPlainTextSearchRegex(searchQuery, "i") : null); |
- this._notifyFiltersChanged(); |
- } |
- |
- /** |
- * @this {WebInspector.TimelineFilters} |
- */ |
- function durationFilterChanged() |
- { |
- var duration = durationFilterUI.value(); |
- var minimumRecordDuration = parseInt(duration, 10); |
- this._durationFilter.setMinimumRecordDuration(minimumRecordDuration); |
- this._notifyFiltersChanged(); |
- } |
- |
- /** |
- * @param {string} name |
- * @this {WebInspector.TimelineFilters} |
- */ |
- function categoriesFilterChanged(name) |
- { |
- var categories = WebInspector.TimelineUIUtils.categories(); |
- categories[name].hidden = !categoryFiltersUI[name].checked(); |
- this._notifyFiltersChanged(); |
- } |
- }, |
+ function categoriesFilterChanged(name) { |
+ var categories = WebInspector.TimelineUIUtils.categories(); |
+ categories[name].hidden = !categoryFiltersUI[name].checked(); |
+ this._notifyFiltersChanged(); |
+ } |
+ } |
- _notifyFiltersChanged: function() |
- { |
- this.dispatchEventToListeners(WebInspector.TimelineFilters.Events.FilterChanged); |
- }, |
+ _notifyFiltersChanged() { |
+ this.dispatchEventToListeners(WebInspector.TimelineFilters.Events.FilterChanged); |
+ } |
+}; |
- __proto__: WebInspector.Object.prototype |
+/** @enum {symbol} */ |
+WebInspector.TimelineFilters.Events = { |
+ FilterChanged: Symbol('FilterChanged') |
}; |
+WebInspector.TimelineFilters._durationFilterPresetsMs = [0, 1, 15]; |
+ |
/** |
- * @constructor |
- * @extends {WebInspector.Object} |
* @implements {WebInspector.TargetManager.Observer} |
+ * @unrestricted |
*/ |
-WebInspector.CPUThrottlingManager = function() |
-{ |
+WebInspector.CPUThrottlingManager = class extends WebInspector.Object { |
+ constructor() { |
+ super(); |
this._targets = []; |
- this._throttlingRate = 1.; // No throttling |
+ this._throttlingRate = 1.; // No throttling |
WebInspector.targetManager.observeTargets(this, WebInspector.Target.Capability.Browser); |
-}; |
- |
-WebInspector.CPUThrottlingManager.prototype = { |
- /** |
- * @param {number} value |
- */ |
- setRate: function(value) |
- { |
- this._throttlingRate = value; |
- this._targets.forEach(target => target.emulationAgent().setCPUThrottlingRate(value)); |
- if (value !== 1) |
- WebInspector.inspectorView.setPanelIcon("timeline", "warning-icon", WebInspector.UIString("CPU throttling is enabled")); |
- else |
- WebInspector.inspectorView.setPanelIcon("timeline", "", ""); |
- }, |
- |
- /** |
- * @return {number} |
- */ |
- rate: function() |
- { |
- return this._throttlingRate; |
- }, |
- |
- /** |
- * @override |
- * @param {!WebInspector.Target} target |
- */ |
- targetAdded: function(target) |
- { |
- this._targets.push(target); |
- target.emulationAgent().setCPUThrottlingRate(this._throttlingRate); |
- }, |
- |
- /** |
- * @override |
- * @param {!WebInspector.Target} target |
- */ |
- targetRemoved: function(target) |
- { |
- this._targets.remove(target, true); |
- }, |
- |
- __proto__: WebInspector.Object.prototype |
+ } |
+ |
+ /** |
+ * @param {number} value |
+ */ |
+ setRate(value) { |
+ this._throttlingRate = value; |
+ this._targets.forEach(target => target.emulationAgent().setCPUThrottlingRate(value)); |
+ if (value !== 1) |
+ WebInspector.inspectorView.setPanelIcon( |
+ 'timeline', 'warning-icon', WebInspector.UIString('CPU throttling is enabled')); |
+ else |
+ WebInspector.inspectorView.setPanelIcon('timeline', '', ''); |
+ } |
+ |
+ /** |
+ * @return {number} |
+ */ |
+ rate() { |
+ return this._throttlingRate; |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {!WebInspector.Target} target |
+ */ |
+ targetAdded(target) { |
+ this._targets.push(target); |
+ target.emulationAgent().setCPUThrottlingRate(this._throttlingRate); |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {!WebInspector.Target} target |
+ */ |
+ targetRemoved(target) { |
+ this._targets.remove(target, true); |
+ } |
}; |
/** |
- * @constructor |
- * @extends {WebInspector.HBox} |
+ * @unrestricted |
*/ |
-WebInspector.TimelinePanel.CustomCPUThrottlingRateDialog = function() |
-{ |
- WebInspector.HBox.call(this, true); |
- this.registerRequiredCSS("ui_lazy/dialog.css"); |
- this.contentElement.createChild("label").textContent = WebInspector.UIString("CPU Slowdown Rate: "); |
+WebInspector.TimelinePanel.CustomCPUThrottlingRateDialog = class extends WebInspector.HBox { |
+ constructor() { |
+ super(true); |
+ this.registerRequiredCSS('ui_lazy/dialog.css'); |
+ this.contentElement.createChild('label').textContent = WebInspector.UIString('CPU Slowdown Rate: '); |
- this._input = this.contentElement.createChild("input"); |
- this._input.setAttribute("type", "text"); |
- this._input.style.width = "64px"; |
- this._input.addEventListener("keydown", this._onKeyDown.bind(this), false); |
+ this._input = this.contentElement.createChild('input'); |
+ this._input.setAttribute('type', 'text'); |
+ this._input.style.width = '64px'; |
+ this._input.addEventListener('keydown', this._onKeyDown.bind(this), false); |
- var addButton = this.contentElement.createChild("button"); |
- addButton.textContent = WebInspector.UIString("Set"); |
- addButton.addEventListener("click", this._apply.bind(this), false); |
+ var addButton = this.contentElement.createChild('button'); |
+ addButton.textContent = WebInspector.UIString('Set'); |
+ addButton.addEventListener('click', this._apply.bind(this), false); |
this.setDefaultFocusedElement(this._input); |
this.contentElement.tabIndex = 0; |
this._resultPromise = new Promise(fulfill => this._callback = fulfill); |
-}; |
+ } |
-/** |
- * @param {!Element=} anchor |
- * @return {!Promise<string>} |
- */ |
-WebInspector.TimelinePanel.CustomCPUThrottlingRateDialog.show = function(anchor) |
-{ |
+ /** |
+ * @param {!Element=} anchor |
+ * @return {!Promise<string>} |
+ */ |
+ static show(anchor) { |
var dialog = new WebInspector.Dialog(); |
var dialogContent = new WebInspector.TimelinePanel.CustomCPUThrottlingRateDialog(); |
dialogContent.show(dialog.element); |
dialog.setWrapsContent(true); |
if (anchor) |
- dialog.setPosition(anchor.totalOffsetLeft() - 32, anchor.totalOffsetTop() + anchor.offsetHeight); |
+ dialog.setPosition(anchor.totalOffsetLeft() - 32, anchor.totalOffsetTop() + anchor.offsetHeight); |
dialog.show(); |
return dialogContent.result().then(value => (dialog.detach(), value)); |
+ } |
+ |
+ /** |
+ * @return {!Promise<string>} |
+ */ |
+ result() { |
+ return this._resultPromise; |
+ } |
+ |
+ _apply() { |
+ this._callback(this._input.value); |
+ } |
+ |
+ /** |
+ * @param {!Event} event |
+ */ |
+ _onKeyDown(event) { |
+ if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Enter.code) { |
+ event.preventDefault(); |
+ this._apply(); |
+ } |
+ } |
}; |
-WebInspector.TimelinePanel.CustomCPUThrottlingRateDialog.prototype = { |
- /** |
- * @return {!Promise<string>} |
- */ |
- result: function() |
- { |
- return this._resultPromise; |
- }, |
- _apply: function() |
- { |
- this._callback(this._input.value); |
- }, |
- |
- /** |
- * @param {!Event} event |
- */ |
- _onKeyDown: function(event) |
- { |
- if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Enter.code) { |
- event.preventDefault(); |
- this._apply(); |
- } |
- }, |
- |
- __proto__: WebInspector.HBox.prototype |
-}; |