Firefoxでアドオンなしで広告をブロックする

macOSのFirefoxでアドオンなしでドメインベースのサイトブロックをする方法について。

言うまでもなく広告はウェブサイトの大切な収入源です。
適切に配置された美しい広告はWebサイトのコンテンツのひとつとも言えます。
一方、Webサイトの美観を損ねるだけの広告や、見る人を傷つける脅迫めいた広告、JavaScriptでユーザのリソースを無駄に消費するだけの迷惑な広告が多いのも事実です。

<img width="176" alt="スクリーンショット 2018-08-23 1.06.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/26038/7bd3eee5-b36d-e8d3-4d5c-90665b609634.png">

この広告は常にスクロールしているので非常に目障りなうえに、ExcelVBAの書籍を表示するなど、常軌を逸しています。
こういったものは、広告配信プラットフォームごと表示を拒否してしまうのが得策です。

そこで、Firefoxにアドオンを導入しようとしたのですが、有名どころのAdBlock PlusもuBlock Originもtoo muchに思えたので、Firefoxの基本機能だけでドメイン指定のサイトブロックをできないか試してみました。

# ブロックすべきドメインの調査

`ツール > ウェブ開発 > インスペクター`からインスペクターを立ち上げ、広告ウィジットのiframe要素やscript要素の`src`に指定されているURLを探します。
先ほどの広告は、`http://xml.affiliate.rakuten.co.jp`からJavaScriptが配信されているようです。

# ドメインのブロック

[Native content blocking in Firefox without installing any extensions](https://www.ctrl.blog/entry/firefox-native-content-blocker) によると、Firefoxプロファイルに含まれる`permissions.sqlite`を直接編集すると、ドメインを指定してコンテンツの読み込みをブロックできるようです。

Firefoxのプロファイルは、`~/Library/Application\ Support/Firefox/Profiles/q4xjykpp.default`にあります。（`q4xjykpp`の部分は環境によって異なるかもしれません）
まずこのディレクトリに移動します。

```sh:プロファイルディレクトリに移動するコマンド
cd ~/Library/Application\ Support/Firefox/Profiles/*.default
```

パーミッションの設定は`permissions.sqlite`に記録されています。
このファイルはsqliteというデータベースなので、sqliteにアクセスするためのコマンドがあるかどうか確認します。

```sh:sqlite3コマンドがあるかどうか確認
sqlite3 --version
```

```shell-session:実行結果（例）
3.16.0 2016-11-04 19:09:39 0e5ffd9123d6d2d2b8f3701e8a73cc98a3a7ff5f
```

このようにバージョン番号が表示されればsqlite3コマンドは存在しています。

もし、`sqlite3: command not found`と言われてしまった場合は、次のようにしてインストールします。

```sh:sqlite3をインストールするコマンド
brew update
brew install sqlite3
```

続いて、現在設定されているパーミッションの設定を確認してみます。

```sh:moz_permsテーブルの内容を確認するコマンド
(echo ".headers on"; \
echo ".mode column"; \
echo ".width 4 40"; \
echo "select * from moz_perms;") | \
sqlite3 permissions.sqlite
```

```shell-session:実行結果（例）
id    origin                                    type         permission  expireType  expireTime  modificationTime
----  ----------------------------------------  -----------  ----------  ----------  ----------  ----------------
1     https://outlook.office.com                offline-app  1           0           0           1491799577598   
2     https://teams.microsoft.com               offline-app  1           0           0           1491811815188   
4     http://www.openstreetmap.org              geo          1           0           0           1497640565896   
7     https://wired.jp                          desktop-not  2           0           0           1512983172841
.
.
.
```

ここまで確認できたら、`sqlite3`コマンドで、`http://xml.affiliate.rakuten.co.jp`からのJavaScript読み込みを禁止する設定を追加してみます。

```sh:permissions.sqliteにエントリを追加するコマンド
echo "INSERT INTO 'moz_perms' (origin, type, permission) VALUES('http://xml.affiliate.rakuten.co.jp', 'script', '2');" | \
sqlite3 ./permissions.sqlite
```

追加ができたら、ちゃんと追加されているかどうか確認してみます。

```sh:moz_permsテーブルの内容を確認するコマンド
(echo ".headers on"; \
echo ".mode column"; \
echo ".width 4 40"; \
echo "select * from moz_perms;") | \
sqlite3 permissions.sqlite | \
grep rakuten
```

```shell-session:実行結果（例）
57    http://xml.affiliate.rakuten.co.jp        script       2                                                   
```

あとはFirefoxを再起動すれば、さきほどの広告が消えているはずです。