15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @fileoverview
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Module to support debug overlay window with connection stats.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)'use strict';
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** @suppress {duplicate} */
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var remoting = remoting || {};
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @constructor
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Element} statsElement The HTML div to which to update stats.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)remoting.ConnectionStats = function(statsElement) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.statsElement = statsElement;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Show or hide the connection stats div.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)remoting.ConnectionStats.prototype.toggle = function() {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.statsElement.hidden = !this.statsElement.hidden;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Update the statistics panel.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {remoting.ClientSession.PerfStats} stats The connection statistics.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)remoting.ConnectionStats.prototype.update = function(stats) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var units = '';
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var videoBandwidth = stats.videoBandwidth;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (videoBandwidth != undefined) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (videoBandwidth < 1024) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      units = 'Bps';
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (videoBandwidth < 1048576) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      units = 'KiBps';
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      videoBandwidth = videoBandwidth / 1024;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (videoBandwidth < 1073741824) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      units = 'MiBps';
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      videoBandwidth = videoBandwidth / 1048576;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      units = 'GiBps';
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      videoBandwidth = videoBandwidth / 1073741824;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {number} value
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} units
550de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)   * @return {string} Formatted number.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function formatStatNumber(value, units) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value != undefined) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value.toFixed(2) + ' ' + units;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "n/a";
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var statistics = document.getElementById('statistics');
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.statsElement.innerText = (
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'Bandwidth: ' + formatStatNumber(videoBandwidth, units) +
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ', Frame Rate: ' + formatStatNumber(stats.videoFrameRate, 'fps') +
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ', Capture: ' + formatStatNumber(stats.captureLatency, 'ms') +
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ', Encode: ' + formatStatNumber(stats.encodeLatency, 'ms') +
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ', Decode: ' + formatStatNumber(stats.decodeLatency, 'ms') +
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ', Render: ' + formatStatNumber(stats.renderLatency, 'ms') +
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ', Latency: ' + formatStatNumber(stats.roundtripLatency, 'ms'));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check for the debug toggle hot-key.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Event} event The keyboard event.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {void} Nothing.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)remoting.ConnectionStats.onKeydown = function(event) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var element = /** @type {Element} */ (event.target);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (String.fromCharCode(event.which) == 'D') {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    remoting.stats.toggle();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** @type {remoting.ConnectionStats} */
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)remoting.stats = null;
94