Home | History | Annotate | Download | only in net_internals
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 var timeutil = (function() {
      6   'use strict';
      7 
      8   /**
      9    * Offset needed to convert event times to Date objects.
     10    * Updated whenever constants are loaded.
     11    */
     12   var timeTickOffset = 0;
     13 
     14   /**
     15    * The time of the first observed event.  Used for more friendly time display.
     16    */
     17   var baseTime = 0;
     18 
     19   /**
     20    * Sets the offset used to convert tick counts to dates.
     21    */
     22   function setTimeTickOffset(offset) {
     23     // Note that the subtraction by 0 is to cast to a number (probably a float
     24     // since the numbers are big).
     25     timeTickOffset = offset - 0;
     26   }
     27 
     28   /**
     29    * The browser gives us times in terms of "time ticks" in milliseconds.
     30    * This function converts the tick count to a Javascript "time", which is
     31    * the UTC time in milliseconds.
     32    *
     33    * @param {string} timeTicks A time represented in "time ticks".
     34    * @return {number} The Javascript time that |timeTicks| represents.
     35    */
     36   function convertTimeTicksToTime(timeTicks) {
     37     return timeTickOffset + (timeTicks - 0);
     38   }
     39 
     40   /**
     41    * The browser gives us times in terms of "time ticks" in milliseconds.
     42    * This function converts the tick count to a Date() object.
     43    *
     44    * @param {string} timeTicks A time represented in "time ticks".
     45    * @return {Date} The time that |timeTicks| represents.
     46    */
     47   function convertTimeTicksToDate(timeTicks) {
     48     return new Date(convertTimeTicksToTime(timeTicks));
     49   }
     50 
     51   /**
     52    * Returns the current time.
     53    *
     54    * @return {number} Milliseconds since the Unix epoch.
     55    */
     56   function getCurrentTime() {
     57     return Date.now();
     58   }
     59 
     60   /**
     61    * Returns the curent time in time ticks.
     62    *
     63    * @return {number} Current time, in TimeTicks.
     64    */
     65   function getCurrentTimeTicks() {
     66     return getCurrentTime() - timeTickOffset;
     67   }
     68 
     69   /**
     70    * Sets the base time more friendly display.
     71    *
     72    * @param {string} firstEventTime The time of the first event, as a Javascript
     73    *     numeric time.  Other times can be displayed relative to this time.
     74    */
     75   function setBaseTime(firstEventTime) {
     76     baseTime = firstEventTime;
     77   }
     78 
     79   /**
     80    * Sets the base time more friendly display.
     81    *
     82    * @return {number} Time set by setBaseTime, or 0 if no time has been set.
     83    */
     84   function getBaseTime() {
     85     return baseTime;
     86   }
     87 
     88   /**
     89    * Clears the base time, so isBaseTimeSet() returns 0.
     90    */
     91   function clearBaseTime() {
     92     baseTime = 0;
     93   }
     94 
     95   /**
     96    * Returns true if the base time has been initialized.
     97    *
     98    * @return {bool} True if the base time is set.
     99    */
    100   function isBaseTimeSet() {
    101     return baseTime != 0;
    102   }
    103 
    104   /**
    105    * Takes in a "time ticks" and returns it as a time since the base time, in
    106    * milliseconds.
    107    *
    108    * @param {string} timeTicks A time represented in "time ticks".
    109    * @return {number} Milliseconds since the base time.
    110    */
    111   function convertTimeTicksToRelativeTime(timeTicks) {
    112     return convertTimeTicksToTime(timeTicks) - baseTime;
    113   }
    114 
    115   /**
    116    * Adds an HTML representation of |date| to |parentNode|.
    117    *
    118    * @param {DomNode} parentNode The node that will contain the new node.
    119    * @param {Date} date The date to be displayed.
    120    * @return {DomNode} The new node containing the date/time.
    121    */
    122   function addNodeWithDate(parentNode, date) {
    123     var span = addNodeWithText(parentNode, 'span', dateToString(date));
    124     span.title = 't=' + date.getTime();
    125     return span;
    126   }
    127 
    128   /**
    129    * Returns a string representation of |date|.
    130    *
    131    * @param {Date} date The date to be represented.
    132    * @return {string} A string representation of |date|.
    133    */
    134   function dateToString(date) {
    135     var dateStr = date.getFullYear() + '-' +
    136                   zeroPad_(date.getMonth() + 1, 2) + '-' +
    137                   zeroPad_(date.getDate(), 2);
    138 
    139     var timeStr = zeroPad_(date.getHours(), 2) + ':' +
    140                   zeroPad_(date.getMinutes(), 2) + ':' +
    141                   zeroPad_(date.getSeconds(), 2) + '.' +
    142                   zeroPad_(date.getMilliseconds(), 3);
    143 
    144     return dateStr + ' ' + timeStr;
    145   }
    146 
    147   /**
    148    * Prefixes enough zeros to |num| so that it has length |len|.
    149    * @param {number} num The number to be padded.
    150    * @param {number} len The desired length of the returned string.
    151    * @return {string} The zero-padded representation of |num|.
    152    */
    153   function zeroPad_(num, len) {
    154     var str = num + '';
    155     while (str.length < len)
    156       str = '0' + str;
    157     return str;
    158   }
    159 
    160   return {
    161     setTimeTickOffset: setTimeTickOffset,
    162     convertTimeTicksToTime: convertTimeTicksToTime,
    163     convertTimeTicksToDate: convertTimeTicksToDate,
    164     getCurrentTime: getCurrentTime,
    165     getCurrentTimeTicks: getCurrentTimeTicks,
    166     setBaseTime: setBaseTime,
    167     getBaseTime: getBaseTime,
    168     clearBaseTime: clearBaseTime,
    169     isBaseTimeSet: isBaseTimeSet,
    170     convertTimeTicksToRelativeTime: convertTimeTicksToRelativeTime,
    171     addNodeWithDate: addNodeWithDate,
    172     dateToString: dateToString,
    173   };
    174 })();
    175