chromium/chrome/browser/resources/media_router/internals/media_router_internals.ts

// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'chrome://resources/cr_elements/cr_tab_box/cr_tab_box.js';

import {assertInstanceof} from 'chrome://resources/js/assert.js';
import {addWebUiListener, sendWithPromise} from 'chrome://resources/js/cr.js';
import {getRequiredElement} from 'chrome://resources/js/util.js';

interface MediaRouterLog {
  time: string;
  sessionId: string;
  sinkId: string;
  mediaSource: string;
  category: string;
  component: string;
  severity: string;
  message: string;
}

function formatJson(jsonObj: object) {
  return JSON.stringify(jsonObj, null, /* spacing level = */ 2);
}

function displayMirroringStats(mirroringStats: object) {
  getRequiredElement('mirroring-stats-div').textContent =
      formatJson(mirroringStats);
}

// Build the table which displays Media Router logs.
function displayLogsTable(logs: MediaRouterLog[]) {
  const logsTable = getRequiredElement('logs-table');
  assertInstanceof(logs, Array);
  for (const log of logs) {
    const logRow = document.createElement('tr');
    const logDict = log as unknown as {[key: string]: string};
    ['time', 'message', 'sessionId', 'sinkId', 'mediaSource', 'category',
     'component', 'severity']
        .forEach(fieldName => {
          const element = document.createElement('td');
          element.textContent = logDict[fieldName] ?? '';
          logRow.appendChild(element);
        });

    logsTable.appendChild(logRow);
  }
}

// Handles user events for the Media Router Internals UI.
document.addEventListener('DOMContentLoaded', function() {
  sendWithPromise('getState').then((status: object) => {
    getRequiredElement('sink-status-div').textContent = formatJson(status);
  });
  sendWithPromise('getProviderState', 'CAST').then((status: object) => {
    getRequiredElement('cast-status-div').textContent = formatJson(status);
  });
  sendWithPromise('getLogs').then(displayLogsTable);
  addWebUiListener(
      'on-mirroring-stats-update',
      (mirroringStats: object) => displayMirroringStats(mirroringStats));
  sendWithPromise('getMirroringStats').then(displayMirroringStats);
});