• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2013 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'use strict';
6
7/**
8 * @fileoverview This file provides a JavaScript helper function that
9 * determines when the last resource was received.
10 */
11(function() {
12
13  // Set the Resource Timing interface functions that will be used below
14  // to use whatever version is available currently regardless of vendor
15  // prefix.
16  window.performance.clearResourceTimings =
17      (window.performance.clearResourceTimings     ||
18       window.performance.mozClearResourceTimings  ||
19       window.performance.msClearResourceTimings   ||
20       window.performance.oClearResourceTimings    ||
21       window.performance.webkitClearResourceTimings);
22
23  window.performance.getEntriesByType =
24      (window.performance.getEntriesByType     ||
25       window.performance.mozGetEntriesByType  ||
26       window.performance.msGetEntriesByType   ||
27       window.performance.oGetEntriesByType    ||
28       window.performance.webkitGetEntriesByType);
29
30  // This variable will available to the function below and it will be
31  // persistent across different function calls. It stores the last
32  // entry in the list of PerformanceResourceTiming objects returned by
33  // window.performance.getEntriesByType('resource').
34  //
35  // The reason for doing it this way is because the buffer for
36  // PerformanceResourceTiming objects has a limit, and once it's full,
37  // new entries are not added. We're only interested in the last entry,
38  // so we can clear new entries when they're added.
39  var lastEntry = null;
40
41  /**
42   * This method uses the Resource Timing interface, which is described at
43   * http://www.w3.org/TR/resource-timing/. It provides information about
44   * timings for resources such as images and script files, and it includes
45   * resources requested via XMLHttpRequest.
46   *
47   * @return {number} The time since either the load event, or the last
48   *   the last resource was received after the load event. If the load
49   *   event hasn't yet happened, return 0.
50   */
51  window.timeSinceLastResponseAfterLoadMs = function() {
52    if (window.document.readyState !== 'complete') {
53      return 0;
54    }
55
56    var resourceTimings = window.performance.getEntriesByType('resource');
57    if (resourceTimings.length > 0) {
58      lastEntry = resourceTimings.pop();
59      window.performance.clearResourceTimings();
60    }
61
62    // The times for performance.now() and in the PerformanceResourceTiming
63    // objects are all in milliseconds since performance.timing.navigationStart,
64    // so we must also get load time in the same terms.
65    var timing = window.performance.timing;
66    var loadTime = timing.loadEventEnd - timing.navigationStart;
67
68    // If there have been no resource timing entries, or the last entry was
69    // before the load event, then return the time since the load event.
70    if (!lastEntry || lastEntry.responseEnd < loadTime) {
71      return window.performance.now() - loadTime;
72    }
73    return window.performance.now() - lastEntry.responseEnd;
74  }
75
76})();
77