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