ServiceWorkerを無効化する

投稿日 2020/03/28 更新日 2021/03/19

はじめに

ServiceWorkerと言うこの頃話題の機能がブラウザに追加されました。既存のウェブページではできなかった。スマホのアプリのような機能をブラウザで実現できる素晴らしい機能です。ただし、ユーザの事前承認なしに登録できます。

ServiceWorkerは、スマホアプリのような機能を無承認で実行できるため、便利な半面でとても危険な機能です。ウイルス対策ソフト(Windows Defenderなど)では、一部のServiceWorkerをウイルスとして検出することがあります。ServiceWorkerは、サイトを閉じても動作し続けることが可能なため、ブラウザの動作を重くする原因にもなります。ServiceWorkerは、キャッシュを大量に保存するため、ディスクやメモリの圧迫につながることもあります。

登録済みのServiceWorkerを確認する

次のアドレスにアクセスすれば確認できます。手動による登録解除も可能です。

// Chrome
chrome://serviceworker-internals

// Edge
edge://serviceworker-internals

// Firefox
about:serviceworkers
about:debugging#workers

※Chromeでは、Google関連サービスの手動による登録解除ができません。
※次の方法を使用することで、ChromeのGoogle関連サービスを登録解除は可能です。

ユーザスクリプトでServiceWorkerの登録を拒否する

ServiceWorkerの登録関数を置き換えてしまうことで新規登録を拒否します。また、ServiceWorkerは登録解除が可能です。なので、登録済みのServiceWorkerを登録解除します。

仕様

  • ServiceWorkerの登録関数を置き換えて新規登録不可にする
  • ServiceWorkerが登録済みならば登録解除する
  • ServiceWorkerが登録済みならばキャッシュもクリアする
  • @excludeを設定することでホワイトリストとして利用できる
  • @includeの設定を変更することでブラックリストとしても利用できる
    • // @include https://*/*」を指定のサイトに変更する
  • ユーザスクリプトの実行タイミングでは、完全な登録拒否はできない
    • ページへのスクリプト挿入が少し遅れるため
    • 一時的にServiceWorkerを登録されますが、直後に登録解除します
      • ただし、登録解除を妨害された場合、解除できないことがあります
    • 拡張機能版は、ユーザスクリプト版に比べてこの部分がより強力に動作します

ユーザスクリプトのコード

RejectServiceWorker.user.js// ==UserScript==
// @name        RejectServiceWorker
// @description Reject to register a ServiceWorker.
//              Unregister the registered Service Worker.
//              If ServiceWorker was registered, it clears the cache.
//              You can use it as a whitelist by setting @exclude.
//              It is not possible to completely reject registration at the timing of executing the user script.
// @note        ↓↓↓ Add target page URL ↓↓↓
// @include     https://*/*
// @exclude     https://example.com/*
// @note        ↑↑↑ Add target page URL ↑↑↑
// @author      toshi (https://github.com/k08045kk)
// @license     MIT License
// @see         https://opensource.org/licenses/MIT
// @version     0.2.1
// @note        0.1.0 - 20200328 - 初版
// @note        0.1.1 - 20200415 - 修正
// @note        0.2.0 - 20200926 - Greasemonkey対応(unsafeWindow経由でwindowのオブジェクトを書き換え)
// @note        0.2.1 - 20210125 - RejectServiceWorkers.user.js → RejectServiceWorker.user.js
// @see         https://github.com/k08045kk/UserScripts
// @see         https://www.bugbugnow.net/2020/03/Reject-to-register-a-ServiceWorker.html
// @run-at      document-start
// @grant       unsafeWindow
// ==/UserScript==

(function(w) {
  // Reject to register a ServiceWorker
  if ('serviceWorker' in navigator) {
    w.ServiceWorkerContainer.prototype.register = function(scriptURL, options) {
      return new Promise((resolve, reject) => {
        //console.log('Reject to register a ServiceWorker.');
        reject(new Error('Reject to register a ServiceWorker.'));
      });
    };
  }
  // Note: It may be registered before `document-start`.

  // Unregister the registered Service Worker
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.getRegistrations().then((registrations) => {
      if (registrations.length != 0) {
        for (let i=0; i<registrations.length; i++) {
          registrations[i].unregister();
          //console.log('ServiceWorker unregister.');
        }
        caches.keys().then((keys) => {
          Promise.all(keys.map((key) => { caches.delete(key); })).then(() => {
            //console.log('caches delete.');
          });
        });
      }
    });
  }
})(unsafeWindow || window);

拡張機能でServiceWorkerをブロック(または、管理)する

次のような拡張機能が既に作成されています。まだ、出始めの機能であるため、探せばもっと良いものがあるかもしれません。

宣伝(筆者作成の拡張機能)

上記ユーザスクリプトと同じような動作をします。拡張機能は、ユーザスクリプトより実行タイミングが早いため、より強力に動作します。

ブラウザ設定でServiceWorkerを無効化する

Chrome(無効化できない)

ChromeでServiceWorkerを無効にする方法は発見できませんでした。次の記事で紹介されている方法では無効化できないことを確認しています。記事内でも無効化できなかったと記載されています。そのため、現状ChromeでServiceWorkerを無効化する場合、上記ユーザスクリプトや拡張機能を利用するのが懸命です。

Firefox

Firefoxは、about:configからdom.serviceWorkers.enabledfalseとすることでServiceWorkerを無効化できます。ただし、既に登録済みのServiceWorkerは動作するため、事前にabout:serviceworkersからすべてのServiceWorkerを登録解除する必要があります。

※設定の反映には、Firefoxの再起動が必要になります。

参考

コメント

asiamoth さんのコメント...

Service Workerディレクトリの肥大に悩んでいたため、「Reject Service Worker」を使わせていただきました。素晴らしい!

ただ一つ難点を言わせていただくと、ホワイト・リストの有効な指定方法が分かりにくかったため、どこかに明記してほしかったです。
「ドメイン名のみ」ですよね? 「https://example.com/*」など色々と試していて見つけました。

(ついでに「Whitelist」の名称も変えた方が無難かと……)

toshi さんのコメント...

ご使用ありがとうございます。以下に質問の回答を記載します。

> 「ドメイン名のみ」ですよね?
ドメイン名のみです。正確には、ドメイン名の改行区切りです。
言い訳になりますが、ブラウザアクションから設定すれば、チェック(ON/OFF)のみで設定できます。ServiceWorkerは、ページと同一ドメイン(サブドメインも不可)上にしか配置できないため、ページのドメイン以外を指定する必要はありません。そのため、ブラウザアクション操作のみで作業を完結できます。現状のオプション画面は、補助機能であり、確認・保存・一括設定用です。(作者の利用目的が既に達成されているうえに、利用者が少なすぎてやるきがでないため、)GUI周りを作り込めていないのが根本の原因です。気が向いたら改善します。

> (ついでに「Whitelist」の名称も変えた方が無難かと……)
Allowlistが一般的になったら変更します。

Unknown さんのコメント...

着眼点がナイスでした。