YouTube - Disable Service Worker

To disable Service Worker (sw.js)

  1. // ==UserScript==
  2. // @name YouTube - Disable Service Worker
  3. // @name:ja YouTube - Disable Service Worker
  4. // @name:zh-TW YouTube - Disable Service Worker
  5. // @name:zh-CN YouTube - Disable Service Worker
  6. // @namespace UserScripts
  7. // @version 0.0.4
  8. // @match https://www.youtube.com/*
  9. // @match https://www.youtube-nocookie.com/embed/*
  10. // @match https://studio.youtube.com/live_chat*
  11. // @license MIT
  12. // @author CY Fung
  13. // @icon https://raw.githubusercontent.com/cyfung1031/userscript-supports/main/icons/yt-engine.png
  14. // @grant none
  15. // @run-at document-start
  16. // @unwrap
  17. // @inject-into page
  18. // @allFrames true
  19. // @exclude /^https?://\S+\.(txt|png|jpg|jpeg|gif|xml|svg|manifest|log|ini)[^\/]*$/
  20. //
  21. // @description To disable Service Worker (sw.js)
  22. // @description:ja To disable Service Worker (sw.js)
  23. // @description:zh-TW To disable Service Worker (sw.js)
  24. // @description:zh-CN To disable Service Worker (sw.js)
  25. //
  26. // ==/UserScript==
  27.  
  28. if (typeof ServiceWorkerContainer === "function" && typeof ServiceWorkerRegistration === "function" && typeof (ServiceWorkerContainer.prototype || 0).getRegistrations === 'function' && !ServiceWorkerContainer.prototype.register767) {
  29. const filterSW = (e) => {
  30. const url = typeof e === 'string' ? e : `${((e || 0).active || 0).scriptURL}`;
  31. return url.endsWith('/sw.js');
  32. };
  33. const makeReject = true;
  34. const unRegisterAll = () => {
  35. const sw = ((typeof navigator === 'object' ? navigator : null) || 0).serviceWorker || 0;
  36. if (sw && typeof sw.getRegistrations === 'function') {
  37. sw.getRegistrations().then(e => e.length >= 1 && Promise.all(e.filter(filterSW).map(e => e.unregister().catch(console.warn)))).catch(console.warn);
  38. }
  39. }
  40. let i = 0;
  41. const scriptCollection = document.getElementsByTagName('script');
  42. (new MutationObserver((mutations, observer) => {
  43. if (typeof yt !== 'object' || scriptCollection.length === 0) return;
  44. if (i < 394 && document.readyState === "complete") i = 394;
  45. if (++i > 400) {
  46. observer.disconnect();
  47. return;
  48. }
  49. if (typeof navigator !== "object") return;
  50. if (!('serviceWorker' in navigator) || !navigator.serviceWorker) return;
  51. if (typeof navigator.serviceWorker.getRegistrations !== "function") return;
  52. unRegisterAll();
  53. })).observe(document, { subtree: true, childList: true, attributes: true });
  54. ServiceWorkerContainer.prototype.register767 = ServiceWorkerContainer.prototype.register;
  55. ServiceWorkerContainer.prototype.register = function (url, ...args) {
  56. if (!filterSW(`${url}`)) {
  57. return this.register767(...arguments);
  58. }
  59. if (i < 394) i = 394;
  60. Promise.resolve().then(unRegisterAll);
  61. return new Promise((resolve, reject) => {
  62. makeReject && setTimeout(() => {
  63. reject(new TypeError("Failed to register a ServiceWorker."));
  64. }, Math.round(1300 + 1700 * Math.random()) + 0.125);
  65. });
  66. };
  67. Promise.resolve().then(unRegisterAll);
  68. unRegisterAll();
  69. }