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