// Copyright 2013 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. 'use strict'; /** * @fileoverview This file provides a JavaScript helper function that * determines when the last resource was received. */ (function() { // Set the Resource Timing interface functions that will be used below // to use whatever version is available currently regardless of vendor // prefix. window.performance.clearResourceTimings = (window.performance.clearResourceTimings || window.performance.mozClearResourceTimings || window.performance.msClearResourceTimings || window.performance.oClearResourceTimings || window.performance.webkitClearResourceTimings); window.performance.getEntriesByType = (window.performance.getEntriesByType || window.performance.mozGetEntriesByType || window.performance.msGetEntriesByType || window.performance.oGetEntriesByType || window.performance.webkitGetEntriesByType); // This variable will available to the function below and it will be // persistent across different function calls. It stores the last // entry in the list of PerformanceResourceTiming objects returned by // window.performance.getEntriesByType('resource'). // // The reason for doing it this way is because the buffer for // PerformanceResourceTiming objects has a limit, and once it's full, // new entries are not added. We're only interested in the last entry, // so we can clear new entries when they're added. var lastEntry = null; /** * This method uses the Resource Timing interface, which is described at * http://www.w3.org/TR/resource-timing/. It provides information about * timings for resources such as images and script files, and it includes * resources requested via XMLHttpRequest. * * @return {number} The time since either the load event, or the last * the last resource was received after the load event. If the load * event hasn't yet happened, return 0. */ window.timeSinceLastResponseAfterLoadMs = function() { if (window.document.readyState !== 'complete') { return 0; } var resourceTimings = window.performance.getEntriesByType('resource'); if (resourceTimings.length > 0) { lastEntry = resourceTimings.pop(); window.performance.clearResourceTimings(); } // The times for performance.now() and in the PerformanceResourceTiming // objects are all in milliseconds since performance.timing.navigationStart, // so we must also get load time in the same terms. var timing = window.performance.timing; var loadTime = timing.loadEventEnd - timing.navigationStart; // If there have been no resource timing entries, or the last entry was // before the load event, then return the time since the load event. if (!lastEntry || lastEntry.responseEnd < loadTime) { return window.performance.now() - loadTime; } return window.performance.now() - lastEntry.responseEnd; } })();