(function () {
    // Browser timing remains hidden unless we can successfully access the performance object
    var perf = window.performance || window.msPerformance ||
               window.webkitPerformance || window.mozPerformance;
    if (!perf)
        return;

    var timingOffset = perf.timing.navigationStart,
        timingEnd = perf.timing.loadEventEnd,
        totalTime = timingEnd - timingOffset;
    function getLeft(stat) {
        return ((perf.timing[stat] - timingOffset) / (totalTime)) * 100.0;
    }
    function getCSSWidth(stat, endStat) {
        var width = ((perf.timing[endStat] - perf.timing[stat]) / (totalTime)) * 100.0;
        // Calculate relative percent (same as sql panel logic)
        width = 100.0 * width / (100.0 - getLeft(stat));
        return (width < 1) ? "2px" : width + "%";
    }
    function addRow(stat, endStat) {
        var row = document.createElement('tr');
        if (endStat) {
            // Render a start through end bar
            row.innerHTML = '<td>' + stat.replace('Start', '') + '</td>' +
                            '<td class="djdt-timeline"><div class="djDebugTimeline"><div class="djDebugLineChart"><strong>&#160;</strong></div></div></td>' +
                            '<td>' + (perf.timing[stat] - timingOffset) + ' (+' + (perf.timing[endStat] - perf.timing[stat]) + ')</td>';
            row.querySelector('strong').style.width = getCSSWidth(stat, endStat);
        } else {
            // Render a point in time
            row.innerHTML = '<td>' + stat + '</td>' +
                            '<td class="djdt-timeline"><div class="djDebugTimeline"><div class="djDebugLineChart"><strong>&#160;</strong></div></div></td>' +
                            '<td>' + (perf.timing[stat] - timingOffset) + '</td>';
            row.querySelector('strong').style.width = '2px';
        }
        row.querySelector('.djDebugLineChart').style.left = getLeft(stat) + '%';
        document.querySelector('#djDebugBrowserTimingTableBody').appendChild(row);
    }

    // This is a reasonably complete and ordered set of timing periods (2 params) and events (1 param)
    addRow('domainLookupStart', 'domainLookupEnd');
    addRow('connectStart', 'connectEnd');
    addRow('requestStart', 'responseEnd'); // There is no requestEnd
    addRow('responseStart', 'responseEnd');
    addRow('domLoading', 'domComplete'); // Spans the events below
    addRow('domInteractive');
    addRow('domContentLoadedEventStart', 'domContentLoadedEventEnd');
    addRow('loadEventStart', 'loadEventEnd');
    document.querySelector('#djDebugBrowserTiming').classList.remove('djdt-hidden');
})();

@@ -16,261 +16,8 @@
     
-// Browser timing remains hidden unless we can successfully access the performance object%0A    var perf = window.performance %7C%7C window.msPerformance %7C%7C%0A               window.webkitPerformance %7C%7C window.mozPerformance;%0A    if (!perf)%0A        return;%0A%0A    
 var 
@@ -31,24 +31,31 @@
 ffset = perf
+ormance
 .timing.navi
@@ -87,24 +87,31 @@
 ngEnd = perf
+ormance
 .timing.load
@@ -212,24 +212,31 @@
 eturn ((perf
+ormance
 .timing%5Bstat
@@ -347,24 +347,31 @@
 dth = ((perf
+ormance
 .timing%5BendS
@@ -373,32 +373,39 @@
 %5BendStat%5D - perf
+ormance
 .timing%5Bstat%5D) /
@@ -1025,32 +1025,39 @@
   '%3Ctd%3E' + (perf
+ormance
 .timing%5Bstat%5D - 
@@ -1077,32 +1077,39 @@
  + ' (+' + (perf
+ormance
 .timing%5BendStat%5D
@@ -1111,24 +1111,31 @@
 Stat%5D - perf
+ormance
 .timing%5Bstat
@@ -1540,16 +1540,23 @@
  + (perf
+ormance
 .timing%5B

Remove old, outdated perofmance API fallback