troubleshooter.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. /*** ghacks-user.js troubleshooter.js v1.5.2 ***/
  2. (function() {
  3. if("undefined" === typeof(Services)) {
  4. alert("about:config needs to be the active tab!");
  5. return;
  6. }
  7. function getMyList(arr) {
  8. let aRet = [];
  9. let dummy = 0;
  10. for (let i = 0, len = arr.length; i < len; i++) {
  11. if (Services.prefs.prefHasUserValue(arr[i])) {
  12. dummy = Services.prefs.getPrefType(arr[i]);
  13. switch (dummy) {
  14. case 32: // string (see https://dxr.mozilla.org/mozilla-central/source/modules/libpref/nsIPrefBranch.idl#31)
  15. dummy = Services.prefs.getCharPref(arr[i]);
  16. aRet.push({'name':arr[i],'value': dummy,'type':32});
  17. break;
  18. case 64: // int
  19. dummy = Services.prefs.getIntPref(arr[i]);
  20. aRet.push({'name':arr[i],'value': dummy,'type':64});
  21. break;
  22. case 128: // boolean
  23. dummy = Services.prefs.getBoolPref(arr[i]);
  24. aRet.push({'name':arr[i],'value': dummy,'type':128});
  25. break;
  26. default:
  27. console.log("error detecting pref-type for '"+arr[i]+"' !");
  28. }
  29. }
  30. }
  31. return aRet;
  32. }
  33. function reapply(arr) {
  34. for (let i = 0, len = arr.length; i < len; i++) {
  35. switch (arr[i].type) {
  36. case 32: // string
  37. Services.prefs.setCharPref(arr[i].name, arr[i].value);
  38. break;
  39. case 64: // int
  40. Services.prefs.setIntPref(arr[i].name, arr[i].value);
  41. break;
  42. case 128: // boolean
  43. Services.prefs.setBoolPref(arr[i].name, arr[i].value);
  44. break;
  45. default:
  46. console.log("error re-appyling value for '"+arr[i].name+"' !"); // should never happen
  47. }
  48. }
  49. }
  50. function myreset(arr) {
  51. for (let i = 0, len = arr.length; i < len; i++) {
  52. Services.prefs.clearUserPref(arr[i].name);
  53. }
  54. }
  55. let ops = [
  56. /* known culprits */
  57. 'network.cookie.cookieBehavior',
  58. 'network.http.referer.XOriginPolicy',
  59. 'privacy.firstparty.isolate',
  60. 'privacy.resistFingerprinting',
  61. 'security.mixed_content.block_display_content',
  62. 'svg.disabled',
  63. /* Storage + Cache */
  64. 'browser.cache.offline.enable',
  65. 'dom.indexedDB.enabled',
  66. 'dom.storage.enabled',
  67. 'browser.storageManager.enabled',
  68. 'dom.storageManager.enabled',
  69. /* Workers, Web + Push Notifications */
  70. 'dom.caches.enabled',
  71. 'dom.push.connection.enabled',
  72. 'dom.push.enabled',
  73. 'dom.push.serverURL',
  74. 'dom.serviceWorkers.enabled',
  75. 'dom.webnotifications.enabled',
  76. 'dom.webnotifications.serviceworker.enabled',
  77. /* Fonts */
  78. 'browser.display.use_document_fonts',
  79. 'font.blacklist.underline_offset',
  80. 'gfx.downloadable_fonts.woff2.enabled',
  81. 'gfx.font_rendering.graphite.enabled',
  82. 'gfx.font_rendering.opentype_svg.enabled',
  83. 'layout.css.font-loading-api.enabled',
  84. /* Misc */
  85. 'browser.link.open_newwindow.restriction',
  86. 'canvas.capturestream.enabled',
  87. 'dom.event.clipboardevents.enabled',
  88. 'dom.event.contextmenu.enabled',
  89. 'dom.IntersectionObserver.enabled',
  90. 'dom.popup_allowed_events',
  91. 'full-screen-api.enabled',
  92. 'geo.wifi.uri',
  93. 'intl.accept_languages',
  94. 'javascript.options.asmjs',
  95. 'javascript.options.wasm',
  96. 'permissions.default.shortcuts',
  97. 'security.csp.experimentalEnabled',
  98. /* Hardware */
  99. 'dom.vr.enabled',
  100. 'media.ondevicechange.enabled',
  101. /* Audio + Video */
  102. 'dom.webaudio.enabled',
  103. 'media.autoplay.enabled',
  104. 'media.autoplay.default', // FF63+
  105. /* Forms */
  106. 'browser.formfill.enable',
  107. 'signon.autofillForms',
  108. 'signon.formlessCapture.enabled',
  109. /* HTTPS */
  110. 'security.cert_pinning.enforcement_level',
  111. 'security.family_safety.mode',
  112. 'security.OCSP.require',
  113. 'security.pki.sha1_enforcement_level',
  114. 'security.ssl.require_safe_negotiation',
  115. 'security.ssl.treat_unsafe_negotiation_as_broken',
  116. 'security.ssl3.dhe_rsa_aes_128_sha',
  117. 'security.ssl3.dhe_rsa_aes_256_sha',
  118. 'security.ssl3.ecdhe_ecdsa_aes_128_sha',
  119. 'security.ssl3.ecdhe_rsa_aes_128_sha',
  120. 'security.ssl3.rsa_aes_128_sha',
  121. 'security.ssl3.rsa_aes_256_sha',
  122. 'security.ssl3.rsa_des_ede3_sha',
  123. 'security.tls.enable_0rtt_data',
  124. 'security.tls.version.max',
  125. 'security.tls.version.min',
  126. /* Plugins + Flash */
  127. 'plugin.default.state',
  128. 'plugin.defaultXpi.state',
  129. 'plugin.sessionPermissionNow.intervalInMinutes',
  130. 'plugin.state.flash',
  131. /* unlikely to cause problems */
  132. 'browser.tabs.remote.allowLinkedWebInFileUriProcess',
  133. 'dom.popup_maximum',
  134. 'layout.css.visited_links_enabled',
  135. 'mathml.disabled',
  136. 'network.auth.subresource-http-auth-allow',
  137. 'network.http.redirection-limit',
  138. 'network.protocol-handler.external.ms-windows-store',
  139. 'privacy.trackingprotection.enabled',
  140. 'security.data_uri.block_toplevel_data_uri_navigations',
  141. 'last.one.without.comma'
  142. ]
  143. // reset prefs that set the same value as FFs default value
  144. let aTEMP = getMyList(ops);
  145. myreset(aTEMP);
  146. reapply(aTEMP);
  147. const aBACKUP = getMyList(ops);
  148. //console.log(aBACKUP.length, "user-set prefs from our list detected and their values stored.");
  149. let myArr = aBACKUP;
  150. let found = false;
  151. let aDbg = [];
  152. focus();
  153. myreset(aBACKUP); // reset all detected prefs
  154. if (confirm("all detected prefs reset.\n\n!! KEEP THIS PROMPT OPEN AND TEST THE SITE IN ANOTHER TAB !!\n\nIF the problem still exists, this script can't help you - click cancel to re-apply your values and exit.\n\nClick OK if your problem is fixed.")) {
  155. aDbg = myArr;
  156. reapply(aBACKUP);
  157. myreset(myArr.slice(0, parseInt(myArr.length/2)));
  158. while (myArr.length >= 2) {
  159. alert("NOW TEST AGAIN !");
  160. if (confirm("if the problem still exists click OK, otherwise click cancel.")) {
  161. myArr = myArr.slice(parseInt(myArr.length/2));
  162. if (myArr.length == 1) {
  163. alert("The problem is caused by more than 1 pref !\n\nNarrowed it down to "+ aDbg.length.toString() +" prefs, check the console ...");
  164. break;
  165. }
  166. } else {
  167. myArr = myArr.slice(0, parseInt(myArr.length/2));
  168. aDbg = myArr;
  169. if (myArr.length == 1) { found = true; break; }
  170. }
  171. reapply(aBACKUP);
  172. myreset(myArr.slice(0, parseInt(myArr.length/2))); // reset half of the remaining prefs
  173. }
  174. reapply(aBACKUP);
  175. }
  176. else {
  177. reapply(aBACKUP);
  178. return;
  179. }
  180. if (found) {
  181. alert("narrowed it down to:\n\n"+myArr[0].name+"\n");
  182. myreset(myArr); // reset the culprit
  183. }
  184. else {
  185. console.log("the problem is caused by a combination of the following prefs:");
  186. for (let i = 0, len = aDbg.length; i < len; i++) {
  187. console.log(aDbg[i].name);
  188. }
  189. }
  190. })();