blob: 13aec06532e510b67b1a9a25c72dd5321dd5bb22 [file] [log] [blame]
// 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.
import {$} from 'chrome://resources/js/util.m.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
*/
this.root_ = document.createElement('details');
this.root_.className = 'peer-connection-dump-root';
containerElement.appendChild(this.root_);
const summary = document.createElement('summary');
this.root_.appendChild(summary);
summary.textContent = 'Create Dump';
const content = document.createElement('div');
this.root_.appendChild(content);
content.appendChild($('dump-template').content.cloneNode(true));
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));
}
// Mark the diagnostic audio recording checkbox checked.
setAudioDebugRecordingsCheckbox() {
this.root_.getElementsByTagName('input')[0].checked = true;
}
// Mark the diagnostic audio recording checkbox unchecked.
clearAudioDebugRecordingsCheckbox() {
this.root_.getElementsByTagName('input')[0].checked = false;
}
// Mark the event log recording checkbox checked.
setEventLogRecordingsCheckbox() {
this.root_.getElementsByTagName('input')[1].checked = true;
}
// Mark the event log recording checkbox unchecked.
clearEventLogRecordingsCheckbox() {
this.root_.getElementsByTagName('input')[1].checked = false;
}
// Mark the event log recording checkbox as mutable/immutable.
setEventLogRecordingsCheckboxMutability(mutable) {
// TODO(eladalon): Remove reliance on number and order of elements.
// https://crbug.com/817391
this.root_.getElementsByTagName('input')[1].disabled = !mutable;
if (!mutable) {
const 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_() {
const dumpObject = {
'getUserMedia': userMediaRequests,
'PeerConnections': peerConnectionDataStore,
'UserAgent': navigator.userAgent,
};
const textBlob =
new Blob([JSON.stringify(dumpObject, null, 1)], {type: 'octet/stream'});
const URL = window.URL.createObjectURL(textBlob);
const 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_() {
const 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_() {
const enabled = this.root_.getElementsByTagName('input')[1].checked;
if (enabled) {
chrome.send('enableEventLogRecordings');
} else {
chrome.send('disableEventLogRecordings');
}
}
}