<!DOCTYPE html>
<!--
Copyright (c) 2015 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<link rel="import" href="/base/base.html">
<link rel="import" href="/base/statistics.html">
<link rel="import" href="/core/auditor.html">
<link rel="import" href="/model/model.html">
<link rel="import" href="/base/range_utils.html">
<link rel="import" href="/extras/chrome/chrome_model_helper.html">

<script>
'use strict';

/**
 * @fileoverview Base class for trace data Auditors.
 */
tr.exportTo('tr.e.rail', function() {

  function RAILInteractionRecord(title, railTypeName, start, duration) {
    var colorId = tr.ui.b.getColorIdForReservedName(railTypeName);
    this.railTypeName_ = railTypeName;
    tr.model.InteractionRecord.call(this,
                                    title, colorId, start, duration);
  }

  RAILInteractionRecord.prototype = {
    __proto__: tr.model.InteractionRecord.prototype,

    updateArgs: function() {
      var args = {};

      var layoutSlices = this.associatedEvents.filter(function(event) {
        return event.title === 'FrameView::layout';
      });
      var timeInLayout = tr.b.Statistics.sum(layoutSlices, function(event) {
        return event.duration;
      });

      args['layoutInfo'] = {
        'timeInLayout': timeInLayout
      };

      this.args = args;
    },

    get railTypeName() {
      return this.railTypeName_;
    },

    /**
     * Returns the overall rail score, from 0 to 1.
     *
     * RAILScore for an interaction merges the user's pain with the
     * efficiency, in order to create a perception-oriented measure
     * of how users percieve speed during this interaction.
     *
     *  0 means a bad user experience.
     *  1 means a perfect user experience.
     */
    get railScore() {
      var happiness = 1 - this.normalizedUserPain;
      var efficiency = this.normalizedEfficiency;
      // The lower sub-score is more important than the higher sub-score.
      // happiness is more important than efficiency.
      var happinessWeight = 2 * Math.exp(1 - happiness);
      var efficiencyWeight = Math.exp(1 - efficiency);
      // This function is graphed at http://goo.gl/XMWUKA
      return ((happiness * happinessWeight + efficiency * efficiencyWeight) /
              (happinessWeight + efficiencyWeight));
    },

    /**
     * Measures the pain the user experienced, from 0 to 1.
     *
     * A user performs an interaction with an expectation in mind.
     * When we exceed their expectations, we get zero pain.
     * When we meet their expectations, we get zero pain.
     * As we exceed their expectations, pain goes up. Maximum pain
     * is 1.0, aka "Switch to FireFox".
     */
    get normalizedUserPain() {
      throw new Error('Not implemented');
    },

    /**
     * Measures the efficiency of the interaction from 0 to 1.
     *
     * Efficiency is a notion of how well we used the machine's limited
     * resources in service of this interaction. If we used it perfectly,
     * we would get a 1.0. If we used everything that there was to use ---
     * power, memory, cpu, then we'd get a zero.
     */
    get normalizedEfficiency() {
      throw new Error('Not implemented');
    }
  };

  return {
    RAILInteractionRecord: RAILInteractionRecord
  };
});
</script>
