15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This view displays controls for capturing network events.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var CaptureView = (function() {
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'use strict';
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We inherit from DivView.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var superClass = DivView;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @constructor
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function CaptureView() {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assertFirstConstructorCall(CaptureView);
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Call superclass's constructor.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    superClass.call(this, CaptureView.MAIN_BOX_ID);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var byteLoggingCheckbox = $(CaptureView.BYTE_LOGGING_CHECKBOX_ID);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    byteLoggingCheckbox.onclick = this.onSetByteLogging_.bind(this);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $(CaptureView.LIMIT_CHECKBOX_ID).onclick = this.onChangeLimit_.bind(this);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    $(CaptureView.STOP_BUTTON_ID).onclick =
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.onStopButtonClicked_.bind(this);
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    $(CaptureView.RESET_BUTTON_ID).onclick =
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.onResetButtonClicked_.bind(this);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (byteLoggingCheckbox.checked) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The code to display a warning on ExportView relies on bytelogging
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // being off by default. If this ever changes, the code will need to
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // be updated.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      throw 'Not expecting byte logging to be enabled!';
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    new MouseOverHelp(CaptureView.LIMIT_HELP_ID,
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      CaptureView.LIMIT_HELP_HOVER_ID);
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    new MouseOverHelp(CaptureView.BYTE_LOGGING_HELP_ID,
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      CaptureView.BYTE_LOGGING_HELP_HOVER_ID);
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.onChangeLimit_();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CaptureView.TAB_ID = 'tab-handle-capture';
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CaptureView.TAB_NAME = 'Capture';
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CaptureView.TAB_HASH = '#capture';
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IDs for special HTML elements in capture_view.html
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CaptureView.MAIN_BOX_ID = 'capture-view-tab-content';
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CaptureView.BYTE_LOGGING_CHECKBOX_ID = 'capture-view-byte-logging-checkbox';
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CaptureView.LIMIT_CHECKBOX_ID = 'capture-view-limit-checkbox';
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CaptureView.LIMIT_HELP_ID = 'capture-view-limit-help';
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CaptureView.LIMIT_HELP_HOVER_ID = 'capture-view-limit-help-hover';
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CaptureView.BYTE_LOGGING_HELP_ID = 'capture-view-byte-logging-help';
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CaptureView.BYTE_LOGGING_HELP_HOVER_ID =
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      'capture-view-byte-logging-help-hover';
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CaptureView.STOP_BUTTON_ID = 'capture-view-stop-button';
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CaptureView.RESET_BUTTON_ID = 'capture-view-reset-button';
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cr.addSingletonGetter(CaptureView);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CaptureView.prototype = {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Inherit the superclass's methods.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __proto__: superClass.prototype,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Called when a log file is loaded, after clearing the old log entries and
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * loading the new ones.  Returns false to indicate the view should
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * be hidden.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    onLoadLogFinish: function(data) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Depending on the value of the checkbox, enables or disables logging of
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * actual bytes transferred.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    onSetByteLogging_: function() {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var byteLoggingCheckbox = $(CaptureView.BYTE_LOGGING_CHECKBOX_ID);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (byteLoggingCheckbox.checked) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        g_browser.setLogLevel(LogLevelType.LOG_ALL);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Once we enable byte logging, all bets are off on what gets captured.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Have the export view warn that the "strip cookies" option is
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // ineffective from this point on.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        //
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // In theory we could clear this warning after unchecking the box and
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // then deleting all the events which had been captured. We don't
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // currently do that; if you want the warning to go away, will need to
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // reload.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ExportView.getInstance().showPrivacyWarning();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        g_browser.setLogLevel(LogLevelType.LOG_ALL_BUT_BYTES);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    onChangeLimit_: function() {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var limitCheckbox = $(CaptureView.LIMIT_CHECKBOX_ID);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Default to unlimited.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var softLimit = Infinity;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var hardLimit = Infinity;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (limitCheckbox.checked) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // The chosen limits are kind of arbitrary. I based it off the
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // following observation:
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        //   A user-submitted log file which spanned a 7 hour time period
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        //   comprised 778,235 events and required 128MB of JSON.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        //
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // That feels too big. Assuming it was representative, then scaling
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // by a factor of 4 should translate into a 32MB log file and cover
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // close to 2 hours of events, which feels better.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        //
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // A large gap is left between the hardLimit and softLimit to avoid
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // resetting the events often.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        hardLimit = 300000;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        softLimit = 150000;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EventsTracker.getInstance().setLimits(softLimit, hardLimit);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    onStopButtonClicked_: function() {
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MainView.getInstance().switchToViewOnlyMode();
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    },
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    onResetButtonClicked_: function() {
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EventsTracker.getInstance().deleteAllLogEntries();
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    },
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CaptureView;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
141