テストの持続と再起動機能

この翻訳は不完全です。英語から この記事を翻訳 してください。

拡張機能をテストする時、機能が拡張機能自身をリセットしたり、Firefox の再起動後に(再)読み込みすると動作が停止することがあるのに気づくでしょう。例えば、local storage を使っていて拡張機能を再起動すると以前の保存データが消えるのがわかります。あるいは、Firefox の再起動をまたいで拡張機能をテストしたいが、拡張機能がロードされないとわかることもあります。

この記事ではこうしたふるまいがなぜ起きるのかを説明します。次に拡張機能が再読み込みされた時に機能を確実にするために何をすべきか、また再起動のふるまいのセットアップ方法を示します。

Firefox がテストしている拡張機能をどう扱うのかを見る前に; Firefox と拡張機能について意識すべき機能がいくつかあります。: アドオン ID と Firefox プロファイルです。

アドオン ID とは?

アドオン ID はそれぞれ拡張機能にユニークな ID として使われ、その代わりにその ID は拡張機能と WebExtension API の特定機能をリンクするのに使われます。この機能は次の通り:

  • storage.managed—そのアドオン ID によってデータを拡張機能に属するものとして識別します
  • storage.sync—そのアドオン ID によってデータを拡張機能に属するものとして識別します
  • identity.getRedirectURL—リダイレクト URL には、内線番号のアドオン ID が含まれます
  • Native messaging—ネイティブアプリはアドオン ID でそのアプリと通信できる拡張機能を識別します
  • pkcs11—PKCS #11 モジュールはアドオン ID で通信できる拡張機能を識別します
  • runtime.onMessageExternal—拡張機能はそのアドオン ID をアドレスとして別の拡張機能にメッセージを送信します
  • runtime.onConnectExternal—拡張機能は、他の拡張機能のアドオン ID による拡張機能の接続を要求します
  • browserAction—そのボタンの保存された位置は、そのアドオン ID に基づいて拡張機能に属するものとして識別されます

拡張機能がアドオン ID を割り当てられるのに manifest.json ファイルの "applications" キーが使われます。

"applications": {
  "gecko": {
    "id": "addon@example.com"
    }
  }

拡張機能が "applications" キーで定義するアドオン ID を持たない場合、次のどれかからアドオン ID を取得します:

  • エクステンションが AMO に提出され、署名されている場合は、署名されたときに ID が付与されます
  • 拡張機能が about:debugging で Load Temporary Add-on を使用してロードされている場合、一時的なアドオン ID が割り当てられます
    Example of a temporarily loaded extension showing its various IDs

上記の画像には、内部 UUID のIDが追加されていることが分かります。これは、インストール時に拡張機能に与えられる固有の識別子です。これは、拡張機能に含まれるリソースの格納場所を定義し、window.localStorage または indexedDB 内の拡張機能のデータを識別するために使用されます。しかし、その値を知る必要はありません。window.localStorage または indexedDB での使用は透過的で、拡張に含まれるリソースにアクセスするには、runtime.getURL を使用します。これにより、リソースへのパスが返されます。また、インストールごとに固有のものであるため、他の目的に頼ることのできる ID を提供しません。

Firefox プロファイルとは?

ユーザーが Firefox をどのように設定したかを定義するデータと、履歴やクッキーなどの Web を閲覧する際に生成される情報とともに、プロファイルと呼ばれる特別なフォルダに保存されます。クッキーに加えて、プロファイルには、ローカルストレージおよびその他のプロファイル関連のコンテンツが保存されます。

Firefox の拡張機能

拡張機能を開発するときに、"applications" キーを使用してアドオン ID を定義していないと仮定すると、Firefox のデフォルトの動作は次のようになります。

  • about:debugging の Load Temporary Add-on 機能を使用すると、ロードするたびに拡張機能に新しいアドオン ID が割り当てられます
  • web-ext を使用する場合は、拡張機能を起動するたびに新しいアドオン ID を取得するだけでなく、新しいプロファイルにも起動されます
  • when a temporarily loaded extension is unloaded, local storage, such as that used by storage.local, window.localStorage, and indexedDB, is removed.
  • Firefox を停止すると、一時的に読み込まれた拡張機能がアンロードされるので、Firefox を再起動すると利用できなくなります。これには、about:debugging の Load Temporary Add-on と web-ext でロードした拡張機能が含まれます

拡張機能を再読み込みするときのこの動作の結果は次のとおりです。

  • any data in local or sync storage is lost.
  • any redirect URL becomes invalid.
  • the extension will no longer be able to communicate with native apps or a PKCS #11 module.
  • it will no longer be possible to send messages or create connections between extensions.
  • you cannot test how the extension will behave if Firefox is stopped and restarted.
  • browserAction positions are not carried over

拡張機能をテストできるようにするにはどうすればよいですか?

To get your extension to behave like a signed extension during development testing, use the following techniques:

  • to make sure an extension can use add-on ID dependent features between reloads, such as local storage or native application communication:
    • set an add-on ID using the "applications" key in the extension's manifest.json.
    • when using web-ext, make sure you use the same profile.
  • to ensure you use the same profile for multiple tests of an extension when using web-ext:
    • optionally, use Profile Manager to create a new Firefox profile.
    • find the path to your new profile or the default Firefox profile by following the instructions in How do I find my profile?
    • add the Firefox profile path to the web-ext run command as follows:
      web-ext run --firefox-profile [A PATH TO A FIREFOX PROFILE] --keep-profile-changes
  • to preserve local storage when removing a temporary add-on (such as between browser restarts):
    • go to about:config and set extensions.webextensions.keepStorageOnUninstall to true.
  • to preserve access to window.localStorage or indexedDB data when removing a temporary add-on (such as between browser restarts):
    • go to about:config and set both extensions.webextensions.keepStorageOnUninstall and extensions.webextensions.keepUuidOnUninstall to true.
  • to test restart behavior:
    • set an add-on ID using the "applications" key in the extension's manifest.json.
    • install the Nightly or Developer editions of Firefox. Note: You can also use unbranded Beta and Release builds.
    • go to about:config and set xpinstall.signatures.required to false.
    • package your extension into a ZIP file using web-ext or by zipping it manually.
    • install your extension using Install Add-on From File in the Add-on manager (about:addons).
      Note: Remember you'll need to reload your extension each time you change it.
      Note: If you don't set the add-on ID, when you load the extension you get an error like this:

      Example of the message displayed when an add-on ID cannot be found for an extension

      with a matching error in the browser console.

      Example of the message displayed in the browser console when an add-on ID cannot be found for an extension

ドキュメントのタグと貢献者

このページの貢献者: silverskyvicto, Uemmra3
最終更新者: silverskyvicto,