| // Copyright (c) 2013 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. |
| |
| |
| /** |
| * Provides the UI for dump creation. |
| */ |
| var DumpCreator = (function() { |
| /** |
| * @param {Element} containerElement The parent element of the dump creation |
| * UI. |
| * @constructor |
| */ |
| function DumpCreator(containerElement) { |
| /** |
| * The root element of the dump creation UI. |
| * @type {Element} |
| * @private |
| */ |
| this.root_ = document.createElement('details'); |
| |
| this.root_.className = 'peer-connection-dump-root'; |
| containerElement.appendChild(this.root_); |
| var summary = document.createElement('summary'); |
| this.root_.appendChild(summary); |
| summary.textContent = 'Create Dump'; |
| var content = document.createElement('div'); |
| this.root_.appendChild(content); |
| |
| content.innerHTML = '<div><a><button>' + |
| 'Download the PeerConnection updates and stats data' + |
| '</button></a></div>' + |
| '<p><label><input type=checkbox>' + |
| 'Enable diagnostic audio recordings</label></p>' + |
| '<p class=audio-diagnostic-dumps-info>A diagnostic audio recording is' + |
| ' used for analyzing audio problems. It consists of several files and' + |
| ' contains the audio played out to the speaker (output) and captured' + |
| ' from the microphone (input). The data is saved locally.' + |
| ' Checking this box will enable recordings of all ongoing input and' + |
| ' output audio streams (including non-WebRTC streams) and for future' + |
| ' audio streams. When the box is unchecked or this page is closed,' + |
| ' all ongoing recordings will be stopped and this recording' + |
| ' functionality disabled. Recording audio from multiple tabs is' + |
| ' supported as well as multiple recordings from the same tab.</p>' + |
| '<p>When enabling, select a base filename to which the following' + |
| ' suffixes will be added:</p>' + |
| '<p><div><base filename>.<render process ID>' + |
| '.aec_dump.<AEC dump recording ID></div>' + |
| '<div><base filename>.input.<stream recording ID>.wav' + |
| '</div><div>' + |
| '<base filename>.output.<stream recording ID>.wav' + |
| '</div></p>' + |
| '<p class=audio-diagnostic-dumps-info>It is recommended to choose a' + |
| ' new base filename each time the feature is enabled to avoid ending' + |
| ' up with partially overwritten or unusable audio files.</p>' + |
| '<p><label><input type=checkbox disabled=true>' + |
| 'Enable diagnostic packet and event recording' + |
| '<label name="placeholder_for_warning"/></label></p>' + |
| '<p class=audio-diagnostic-dumps-info>A diagnostic packet and event' + |
| ' recording can be used for analyzing various issues related to' + |
| ' thread starvation, jitter buffers or bandwidth estimation. Two' + |
| ' types of data are logged. First, incoming and outgoing RTP headers' + |
| ' and RTCP packets are logged. These do not include any audio or' + |
| ' video information, nor any other types of personally identifiable' + |
| ' information (so no IP addresses or URLs). Checking this box will' + |
| ' enable the recording for ongoing WebRTC calls and for future' + |
| ' WebRTC calls. When the box is unchecked or this page is closed,' + |
| ' all ongoing recordings will be stopped and this recording' + |
| ' functionality will be disabled for future WebRTC calls. Recording' + |
| ' in multiple tabs or multiple recordings in the same tab will cause' + |
| ' multiple log files to be created. When enabling, a filename for the' + |
| ' recording can be entered. The entered filename is used as a' + |
| ' base, to which the following suffixes will be appended.</p>' + |
| ' <p><base filename>_<date>_<timestamp>_<render ' + |
| 'process ID>_<recording ID></p>' + |
| '<p class=audio-diagnostic-dumps-info>If a file with the same name' + |
| ' already exists, it will be overwritten. No more than 5 logfiles ' + |
| ' will be created, and each of them is limited to 60MB of storage. ' + |
| ' On Android these limits are 3 files of at most 10MB each. ' + |
| ' When the limit is reached, the checkbox must be unchecked and ' + |
| ' rechecked to resume logging.</p>'; |
| content.getElementsByTagName('a')[0].addEventListener( |
| 'click', this.onDownloadData_.bind(this)); |
| content.getElementsByTagName('input')[0].addEventListener( |
| 'click', this.onAudioDebugRecordingsChanged_.bind(this)); |
| content.getElementsByTagName('input')[1].addEventListener( |
| 'click', this.onEventLogRecordingsChanged_.bind(this)); |
| } |
| |
| DumpCreator.prototype = { |
| // Mark the diagnostic audio recording checkbox checked. |
| setAudioDebugRecordingsCheckbox: function() { |
| this.root_.getElementsByTagName('input')[0].checked = true; |
| }, |
| |
| // Mark the diagnostic audio recording checkbox unchecked. |
| clearAudioDebugRecordingsCheckbox: function() { |
| this.root_.getElementsByTagName('input')[0].checked = false; |
| }, |
| |
| // Mark the event log recording checkbox checked. |
| setEventLogRecordingsCheckbox: function() { |
| this.root_.getElementsByTagName('input')[1].checked = true; |
| }, |
| |
| // Mark the event log recording checkbox unchecked. |
| clearEventLogRecordingsCheckbox: function() { |
| this.root_.getElementsByTagName('input')[1].checked = false; |
| }, |
| |
| // Mark the event log recording checkbox as mutable/immutable. |
| setEventLogRecordingsCheckboxMutability: function(mutable) { |
| // TODO(eladalon): Remove reliance on number and order of elements. |
| // https://crbug.com/817391 |
| this.root_.getElementsByTagName('input')[1].disabled = !mutable; |
| if (!mutable) { |
| var label = this.root_.getElementsByTagName('label')[2]; |
| label.style = 'color:red;'; |
| label.textContent = |
| ' WebRTC event logging\'s state was set by a command line flag.'; |
| } |
| }, |
| |
| /** |
| * Downloads the PeerConnection updates and stats data as a file. |
| * |
| * @private |
| */ |
| onDownloadData_: function() { |
| var dump_object = { |
| 'getUserMedia': userMediaRequests, |
| 'PeerConnections': peerConnectionDataStore, |
| 'UserAgent': navigator.userAgent, |
| }; |
| var textBlob = new Blob( |
| [JSON.stringify(dump_object, null, ' ')], {type: 'octet/stream'}); |
| var URL = window.URL.createObjectURL(textBlob); |
| |
| var anchor = this.root_.getElementsByTagName('a')[0]; |
| anchor.href = URL; |
| anchor.download = 'webrtc_internals_dump.txt'; |
| // The default action of the anchor will download the URL. |
| }, |
| |
| /** |
| * Handles the event of toggling the audio debug recordings state. |
| * |
| * @private |
| */ |
| onAudioDebugRecordingsChanged_: function() { |
| var enabled = this.root_.getElementsByTagName('input')[0].checked; |
| if (enabled) { |
| chrome.send('enableAudioDebugRecordings'); |
| } else { |
| chrome.send('disableAudioDebugRecordings'); |
| } |
| }, |
| |
| /** |
| * Handles the event of toggling the event log recordings state. |
| * |
| * @private |
| */ |
| onEventLogRecordingsChanged_: function() { |
| var enabled = this.root_.getElementsByTagName('input')[1].checked; |
| if (enabled) { |
| chrome.send('enableEventLogRecordings'); |
| } else { |
| chrome.send('disableEventLogRecordings'); |
| } |
| }, |
| }; |
| return DumpCreator; |
| })(); |