170 lines
		
	
	
	
		
			5.9 KiB
			
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
	
		
			5.9 KiB
			
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// Derived from Chromium WebRTC Internals Dashboard - see Acknowledgements for full license details
 | 
						|
 | 
						|
import {$} from './util.js';
 | 
						|
 | 
						|
/** A list of getUserMedia requests. */
 | 
						|
export const userMediaRequests = [];
 | 
						|
/** A map from peer connection id to the PeerConnectionRecord. */
 | 
						|
export const peerConnectionDataStore = {};
 | 
						|
 | 
						|
// Also duplicating on window since tests access these from C++.
 | 
						|
window.userMediaRequests = userMediaRequests;
 | 
						|
window.peerConnectionDataStore = peerConnectionDataStore;
 | 
						|
 | 
						|
/**
 | 
						|
 * Provides the UI for dump creation.
 | 
						|
 */
 | 
						|
export class DumpCreator {
 | 
						|
  /**
 | 
						|
   * @param {Element} containerElement The parent element of the dump creation
 | 
						|
   *     UI.
 | 
						|
   */
 | 
						|
  constructor(containerElement) {
 | 
						|
    /**
 | 
						|
     * The root element of the dump creation UI.
 | 
						|
     * @type {Element}
 | 
						|
     * @private
 | 
						|
     */
 | 
						|
    // Signal change, remove unused diagnostic UI
 | 
						|
  }
 | 
						|
 | 
						|
  createDumpRoot(containerElement) {
 | 
						|
    this.dumpRoot_ = document.createElement('details');
 | 
						|
 | 
						|
    this.dumpRoot_.className = 'peer-connection-dump-root';
 | 
						|
    containerElement.appendChild(this.dumpRoot_);
 | 
						|
    const summary = document.createElement('summary');
 | 
						|
    this.dumpRoot_.appendChild(summary);
 | 
						|
    summary.textContent = 'Create a WebRTC-Internals dump';
 | 
						|
    const content = document.createElement('div');
 | 
						|
    this.dumpRoot_.appendChild(content);
 | 
						|
    content.appendChild($('dump-template').content.cloneNode(true));
 | 
						|
    content.getElementsByTagName('a')[0].addEventListener(
 | 
						|
      'click', this.onDownloadData_.bind(this));
 | 
						|
  }
 | 
						|
 | 
						|
  createAudioRecordingRoot(containerElement) {
 | 
						|
    this.audioRoot_ = document.createElement('details');
 | 
						|
 | 
						|
    this.audioRoot_.className = 'peer-connection-dump-root';
 | 
						|
    containerElement.appendChild(this.audioRoot_);
 | 
						|
    const summary = document.createElement('summary');
 | 
						|
    this.audioRoot_.appendChild(summary);
 | 
						|
    summary.textContent = 'Create diagnostic audio recordings';
 | 
						|
    const content = document.createElement('div');
 | 
						|
    this.audioRoot_.appendChild(content);
 | 
						|
    content.appendChild($('audio-recording-template').content.cloneNode(true));
 | 
						|
    content.getElementsByTagName('input')[0].addEventListener(
 | 
						|
      'click', this.onAudioDebugRecordingsChanged_.bind(this));
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
  createPacketRecordingRoot(containerElement) {
 | 
						|
    this.packetRoot_ = document.createElement('details');
 | 
						|
 | 
						|
    this.packetRoot_.className = 'peer-connection-dump-root';
 | 
						|
    containerElement.appendChild(this.packetRoot_);
 | 
						|
    const summary = document.createElement('summary');
 | 
						|
    this.packetRoot_.appendChild(summary);
 | 
						|
    summary.textContent = 'Create diagnostic packet recordings';
 | 
						|
    const content = document.createElement('div');
 | 
						|
    this.packetRoot_.appendChild(content);
 | 
						|
    content.appendChild($('packet-recording-template').content.cloneNode(true));
 | 
						|
    content.getElementsByTagName('input')[0].addEventListener(
 | 
						|
        'click', this.onEventLogRecordingsChanged_.bind(this));
 | 
						|
  }
 | 
						|
 | 
						|
  // Mark the diagnostic audio recording checkbox checked.
 | 
						|
  setAudioDebugRecordingsCheckbox() {
 | 
						|
    this.audioRoot_.getElementsByTagName('input')[0].checked = true;
 | 
						|
  }
 | 
						|
 | 
						|
  // Mark the diagnostic audio recording checkbox unchecked.
 | 
						|
  clearAudioDebugRecordingsCheckbox() {
 | 
						|
    this.audioRoot_.getElementsByTagName('input')[0].checked = false;
 | 
						|
  }
 | 
						|
 | 
						|
  // Mark the event log recording checkbox checked.
 | 
						|
  setEventLogRecordingsCheckbox() {
 | 
						|
    this.packetRoot_.getElementsByTagName('input')[0].checked = true;
 | 
						|
  }
 | 
						|
 | 
						|
  // Mark the event log recording checkbox unchecked.
 | 
						|
  clearEventLogRecordingsCheckbox() {
 | 
						|
    this.packetRoot_.getElementsByTagName('input')[0].checked = false;
 | 
						|
  }
 | 
						|
 | 
						|
  // Mark the event log recording checkbox as mutable/immutable.
 | 
						|
  setEventLogRecordingsCheckboxMutability(mutable) {
 | 
						|
    this.packetRoot_.getElementsByTagName('input')[0].disabled = !mutable;
 | 
						|
    if (!mutable) {
 | 
						|
      const label = this.packetRoot_.getElementsByTagName('label')[0];
 | 
						|
      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
 | 
						|
   */
 | 
						|
  async onDownloadData_(event) {
 | 
						|
    const useCompression = this.dumpRoot_.getElementsByTagName('input')[0].checked;
 | 
						|
    const dumpObject = {
 | 
						|
      'getUserMedia': userMediaRequests,
 | 
						|
      'PeerConnections': peerConnectionDataStore,
 | 
						|
      'UserAgent': navigator.userAgent,
 | 
						|
    };
 | 
						|
    const textBlob =
 | 
						|
      new Blob([JSON.stringify(dumpObject, null, 1)], {type: 'octet/stream'});
 | 
						|
    let url;
 | 
						|
    if (useCompression) {
 | 
						|
      const compressionStream = new CompressionStream('gzip');
 | 
						|
      const binaryStream = textBlob.stream().pipeThrough(compressionStream);
 | 
						|
      const binaryBlob = await new Response(binaryStream).blob();
 | 
						|
      url = URL.createObjectURL(binaryBlob);
 | 
						|
      // Since this is async we can't use the default event and need to click
 | 
						|
      // again (while avoiding an infinite loop).
 | 
						|
      const anchor = document.createElement('a');
 | 
						|
      anchor.download = 'webrtc_internals_dump.gz'
 | 
						|
      anchor.href = url;
 | 
						|
      anchor.click();
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    url = URL.createObjectURL(textBlob);
 | 
						|
    const anchor = this.dumpRoot_.getElementsByTagName('a')[0];
 | 
						|
    anchor.download = 'webrtc_internals_dump.txt'
 | 
						|
    anchor.href = url;
 | 
						|
    // The default action of the anchor will download the url.
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Handles the event of toggling the audio debug recordings state.
 | 
						|
   *
 | 
						|
   * @private
 | 
						|
   */
 | 
						|
  onAudioDebugRecordingsChanged_() {
 | 
						|
    const enabled = this.audioRoot_.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_() {
 | 
						|
    const enabled = this.packetRoot_.getElementsByTagName('input')[0].checked;
 | 
						|
    if (enabled) {
 | 
						|
      // chrome.send('enableEventLogRecordings');
 | 
						|
    } else {
 | 
						|
      // chrome.send('disableEventLogRecordings');
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |