Workerの実行を阻止する

はじめに

Worker (Dedicatedworker or SharedWorker) の実行を阻止するユーザスクリプトです。

不本意なマイニングなどの Worker が絡む問題を解決できます。

ただし、ServiceWorkerの実行阻止とは異なり、すべてのページで Worker の実行を阻止することは推奨しません。なぜならば、 Worker の処理がウェブページの一連の処理の一部分を占める可能性が極めて高いためです。 Worker の実行を阻止することでウェブページ全体が動作しなくなる可能性が極めて高いです。

特定のページのみで使用するか、 NoScript などで JavaScript そのものの動作を無効化することを強く推奨します。

※上記理由により、筆者は本ユーザスクリプトをほとんど使用していません。ユーザスクリプトのテストが不十分であったり、今後の機能拡張される可能性が極めて低いことを留意して使用してください。

仕様

  • 対象ページのWorker (Dedicatedworker or SharedWorker) の実行を阻止する
  • 対象ページ以外は、動作しない(なにもしない)
  • ユーザスクリプトに対象ページを追記する(@include or @matchで追記する)
    • // @include *://*/* で全ページを対象にすることもできます
  • ServiceWorker の実行(登録)は、阻止しません
  • ユーザスクリプトの実行タイミングでは、完全な実行阻止はできません
    • ページへのスクリプト挿入が少し遅れるため
    • 拡張機能は、ユーザスクリプト版に比べてこの部分がより強力に動作します
      • 拡張機能版は、作成しておりません

ユーザスクリプト

DummyWorker.user.js// ==UserScript==
// @name        DummyWorker
// @description Set up a DummyWorker to stop the Worker from executing.
//              Dedicatedworker or SharedWorker is targeted; ServiceWorker is not targeted.
// @note        ↓↓↓ Add target page URL ↓↓↓
// @include     *://example.com/*
// @note        ↑↑↑ Add target page URL ↑↑↑
// @author      toshi (https://github.com/k08045kk)
// @license     MIT License | https://opensource.org/licenses/MIT
// @version     0.1.1
// @since       0.1.0 - 20210618 - 初版
// @since       0.1.1 - 20210620 - this から prototype に設計変更
// @see         https://www.bugbugnow.net/2021/06/dummy-worker.html
// @run-at      document-start
// @grant       unsafeWindow
// ==/UserScript==

(function(w) {
  var DummyWorker = function(aURL, options) {};
  DummyWorker.prototype.postMessage = function() {};
  DummyWorker.prototype.terminate = function() {};
  DummyWorker.prototype.addEventListener = function() {};
  DummyWorker.prototype.removeEventListener = function() {};
  DummyWorker.prototype.dispatchEvent = function() {};
  DummyWorker.prototype.port = {};
  DummyWorker.prototype.port.postMessage = function() {};
  DummyWorker.prototype.port.start = function() {};
  DummyWorker.prototype.port.close = function() {};
  DummyWorker.prototype.port.addEventListener = function() {};
  DummyWorker.prototype.port.removeEventListener = function() {};
  DummyWorker.prototype.port.dispatchEvent = function() {};

  // see https://developer.mozilla.org/en-US/docs/Web/API/Worker
  // see https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker
  w.Worker = DummyWorker;
  w.SharedWorker = DummyWorker;
})(unsafeWindow || window);