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 <base filename>.<render process' + 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ' ID>.<recording ID>. 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