Firefoxで検索プラグインを追加・編集する方法

Firefoxで、検索プラグインを追加したり、追加した検索プラグインを編集したりする方法を纏めた。本記事の内容は、Quantumにも旧式環境にも対応している。

ウェブブラウザに於いて、検索プラグインとは、検索バーやアドレスバーから検索をする機能に組み込まれる検索エンジンごとのプログラムである。Firefoxを含め殆どのウェブブラウザで、[OpenSearch](http://www.opensearch.org/Home "Home - 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 ヘルプ](https://support.mozilla.org/ja/kb/add-or-remove-search-engine-firefox#w_cuicaechaichaclloaaoao)」の通りである。

因みにウェブサイト側は、"[Creating OpenSearch plugins for Firefox | MDN](https://developer.mozilla.org/ja/docs/Creating_OpenSearch_plugins_for_Firefox#.E6.A4.9C.E7.B4.A2.E3.83.97.E3.83.A9.E3.82.B0.E3.82.A4.E3.83.B3.E3.81.AE.E8.A8.B3.E8.AA.9E.E8.87.AA.E5.8B.95.E6.A4.9C.E5.87.BAAutodiscovery)"に示されているように設定している。

## 検索プラグインの配布サイトから追加
次のような、様々な検索エンジンのプラグインが配布されているウェブサイトから入手する。

+ [Firefox Add-ons　検索プラグイン](https://addons.mozilla.org/ja/firefox/search/?type=search "検索結果 – Firefox 向けアドオン")
+ [Mycroft Project](http://mycroftproject.com/)

特にMycroft Projectは、検索プラグインの配布に特化したサイトで、豊富に取り揃えられており、お薦めだ。

因みに、Firefoxの[オプション　‐　検索パネル](about:preferences#search "about:preferences#search")に「検索エンジンを追加...」というリンクが有り、初期設定では前記の[Firefox Add-ons　検索プラグイン](https://addons.mozilla.org/ja/firefox/search/?type=search "検索結果 – Firefox 向けアドオン")が開かれるようになっている。これは、リンク先を[Mycroft Projectの検索ページ](http://mycroftproject.com/search-engines.html "Mycroft Project: Search Engine Plugins - Firefox IE Chrome")などに変更することもできる。オプションパネルに無い高度な設定項目である
"`browser.search.searchEnginesURL`"
の値を
"`http://mycroftproject.com/search-engines.html`"
などとする[^2]。

## アドオンで検索フォームから追加
次のいずれかのアドオンを使用し、追加したい検索エンジンのウェブサイトに有る検索フォームから検索プラグインを自動で生成する。

+ [Add to Search Bar](https://addons.mozilla.org/ja/firefox/addon/add-to-search-bar/ "Add to Search Bar – Firefox 向けアドオン")（旧式、マルチプロセス非対応）
+ [BurningMoth AddSearch](https://addons.mozilla.org/ja/firefox/addon/burning-moth-add-search/ "BurningMoth AddSearch – Firefox 向けアドオン")

いずれのアドオンも検索フォームのコンテキストメニューから動作する。BurningMoth AddSearchはQuantumに対応しているが、外部のウェブサーバを経由して動作する[^3]。Waterfoxなど旧式アドオンを使用できる環境であれば、Add to Search Barが良いだろう。

## アドオンで検索プラグインを作成して追加
次のいずれかのアドオンを使用し、アドオンの設定パネルで検索プラグインを作成する。

+ [Search Engine Creator](https://addons.mozilla.org/ja/firefox/addon/search-engine-creator/ "Search Engine Creator – Firefox 向けアドオン")（旧式、マルチプロセス非対応）
+ [Search Engines Helper](https://addons.mozilla.org/ja/firefox/addon/search-engines-helper/ "Search Engines Helper – Firefox 向けアドオン")

但し、いずれののアドオンも、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](https://developer.mozilla.org/ja/docs/Creating_OpenSearch_plugins_for_Firefox#OpenSearch_.E8.A8.98.E8.BF.B0.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB])"を参照されたい。

## XMLドキュメントを編集
OpenSearch仕様に於いて検索プラグインはXMLドキュメントである。XMLドキュメントを編集し、これを`search.json.mozlz4`に反映させることができる。

### XMLファイルの取出し
先ず、編集する検索プラグインをXMLファイルとして取り出す。これには、次のアドオンを使用する。

+ [XML Search Engines Exporter/Importer](https://addons.mozilla.org/ja/firefox/addon/search-engines-export-import/ "XML Search Engines Exporter/Importer – Firefox 向けアドオン")（旧式）[^5]

又は、取分け旧式アドオンを使用できない環境では、スクラッチパッドでウェブブラウザを実行環境として[Export your search engines in only-WebExtensions Mozilla Firefox builds](https://gist.github.com/nohamelin/6af8907ca2dd90a9c870629c396c9521 "Export your search engines in only-WebExtensions Mozilla Firefox builds · GitHub")スクリプト[^6]を実行する[^7]。現用の検索プラグインが全てエクスポートされる。

又、ビルトインの検索プラグインは、Firefoxの[オプション　‐　検索パネル](about:preferences#search "about:preferences#search")で削除したものも含め、"[resource:///chrome/browser/searchplugins/](resource:///chrome/browser/searchplugins/ "resource:///chrome/browser/searchplugins/ の一覧")"[^8]（Waterfoxでは"[resource:///chrome/en-US/locale/browser/searchplugins/](resource:///chrome/en-US/locale/browser/searchplugins/ "resource:///chrome/en-US/locale/browser/searchplugins/ の一覧")")から取り出せる。

### XMLファイルの取込み
取り出したXMLファイルを編集した後、Firefoxに取り込む。これには、次のアドオンを使用する。

+ [XML Search Engines Exporter/Importer](https://addons.mozilla.org/ja/firefox/addon/search-engines-export-import/ "XML Search Engines Exporter/Importer – Firefox 向けアドオン")（旧式）[^5]

又は、取分け旧式アドオンを使用できない環境では、スクラッチパッドでウェブブラウザを実行環境として[Import search engines in only-WebExtensions Mozilla Firefox builds](https://gist.github.com/nohamelin/8e2e1b50dc7d97044992ae981487c6ec "Import search engines in only-WebExtensions Mozilla Firefox builds · GitHub")スクリプト[^6]を実行する[^7]。

## JSONドキュメントを編集
`search.json.mozlz4`を解凍し、JSONドキュメントを編集し、MOZLZ4ファイルへ圧縮し、既存の`search.json.mozlz4`と置き換える。これには、次のアドオンを使用する。

+ [mozlz4-edit](https://addons.mozilla.org/ja/firefox/addon/mozlz4-edit/ "mozlz4-edit – Firefox 向けアドオン")

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](https://addons.mozilla.org/ja/firefox/addon/mozlz4-edit/ "mozlz4-edit – Firefox 向けアドオン")
+ [Search Engines Helper](https://addons.mozilla.org/ja/firefox/addon/search-engines-helper/ "Search Engines Helper – Firefox 向けアドオン")

但し、mozlz4-editはFirefox 58.0以上、Search Engines Helperは同57.0以上の環境を必要とする。

又は、取分けFirefox 57.0未満の環境では、次のいずれかのプログラムやソフトウェアを使用する。

+ "[nightly search engine icon (2) - Dead Zone](https://blog.goo.ne.jp/atlanto/e/c4a1515ed3d574ede4a55e6bed247ffc)"に有る[^9]JavaScriptスクリプトのdecompress関数　ブラウザコンソールで実行する[^7]。
+ [Browser Console Snippet to decompress mozlz4 and jsonlz4 files](https://gist.github.com/jscher2000/4403507e33df0918289619edb83f8193 "Browser Console Snippet to decompress mozlz4 and jsonlz4 files · GitHub")　ブラウザコンソールで実行する[^7]JavaScriptスクリプト。
+ [Decompress mozlz4 in Firefox's browser console](https://gist.github.com/KwanEsq/c5f6a460da51524ee83dba0a9b15093c "Decompress mozlz4 in Firefox's browser console · GitHub")　ブラウザコンソールで実行する[^7]JavaScriptスクリプト。
+ [Decompress / compress mozlz4 files, with precompiled binaries for Windows and Linux](https://github.com/jusw85/mozlz4 "GitHub - jusw85/mozlz4: Decompress / compress mozlz4 files, with precompiled binaries for Windows and Linux")　Windows64bit又はLinuxで動作するソフトウェア。
+ [Library to operate Mozilla Firefox's compressed files (jsonlz4 etc.)](https://github.com/piroor/node-mozlz4a "GitHub - piroor/node-mozlz4a: Library to operate Mozilla Firefox's compressed files (jsonlz4 etc.)")　コマンドライン経由やライブラリとして動作するJavaScriptスクリプト。
+ [Compressing/uncompressing mozlz4 files](https://github.com/juandiazq/mozlz4 "GitHub - juandiazq/mozlz4: Compressing/uncompressing mozlz4 files")　Pythonスクリプト。
+ [Decompressor/Compressor for Mozilla's MozLz4 file format used for Firefox bookmark backups and search plugins.](https://github.com/ebassett/mozlz4 "GitHub - ebassett/mozlz4: Decompressor/Compressor for Mozilla's MozLz4 file format used for Firefox bookmark backups and search plugins.")　Pythonスクリプト。
+ [MozLz4a compression/decompression utility](https://gist.github.com/Tblue/62ff47bef7f894e92ed5 "MozLz4a compression/decompression utility · GitHub")　Pythonスクリプト。
+ [MozLZ4 compressor/decompressor](https://github.com/pjanouch/mozlz4 "GitHub - pjanouch/mozlz4: MozLZ4 compressor/decompressor")　Cプログラム。
+ [Decompress Mozilla Firefox bookmarks backup files](https://github.com/avih/dejsonlz4 "GitHub - avih/dejsonlz4: Decompress Mozilla Firefox bookmarks backup files")　Windowsで動作するソフトウェア。
+ [mnordhoff/unmozlz4.py](https://gist.github.com/mnordhoff/25e42a0d29e5c12785d0 "unmozlz4.py · GitHub")　Pythonスクリプト。
+ [C decompress tool for mozilla lz4json format](https://github.com/andikleen/lz4json "GitHub - andikleen/lz4json: C decompress tool for mozilla lz4json format")　Cプログラム。

### MOZLZ4ファイルへ圧縮
解凍されたJSONファイルを編集した後、MOZLZ4ファイルへ圧縮する。これには、次のアドオンを使用する。

+ [mozlz4-edit](https://addons.mozilla.org/ja/firefox/addon/mozlz4-edit/ "mozlz4-edit – Firefox 向けアドオン")

但し、mozlz4-editはFirefox 58.0以上の環境を必要とする。

又は、取分けFirefox 58.0未満の環境では、次のいずれかのスクリプトやソフトウェアを使用する。

+ "[How do you decompress search.json.mozlz4? • mozillaZine Forums](http://forums.mozillazine.org/viewtopic.php?p=14708933#p14708933)"に有る[^10]JavaScriptスクリプトのcompress関数　ブラウザコンソールで実行する[^7]。
+ [Decompress / compress mozlz4 files, with precompiled binaries for Windows and Linux](https://github.com/jusw85/mozlz4 "GitHub - jusw85/mozlz4: Decompress / compress mozlz4 files, with precompiled binaries for Windows and Linux")　Windows64bit又はLinuxで動作するソフトウェア。
+ [Library to operate Mozilla Firefox's compressed files (jsonlz4 etc.)](https://github.com/piroor/node-mozlz4a "GitHub - piroor/node-mozlz4a: Library to operate Mozilla Firefox's compressed files (jsonlz4 etc.)")　コマンドライン経由やライブラリとして動作するJavaScriptスクリプト。
+ [Compressing/uncompressing mozlz4 files](https://github.com/juandiazq/mozlz4 "GitHub - juandiazq/mozlz4: Compressing/uncompressing mozlz4 files")　Pythonスクリプト。
+ [Decompressor/Compressor for Mozilla's MozLz4 file format used for Firefox bookmark backups and search plugins.](https://github.com/ebassett/mozlz4 "GitHub - ebassett/mozlz4: Decompressor/Compressor for Mozilla's MozLz4 file format used for Firefox bookmark backups and search plugins.")　Pythonスクリプト。
+ [MozLz4a compression/decompression utility](https://gist.github.com/Tblue/62ff47bef7f894e92ed5 "MozLz4a compression/decompression utility · GitHub")　Pythonスクリプト。
+ [MozLZ4 compressor/decompressor](https://github.com/pjanouch/mozlz4 "GitHub - pjanouch/mozlz4: MozLZ4 compressor/decompressor")　Cプログラム。

# ビルトインの検索プラグインの編集
ユーザが追加する検索プラグインをビルトインのものと同じ名前(`ShortName`)にすることはできない。これは、ビルトインの検索プラグインが[オプション　‐　検索パネル](about:preferences#search "about:preferences#search")で削除されている場合も例外でない。然しながら、ビルトインの検索プラグインに満足いかないことも有るものだ。例えば、日本語版ロケールにビルトインされている"Twitter"検索プラグインは「話題のツイート」を対象に検索をするが、筆者は「すべてのツイート」を対象にしたい。「Twitter　全てのツイート」とか「ツイッター」というようにビルトインの検索プラグインと異なる名前にすれば追加できるが、純粋に"Twitter"としたいのだ。

## プロファイルの検索プラグインのデータを編集
ビルトインのものと同じ名前の検索プラグインを追加することはできないので、ビルトインの検索プラグインのデータに対し何らかの方法で編集を行う。即ち、[JSONドキュメントを編集](#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`ファイルに格納された[^13]XMLファイルである。ビルトインの検索プラグインのXMLドキュメントを編集し、`omni.ja`ファイルへ格納することで、ビルトインの検索プラグインの大元のデータを編集することができる。然し、`omni.ja`も亦、Firefoxが更新されると上書きされるので、その都度作業を繰り返さなければならない。`omni.ja`の編集は`search.json.mozlz4`よりも面倒なので、通常は前の[プロファイルの検索プラグインのデータを編集](#プロファイルの検索プラグインのデータを編集)節の方法の方が良いだろう。[^14]

## 検索プラグインの名前の末尾に空白を加える
苦肉の策だが、[検索プラグインの編集](#検索プラグインの編集)節の方法を用い、ビルトインの検索プラグインの名前の末尾に空白を加えた名前で検索プラグインを新たに作成する。この方法であれば、Firefoxが更新される度に作業を繰り返す必要は無い。実際上、見た目に大きな差異は無いので、然程違和感無く使用できると思われる。[^15]

# 検索プラグインの仕様に関して
検索プラグインのデータの在り方は仕様変更が重ねられてきており、概してユーザが編集を行いにくいように変化してきている。

+ Firefox 40: ビルトインの検索プラグインのデータは、それまでインストールフォルダの`\browser\searchplugins`ディレクトリにXMLファイルとして存在したが、`\browser`ディレクトリの`omni.ja`ファイルに格納されるようになった([Bug 1162569](https://bugzilla.mozilla.org/show_bug.cgi?id=1162569 "1162569 - default engine files should be in the omni.ja file"))。ビルトインの検索プラグインがユーザの追加に依るものと同じ名前の場合、前者が優先するようになった([Bug 1109354](https://bugzilla.mozilla.org/show_bug.cgi?id=1109354 "1109354 - prefer Firefox default engines over profile-installed plugins with the same name"))。
+ Firefox 45: ユーザが追加した検索プラグインのデータは、それまでプロファイルの`\searchplugins`ディレクトリにXMLファイルとして存在したが、プロファイルフォルダ直下の`search.json.mozlz4`ファイルに格納されるようになった([Bug 1203167](https://bugzilla.mozilla.org/show_bug.cgi?id=1203167 "1203167 - Store user-installed search plugins in a JSON file and stop loading [profile]/searchplugins/*.xml"))。
+ Firefox 57.0.1: プロファイルフォルダ直下の`search.json.mozlz4`ファイルが削除されるとFirefoxが次に起動した時に再生成されるところ、それまではその際同じプロファイルの`\searchplugins`ディレクトリにOpenSearch仕様のXMLファイルが有れば取り込まれたが、そうされなくなった([Bug 1405670](https://bugzilla.mozilla.org/show_bug.cgi?id=1405670 "1405670 - Stop importing old search settings from search-metadata.json"))。

これらの仕様変更は、勝手に検索プラグインが追加されたり現用の検索プラグインに対し内容の変更や削除が為されたりといった検索ハイジャックを防止するセキュリティ対策を理由とする。尤も、Mozillaは検索プラグインをビルトインすることでその検索プロバイダから利益を得ている[^16]ので、出来るだけビルトインの検索プラグインが使用されるようユーザを誘導する意図が有るのではないかとも囁かれる。それは附随的ないし結果的なものに過ぎないかもしれないが、そのような効果が有るのは確かであろう。そして、こうした対策に依り検索ハイジャックを完全に防止できるわけではないのも亦事実である。そもそも、検索ハイジャックが為されるような汚染された環境こそが問題なのであって、そこでは別のもっと深刻な事態が生じている虞だって有る――泥棒が入り、家財がごっそりやられたが、夫の僅かなへそくりだけは引出しの奥に仕舞い込んであって偶々無事だった、からといってどれだけの意義が有ろうか。「開かれた、誰にでもアクセス可能な」インターネットを[ミッション](https://www.mozilla.org/ja/mission/ "私たちは、より良いインターネットを築き上げています — Mozilla")に掲げる[^17]Mozillaが、カスタマイズの自由を損なってまですべきことなのか、疑念は拭えない。プロジェクトの運営には金が掛かるから、大義の実現のために多少の犠牲はやむをえないのかもしれないけれど…。

## 改善の要求
Bugzillaに提起されている[検索に関してのバグ](https://bugzilla.mozilla.org/buglist.cgi?resolution=---&query_format=advanced&component=Search&product=Firefox "Bug List")の内目ぼしいものを挙げておく。

+ [Bug 261124](https://bugzilla.mozilla.org/show_bug.cgi?id=261124 "261124 - Textbox context menu should have "Add to Search Bar..."")「テキストボックスコンテキストメニューに「検索バーへ追加」が有るべき」
+ [Bug 335102](https://bugzilla.mozilla.org/show_bug.cgi?id=335102 "335102 - make it possible to rename search engine (support search plugin renaming)")「検索エンジンの名前の変更を可能に（検索プラグインの名前の変更をサポート）」
+ [Bug 353056](https://bugzilla.mozilla.org/show_bug.cgi?id=353056 "353056 - can't overwrite default/shipped search plugins/engines")「既定の（出荷された）検索プラグイン（エンジン）[^18]を上書きできない」
+ [Bug 1209390](https://bugzilla.mozilla.org/show_bug.cgi?id=1209390 "1209390 - Use standard lz4 file format instead of the non-standard jsonlz4/mozlz4")「非標準のjsonlz4・mozlz4でなく標準のlz4ファイル形式を用いよ」

&#13;&#10;

+ [Bug 1428948](https://bugzilla.mozilla.org/show_bug.cgi?id=1428948 "1428948 - Search engine policies: add / remove / set default / block web API")「検索エンジンポリシー：追加・削除・既定の設定・ブロック　Web API」
+ [Bug 1352598](https://bugzilla.mozilla.org/show_bug.cgi?id=1352598 "1352598 - Add an API to list installed search engines")「インストールされた検索エンジンを一覧するためのAPIを追加せよ」

&#13;&#10;

+ [Bug 1213660](https://bugzilla.mozilla.org/show_bug.cgi?id=1213660 "1213660 - Can't distinguish similar search plugins")「よく似た検索プラグインを見分けられない」[^19]
+ [Bug 1223454](https://bugzilla.mozilla.org/show_bug.cgi?id=1223454 "1223454 - Let users group search engines")「ユーザに検索エンジンのグループ分けをさせてくれ」

# 補足
## 2018/09/05追記
筆者の環境は次の通り。

+ OS: Windows 10
+ ウェブブラウザ(1): Mozilla Firefox 61.0.2 64bit版
+ ウェブブラウザ(3): Waterfox 56.2.2

[XMLドキュメントを編集](#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](https://www.reddit.com/r/firefox/comments/7fr039/how_to_add_custom_search_engines/)
+ [Where are search plugins saved now in Firefox 57? : firefox](https://www.reddit.com/r/firefox/comments/7cpatg/where_are_search_plugins_saved_now_in_firefox_57/)
+ [How do I edit search engines predefined URLs? : firefox](https://www.reddit.com/r/firefox/comments/5pwvke/how_do_i_edit_search_engines_predefined_urls/)
+ [How to modify installed search plugin. • mozillaZine Forums](http://forums.mozillazine.org/viewtopic.php?f=23&t=3003263)
+ [nightly search engine icon - Dead Zone](https://blog.goo.ne.jp/atlanto/e/96e61d9070978b6abed0d4b67f7543f4)

### XMLドキュメントを編集
+ [JavaScript コードモジュール - Mozilla | MDN](https://developer.mozilla.org/ja/docs/Mozilla/JavaScript_code_modules)
+ [Services.jsm - Mozilla | MDN](https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Services.jsm)
+ [nsIBrowserSearchService - Mozilla | MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIBrowserSearchService)

### JSONドキュメントを編集
+ [Reading an LZ4 compressed text file (mozlz4) in WebExtensions (JavaScript, Firefox) - Stack Overflow](https://stackoverflow.com/questions/46130021/reading-an-lz4-compressed-text-file-mozlz4-in-webextensions-javascript-firef)
+ [Comment lire le fichier search.json.mozlz4 (~/.mozilla) - LinuxFr.org](https://linuxfr.org/forums/linux-slackware/posts/comment-lire-le-fichier-search-json-mozlz4-mozilla)

## 検索プラグインの仕様に関して
+ [What about search hijacking? - Florian Quèze](http://blog.queze.net/post/2015/11/02/What-about-search-hijacking)　一連の仕様変更に深く携わっているFirefoxの開発者Florian Quèze氏によるブログ記事

# 脚注
[^1]: "[Creating OpenSearch plugins for Firefox | MDN](https://developer.mozilla.org/ja/docs/Creating_OpenSearch_plugins_for_Firefox)"も参照されたい。
[^2]: 初期設定値は"`https://addons.mozilla.org/%LOCALE%/firefox/search-engines/`"である。この設定の詳細は、"[Browser.search.searchEnginesURL - MozillaZine Knowledge Base](http://kb.mozillazine.org/Browser.search.searchEnginesURL)"を参照されたい。
[^3]: 外部のウェブサーバを経由して動作するのであっても実際上は然程問題無いと思われるが、技術的なプログラム処理のためだけにそのようにする設計思想には賛同できない。同旨の見解に、Firefoxアドオンの開発者として著名なPiroこと結城洋志氏の[ツイート](https://twitter.com/piro_or/status/942275953316655104 "Piro/Linuxコマンド操作解説漫画連載中さんのツイート: "僕はこういう種類のアドオンはWebサービス無しでスタンドアロンで動くべきと思ってるので、それができないと分かった時点で早々に諦めたんだけど、そう思わないのであれば（サーバーの支援を受ける前提であれば）できる事の幅はいくらでも広がるという例だと思った。"")。勿論、これはWebExtensions APIの制限に起因するのであって、こうした設計思想を採ったアドオンの作者に非は無い。
[^4]: POSTリクエストで動作する検索エンジンであっても、リクエストパラメータがURLへの付加でしか設定できない。それでも一応動作するので、実際上は然程問題無いと思われるが。
[^5]: 作者に拠れば、<ul><li>WebExtensionsへの移行は同APIが対応しておらず不可能である。</li><li>もしWebExtensions APIがOpenSearch仕様のXMLドキュメントのエクスポートかインポートのいずれかの機能に対応するようになれば、WebExtensionsに準拠する更新の作業を行う。</li><li>WaterfoxやPale Moonのための移行は行わない。</li></ul>ということである。"[Migrating to WebExtensions (if it will be possible) due to Firefox 57 dropping support for XUL-based add-ons](https://github.com/nohamelin/xseei/issues/1 "Migrating to WebExtensions (if it will be possible) due to Firefox 57 dropping support for XUL-based add-ons · Issue #1 · nohamelin/xseei · GitHub")"、"[[Ext] XML Search Engines Exporter/Importer (+ Fx57 tools)](http://forums.mozillazine.org/viewtopic.php?f=48&t=3020165 "[Ext] XML Search Engines Exporter/Importer (+ Fx57 tools) • mozillaZine Forums")"を参照。
[^6]: XML Search Engines Exporter/Importerアドオンの作者nohamelin氏による作である。
[^7]: Firefoxの[開発ツール　‐　オプションペイン](https://developer.mozilla.org/ja/docs/Tools/Settings "設定 - 開発ツール | MDN")で「ブラウザーとアドオンのデバッガーを有効化」項目を有効と設定する必要が有る。
[^8]: 本記事初版時点では、`chrome/ja/locale/browser/searchplugins/`であった。<br/>（2018/09/08更新。筆者の環境は次の通り。<ul><li>OS: Windows 10</li><li> ウェブブラウザ(1): Mozilla Firefox 62.0 64bit版</li></ul>）
[^9]: "[How do you decompress search.json.mozlz4? • mozillaZine Forums](http://forums.mozillazine.org/viewtopic.php?p=14708933#p14708933)"も同様である。
[^10]: "[nightly search engine icon (2) - Dead Zone](https://blog.goo.ne.jp/atlanto/e/c4a1515ed3d574ede4a55e6bed247ffc)"も同様である。
[^11]: [オプション　‐　詳細パネル　‐　更新タブ](about:preferences#advanced "about:preferences#advanced")の[「次のソフトウェアを自動的に更新する　‐　検索エンジン」項目](https://support.mozilla.org/ja/kb/advanced-panel-settings-in-firefox#w_eaagalcicnadadacacieoioeaeuiiuaoao "詳細設定 - Firefox のアクセシビリティ、ブラウジング、ネットワーク、更新、その他 | Firefox ヘルプ")を無効と設定しても、ビルトインの検索プラグインは自動的に更新される。[Bug 1436741](https://bugzilla.mozilla.org/show_bug.cgi?id=1436741 "1436741 - Firefox installed new search engine when option update search engines was disabled")（「検索エンジンを更新する設定が無効だったのにFirefoxが新しい検索エンジンをインストールした」）、[Bug 1444426](https://bugzilla.mozilla.org/show_bug.cgi?id=1444426 "1444426 - Remove or hide "Automatically update search engines"")（「「検索エンジンを自動で更新する」を除去又は非表示化せよ」）を参照。
[^12]: FirefoxのビルドIDとバージョンであり、[トラブルシューティング情報パネル](about:support "about:support")で確認できる。
[^13]: `omni.ja`ファイルを解凍すると、その中の`chrome/browser/searchplugins/`[^8]（Waterfoxでは`chrome/en-US/locale/browser/searchplugins/`）ディレクトリに存在する。
[^14]: `omni.ja`に関しての詳細は、「[omni.ja （かつてのomni.jar）について | MDN](https://developer.mozilla.org/ja/docs/About_omni.jar)」、"[How to correctly (re)pack omni.ja in Firefox? - Stack Overflow](https://stackoverflow.com/questions/32038251/how-to-correctly-repack-omni-ja-in-firefox)"などを参照されたい。
[^15]: [Bug 1154835](https://bugzilla.mozilla.org/show_bug.cgi?id=1154835 "1154835 - whitespace should be stripped out of search engine names")（「空白は検索エンジン名から取り除かれるべき」）や[Bug 1226613](https://bugzilla.mozilla.org/show_bug.cgi?id=1226613 "1226613 - Search plugins with a name that's very similar to the name of plugins we ship shouldn't get installed")（「出荷するプラグイン[^18]の名前に酷似した名前の付いた検索プラグインはインストールさせないべき」）がもし実現されれば、こうした方法は用いられなくなる。これに対する、「必ずしも全てのユーザが、既定の検索プラグイン[^18]で扱われるサービスにMozillaの検索プラグインを使用するよう強いられたいわけではないだろうことを、思い起こしてください。上述された使い方の一部は、[Bug 353056](https://bugzilla.mozilla.org/show_bug.cgi?id=353056 "353056 - can't overwrite default/shipped search plugins/engines")のような問題への対処であるかもしれません。」との[コメント](https://bugzilla.mozilla.org/show_bug.cgi?id=1226613#c4 "1226613 - Search plugins with a name that's very similar to the name of plugins we ship shouldn't get installed")（Stefan Plewako氏）は、重要な指摘であるように思われる。
[^16]: "[Mozilla Fdn 2016 Final FS - Short Form 9-28 - 2016_Mozilla_Audited_Financial_Statement.pdf](https://assets.mozilla.net/annualreport/2016/2016_Mozilla_Audited_Financial_Statement.pdf")"、"[Mozilla Foundation Documents](https://www.mozilla.org/en-US/foundation/documents/)"を参照。
[^17]: 更に、[マニフェスト](https://www.mozilla.org/ja/about/manifesto/details/ "Mozilla マニフェスト")に「人は誰でも、インターネットとインターネット上での自らの体験を自分自身で形成する力を有するべき」と掲げ、[ウェブサイトのトップページ](https://www.mozilla.org/ja/ "利益ではなく、人々のためのインターネット — Mozilla")で「利益ではなく、人々のためのインターネット」と謳う。
[^18]: 「ビルトインの検索プラグイン」のことを指している。
[^19]: この問題は、[Firefox Search Bar Show Engine Names (Firefox 43+)](https://userstyles.org/styles/122214/firefox-search-bar-show-engine-names-firefox-43 "Firefox Search Bar Show Engine Names (Firefox 43+) | Userstyles.org")ユーザスタイルを使用することで、一先ず解決できる。
[^20]: 例えば、検索サイトの[StartPage](https://www.startpage.com/ "StartPage Web Search")([https://www.startpage.com/nih/opensearch.xml](https://www.startpage.com/nih/opensearch.xml))。