dump_creator.js revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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)/**
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Provides the UI to start and stop RTP recording, forwards the start/stop
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * commands to Chrome, and updates the UI based on dump updates.
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {Element} containerElement The parent element of the dump creation UI.
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var DumpCreator = (function() {
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /**
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   * @param {Element} containerElement The parent element of the dump creation
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   *     UI.
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   * @constructor
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   */
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  function DumpCreator(containerElement) {
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * True if the RTP packets are being recorded.
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @type {bool}
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @private
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.recording_ = false;
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @type {!Object.<string>}
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @private
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @const
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.StatusStrings_ = {
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOT_STARTED: 'not started.',
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      RECORDING: 'recording...',
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    },
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * The status of dump creation.
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @type {string}
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @private
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.status_ = this.StatusStrings_.NOT_STARTED;
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * The root element of the dump creation UI.
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @type {Element}
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @private
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.root_ = document.createElement('details');
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.root_.className = 'peer-connection-dump-root';
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    containerElement.appendChild(this.root_);
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    var summary = document.createElement('summary');
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.root_.appendChild(summary);
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    summary.textContent = 'Create Dump';
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    var content = document.createElement('pre');
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.root_.appendChild(content);
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content.innerHTML = '<button></button> Status: <span></span>';
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content.getElementsByTagName('button')[0].addEventListener(
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        'click', this.onToggled_.bind(this));
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.updateDisplay_();
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DumpCreator.prototype = {
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Handles the event of toggling the dump recording state.
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @private
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    onToggled_: function() {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (this.recording_) {
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.recording_ = false;
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.status_ = this.StatusStrings_.NOT_STARTED;
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        chrome.send('stopRtpRecording');
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.recording_ = true;
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.status_ = this.StatusStrings_.RECORDING;
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        chrome.send('startRtpRecording');
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      this.updateDisplay_();
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    },
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Updates the UI based on the recording status.
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @private
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    updateDisplay_: function() {
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (this.recording_) {
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.root_.getElementsByTagName('button')[0].textContent =
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            'Stop Recording RTP Packets';
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.root_.getElementsByTagName('button')[0].textContent =
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            'Start Recording RTP Packets';
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      this.root_.getElementsByTagName('span')[0].textContent = this.status_;
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    },
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Set the status to the content of the update.
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @param {!Object} update
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    onUpdate: function(update) {
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (this.recording_) {
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.status_ = JSON.stringify(update);
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.updateDisplay_();
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    },
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return DumpCreator;
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)})();
113