// 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
};
});