logo
Published on

The Great Suspenderみたいな拡張機能を作った

Authors

以前にThe Great Suspenderという拡張機能が存在していたが、セキュリティ上の問題により利用できなくなってしまった。

事案からは大分年月が経っており、だからというわけでもないが、気が向いたのでThe Great Suspenderみたいな拡張機能を作ってみることにした。以下のgifはその拡張機能の動作を示している。

the great suspenderみたいな拡張機能

とりあえずの仮称をtab suspenderとしている。

このような拡張機能を作る方法は意外とシンプルである。

以下は拡張機能のコードの一部だ。

/**
 * tab suspender
 */
(async () => {
  const sleep = m => new Promise(r => setTimeout(r, m));
  const moment = (await import('https://cdn.jsdelivr.net/npm/moment@2.29.4/+esm')).default;
  const axios = (await import('https://cdn.skypack.dev/axios@1.4.0')).default;
  const URLParse = (await import('https://cdn.skypack.dev/url-parse@1.5.10')).default;
  const uuid = (await import('https://cdn.skypack.dev/@lukeed/uuid@2.0.1')).v4;
  const script = (await axios.get('http://localhost:8080/web/lib/utils.js')).data
  eval(script);

  app.console.setLogPrefix("[tab suspender]");
  app.console.warn("starting.");

  async function tabSuspender(__target) {
    const href = await ChromeUtils.executeScript(__target, `location.href`);
    const title = await ChromeUtils.executeScript(__target, `document.title`);
    const date = new Date();

    const url = `chrome-extension://fnpaijaoeigbfiglkhamjdlkhpapdfbe/options.html`
      + `?href=${encodeURIComponent(href)}&title=${encodeURIComponent(title)}&date=${date}`;

// (続く)

ショートカットキーが設定できるようにしてある。例えばAlt-Rキーを私は設定している。

任意のタブのページ上でalt-rを押すと、そのタブが拡張機能の独自ページに飛ぶようになっている。

これにより、CPUやメモリを消費している当該ページからタブを逃してやることができる。また、タブを閉じてしまっても、拡張機能の独自ページからタブを復元することができる。

簡単に言えば、やっていることはシンプルにCPUやメモリ消費の最低限なプレーンなページ(例えばhttps://example.com/のようなものを想像してもらえれば良い)にタブを置き換えているだけである。

しかしThe Great Suspenderも仕組みはほぼ同じである。

現状この拡張機能は私用の最低限の機能、つまりショートカットキーでタブをサスペンド/レジューム(スリーブ/再開)でトグルする機能しかないが、要望があればタイマーや複雑なif条件などを組み込んでいくこともできる。

紹介は以上である。