/*** arkenfox user.js troubleshooter.js v1.6.3 ***/ (function() { if ("undefined" === typeof(Services)) return alert('about:config needs to be the active tab!'); const aPREFS = [ /* known culprits */ 'network.cookie.cookieBehavior', 'network.http.referer.XOriginPolicy', 'privacy.firstparty.isolate', 'privacy.resistFingerprinting', 'security.mixed_content.block_display_content', 'svg.disabled', /* Storage + Cache */ 'browser.cache.offline.enable', 'dom.storage.enabled', 'dom.storageManager.enabled', /* Workers, Web + Push Notifications */ 'dom.caches.enabled', 'dom.push.connection.enabled', 'dom.push.enabled', 'dom.push.serverURL', 'dom.serviceWorkers.enabled', 'dom.webnotifications.enabled', 'dom.webnotifications.serviceworker.enabled', /* Fonts */ 'browser.display.use_document_fonts', 'font.blacklist.underline_offset', 'gfx.font_rendering.graphite.enabled', 'gfx.font_rendering.opentype_svg.enabled', 'layout.css.font-loading-api.enabled', /* Misc */ 'browser.link.open_newwindow.restriction', 'canvas.capturestream.enabled', 'dom.event.clipboardevents.enabled', 'dom.event.contextmenu.enabled', 'dom.IntersectionObserver.enabled', 'dom.popup_allowed_events', 'full-screen-api.enabled', 'intl.accept_languages', 'javascript.options.asmjs', 'javascript.options.wasm', 'permissions.default.shortcuts', /* Hardware */ 'dom.vr.enabled', 'media.ondevicechange.enabled', /* Audio + Video */ 'dom.webaudio.enabled', 'media.autoplay.default', // FF63+ 'media.autoplay.blocking_policy', // FF78+ /* Forms */ 'browser.formfill.enable', 'signon.autofillForms', 'signon.formlessCapture.enabled', /* HTTPS */ 'security.cert_pinning.enforcement_level', 'security.family_safety.mode', 'security.OCSP.require', 'security.pki.sha1_enforcement_level', 'security.ssl.require_safe_negotiation', 'security.ssl.treat_unsafe_negotiation_as_broken', 'security.ssl3.dhe_rsa_aes_128_sha', 'security.ssl3.dhe_rsa_aes_256_sha', 'security.ssl3.ecdhe_ecdsa_aes_128_sha', 'security.ssl3.ecdhe_rsa_aes_128_sha', 'security.ssl3.rsa_aes_128_sha', 'security.ssl3.rsa_aes_256_sha', 'security.ssl3.rsa_des_ede3_sha', 'security.tls.enable_0rtt_data', 'security.tls.version.max', 'security.tls.version.min', /* Plugins + Flash */ 'plugin.default.state', 'plugin.state.flash', /* unlikely to cause problems */ 'dom.popup_maximum', 'geo.provider.network.url', 'layout.css.visited_links_enabled', 'mathml.disabled', 'network.auth.subresource-http-auth-allow', 'network.http.redirection-limit', 'network.protocol-handler.external.ms-windows-store', 'privacy.trackingprotection.enabled', 'security.data_uri.block_toplevel_data_uri_navigations', 'privacy.window.name.update.enabled', // FF82+ 'last.one.without.comma' ] // any runtime-set pref that everyone will have and that can be safely reset const oFILLER = { type: 64, name: 'app.update.lastUpdateTime.browser-cleanup-thumbnails', value: 1580000000 }; function getMyList(arr) { const aRet = []; for (const sPname of arr) { if (Services.prefs.prefHasUserValue(sPname)) { const ptype = Services.prefs.getPrefType(sPname); switch (ptype) { case 32: // string (see https://dxr.mozilla.org/mozilla-central/source/modules/libpref/nsIPrefBranch.idl#31) aRet.push({'type':ptype,'name':sPname,'value':Services.prefs.getCharPref(sPname)}); break; case 64: // int aRet.push({'type':ptype,'name':sPname,'value':Services.prefs.getIntPref(sPname)}); break; case 128: // boolean aRet.push({'type':ptype,'name':sPname,'value':Services.prefs.getBoolPref(sPname)}); break; default: console.log("error detecting pref-type for '"+sPname+"' !"); } } } return aRet; } function reapply(arr) { for (const oPref of arr) { switch (oPref.type) { case 32: // string Services.prefs.setCharPref(oPref.name, oPref.value); break; case 64: // int Services.prefs.setIntPref(oPref.name, oPref.value); break; case 128: // boolean Services.prefs.setBoolPref(oPref.name, oPref.value); break; default: console.log("error re-appyling value for '"+oPref.name+"' !"); // should never happen } } } function myreset(arr) { for (const oPref of arr) Services.prefs.clearUserPref(oPref.name); } function resetAllMatchingDefault(arr) { const aTmp = getMyList(arr); myreset(aTmp); reapply(aTmp); } function _main(aALL) { const _h = (arr) => Math.ceil(arr.length/2); let aTmp = aALL, aDbg = aALL; reapply(aALL); myreset(aTmp.slice(0, _h(aTmp))); while (aTmp.length) { alert('NOW TEST AGAIN !'); if (confirm('if the problem still exists click OK, otherwise click Cancel.')) { aTmp = aTmp.slice(_h(aTmp)); } else { aTmp = aTmp.slice(0, _h(aTmp)); aDbg = aTmp; // update narrowed down list if (aDbg.length == 1) break; } reapply(aALL); myreset(aTmp.slice(0, _h(aTmp))); // reset half of the remaining prefs } reapply(aALL); if (aDbg.length == 1) return alert("narrowed it down to:\n\n"+aDbg[0].name+"\n"); if (aDbg.length == aALL.length) { const msg = "Failed to narrow it down beyond the initial "+aALL.length+" prefs. The problem is most likely caused by at least 2 prefs!\n\n" + "Either those prefs are too far apart in the list or there are exactly 2 culprits and they just happen to be at the wrong place.\n\n" + "In case it's the latter, the script can add a dummy pref and you can try again - Try again?"; if (confirm(msg)) return _main([...aALL, oFILLER]); } else if (aDbg.length > 10 && confirm("Narrowed it down to "+aDbg.length+" prefs. Try narrowing it down further?")) { return _main(aDbg.reverse()); } alert("Narrowed it down to "+ aDbg.length.toString() +" prefs, check the console ..."); console.log('The problem is caused by 2 or more of these prefs:'); for (const oPref of aDbg) console.log(oPref.name); } resetAllMatchingDefault(aPREFS); // reset user-set prefs matching FFs default value const aBAK = getMyList(aPREFS); //console.log(aBAK.length, "user-set prefs from our list detected and their values stored."); const sMsg = "all detected prefs reset.\n\n" + "!! KEEP THIS PROMPT OPEN AND TEST THE SITE IN ANOTHER TAB !!\n\n" + "IF the problem still exists, this script can't help you - click Cancel to re-apply your values and exit.\n\n" + "Click OK if your problem is fixed."; focus(); myreset(aBAK); if (!confirm(sMsg)) { reapply(aBAK); return; } _main(aBAK); })();