chromium/chrome/test/data/chrome_endure/webpagereplay/wpr_deterministic.js

/* Copyright 2012 The Chromium Authors
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * The scripts in this file will be injected to the http responses when
 * simulating network via Web Page Replay for Chrome Endure tests.
 *
 * If you need to modify this scripts, make sure that you use the same version
 * of this scripts in both record and replay mode.
 *
 * TODO(fdeng):
 * This file is adapted from deterministic.js in Web Page Replay project.
 * http://code.google.com/p/web-page-replay/source/browse/trunk/deterministic.js
 * The value of time_seed is modified to a date far in the future.
 * This is a workaround for Endure tests for Google apps like Gmail.
 * The side effect of a future date is unknown and needs future investigation.
 * A better way to go is to revise the time_seed to
 * current time each time we record and use the revised scripts for replay.
 * This can be achieved by modifying Web Page Replay to automatically
 * revise and save scripts in the archive in record mode and read it
 * from the archive in replay mode.
 */
(function () {
  var orig_date = Date;
  var random_count = 0;
  var date_count = 0;
  var random_seed = 0.462;
  var time_seed = 3204251968254; // Changed from default value 1204251968254
  var random_count_threshold = 25;
  var date_count_threshold = 25;
  Math.random = function() {
    random_count++;
    if (random_count > random_count_threshold) {
     random_seed += 0.1;
     random_count = 1;
    }
    return (random_seed % 1);
  };
  Date = function() {
    if (this instanceof Date) {
      date_count++;
      if (date_count > date_count_threshold) {
        time_seed += 50;
        date_count = 1;
      }
      switch (arguments.length) {
      case 0: return new orig_date(time_seed);
      case 1: return new orig_date(arguments[0]);
      default: return new orig_date(arguments[0], arguments[1],
         arguments.length >= 3 ? arguments[2] : 1,
         arguments.length >= 4 ? arguments[3] : 0,
         arguments.length >= 5 ? arguments[4] : 0,
         arguments.length >= 6 ? arguments[5] : 0,
         arguments.length >= 7 ? arguments[6] : 0);
      }
    }
    return new Date().toString();
  };
  Date.__proto__ = orig_date;
  Date.prototype.constructor = Date;
  orig_date.now = function() {
    return new Date().getTime();
  };
})();