Firefoxで、検索プラグインを追加したり、追加した検索プラグインを編集したりする方法を纏めた。本記事の内容は、Quantumにも旧式環境にも対応している。
ウェブブラウザに於いて、検索プラグインとは、検索バーやアドレスバーから検索をする機能に組み込まれる検索エンジンごとのプログラムである。Firefoxを含め殆どのウェブブラウザで、OpenSearch仕様1に準拠している。
筆者の環境は、次の通り。
- OS: Windows 10
- ウェブブラウザ(1): Mozilla Firefox 55.0.3 64bit版
- ウェブブラウザ(2): Mozilla Firefox Developer Edition 60.0b4
- ウェブブラウザ(3): Waterfox 56.0.4.1
検索プラグインの追加
検索エンジンサイトから追加
追加したい検索エンジンのウェブサイトで検索プラグインが提供されていることが間々有る。その場合は、「Firefox で検索エンジンを追加または削除する | Firefox ヘルプ」の通りである。
因みにウェブサイト側は、"Creating OpenSearch plugins for Firefox | MDN"に示されているように設定している。
検索プラグインの配布サイトから追加
次のような、様々な検索エンジンのプラグインが配布されているウェブサイトから入手する。
特にMycroft Projectは、検索プラグインの配布に特化したサイトで、豊富に取り揃えられており、お薦めだ。
因みに、Firefoxのオプション ‐ 検索パネルに「検索エンジンを追加...」というリンクが有り、初期設定では前記のFirefox Add-ons 検索プラグインが開かれるようになっている。これは、リンク先をMycroft Projectの検索ページなどに変更することもできる。オプションパネルに無い高度な設定項目である
"browser.search.searchEnginesURL
"
の値を
"http://mycroftproject.com/search-engines.html
"
などとする2。
アドオンで検索フォームから追加
次のいずれかのアドオンを使用し、追加したい検索エンジンのウェブサイトに有る検索フォームから検索プラグインを自動で生成する。
- Add to Search Bar(旧式、マルチプロセス非対応)
- BurningMoth AddSearch
いずれのアドオンも検索フォームのコンテキストメニューから動作する。BurningMoth AddSearchはQuantumに対応しているが、外部のウェブサーバを経由して動作する3。Waterfoxなど旧式アドオンを使用できる環境であれば、Add to Search Barが良いだろう。
アドオンで検索プラグインを作成して追加
次のいずれかのアドオンを使用し、アドオンの設定パネルで検索プラグインを作成する。
- Search Engine Creator(旧式、マルチプロセス非対応)
- Search Engines Helper
但し、いずれののアドオンも、URL(Url
)・名前(ShortName
)・アイコン(Image
)(とSearch Engine Creatorはこれらに加えて説明(Description
))しか設定できず、厳密にはPOSTリクエストに対応していない4。又、Search Engine Creatorは非ラテン文字を正しく処理できない虞が有る。Search Engines HelperはQuantumに対応しているが、外部のウェブサーバを経由して動作する3。
検索プラグインを自作して追加
次の検索プラグインの編集節を参照されたい。
検索プラグインの編集
残念ながら、現状、検索プラグインの編集をGUIで行える方法は存在しないと思われる。検索プラグインのデータはプロファイルフォルダ直下のsearch.json.mozlz4
ファイルであり、JSONドキュメントがLZ4形式で圧縮されたものであるものの、ヘッダにFirefox独自のアルゴリズムが用いられている。これに対し何らかの方法で編集を行う。本節ではこれについて纏めているので、検索プラグインのデータのソースコードに於ける記述の方法に関しては"Creating OpenSearch plugins for Firefox | MDN"を参照されたい。
XMLドキュメントを編集
OpenSearch仕様に於いて検索プラグインはXMLドキュメントである。XMLドキュメントを編集し、これをsearch.json.mozlz4
に反映させることができる。
XMLファイルの取出し
先ず、編集する検索プラグインをXMLファイルとして取り出す。これには、次のアドオンを使用する。
又は、取分け旧式アドオンを使用できない環境では、スクラッチパッドでウェブブラウザを実行環境としてExport your search engines in only-WebExtensions Mozilla Firefox buildsスクリプト6を実行する7。現用の検索プラグインが全てエクスポートされる。
又、ビルトインの検索プラグインは、Firefoxのオプション ‐ 検索パネルで削除したものも含め、"resource:///chrome/browser/searchplugins/"8(Waterfoxでは"resource:///chrome/en-US/locale/browser/searchplugins/")から取り出せる。
XMLファイルの取込み
取り出したXMLファイルを編集した後、Firefoxに取り込む。これには、次のアドオンを使用する。
又は、取分け旧式アドオンを使用できない環境では、スクラッチパッドでウェブブラウザを実行環境としてImport search engines in only-WebExtensions Mozilla Firefox buildsスクリプト6を実行する7。
JSONドキュメントを編集
search.json.mozlz4
を解凍し、JSONドキュメントを編集し、MOZLZ4ファイルへ圧縮し、既存のsearch.json.mozlz4
と置き換える。これには、次のアドオンを使用する。
mozlz4-editは、MOZLZ4ファイルやJSONファイルをアドオンのエディタに開き、JSONドキュメントとして編集し、MOZLZ4ファイルやJSONファイルとして保存することができる。Firefox 58.0以上の環境を必要とするが、編集するMOZLZ4ファイルやJSONファイルは任意に指定できるので、斯かる環境を有してさえいれば、Firefox 58.0未満の環境のsearch.json.mozlz4
も編集できる。
又は、取分けFirefox 58.0未満の環境では、次に示した方法を用いる。
MOZLZ4ファイルを解凍
先ず、search.json.mozlz4
をJSONファイルへと解凍する。これには、次のいずれかのアドオンを使用する。
但し、mozlz4-editはFirefox 58.0以上、Search Engines Helperは同57.0以上の環境を必要とする。
又は、取分けFirefox 57.0未満の環境では、次のいずれかのプログラムやソフトウェアを使用する。
- "nightly search engine icon (2) - Dead Zone"に有る9JavaScriptスクリプトのdecompress関数 ブラウザコンソールで実行する7。
- Browser Console Snippet to decompress mozlz4 and jsonlz4 files ブラウザコンソールで実行する7JavaScriptスクリプト。
- Decompress mozlz4 in Firefox's browser console ブラウザコンソールで実行する7JavaScriptスクリプト。
- Decompress / compress mozlz4 files, with precompiled binaries for Windows and Linux Windows64bit又はLinuxで動作するソフトウェア。
- Library to operate Mozilla Firefox's compressed files (jsonlz4 etc.) コマンドライン経由やライブラリとして動作するJavaScriptスクリプト。
- Compressing/uncompressing mozlz4 files Pythonスクリプト。
- Decompressor/Compressor for Mozilla's MozLz4 file format used for Firefox bookmark backups and search plugins. Pythonスクリプト。
- MozLz4a compression/decompression utility Pythonスクリプト。
- MozLZ4 compressor/decompressor Cプログラム。
- Decompress Mozilla Firefox bookmarks backup files Windowsで動作するソフトウェア。
- mnordhoff/unmozlz4.py Pythonスクリプト。
- C decompress tool for mozilla lz4json format Cプログラム。
MOZLZ4ファイルへ圧縮
解凍されたJSONファイルを編集した後、MOZLZ4ファイルへ圧縮する。これには、次のアドオンを使用する。
但し、mozlz4-editはFirefox 58.0以上の環境を必要とする。
又は、取分けFirefox 58.0未満の環境では、次のいずれかのスクリプトやソフトウェアを使用する。
- "How do you decompress search.json.mozlz4? • mozillaZine Forums"に有る10JavaScriptスクリプトのcompress関数 ブラウザコンソールで実行する7。
- Decompress / compress mozlz4 files, with precompiled binaries for Windows and Linux Windows64bit又はLinuxで動作するソフトウェア。
- Library to operate Mozilla Firefox's compressed files (jsonlz4 etc.) コマンドライン経由やライブラリとして動作するJavaScriptスクリプト。
- Compressing/uncompressing mozlz4 files Pythonスクリプト。
- Decompressor/Compressor for Mozilla's MozLz4 file format used for Firefox bookmark backups and search plugins. Pythonスクリプト。
- MozLz4a compression/decompression utility Pythonスクリプト。
- MozLZ4 compressor/decompressor Cプログラム。
ビルトインの検索プラグインの編集
ユーザが追加する検索プラグインをビルトインのものと同じ名前(ShortName
)にすることはできない。これは、ビルトインの検索プラグインがオプション ‐ 検索パネルで削除されている場合も例外でない。然しながら、ビルトインの検索プラグインに満足いかないことも有るものだ。例えば、日本語版ロケールにビルトインされている"Twitter"検索プラグインは「話題のツイート」を対象に検索をするが、筆者は「すべてのツイート」を対象にしたい。「Twitter 全てのツイート」とか「ツイッター」というようにビルトインの検索プラグインと異なる名前にすれば追加できるが、純粋に"Twitter"としたいのだ。
プロファイルの検索プラグインのデータを編集
ビルトインのものと同じ名前の検索プラグインを追加することはできないので、ビルトインの検索プラグインのデータに対し何らかの方法で編集を行う。即ち、JSONドキュメントを編集節の方法を用い、search.json.mozlz4
に含まれるビルトインの検索プラグインのデータを編集する。然し、Firefoxが更新されると、search.json.mozlz4
に含まれるビルトインの検索プラグインのデータも更新される11ので、この編集は無に帰してしまう。そこで、編集したsearch.json.mozlz4
のバックアップを保存しておき、Firefoxが更新された際には、バックアップのsearch.json.mozlz4
に含まれるbuildID
・appVersion
各オブジェクトの値を現在のものに書き換え12、現在のsearch.json.mozlz4
と置き換える。
インストールフォルダの検索プラグインのデータを編集
ビルトインの検索プラグインの大元のデータは、インストールフォルダの\browser
ディレクトリのomni.ja
ファイルに格納された13XMLファイルである。ビルトインの検索プラグインのXMLドキュメントを編集し、omni.ja
ファイルへ格納することで、ビルトインの検索プラグインの大元のデータを編集することができる。然し、omni.ja
も亦、Firefoxが更新されると上書きされるので、その都度作業を繰り返さなければならない。omni.ja
の編集はsearch.json.mozlz4
よりも面倒なので、通常は前のプロファイルの検索プラグインのデータを編集節の方法の方が良いだろう。14
検索プラグインの名前の末尾に空白を加える
苦肉の策だが、検索プラグインの編集節の方法を用い、ビルトインの検索プラグインの名前の末尾に空白を加えた名前で検索プラグインを新たに作成する。この方法であれば、Firefoxが更新される度に作業を繰り返す必要は無い。実際上、見た目に大きな差異は無いので、然程違和感無く使用できると思われる。15
検索プラグインの仕様に関して
検索プラグインのデータの在り方は仕様変更が重ねられてきており、概してユーザが編集を行いにくいように変化してきている。
- Firefox 40: ビルトインの検索プラグインのデータは、それまでインストールフォルダの
\browser\searchplugins
ディレクトリにXMLファイルとして存在したが、\browser
ディレクトリのomni.ja
ファイルに格納されるようになった(Bug 1162569)。ビルトインの検索プラグインがユーザの追加に依るものと同じ名前の場合、前者が優先するようになった(Bug 1109354)。 - Firefox 45: ユーザが追加した検索プラグインのデータは、それまでプロファイルの
\searchplugins
ディレクトリにXMLファイルとして存在したが、プロファイルフォルダ直下のsearch.json.mozlz4
ファイルに格納されるようになった(Bug 1203167)。 - Firefox 57.0.1: プロファイルフォルダ直下の
search.json.mozlz4
ファイルが削除されるとFirefoxが次に起動した時に再生成されるところ、それまではその際同じプロファイルの\searchplugins
ディレクトリにOpenSearch仕様のXMLファイルが有れば取り込まれたが、そうされなくなった(Bug 1405670)。
これらの仕様変更は、勝手に検索プラグインが追加されたり現用の検索プラグインに対し内容の変更や削除が為されたりといった検索ハイジャックを防止するセキュリティ対策を理由とする。尤も、Mozillaは検索プラグインをビルトインすることでその検索プロバイダから利益を得ている16ので、出来るだけビルトインの検索プラグインが使用されるようユーザを誘導する意図が有るのではないかとも囁かれる。それは附随的ないし結果的なものに過ぎないかもしれないが、そのような効果が有るのは確かであろう。そして、こうした対策に依り検索ハイジャックを完全に防止できるわけではないのも亦事実である。そもそも、検索ハイジャックが為されるような汚染された環境こそが問題なのであって、そこでは別のもっと深刻な事態が生じている虞だって有る――泥棒が入り、家財がごっそりやられたが、夫の僅かなへそくりだけは引出しの奥に仕舞い込んであって偶々無事だった、からといってどれだけの意義が有ろうか。「開かれた、誰にでもアクセス可能な」インターネットをミッションに掲げる17Mozillaが、カスタマイズの自由を損なってまですべきことなのか、疑念は拭えない。プロジェクトの運営には金が掛かるから、大義の実現のために多少の犠牲はやむをえないのかもしれないけれど…。
改善の要求
Bugzillaに提起されている検索に関してのバグの内目ぼしいものを挙げておく。
- [Bug 261124](https://bugzilla.mozilla.org/show_bug.cgi?id=261124 "261124 - Textbox context menu should have "Add to Search Bar..."")「テキストボックスコンテキストメニューに「検索バーへ追加」が有るべき」
- Bug 335102「検索エンジンの名前の変更を可能に(検索プラグインの名前の変更をサポート)」
- Bug 353056「既定の(出荷された)検索プラグイン(エンジン)18を上書きできない」
- Bug 1209390「非標準のjsonlz4・mozlz4でなく標準のlz4ファイル形式を用いよ」
- Bug 1428948「検索エンジンポリシー:追加・削除・既定の設定・ブロック Web API」
- Bug 1352598「インストールされた検索エンジンを一覧するためのAPIを追加せよ」
- Bug 1213660「よく似た検索プラグインを見分けられない」19
- Bug 1223454「ユーザに検索エンジンのグループ分けをさせてくれ」
補足
2018/09/05追記
筆者の環境は次の通り。
- OS: Windows 10
- ウェブブラウザ(1): Mozilla Firefox 61.0.2 64bit版
- ウェブブラウザ(3): Waterfox 56.2.2
XMLドキュメントを編集する方法で検索プラグインの編集を行う場合、Url
要素のtemplate
属性の値には&
記号を含められないようである。そうでないと、「不正なフォーマット」というタイトルの「検索エンジンを次の場所からインストールできませんでした」というエラーメッセージが表示されてしまい、XMLファイルを取り込むことができない。従って、リクエストパラメータは、単数の場合を除き、Param
要素に依り指定する必要が有る。
以前は問題なかったような気がするが、定かでない。Url
要素のtemplate
属性の値に&
記号を含む検索エンジンを提供しているウェブサイトも見受けられる20。尚、XMLドキュメントを編集する方法で検索プラグインの編集を行う場合以外については、十分確認できておらず分からない。
2022/12/29追記
Mozilla Firefox 108.0.1に更新したところ、一部の検索エンジンが削除されてしまった。search.json.mozlz4
ファイルのバックアップを確認したところ、同ファイルにおいて_extensionID
キーの値が"false"
と記述されている検索エンジンが複数あり、これらが1つを除き削除されてしまったようであった。そこで、これらの検索エンジンの_extensionID
キーの値をnull
と書き換えたsearch.json.mozlz4
ファイルを作成し、Mozilla Firefoxを一度終了後にプロファイル内のsearch.json.mozlz4
ファイルをこれに置き換えることで、Mozilla Firefoxを改めて起動後、全ての検索エンジンが削除されることなく表示されていることを確認できた。
Mozilla Firefox 108.0.1では「他の場所からコピーしてきたプロファイルを利用していると、アップグレード時に既定の検索エンジンがリセットされる問題」の修正がされており、search.json.mozlz4
ファイルにおいて各検索エンジンに自動的にIDが割り振られる(id
キーとその値が生成される)ようになったようであるが、同ファイル内にid
キーを持たない検索エンジンが記述されている場合において、_extensionID
キーの値が"false"
と記述されているとき(恐らくは"false"
に限らずnull
以外の値が記述されているときも同様だろう)は、id
キーに_extensionID
キーの値を含む値が設定されるようになっているようで、この結果、複数の検索エンジンでIDの重複が生ずることとなったことにより、その内1つを除き他は削除されてしまったのだと見受けられる。
なお、現時点において、本記事の内容には既に通用しない古い情報が含まれたままとなっていることを念のため付言しておく。
参考文献・情報源
検索プラグインの編集
- How to add custom search engines? : firefox
- Where are search plugins saved now in Firefox 57? : firefox
- How do I edit search engines predefined URLs? : firefox
- How to modify installed search plugin. • mozillaZine Forums
- nightly search engine icon - Dead Zone
XMLドキュメントを編集
- JavaScript コードモジュール - Mozilla | MDN
- Services.jsm - Mozilla | MDN
- nsIBrowserSearchService - Mozilla | MDN
JSONドキュメントを編集
- Reading an LZ4 compressed text file (mozlz4) in WebExtensions (JavaScript, Firefox) - Stack Overflow
- Comment lire le fichier search.json.mozlz4 (~/.mozilla) - LinuxFr.org
検索プラグインの仕様に関して
- What about search hijacking? - Florian Quèze 一連の仕様変更に深く携わっているFirefoxの開発者Florian Quèze氏によるブログ記事
脚注
-
初期設定値は"
https://addons.mozilla.org/%LOCALE%/firefox/search-engines/
"である。この設定の詳細は、"Browser.search.searchEnginesURL - MozillaZine Knowledge Base"を参照されたい。 ↩ -
外部のウェブサーバを経由して動作するのであっても実際上は然程問題無いと思われるが、技術的なプログラム処理のためだけにそのようにする設計思想には賛同できない。同旨の見解に、Firefoxアドオンの開発者として著名なPiroこと結城洋志氏の[ツイート](https://twitter.com/piro_or/status/942275953316655104 "Piro/Linuxコマンド操作解説漫画連載中さんのツイート: "僕はこういう種類のアドオンはWebサービス無しでスタンドアロンで動くべきと思ってるので、それができないと分かった時点で早々に諦めたんだけど、そう思わないのであれば(サーバーの支援を受ける前提であれば)できる事の幅はいくらでも広がるという例だと思った。"")。勿論、これはWebExtensions APIの制限に起因するのであって、こうした設計思想を採ったアドオンの作者に非は無い。 ↩ ↩2
-
POSTリクエストで動作する検索エンジンであっても、リクエストパラメータがURLへの付加でしか設定できない。それでも一応動作するので、実際上は然程問題無いと思われるが。 ↩
-
作者に拠れば、
- WebExtensionsへの移行は同APIが対応しておらず不可能である。
- もしWebExtensions APIがOpenSearch仕様のXMLドキュメントのエクスポートかインポートのいずれかの機能に対応するようになれば、WebExtensionsに準拠する更新の作業を行う。
- WaterfoxやPale Moonのための移行は行わない。
-
XML Search Engines Exporter/Importerアドオンの作者nohamelin氏による作である。 ↩ ↩2
-
Firefoxの開発ツール ‐ オプションペインで「ブラウザーとアドオンのデバッガーを有効化」項目を有効と設定する必要が有る。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
本記事初版時点では、
chrome/ja/locale/browser/searchplugins/
であった。
(2018/09/08更新。筆者の環境は次の通り。- OS: Windows 10
- ウェブブラウザ(1): Mozilla Firefox 62.0 64bit版
-
"How do you decompress search.json.mozlz4? • mozillaZine Forums"も同様である。 ↩
-
オプション ‐ 詳細パネル ‐ 更新タブの「次のソフトウェアを自動的に更新する ‐ 検索エンジン」項目を無効と設定しても、ビルトインの検索プラグインは自動的に更新される。Bug 1436741(「検索エンジンを更新する設定が無効だったのにFirefoxが新しい検索エンジンをインストールした」)、[Bug 1444426](https://bugzilla.mozilla.org/show_bug.cgi?id=1444426 "1444426 - Remove or hide "Automatically update search engines"")(「「検索エンジンを自動で更新する」を除去又は非表示化せよ」)を参照。 ↩
-
FirefoxのビルドIDとバージョンであり、トラブルシューティング情報パネルで確認できる。 ↩
-
omni.ja
ファイルを解凍すると、その中のchrome/browser/searchplugins/
8(Waterfoxではchrome/en-US/locale/browser/searchplugins/
)ディレクトリに存在する。 ↩ -
omni.ja
に関しての詳細は、「omni.ja (かつてのomni.jar)について | MDN」、"How to correctly (re)pack omni.ja in Firefox? - Stack Overflow"などを参照されたい。 ↩ -
Bug 1154835(「空白は検索エンジン名から取り除かれるべき」)やBug 1226613(「出荷するプラグイン18の名前に酷似した名前の付いた検索プラグインはインストールさせないべき」)がもし実現されれば、こうした方法は用いられなくなる。これに対する、「必ずしも全てのユーザが、既定の検索プラグイン18で扱われるサービスにMozillaの検索プラグインを使用するよう強いられたいわけではないだろうことを、思い起こしてください。上述された使い方の一部は、Bug 353056のような問題への対処であるかもしれません。」とのコメント(Stefan Plewako氏)は、重要な指摘であるように思われる。 ↩
-
"Mozilla Fdn 2016 Final FS - Short Form 9-28 - 2016_Mozilla_Audited_Financial_Statement.pdf"、"Mozilla Foundation Documents"を参照。 ↩
-
更に、マニフェストに「人は誰でも、インターネットとインターネット上での自らの体験を自分自身で形成する力を有するべき」と掲げ、ウェブサイトのトップページで「利益ではなく、人々のためのインターネット」と謳う。 ↩
-
この問題は、Firefox Search Bar Show Engine Names (Firefox 43+)ユーザスタイルを使用することで、一先ず解決できる。 ↩
-
例えば、検索サイトのStartPage(https://www.startpage.com/nih/opensearch.xml)。 ↩