/*
 * Copyright 2012 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Source:
//   https://github.com/chromium/web-page-replay/blob/master/deterministic.js
//
// This js redefines the non-deterministic parts of JS, such as Date and
// Math.random, so that contents of the rewritten page are more or less
// deterministic when loaded repeatedly. This can help in reducing variance
// found while measuring page load metrics over time.

var orig_date = Date;
var random_count = 0;
var date_count = 0;
var random_seed = 0.462;
var time_seed = 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();
};
