166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Copyright (c) 2013 The Chromium Authors. All rights reserved.
266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Use of this source code is governed by a BSD-style license that can be
366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// found in the LICENSE file.
466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis'use strict';
666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('base.events');
866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('about_tracing.profiling_view');
966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('about_tracing.tracing_controller');
1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('ui.dom_helpers');
1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
1266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.unittest.testSuite('about_tracing.profiling_view', function() {
1366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  var testDataString = JSON.stringify([
1466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    {name: 'a', args: {}, pid: 52, ts: 15000, cat: 'foo', tid: 53, ph: 'B'},
1566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    {name: 'a', args: {}, pid: 52, ts: 19000, cat: 'foo', tid: 53, ph: 'E'},
1666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    {name: 'b', args: {}, pid: 52, ts: 32000, cat: 'foo', tid: 53, ph: 'B'},
1766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    {name: 'b', args: {}, pid: 52, ts: 54000, cat: 'foo', tid: 53, ph: 'E'}
1866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  ]);
1966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  var systemTraceTestData = [
2166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    'systrace.sh-8170  [000] 0.013: sched_switch: ' +
2266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        'prev_comm=systrace.sh prev_pid=8170 prev_prio=120 ' +
2366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        'prev_state=x ==> next_comm=kworker/1:0 next_pid=7873 ' +
2466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        'next_prio=120',
2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    ' kworker/1:0-7873  [000] 0.036: sched_switch: ' +
2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        'prev_comm=kworker/1:0 prev_pid=7873 prev_prio=120 ' +
2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        'prev_state=S ==> next_comm=debugd next_pid=4404 ' +
2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        'next_prio=120',
2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    '     debugd-4404  [000] 0.070: sched_switch: prev_comm=debugd ' +
3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        'prev_pid=4404 prev_prio=120 prev_state=S ==> ' +
3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        'next_comm=dbus-daemon next_pid=510 next_prio=120',
3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    'systrace.sh-8182  [000] 0.000: tracing_mark_write: ' +
3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        'trace_event_clock_sync: parent_ts=0.0'
3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  ].join('\n');
3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  // This code emulates Chrome's responses to sendFn enough that the real
3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  // tracing controller can be used to interactively test the UI.
3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  var createSendHandler = function() {
3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var systemTraceRequested = false;
4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var corruptTrace;
4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var tracingController;
4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    function send(message, opt_args) {
4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var args = opt_args || [];
4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (message == 'getKnownCategories') {
4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        setTimeout(function() {
4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          tracingController.onKnownCategoriesCollected(['a', 'b', 'c']);
4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }, 1);
4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      } else if (message == 'beginTracing') {
5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        systemTraceRequested = opt_args[0];
5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        continuousTraceRequested = opt_args[1];
5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        samplingRequested = opt_args[2];
5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      } else if (message == 'beginRequestBufferPercentFull') {
5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        setTimeout(function() {
5666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          tracingController.onRequestBufferPercentFullComplete(0.5);
5766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }, 1);
5866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      } else if (message == 'endTracingAsync') {
6066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        setTimeout(function() {
6166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          if (systemTraceRequested) {
6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            tracingController.onSystemTraceDataCollected(systemTraceTestData);
6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          }
6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          // Strip off [] and add a ,
6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          var n = testDataString.length - 1;
6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          var tmp = testDataString.substr(1, n - 1) + ',';
6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          if (corruptTrace)
6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            tmp += 'corruption';
7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          tracingController.onEndTracingComplete(tmp);
7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }, 1);
7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      } else if (message == 'loadTraceFile') {
7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        setTimeout(function() {
7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          var tmp = testDataString.substr(0);
7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          if (corruptTrace)
7766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            tmp += 'corruption';
7866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          tracingController.onLoadTraceFileComplete(tmp);
7966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }, 150);
8066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
8166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      } else if (message == 'saveTraceFile') {
8266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        setTimeout(function() {
8366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          tracingController.onSaveTraceFileComplete();
8466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }, 1);
8566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
8666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
8766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
8866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    send.__defineSetter__('tracingController', function(c) {
8966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      tracingController = c;
9066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
9166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    send.__defineSetter__('corruptTrace', function(c) {
9366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      corruptTrace = c;
9466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
9566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return send;
9666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
9766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  /*
9966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   * Just enough of the TracingController to support the tests below.
10066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   */
10166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  var FakeTracingController = function() {
10266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this.wasBeginTracingCalled = false;
10366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this.wasCollectCategoriesCalled = false;
10466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this.wasSamplingEnabled = false;
10566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
10666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
10766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  FakeTracingController.prototype = {
10866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    __proto__: base.EventTarget.prototype,
10966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
11066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    get supportsSystemTracing() {
11166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return base.isChromeOS;
11266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
11366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
11466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    beginTracing: function(opt_systemTracingEnabled,
11566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                           opt_continuousTracingEnabled,
11666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                           opt_enableSampling,
11766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                           opt_traceCategories) {
11866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.wasBeginTracingCalled = true;
11966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.wasBeginTracingCalledWithSystemTracingEnabled =
12066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          opt_systemTracingEnabled;
12166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.wasBeginTracingCalledWithContinuousTracingEnabled =
12266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          opt_continuousTracingEnabled;
12366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.beginTracingCategories = opt_traceCategories;
12466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.wasSamplingEnabled = opt_enableSampling;
12566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
12666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
12766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    collectCategories: function() {
12866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.wasCollectCategoriesCalled = true;
12966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
13066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
13166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    get traceEventData() {
13266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (!this.wasBeginTracingCalled)
13366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return undefined;
13466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return testDataString;
13566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
13666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
13766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    get systemTraceEvents() {
13866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (!this.wasBeginTracingCalled)
13966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return [];
14066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (!this.wasBeginTracingCalledWithSystemTracingEnabled)
14166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return [];
14266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return systemTraceTestData;
14366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
14466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
14566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    set tracingEnabled(val) {
14666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.isTracingEnabled_ = val;
14766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
14866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
14966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    get isTracingEnabled() {
15066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (this.isTracingEnabled_ === undefined)
15166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        this.isTracingEnabled_ = false;
15266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return this.isTracingEnabled_;
15366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
15466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
15566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
15666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  var recordTestCommon = function() {
15766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var view = new about_tracing.ProfilingView();
15866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
15966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var tracingController = new FakeTracingController();
16066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.tracingController = tracingController;
16166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
16266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.querySelector('button.record').click();
16366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertTrue(tracingController.wasCollectCategoriesCalled);
16466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
16566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var e = new base.Event('categoriesCollected');
16666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    e.categories = ['skia', 'gpu'];
16766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    tracingController.dispatchEvent(e);
16866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
16966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.recordSelectionDialog_.querySelector(
17066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        'button.record-categories').click();
17166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
17266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertTrue(tracingController.wasBeginTracingCalled);
17366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertEquals(base.isChromeOS,
17466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        tracingController.wasBeginTracingCalledWithSystemTracingEnabled);
17566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
17666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var e = new base.Event('traceEnded');
17766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    e.events = tracingController.traceEventData;
17866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    tracingController.dispatchEvent(e);
17966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
18066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertTrue(!!view.timelineView.model);
18166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.detach_();
18266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
18366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
18466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('instantiate', function() {
18566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var parent = document.createElement('div');
18666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this.addHTMLOutput(parent);
18766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
18866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var view = new about_tracing.ProfilingView();
18966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    parent.appendChild(view);
19066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
19166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var sendHandler = createSendHandler();
19266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var tracingController = new about_tracing.TracingController(sendHandler);
19366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    sendHandler.tracingController = tracingController;
19466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    tracingController.supportsSystemTracing_ = true;
19566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
19666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.tracingController = tracingController;
19766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.focusElement = view;
19866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    parent.appendChild(ui.createCheckBox(sendHandler, 'corruptTrace',
19966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                                         'profilingViewTest.corruptTrace',
20066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                                         false, 'Make traces corrupt'));
20166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.detach_();
20266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
20366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
20466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('selectedCategoriesSentToTracing', function() {
20566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var view = new about_tracing.ProfilingView();
20666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.timelineView_.settings.set('cc', true, 'record_categories');
20766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.timelineView_.settings.set('renderer', false, 'record_categories');
20866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
20966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var tracingController = new FakeTracingController(this);
21066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.tracingController = tracingController;
21166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
21266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.querySelector('button.record').click();
21366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertTrue(tracingController.wasCollectCategoriesCalled);
21466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
21566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var e = new base.Event('categoriesCollected');
21666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    e.categories = ['skia', 'gpu', 'cc', 'renderer'];
21766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    tracingController.dispatchEvent(e);
21866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
21966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertVisible(view.recordSelectionDialog_);
22066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertVisible(view.recordSelectionDialog_.toolbar);
22166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
22266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.recordSelectionDialog_.querySelector('input#skia').click();
22366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.recordSelectionDialog_.querySelector(
22466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        'button.record-categories').click();
22566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
22666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var categories = tracingController.beginTracingCategories;
22766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    // Renderer is disabled in settings, skia is clicked off.
22866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertEquals('-renderer,-skia', categories);
22966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
23066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.detach_();
23166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
23266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
23366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('badCategories', function() {
23466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var view = new about_tracing.ProfilingView();
23566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.timelineView_.settings.set('foo,bar', false, 'record_categories');
23666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
23766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var tracingController = new FakeTracingController(this);
23866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.tracingController = tracingController;
23966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
24066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.querySelector('button.record').click();
24166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertTrue(tracingController.wasCollectCategoriesCalled);
24266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
24366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var e = new base.Event('categoriesCollected');
24466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    e.categories = ['baz,zap', 'gpu'];
24566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    tracingController.dispatchEvent(e);
24666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
24766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.recordSelectionDialog_.querySelector(
24866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        'button.record-categories').click();
24966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
25066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var inputs = view.recordSelectionDialog_.querySelectorAll('input');
25166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var inputs_length = inputs.length;
25266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    for (var i = 0; i < inputs_length; ++i) {
25366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      // Comes from categories and should be split before getting
25466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      // to the record selection dialog.
25566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      assertNotEquals('baz,zap', inputs[i].id);
25666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
25766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var categories = tracingController.beginTracingCategories;
25866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertEquals('', categories);
25966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
26066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.detach_();
26166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
26266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
26366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('recordNonCros', function() {
26466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var old = base.isChromeOS;
26566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    base.isChromeOS = false;
26666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    try {
26766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      recordTestCommon();
26866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    } finally {
26966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      base.isChromeOS = old;
27066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
27166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
27266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
27366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('recordCros', function() {
27466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var old = base.isChromeOS;
27566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    base.isChromeOS = true;
27666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    try {
27766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      recordTestCommon();
27866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    } finally {
27966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      base.isChromeOS = old;
28066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
28166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
28266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
28366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('recordWithTraceRunning_KeyEvent', function() {
28466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var view = new about_tracing.ProfilingView();
28566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var tracingController = new FakeTracingController();
28666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    tracingController.tracingEnabled = true;
28766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.tracingController = tracingController;
28866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
28966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var evt = document.createEvent('Event');
29066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    evt.initEvent('keypress',
29166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        true,  //  canBubbleArg
29266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        true,  //  cancelableArg
29366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        window);  //  viewArg
29466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    evt.keyCode = 'r'.charCodeAt(0);
29566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
29666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    document.dispatchEvent(evt);
29766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertFalse(tracingController.wasCollectCategoriesCalled);
29866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
29966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.detach_();
30066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
30166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
30266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('categorySelectionWithTraceRunning_KeyEvent', function() {
30366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var view = new about_tracing.ProfilingView();
30466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var tracingController = new FakeTracingController();
30566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.tracingController = tracingController;
30666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.selectingCategories = true;
30766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
30866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var evt = document.createEvent('Event');
30966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    evt.initEvent('keypress',
31066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        true,  //  canBubbleArg
31166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        true,  //  cancelableArg
31266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        window);  //  viewArg
31366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    evt.keyCode = 'r'.charCodeAt(0);
31466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
31566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    document.dispatchEvent(evt);
31666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertFalse(tracingController.wasCollectCategoriesCalled);
31766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
31866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.detach_();
31966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
32066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
32166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('categorySelectionSetsSelectingCategories', function() {
32266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var view = new about_tracing.ProfilingView();
32366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var tracingController = new FakeTracingController();
32466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.tracingController = tracingController;
32566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.selectingCategories = false;
32666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
32766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.querySelector('button.record').click();
32866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertTrue(view.selectingCategories);
32966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
33066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var e = new base.Event('categoriesCollected');
33166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    e.categories = ['skia', 'gpu', 'cc', 'renderer'];
33266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    tracingController.dispatchEvent(e);
33366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
33466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.recordSelectionDialog_.querySelector(
33566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        'button.record-categories').click();
33666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
33766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertFalse(view.selectingCategories);
33866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.detach_();
33966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
34066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
34166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('categorySelectionResetsSelectingCategoriesOnDialogDismiss', function() {
34266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var view = new about_tracing.ProfilingView();
34366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var tracingController = new FakeTracingController();
34466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.tracingController = tracingController;
34566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.selectingCategories = false;
34666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
34766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.querySelector('button.record').click();
34866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertTrue(view.selectingCategories);
34966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
35066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var e = new base.Event('categoriesCollected');
35166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    e.categories = ['skia', 'gpu', 'cc', 'renderer'];
35266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    tracingController.dispatchEvent(e);
35366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
35466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.recordSelectionDialog_.visible = false;
35566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
35666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertFalse(view.selectingCategories);
35766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.detach_();
35866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
35966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
36066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('recording_withSamplingEnabled', function() {
36166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var view = new about_tracing.ProfilingView();
36266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
36366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var tracingController = new FakeTracingController();
36466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.tracingController = tracingController;
36566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.querySelector('button.record').click();
36666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
36766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var e = new base.Event('categoriesCollected');
36866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    e.categories = [];
36966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    tracingController.dispatchEvent(e);
37066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
37166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.recordSelectionDialog_.querySelector('.sampling-button').click();
37266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.recordSelectionDialog_.querySelector(
37366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        'button.record-categories').click();
37466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
37566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertTrue(tracingController.wasBeginTracingCalled);
37666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertTrue(tracingController.wasSamplingEnabled);
37766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
37866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
37966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('recording_withSamplingDisabled', function() {
38066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var view = new about_tracing.ProfilingView();
38166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
38266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var tracingController = new FakeTracingController();
38366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.tracingController = tracingController;
38466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.querySelector('button.record').click();
38566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
38666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var e = new base.Event('categoriesCollected');
38766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    e.categories = [];
38866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    tracingController.dispatchEvent(e);
38966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
39066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    view.recordSelectionDialog_.querySelector(
39166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        'button.record-categories').click();
39266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
39366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertTrue(tracingController.wasBeginTracingCalled);
39466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertFalse(tracingController.wasSamplingEnabled);
39566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
39666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis});
397