Many sites freezing because of renderedBuffer.length audio javascript code

I’ve been to several sites now that freeze after first loading and then after about 3-5 minutes are usable again.

https://qbo.intuit.com
https://www.discover.com
https://www.microsoft.com/en-us/software-download/windows10ISO

If I pause the javascript execution, it looks the same on all pages, except for some minification differences. It’s always in a file called check.js. It happens in an ‘oncomplete’ function where it loops through from 0 to .renderedBuffer.length, which is always 44100. This seems to take minutes.

I know it’s probably a shared library and this particular bit of code seems to relate to audio detection of some kind.

I would say it’s the library’s issue, but brave is the only browser that’s giving me this issue. Not even any other chromium browsers are having this issue.

@achastain,
I don’t seem to be able to reproduce the issue you’re describing – can you tell me what OS you’re using?

I have been able to reproduce this on both Windows 10 and Ubuntu. I’ve disabled my extensions and the effect lasts.

Here’s the javascript where it freezes:

    this.setup = function() {
    try {
        var td_zW;
        if (td_zW = new (window.OfflineAudioContext || window.webkitOfflineAudioContext)(1,44100,44100),
        !td_zW) {
            return null;
        }
        var td_Hu = td_zW.createOscillator();
        td_Hu.type = td_1h.tdz_85b3a567884244a399432b2b94b71e6d.td_f(16, 8);
        td_Hu.frequency.value = 10000;
        var td_Fl = td_zW.createDynamicsCompressor();
        td_Fl.threshold && (td_Fl.threshold.value = -50);
        td_Fl.knee && (td_Fl.knee.value = 40);
        td_Fl.ratio && (td_Fl.ratio.value = 12);
        td_Fl.reduction && (td_Fl.reduction.value = -20);
        td_Fl.attack && (td_Fl.attack.value = 0);
        td_Fl.release && (td_Fl.release.value = 0.25);
        td_Hu.connect(td_Fl);
        td_Fl.connect(td_zW.destination);
        td_Hu.start(0);
        td_zW.startRendering();
        td_zW.oncomplete = function(td_jt) {
            if (typeof td_jt.renderedBuffer === [][[]] + "") {
                return;
            }
            var td_HH = new td_3Q();
            for (var td_wg = 0; td_wg < td_jt.renderedBuffer.length; td_wg++) {     <---- this loop takes forever
                td_HH.update(td_jt.renderedBuffer.getChannelData(0)[td_wg].toString());
            }
            td_Fl.disconnect();
            td_Bu = td_HH.toString();
        }
        ;
    } catch (td_q3) {
        td_Oc = false;
    }
}

The code is almost identical on all three of the above sites with the exception of variable names.

It also is in a file called check.js.

I checked and these files are all being served from the web sites in question, not a third party.

Can you upload an example into jsfiddle? Also does disabling shields make any difference?

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.