1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Provides the UI for dump creation.
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var DumpCreator = (function() {
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /**
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   * @param {Element} containerElement The parent element of the dump creation
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   *     UI.
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   * @constructor
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   */
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  function DumpCreator(containerElement) {
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * The root element of the dump creation UI.
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @type {Element}
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @private
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.root_ = document.createElement('details');
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.root_.className = 'peer-connection-dump-root';
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    containerElement.appendChild(this.root_);
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    var summary = document.createElement('summary');
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.root_.appendChild(summary);
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    summary.textContent = 'Create Dump';
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var content = document.createElement('div');
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.root_.appendChild(content);
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content.innerHTML = '<div><a><button>' +
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        'Download the PeerConnection updates and stats data' +
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        '</button></a></div>' +
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        '<p><label><input type=checkbox>' +
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'Enable diagnostic audio recordings.</label></p>' +
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        '<p>A diagnostic audio recording is used for analyzing audio' +
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ' problems. It contains the audio played out from the speaker and' +
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ' recorded from the microphone and is saved to the local disk.' +
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' Checking this box will enable the recording for ongoing WebRTC' +
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' calls and for future WebRTC calls. When the box is unchecked or' +
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' this page is closed, all ongoing recordings will be stopped and' +
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' this recording functionality will be disabled for future WebRTC' +
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' calls. Recordings in multiple tabs are supported as well as' +
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' multiple recordings in the same tab. When enabling, you select a' +
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' base filename to save the dump(s) to. The base filename will have a' +
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' suffix appended to it as &lt;base filename&gt;.&lt;render process' +
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' ID&gt;.&lt;recording ID&gt;. If recordings are' +
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' disabled and then enabled using the same base filename, the' +
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' file(s) will be appended to and may become invalid. It is' +
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' recommended to choose a new base filename each time or move' +
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' the resulting files before enabling again. If track processing is' +
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' disabled (--disable-audio-track-processing): (1) Only one recording' +
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' per render process is supported. (2) When the box is unchecked or' +
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' this page is closed, ongoing recordings will continue until the' +
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' call ends or the page with the recording is closed.</p>';
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    content.getElementsByTagName('a')[0].addEventListener(
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        'click', this.onDownloadData_.bind(this));
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content.getElementsByTagName('input')[0].addEventListener(
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'click', this.onAecRecordingChanged_.bind(this));
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DumpCreator.prototype = {
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // Mark the AEC recording checkbox checked.
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    enableAecRecording: function() {
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.root_.getElementsByTagName('input')[0].checked = true;
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    },
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // Mark the AEC recording checkbox unchecked.
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    disableAecRecording: function() {
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      this.root_.getElementsByTagName('input')[0].checked = false;
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    },
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)     * Downloads the PeerConnection updates and stats data as a file.
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)     *
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)     * @private
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)     */
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    onDownloadData_: function() {
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var dump_object =
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      {
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'getUserMedia': userMediaRequests,
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'PeerConnections': peerConnectionDataStore,
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      };
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var textBlob = new Blob([JSON.stringify(dump_object, null, ' ')],
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              {type: 'octet/stream'});
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var URL = window.URL.createObjectURL(textBlob);
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      var anchor = this.root_.getElementsByTagName('a')[0];
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      anchor.href = URL;
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      anchor.download = 'webrtc_internals_dump.txt';
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      // The default action of the anchor will download the URL.
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    },
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    /**
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     * Handles the event of toggling the AEC recording state.
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @private
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    onAecRecordingChanged_: function() {
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var enabled = this.root_.getElementsByTagName('input')[0].checked;
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (enabled) {
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        chrome.send('enableAecRecording');
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        chrome.send('disableAecRecording');
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    },
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return DumpCreator;
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)})();
111