Shoora
10/19/2018 - 7:25 AM

Record first paint time from chrome.loadTimes (Chrome/Opera, IE11) to Google Analytics

Record first paint time from chrome.loadTimes (Chrome/Opera, IE11) to Google Analytics

(function ($) {
    'use strict';

    function recordTimeToFirstPaint() {
        // Use Chrome's loadTimes or IE 9+'s msFirstPaint to record the time to render in milliseconds:
        var firstPaintTime, timingSource;

        if ('chrome' in window && $.isFunction(window.chrome.loadTimes)) {
            var loadTimes = window.chrome.loadTimes();

            // A small percentage of traffic from Chrome in the wild returns impossibly large values – 2+
            // days! – which need to be filtered out:

            firstPaintTime = loadTimes.firstPaintTime - loadTimes.startLoadTime;

            if (firstPaintTime > 3600) {
                Raven.captureMessage('chrome.loadTimes() reported impossible values',
                                     {extra: {loadTimes: loadTimes}});
                return;
            }

            // Convert from seconds to milliseconds:
            firstPaintTime = Math.round(firstPaintTime * 1000);
            timingSource = 'chrome.loadTimes';
        } else if ('performance' in window) {
            var navTiming = window.performance.timing;

            if (navTiming.navigationStart === 0) {
                return; // IE9 bug - see below
            }

            // See http://msdn.microsoft.com/ff974719
            firstPaintTime = navTiming.msFirstPaint - navTiming.navigationStart;
            timingSource = 'msFirstPaint';
        }

        if (typeof firstPaintTime == 'number' && firstPaintTime > 0) {
            ga('send', {
                hitType: 'timing',
                transport: 'beacon',
                timingCategory: 'RUM',
                timingVar: 'First Paint (ms)',
                timingValue: firstPaintTime,
                timingLabel: timingSource
            });
        }
    }

    // Defer collecting data until after the load event has finished to avoid an IE9
    // bug where navigationStart will be 0 until after the browser updates the
    // performance.timing data structure:
    $(window).on('load', function () {
        setTimeout(recordTimeToFirstPaint);
    });
})(jQuery);