| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| 'use strict'; |
| |
| /** |
| * @fileoverview ProfilingView glues the TimelineView control to |
| * TracingController. |
| */ |
| cr.define('tracing', function() { |
| /** |
| * ProfilingView |
| * @constructor |
| * @extends {ui.TabPanel} |
| */ |
| var ProfilingView = cr.ui.define(cr.ui.TabPanel); |
| |
| ProfilingView.prototype = { |
| __proto__: cr.ui.TabPanel.prototype, |
| |
| traceEvents_: [], |
| systemTraceEvents_: [], |
| |
| decorate: function() { |
| cr.ui.TabPanel.prototype.decorate.apply(this); |
| this.classList.add('profiling-view'); |
| |
| // make the <list>/add/save/record element |
| this.recordBn_ = document.createElement('button'); |
| this.recordBn_.className = 'record'; |
| this.recordBn_.textContent = 'Record'; |
| this.recordBn_.addEventListener('click', this.onRecord_.bind(this)); |
| |
| this.saveBn_ = document.createElement('button'); |
| this.saveBn_.textContent = 'Save'; |
| this.saveBn_.addEventListener('click', this.onSave_.bind(this)); |
| |
| this.loadBn_ = document.createElement('button'); |
| this.loadBn_.textContent = 'Load'; |
| this.loadBn_.addEventListener('click', this.onLoad_.bind(this)); |
| |
| if (cr.isChromeOS) { |
| this.systemTracingBn_ = document.createElement('input'); |
| this.systemTracingBn_.type = 'checkbox'; |
| this.systemTracingBn_.checked = true; |
| |
| var systemTracingLabelEl = document.createElement('div'); |
| systemTracingLabelEl.className = 'label'; |
| systemTracingLabelEl.textContent = 'System events'; |
| systemTracingLabelEl.appendChild(this.systemTracingBn_); |
| } |
| |
| this.timelineView_ = new tracing.TimelineView(); |
| this.timelineView_.leftControls.appendChild(this.recordBn_); |
| this.timelineView_.leftControls.appendChild(this.saveBn_); |
| this.timelineView_.leftControls.appendChild(this.loadBn_); |
| if (cr.isChromeOS) |
| this.timelineView_.leftControls.appendChild(this.systemTracingBn_); |
| |
| this.appendChild(this.timelineView_); |
| |
| document.addEventListener('keypress', this.onKeypress_.bind(this)); |
| |
| this.refresh_(); |
| }, |
| |
| didSetTracingController_: function(value, oldValue) { |
| if (oldValue) |
| throw 'Can only set tracing controller once.'; |
| |
| this.tracingController_.addEventListener('traceEnded', |
| this.onRecordDone_.bind(this)); |
| this.tracingController_.addEventListener('loadTraceFileComplete', |
| this.onLoadTraceFileComplete_.bind(this)); |
| this.tracingController_.addEventListener('saveTraceFileComplete', |
| this.onSaveTraceFileComplete_.bind(this)); |
| this.tracingController_.addEventListener('loadTraceFileCanceled', |
| this.onLoadTraceFileCanceled_.bind(this)); |
| this.tracingController_.addEventListener('saveTraceFileCanceled', |
| this.onSaveTraceFileCanceled_.bind(this)); |
| this.refresh_(); |
| }, |
| |
| refresh_: function() { |
| if (!this.tracingController_) |
| return; |
| |
| var traceEvents = this.tracingController_.traceEvents; |
| var hasEvents = traceEvents && traceEvents.length; |
| |
| this.saveBn_.disabled = !hasEvents; |
| |
| if (!hasEvents) return; |
| |
| var m = new tracing.TimelineModel(); |
| m.importEvents(traceEvents, true, |
| [this.tracingController_.systemTraceEvents]); |
| this.timelineView_.model = m; |
| }, |
| |
| onKeypress_: function(event) { |
| if (event.keyCode == 114 && !this.tracingController_.isTracingEnabled) { |
| this.onRecord_(); |
| } |
| }, |
| |
| get timelineView() { |
| return this.timelineView_; |
| }, |
| |
| /////////////////////////////////////////////////////////////////////////// |
| |
| onRecord_: function() { |
| var systemTracingEnabled; |
| if (this.systemTracingBn_) |
| systemTracingEnabled = this.systemTracingBn_.checked; |
| else |
| systemTracingEnabled = false; |
| this.tracingController_.beginTracing(systemTracingEnabled); |
| }, |
| |
| onRecordDone_: function() { |
| this.refresh_(); |
| }, |
| |
| /////////////////////////////////////////////////////////////////////////// |
| |
| onSave_: function() { |
| this.overlayEl_ = new tracing.Overlay(); |
| this.overlayEl_.className = 'profiling-overlay'; |
| |
| var labelEl = document.createElement('div'); |
| labelEl.className = 'label'; |
| labelEl.textContent = 'Saving...'; |
| this.overlayEl_.appendChild(labelEl); |
| this.overlayEl_.visible = true; |
| |
| this.tracingController_.beginSaveTraceFile(); |
| }, |
| |
| onSaveTraceFileComplete_: function(e) { |
| this.overlayEl_.visible = false; |
| this.overlayEl_ = undefined; |
| }, |
| |
| onSaveTraceFileCanceled_: function(e) { |
| this.overlayEl_.visible = false; |
| this.overlayEl_ = undefined; |
| }, |
| |
| /////////////////////////////////////////////////////////////////////////// |
| |
| onLoad_: function() { |
| this.overlayEl_ = new tracing.Overlay(); |
| this.overlayEl_.className = 'profiling-overlay'; |
| |
| var labelEl = document.createElement('div'); |
| labelEl.className = 'label'; |
| labelEl.textContent = 'Loading...'; |
| this.overlayEl_.appendChild(labelEl); |
| this.overlayEl_.visible = true; |
| |
| this.tracingController_.beginLoadTraceFile(); |
| }, |
| |
| onLoadTraceFileComplete_: function(e) { |
| this.overlayEl_.visible = false; |
| this.overlayEl_ = undefined; |
| |
| this.refresh_(); |
| }, |
| |
| onLoadTraceFileCanceled_: function(e) { |
| this.overlayEl_.visible = false; |
| this.overlayEl_ = undefined; |
| } |
| }; |
| |
| cr.defineProperty(ProfilingView, 'tracingController', cr.PropertyKind.JS, |
| ProfilingView.prototype.didSetTracingController_); |
| |
| return { |
| ProfilingView: ProfilingView |
| }; |
| }); |