Tab De-Throttler

Prevents the browser from throttling a tab by playing very quiet audio.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name        Tab De-Throttler
// @version     0.1.1
// @description Prevents the browser from throttling a tab by playing very quiet audio.
// @author      parseHex
// @namespace   https://greasyfork.org/users/8394
// @include     http*://worker.mturk.com/?filters[search_term]=pandacrazy=on*
// @include     http*://worker.mturk.com/requesters/PandaCrazy/projects*
// @include     http*://worker.mturk.com/?end_signin=1&filters%5Bsearch_term%5D=pandacrazy%3Don*
// @grant       unsafeWindow
// @run-at      document-end
// ==/UserScript==

var audioFixStarted = false;

// set up and play a quiet low-frequency sound
// browsers won't throttle tabs playing audio
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
function setupFixSound() {
	if (!audioCtx) {
		// last try wasn't successful, make a new audioCtx
		audioCtx = new (window.AudioContext || window.webkitAudioContext)();
	}

	// don't need to run this more than once
	if (audioFixStarted) return;
	audioFixStarted = true;

	// this comes from the examples on https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Using_Web_Audio_API
	var oscillator = audioCtx.createOscillator();
	var gainNode = audioCtx.createGain();
	oscillator.connect(gainNode);
	gainNode.connect(audioCtx.destination);

	// could try other types besides sine wave
	// triangle sounds okay
	oscillator.type = 'sine';

	// this seems to be about the lowest volume before the browser ignores the sound
	// tested it by lowering and checking if the sound icon showed up on the tab
	gainNode.gain.setTargetAtTime(0.0004, audioCtx.currentTime, 0);

	// picked a low frequency to make it less noticeable
	// too low and i noticed some audio 'crackling'
	// with 100 there's a slight crackle when the sound starts but that's it
	oscillator.frequency.setTargetAtTime(30, audioCtx.currentTime + 0.5, 0.5);

	oscillator.start();

	removeListeners();
}

setTimeout(() => {
	if (audioCtx.state === 'running') {
		setupFixSound();
	} else {
		// have to wait for a user gesture to play sound
		audioCtx.close();
		audioCtx = null;
	}
}, 500);

// audioCtx is suspended; wait for an input event and try again
if (!audioFixStarted) {
	// starting in a later version of chrome, audio can't be played until the user interacts with the page
	// listen for a click or keypress and setup the sound then
	window.addEventListener('click', setupFixSound);
	window.addEventListener('keypress', setupFixSound);
}


function removeListeners() {
	window.removeEventListener('click', setupFixSound);
	window.removeEventListener('keypress', setupFixSound);
}

// setTimeout(function () {
// 	// if there hasn't been an input event yet, try setting up sound just in case
// 	try {
// 		setupFixSound();

// 		// remove the listeners if it setup
// 		removeListeners();
// 	} catch (e) {
// 		console.log('Couldn\'t setup de-throttler sound.');
// 		console.error(e);
// 	}
// }, 15000);