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.
8 * @fileoverview This file provides a JavaScript helper function that
9 * determines when the last resource was received.
13 // Set the Resource Timing interface functions that will be used below
14 // to use whatever version is available currently regardless of vendor
16 window.performance.clearResourceTimings =
17 (window.performance.clearResourceTimings ||
18 window.performance.mozClearResourceTimings ||
19 window.performance.msClearResourceTimings ||
20 window.performance.oClearResourceTimings ||
21 window.performance.webkitClearResourceTimings);
23 window.performance.getEntriesByType =
24 (window.performance.getEntriesByType ||
25 window.performance.mozGetEntriesByType ||
26 window.performance.msGetEntriesByType ||
27 window.performance.oGetEntriesByType ||
28 window.performance.webkitGetEntriesByType);
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').
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.
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.
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.
51 window.timeSinceLastResponseAfterLoadMs = function() {
52 if (window.document.readyState !== 'complete') {
56 var resourceTimings = window.performance.getEntriesByType('resource');
57 if (resourceTimings.length > 0) {
58 lastEntry = resourceTimings.pop();
59 window.performance.clearResourceTimings();
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;
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;
73 return window.performance.now() - lastEntry.responseEnd;