» アドオン開発
Tokyo WebExtensions Meetup #1 が開催されました!
2018 年 3 月 2 日に Tokyo WebExtensions Meetup #1 がデジタルハリウッド大学大学院にて開催されました。
(デジハリさん、会場の提供ありがとうございました!)
20 名 + リモート参加 4 名の拡張機能開発者が集まり、拡張機能に関する問題点や要望などを題材とし、さまざまな観点から熱い議論が繰り広げられました!わお。
当日のスライドや議事録、twitter などは以下になります。
今回のミートアップでは、会の趣旨、Mozilla のスタンス、拡張機能をとりまく現状の説明を経て議論を開始。議題はミートアップの事前にみなで書き出して、それに沿って進んでいきました。拡張機能開発と一言で言っても、新規作成から開発、デバッグ、テスト、そしてリリースさらにはマーケティングなどのプロセスを踏みます。それぞれのプロセスや開発者のコンテクストによって、多様な観点から問題点や要望が浮かびましたが、今回は特に開発・デバッグ、翻訳に注目して議論が展開されました。(議事録を参照くださいませ)
そのあとは懇親会、ピザとお神酒が入り、議論がさらに活発化したのは言うまでもありません。
Tokyo WebExtensions Meetup はコミュニティベースのイベントです。
これから本ミートアップに関することは Mozilla Japan コミュニティ Slack の #extdev で決めていきます。
みなさんも是非ご参加くださいませ。もちろん拡張機能に関する質問なども自由に投稿ください。参加はこちらから。
次回は 5 月中旬をなんとなく予定しています。それでは!
Firefox 54 アドオン互換性情報
Mozilla では Firefox 57 へ向けたロードマップ を投稿しています。もしまだ読んでいなければ目を通してみてください。
Firefox 54 は 6 月 13 日 [日本時間同日深夜] リリース となります。Firefox 54 の変更点でアドオンの互換性に影響を及ぼす可能性のあるものを以下にまとめました。Firefox 54 for Developers により詳しい情報が載っていますので、こちらも併せてご覧ください。
一般
-moz-appearance
が削除されました。この変更はchrome://
URL で読み込まれたスタイルシートには適用されませんが、XUL や JavaScript コード内のインライン CSS には影響します。
XPCOM とモジュール
nsIFormHistory2
が削除されました。URLTYPE_AUTHORITY URLs
で空のホスト名が許容されなくなりました。これはnsIContentPolicy
を使って特定のリクエストをリダイレクトしているアドオンに影響します (そうした手法は推奨されませんが、一部のアドオンで使われていることが判明しています)。nsIX509CertDB.importPKCS12File
とexportPKCS12File
からトークン引数が削除されました。
WebExtensions
runtime.onMessageExternal
/onConnectExternal
が実装されました。バグのコメント 34 を引用すると、これによりbrowser.runtime.id
プロパティの意味が変わるため、拡張機能がそれら独自の URL 内で使われている ID とこのプロパティが同じであることを前提としていた場合には問題となるでしょう。webRequest
がホストの許可設定を確認していない問題が修正されました。従来通りwebRequest
を使い続けるには、必要な許可設定を追加する必要があります。今のところこれは Chrome API と互換性がありません。
この一覧に載っていない変更点や間違いを見つけたらコメント欄でお知らせください。もしあなたのアドオンが Firefox 54 で動かなくなった場合は、筆者の方でも調査したいと思います。
AMO に登録されているアドオンの 自動互換性テストと対応バージョンの更新 は数週間以内に行われますので、AMO に Firefox 53 対応のアドオンを登録している方は後日メールをチェックしてみてください。
Firefox 53 アドオン互換性情報
Mozilla では Firefox 57 へ向けたロードマップ を投稿しています。もしまだ読んでいなければ目を通してみてください。Firefox 53 は重要なマイルストーンで、AMO で旧式アドオンの「新規」受付が停止され、マルチプロセス Firefox が初期設定で有効化され、WebExtensions API を経由しないアドオンからのバイナリアクセスが制限されます。
Firefox 53 は 4 月 18 日 [日本時間同日深夜] リリース となります。Firefox 53 の変更点でアドオンの互換性に影響を及ぼす可能性のあるものを以下にまとめました。Firefox 53 for Developers により詳しい情報が載っていますので、こちらも併せてご覧ください。
一般
- マルチパッケージ XPI への対応が廃止されました。これは完全テーマと拡張機能をひとつのパッケージにまとめているいくつかのアドオンでまだ使われていますが、他の旧式アドオン技術とともに削除されることとなりました。
file://
URL に別のコンテンツプロセスが使われるようになりました。これにより、_openURIInNewTab
の挙動が若干変わっています。-moz-calc()
への対応が廃止されました。dom-storage2-changed
通知がプライベートウィンドウで役に立たない問題が修正されました。これにより、プライベートウィンドウ向けに別のdom-private-storage2-changed
通知が追加されました。urlbarbindings.xml
から未使用のバインディングが削除されました。<splitmenu>
と<menuitem-tooltip>
が削除されています。type
ブラウザー属性の content とcontent-primary
の区別がなくなりました。type="content-primary"
はtype="content"
とまったく同じように動作するようになり、将来的に廃止されます。MimeTypeArray
が列挙不能な名前付きプロパティとなりました。PluginArray
とPlugin
が列挙不能な独自プロパティとなりました。
パスワードマネージャー
以下 3 つの変更は関連しており、アドオンが findSlotByName("")
を呼び出してマスターパスワードが設定されているかどうかを確認できなくなったことが主な影響として挙げられます。該当するコードの変更方法は こちら の例を見てください。
nsIPK11TokenDB.findTokenByName
の引数として空のトークン名を渡すことができなくなりました。nsIPKCS11Slot.status
の不必要な使用を置き換えるためnsIPK11Token.hasPassword
が導入されました。changepassword
内のトークン選択機能が廃止されました。
XPCOM とモジュール
- PSM インターフェイスから NSS 証明書ニックネーム API を使用できなくなりました。これにより、
nsIX509Cert
内の様々なメソッドに変更が加えられています:addCert
、addCertFromBase64
、findCertByNickname
、findEmailEncryptionCert
、findEmailSigningCert
- AddonManager API がコールバックとプロミスの両方に対応しました。これにより、
getInstallForURL
のコールバックが非同期で呼び出されるようになりました。 getURIForKeyword
API が廃止されました。代わりにPlacesUtils.keywords.fetch
を使ってください。nsIStyleSheetService::PreloadSheet
にServoStyleSheets
への対応が追加されました。これにより、preloadSheet
の戻り値が変わりましたが、それをaddSheet
へ渡していない限り影響はないはずです。
WebExtensions
- レコードの削除が暗号化されるようになりました。
storage.sync
API はまだ一般には使用できませんが、一部のプレリリース版ユーザーに使われている可能性があります。この変更により古い同期済みデータが失われます。
この一覧に載っていない変更点や間違いを見つけたらコメント欄でお知らせください。もしあなたのアドオンが Firefox 53 で動かなくなった場合は、筆者の方でも調査したいと思います。
AMO に登録されているアドオンの 自動互換性テストと対応バージョンの更新 は数週間以内に行われますので、AMO に Firefox 52 対応のアドオンを登録している方は後日メールをチェックしてみてください。
2017年のアドオン
この投稿は米国 Mozilla Tech Blog の記事 “Add-ons in 2017” の抄訳です。
1年以上前に私たちはアドオンはどこに向かうのか、そして将来はどんな風になるのか、について会話を開始しました。それは多忙でした。そして2017年にやりたいと考えているガイダンスをご提供し、そのアップデートをご提供したいと思いました。
2015年を通して、私たちはコミュニティとしてFirefoxとaddons.mozilla.org(AMO)のWebExtensionsサポートを追加する基礎的な作業を行うことに注力してきました。そして開発中の標準をメンテナンスする間にレビューすべきリスト化されたアドオンに関わる時間を削減し、アドオンのe10sへの準備を済ませてきました。私たちは、Signing APIやアドオンマネージャの改良版Discovery Paneのようなイニシアティブを通してアドオンの投稿、配信と発見を簡単にするプロセスや製品を数多く変革してきました。そうして、私たちは直接のコンタクトやメーリングリスト、Eメールキャンペーン、wikiやアドオンブログを通して開発者コミュニティに変革をお知らせすることに注力してきました。
私たちが申し上げてきましたとおり、WebExtensionsはFirefoxのアドオンの将来であり、2017年も集中して取り組むエリアです。WebExtensionsはプラットフォームと切り離されており、我々がFirefoxに対してこれから、そしてそれ以降の年に予定する変革はプラットフォームには影響しません。(WebExtensionsの)開発はより簡単で、起動や実行するためにFirefoxの内部処理について学ぶ必要はありません。あなたのアドオンを最小の変更で他のブラウザーからの移植や他のブラウザーへの移植を行うことも簡単です。なぜなら、これらのAPIは – 当然ですが – Opera、ChromeやEdgeのような製品と互換性があるためです。
2017年末までに、Firefox 57のリリースに伴い、私たちはWebExtensionsだけのサポートに切り替え、デスクトップ上の他の種類の拡張機能をロードしないようにします。新しい拡張機能が2017年末以降も動作できるように、Firefox 53でAMOはWebExtensionsではない新しい拡張機能の署名受付を終了いたします。本年を通して私たちはAPIセットを拡張し、Firefoxに機能を追加し、それはまだ他のブラウザでは搭載していませんが、ユーザの前にもっとたくさんのWebExtensionsをご提供します。
移行する部品はたくさんあります。Mozilla WikiのWebExtensionsセクションで、時間軸やロードマップを含むもっと詳細な情報を追跡していきます。もしあなたがアドオンコミュニティやWebExtensionsに参加するご興味がありましたら、いくつかの方法があります。私たちは2017年を楽しみにしており、更新情報や追加情報をこちらのアドオンブログでお知らせしてまいります。
Add-onやWebExtensionsについてのより詳細な情報は、こちらをご覧ください。
注意:Firefox 53の時期にはさらなる具体的な更新を行います
Firefox 52 アドオン互換性情報
[これは Mozilla Add-ons Blog の記事 Add-on Compatibility for Firefox 52 の翻訳です]
Mozilla のアドオンチームでは 2017 年の計画 を公表しています。まだ見ていない方は目を通してみてください。以下で取り上げる変更点の大半は従来の API を使ったアドオンに関するものですが、今後は WebExtensions が前へ進むべき道となります。
Firefox 52 が 3 月 7 日 [日本時間同日深夜] リリース となります。Firefox 52 の変更点でアドオンの互換性に影響を及ぼす可能性のあるものを以下にまとめました。Firefox 52 for Developers により詳しい情報が載っていますので、こちらも併せてご覧ください。
一般
- NPAPI プラグイン対応が削除されました (Flash を除く)。 詳しくは このブログ記事 を参照してください。
- デスクトップからショートカットを複数ドラッグ&ドロップした際にひとつしか開かない問題が修正されました。これにより複数のリンクをブラウザのコンテンツエリアへドラッグ&ドロップすることが可能となり、
browserDragAndDrop.drop
がbrowserDragAndDrop.dropLinks
に置き換えられるといったいくつかの変更が行われています。 File
コンストラクターのChromeFilePropertyBag
版がウェブコンテンツに露呈されている問題が修正されました。これにより、File
コンストラクターが静的メソッドのCreateFromFileName
とCreateFromNsIFile
に置き換えられました。- ドラッグドロップ時に
DataTransfer.types
の型が間違っている問題が修正されました。dataTransfer.types.contains
の代わりにdataTransfer.types.includes
を使ってください。互換性を保つため エイリアスが追加されました が、これは一時的な措置となります。 - Youtube Subtiltle Downloader 使用時のクラッシュが修正されました。この変更により、拡大プリンシパルを使用しているアドオンからの CORS リクエストが動作しなくなります。
CanvasRenderingContext2D.mozDash
/mozDashOffset
が廃止されました。- ウェブコンテンツから Battery API へのアクセスが廃止されました。
XPCOM とモジュール
toolkit/obsolete
ディレクトリが削除されました。これには、nsUserSettings.js
内のnsPreferences
、strres.js
内の文字列バンドル関数など、古いアドオンで使われているユーティリティーオブジェクトがいくつか含まれます。nsISupportsArray
、nsICollection
、nsIEnumerator
が廃止予定となりました。これらのインターフェイス、特にnsISupportsArray
は、多くのコンポーネントアドオンで使われています。これらは以下のようにnsIArray
による置き換えが進んでいます。- 使用されていない
ImageDocument::ImageResizingEnabled
が削除されました。
テーマ
この一覧に載っていない変更点や間違いを見つけたらコメント欄でお知らせください。もしあなたのアドオンが Firefox 52 で動かなくなった場合は、筆者の方でも調査したいと思います。
AMO に登録されているアドオンの 自動互換性テストと対応バージョンの更新 は数週間以内に行われますので、AMO に Firefox 51 対応のアドオンを登録している方は後日メールをチェックしてみてください。
Firefox 51 アドオン互換性情報
[これは Mozilla Add-ons Blog の記事 Add-on Compatibility for Firefox 51 の翻訳です]
Firefox 51 が 1 月 24 日 [日本時間同日深夜] リリース となります。なお、12 月 13 日にはメジャーリリースではなくマイナーリリースが予定されているため、今回は普段より相当長いリリースサイクルとなります。Firefox 51 の変更点でアドオンの互換性に影響を及ぼす可能性のあるものを以下にまとめました。Firefox 51 for Developers により詳しい情報が載っていますので、こちらも併せてご覧ください。
一般
- 「新しいタブ」ボタン上でのアクセルクリックや中クリックで、現在のタブの隣に新しいタブが開かれるようになりました。これにより、「新しいタブ」ボタンの挙動が変更され、
BrowserOpenNewTabOrWindow
関数が削除されました。 setTimeout
を使ったコードが警告表示後に間違った順番で実行される問題が修正されました。onButtonClick
関数の挙動が変更されて非同期となりました。- 接頭辞付き Visibility API が廃止されました。
mozVisibilityState
とmozHidden
が削除されました。 - ワーカー上で
close
イベントが発生しなくなり、onclose
プロパティも削除されました。 - WebExtension の
manifest.json
でstrict_min_version
に「*
」が含まれていた場合、インストールが中止されるようになりました。最小バージョンは、あいまいなものではなく、常に特定のバージョンでなければなりません。 - データとして読み込まれた XML 文書が
<parsererror>
を生成しなくなりました。一部のアドオンが、XML 文書のパース失敗時に現れていたこのノードに依存しているようです。
XPCOM とモジュール
- お気に入りアイコンに
SystemPrincipal
ではなくNullPrincipal
が使われるようになりました。これにより、setAndFetchFaviconForPage
、replaceFaviconDataFromDataURL
両関数に変更が加えられました。プリンシパルは通常引数として渡さなくてはなりません。 - 誤った
Content-Type
を使用しているサーバからダウンロードしたことがある場合、ファイルをアップロードするとその誤ったContent-Type
が設定されてしまう問題が修正されました。コメント #36 で説明されている通り、アドオンが MIME タイプマッピングを変更する方法が変更され、直接mimeTypes.rdf
を編集する代わりにカテゴリを通じて行われるようになりました。 Actor
、FrontClass
への最後の参照が削除されました。これらはまだアドオンから使用できますが、廃止予定となっています。
新機能
- 組み込み WebExtension: 再起動不要型アドオンに WebExtension を組み込めるようになったおかげで、この新しいプラットフォームへ徐々にコードを移行したり、保存したデータを WebExtension で扱える形式に変換したりすることが可能となりました。
- WebExtension Experiments: これは、Mozilla (やアドオン作者の皆さん) が新しい WebExtension API を試作できるようにするための仕組みです。
この一覧に載っていない変更点や間違いを見つけたらコメント欄でお知らせください。もしあなたのアドオンが Firefox 51 で動かなくなった場合は、筆者の方でも調査したいと思います。
AMO に登録されているアドオンの 自動互換性テストと対応バージョンの更新 は数週間以内に行われますので、AMO に Firefox 50 対応のアドオンを登録している方は後日メールをチェックしてみてください。
Firefox 50 アドオン互換性情報
[これは Mozilla Add-ons Blog の記事 Add-on Compatibility for Firefox 50 の翻訳です]
Firefox 50 が 11 月 8 日 [日本時間同日深夜] リリース となります。Firefox 50 の変更点でアドオンの互換性に影響を及ぼす可能性のあるものを以下にまとめました。Firefox 50 for Developers により詳しい情報が載っていますので、こちらも併せてご覧ください。
一般
box-sizing: padding-box
が削除されました。- アドオンが
multiprocessCompatible
を宣言している場合は CPOW の使用が禁止されます。マニフェスト内のmultiprocessCompatible
フラグ は、アドオンが e10s モードでも完全に動作するよう行われるクロスプロセス移行措置をすべて無効化します。このバグは同制限の抜け穴を閉じるものです。e10s 互換性に詳しくない方は このページを参照してください。 draggesture
、dragdrop
両イベントが削除されました。標準の代替イベントとなるdragstart
、drop
を使用してください。
XPCOM とモジュール
nsIClientAuthDialogs::ChooseCertificate
が、文字列ではなく、nsIX509Certs
のnsIArray
を渡すようになりました。この変更により、一部のアドオンが使用しているnsIX509Cert
内のCERT_USAGE_*
定数が削除されました。nsIX509Cert.getUsagesArray
、requestUsagesArrayAsync
、getUsagesString
が削除されました。
新機能
- 再起動不要な更新を遅延させる API が提供されました。更新の遅延は、完了の必要がある遅いプロセスをアドオンが実行している場合に便利でしょう。
この一覧に載っていない変更点や間違いを見つけたらコメント欄でお知らせください。もしあなたのアドオンが Firefox 50 で動かなくなった場合は、筆者の方でも調査したいと思います。
AMO に登録されているアドオンの 自動互換性テストと対応バージョンの更新 は数週間以内に行われますので、AMO に Firefox 49 対応のアドオンを登録している方は後日メールをチェックしてみてください。
Firefox 49 アドオン互換性情報
[これは Mozilla Add-ons Blog の記事 Add-on Compatibility for Firefox 49 の翻訳です]
Firefox 49 が 9 月 13 日 [日本時間同日深夜] リリース となります。Firefox 49 の変更点でアドオンの互換性に影響を及ぼす可能性のあるものを以下にまとめました。Firefox 49 for Developers により詳しい情報が載っていますので、こちらも併せてご覧ください。
一般
- ドアハンガー通知のアンカー ID とクラス名重複が一掃されました。これはポップアップ通知を使用しているアドオンのスタイル付けに影響する可能性があります。
window.open()
を通じて開かれたウィンドウが初期設定でスクロール可能となりました。String.prototype.search
、match
、replace
から非標準のフラグ引数が削除されました。- HTML Microdata API が削除されました。
XPCOM とモジュール
- 子プロセスに送られる設定値のサイズが制限されました。改めて注意しておくと、巨大なデータを保存するのに設定サービスを使ってはいけません。小さな値 (4 KB 以下) にのみ留めるべきです。今回の変更により、プロセス間通信にこの制約が適用されました。
protocol.js
が移動されました。今後このモジュールにアクセスするにはrequire("devtools/shared/protocol")
を使ってください。今のところ、古いパスでも使えるよう過渡的措置が取られています。nsFaviconService.cpp
に廃止警告が追加されました。お気に入りアイコンを操作するアドオンを作っている開発者は このバグのコメント に書かれた変更点を確認してください。今のところ、適切なプリンシパルを渡さなかった場合に警告が表示されるだけですが、ゆくゆくは意図した通りに動作しなくなります。
この一覧に載っていない変更点や間違いを見つけたらコメント欄でお知らせください。もしあなたのアドオンが Firefox 49 で動かなくなった場合は、筆者の方でも調査したいと思います。
AMO に登録されているアドオンの 自動互換性テストと対応バージョンの更新 は数週間以内に行われますので、AMO に Firefox 48 対応のアドオンを登録している方は後日メールをチェックしてみてください。
Popup ALT AttributeアドオンにおけるXUL/XPCOMからWebExtensionsへの移行
今日の投稿はPopup ALT Attributeや40 other add-onsを 開発しているpiro氏の記事からの投稿です。彼はXUL/XPCOMアドオンからWebExtensionに移行するための考えを共有し、彼がどのよう にPopup ALT Attributeを移行したかを私たちに見せてくれました。彼のブログで全文を読むことができます。
***
こんにちは、アドオン開発者のみなさん。私の名前は結城洋志、ニックネームはPiro、そしてFirefoxアドオンの開発者です。私はとても長い期間、個人的に、またビジネスで、XUL/XPCOMベースのFirefoxアドオンやThunderbirdアドオンを開発してきました。
私 は最近アドオンたちをWebExtensionに移行するために必要となるAPIのリサーチを始めました。Mozillaが”XUL/XPCOMベースの アドオンを2017年の終わりまでに廃止する”と告知したからです。私は、いくつかのアドオンが現在使用可能なAPIだけでけしか移行できることに気づきま した。Popup ALT Attribute もそれらのアドオンの中の一つです。
これは私がどのようにWebExtensionに移行させたのかを綴った物語です。
このアドオンについて
Popup ALT Attribute は2002年からスタートしているとても古くからあるアドオンで、これはwebページのimg
HTML要素の alt
属性に書かれている内容を表示するものです。通常、Firefoxはtooltipに title
属性のみ表示します。
最初に、このアドオンはFirefox自身の FillInHTMLTooltip()内部関数を置き換える機能が実装されています。
2016年1月、私はこのアドオンを e10s に対応させました。このことはあなたのアドオンの状態によって価値が変わるでしょう。もしあなたが直接WebExtensionに移行するなら、WebExtensionはデフォルトでe10sに対応しているからです。
WebExtensionスタイルに再フォーマッティング
私は移行する前に、どのように1からWebExtensionベースのシンプルなアドオンを作るかのチュートリアルを読み、WebExtensionはブートストラップ型拡張に似ていることに気が付きました。
- 両者は動的にインストール、再インストールされる
- 両社は主にJavaScriptコードがベースでいくつかの静的なマニフェストファイルを持っている。
私はすでにこのアドオンをbootstrapped型アドオンに移行していたため、容易にWebExtensionに再構成することができました。
これは私が書いた初期のバージョンの manifest.json
です。これはlocalizationやオプション用のUIがありません
<code>{ "manifest_version": 2, "name": "Popup ALT Attribute", "version": "4.0a1", "description": "Popups alternate texts of images or others like NetscapeCommunicator(Navigator) 4.x, and show long descriptions in the multi-row tooltip.", "icons": { "32": "icons/icon.png" }, "applications": { "gecko": { "id": "{61FD08D8-A2CB-46c0-B36D-3F531AC53C12}", "strict_min_version": "48.0a1" } }, "content_scripts": [ { "all_frames": true, "matches": ["<all_urls>"], "js": ["content_scripts/content.js"], "run_at": "document_start" } ] }</code>
私 はすでにmain scriptをフレームスクリプトとloaderに分けていました。一方、 manifest.json
はどのようにロードされたかを述べるための いくつかのマニフェストキーを持ちました。これはパッケージに自作したカスタムloaderを何も追加する必要のないことを示しています。実際、上記のサ ンプルに含まれている content_scripts
ルールによってどんなwebページにもスクリプトをロードすることができます。 content_scripts
の詳細はドキュメントをご覧ください。
そして最後には、3つのファイルにすることができました。
Before:
<code>+ install.rdf + icon.png + [components] + [modules] + [content] + content-utils.js</code>
And after:
<code>+ manifest.json (migrated from install.rdf) + [icons] | + icon.png (moved) + [content_scripts] + content.js (moved and migrated from content-utils.js)</code>
そして、私はまだ、XPCOMから自分のフレームスクリプトを分離する必要があります。
- scriptは
nsIPrefBranch
やXPConnectを通していくつかのXPCOMとつながっています。そのためそれらを一時的にコメントアウトします。 - ユーザープレファレンスは使用不可になり、値を固定し、デフォルト設定のみ使用可能になります。
Ci.nsIDOMNode.ELEMENT_NODE
のように、いくつかの定数のプロパティにアクセスされるXPCOMコンポーネントをNode.ELEMENT_NODE
のような形に置き換えました。webページから mousemove
eventsを取得するリスナーはフレームスクリプトのグローバル名前空間にアタッチされますが、しかしこれはそれぞれのページのdocument自身に
再アタッチされます。なぜなら現在 scriptはwebページで直接実行されるからです。
ローカライズ
xpcomアドオンのinstall.rdfでは、説明をローカライズしていました。webextensionでは異なった方法でローカライズする必要があります。詳細はhow to localize messagesをご覧ください。以下で簡単な説明を行います:
ローカライズした説明を記述するためにファイルを追加します
<code>+ manifest.json + [icons] + [content_scripts] + [_locales] + [en_US] | + messages.json (added) + [ja] + messages.json (added)</code>
en_US
はinstall.rdf
のバージョンのen-US
と異なることに注意してください。
English locale, _locales/en_US/messages.json
です:
<code>{ "name": { "message": "Popup ALT Attribute" }, "description": { "message": "Popups alternate texts of images or others like NetscapeCommunicator(Navigator) 4.x, and show long descriptions in the multi-row tooltip." } }</code>
日本用のlocale, _locales/ja/messages.json
もまた含まれています。そして、manifest.json
をローカライズされた言葉を埋め込むために修正する必要があります。
<code>{ "manifest_version": 2, "name": "__MSG_name__", "version": "4.0a1", "description": "__MSG_description__", "default_locale": "en_US", ...</code>
__MSG_****__
文字列変数は自動的にローカライズされたメッセージに置き換えられます。default_locale
キーを通して、手動でデフォルトロケールを設定することが必要です。
残念ながら、firefox45ではローカライゼーション機能はサポートされていません。そのためlocalizationを行うには Nightly 48.0a1以上のバージョンが必要になります。
ユーザープレファレンス
現在、WebExtensionsはnsIPrefBranch
と互換性 を持っている機能を提供していません。しかし、代わりに、シンプルなストレージAPIを持っています。これはuser preferencesをset/getするための nsIPrefBranch
の代わりに使えます。このアドオンはUIの設定をもっていません。しかし拡 張的な機能をコントロールするためにいくつかのsecret preferencesをもっています。そのため私の他のアドオンの移行のために試験的に挑戦しました。
そして私は大きな壁にぶつかります。ストレージAPIはコンテンツスクリプトでは使用可能ではないのです。私はストレージにアクセスするだけのため にバックグラウンドスクリプトを作成することが必要で、さらに内部サンドボックスメッセージシステムを通してコンテンツスクリプトとコミュニケーションを とる必要があります。(更新情報: bug 1197346はNightly 49.0a1では修正されています。そのためコンテンツスクリプトからストレージシステムにアクセスするようなハックはもう必要ありません。現在、私はネイティブなストレージAPIの代わりに設定値に簡単にアクセスできるようなライブラリ(configs.js)を提供しています。)
最後に私はそれを行うために小さなライブラリを作成しました。私はここでは説明しませんが、もしあなたが詳細を知りたいなら、ソースコードをご覧ください。177行のライブラリがあります。
私は二つのバックグラウンドスクリプトやコンテンツスクリプトを使用するために、自分のmanifest.jsonを更新する必要がありました。
<code> "background": { "scripts": [ "common/Configs.js", /* ライブラリ自身 */ "common/common.js" /* ライブラリを使用するコード */ ] }, "content_scripts": [ { "all_frames": true, "matches": ["<all_urls>"], "js": [ "common/Configs.js", /* ライブラリ自身 */ "common/common.js", /* ライブラリを使用するコード */ "content_scripts/content.js" ], "run_at": "document_start" } ]</code>
同じセクションに記載されているスクリプトはセクションの名前空間を共有しています。他からscriptをロードするためにrequire()のようなも のは必要ありません。代わりに、私は各リストのscriptの並び順に気を付け、ライブラリを必要とするスクリプトが、必要とされるライブラリ自身の後に なるように書く必要があります。
そして最後の障害に当たります。about:cofigやMCDに当たる動作を実現するにはどうすればいいのか・・・一般的な方法はアドオン全体にわたる秘密のプレファレンスを制御することです。
私は仕事の顧客に対し、大抵アドオンを提供して、彼らの設定をロックするためにMCDを使用しま した。(Firefoxをビジネスで使用するためにいくつかの共通の要件があるため、アドオンとMCDの組み合わせは、それぞれの顧客用に異なった設定の Firefoxプライベートビルドを作成するよりもかけるコストが少なくて済みます。)
私はまだこの当たりを探る必要があると考えました。
Options UI
WebExtensions はアドオンに対してオプションページを作成する機能を提供しています。これも同じく、Firefox45ではサポートされていません。そのため現在あなた はNightly 48.0a1を使用する必要があります。前に私が言った通り、このアドオンはコンフィグ用にUIを持ちません。しかし私は勉強用に試してみました。
XUL/XPCOMアドオンでは、<checkbox>
, <textbox>
, <menulist>
や他にもリッチなUI要素が使用可能です。しかしこれらは来年末までに使用不可能になります。なので私は純粋なHTMLとJavascriptベースのカス タム設定用UIを実装する必要がありました。(もしあなたがもっとリッチなUIの要素を必要とするならWebApplication用のライブラリなどが 助けてくれるでしょう。)
このステップで私は2つのライブラリを作成しました。
- A helper to bind configurations to UI elements.
- A helper to apply localized messages to a static HTML.
終わりに
私は自分のPopup ALT AttributeアドオンをXUL/XPCOMからWebExtensionsに移行することに成功しました。現在ここのブランチにありますが、Firefox48が使用可能になってからリリースしようと思っています。
これが私が移行することのできた理由です。
- これがブートストラップ型拡張でした、そのため既にアドオンに破壊的な変更を行う必要がありませんでした。
- このアドオンの中心の実装はシンプルなユーザースクリプトに似ていました。アドオンの中心的な動作は、コンテンツスクリプト中で動作します。そしてこれを行うために、特権を必要としていません。
しかし、これは珍しいケースです。私の他の40以上のアドオンはいくつかの特権を必要とし、コンテンツエリアの外側で動作します。私のアドオンのほとんどは、このような非典型的なアドオンです。
私は複数の新しいAPIをリクエスト、分類、計画などを立てたりすることが必要があります。これは私だけではなく、他のアドオン開発者も同じでしょう。
読んで頂きありがとうございます。
Firefox 48 アドオン互換性情報
[これは Mozilla Add-ons Blog の記事 Add-on Compatibility for Firefox 48 の翻訳です]
Firefox 48 が 8 月 2 日 [日本時間同日深夜] リリース となります。Firefox 48 の変更点でアドオンの互換性に影響を及ぼす可能性のあるものを以下にまとめました。Firefox 48 for Developers により詳しい情報が載っていますので、こちらも併せてご覧ください。
一般
- セカンダリ UI 内の読み込みインジケータが更新されました。あなたのアドオンで
loading_16.png
あるいはloading.png
を使っている場合は、新しいパスとなるchrome://global/skin/icons/loading.png
あるいはchrome://global/skin/icons/loading@2x.png
(HiDPI) を指すようコードを更新してください。 - 開発者ツールのトップレベルメニュー項目が動的に追加されるようになりました (Bug 1258987 も参照)。開発者ツールの UI を変更するオーバーレイ、ブロードキャスターあるいはコマンドを使用している場合、これらの変更がアドオンの互換性に影響する可能性があります。
__defineGetter__
と__defineSetter__
のレガシーなthis
自動補完の挙動が廃止されました。
XPCOM とモジュール
- 廃止予定となっている
newChannel
API がnsIIOService
へ戻されました。あなたのアドオンでnewChannel
、newChannelFromURI
あるいはnewChannelFromURIWithProxyFlags
を使用している場合、これらはすべて廃止予定となっているため、それぞれ末尾に「2」の付いたメソッドへ移行しなければなりません。詳しくはnsIIOService
のドキュメント を参照してください。 DownloadIntegration
モジュールのカスタマイズ用インタフェースが追加されました。これはアドオンがDownloadIntegration
モジュールを拡張できるようにするものですが、一方でモジュールをDownloadIntegration.jsm
から直接インポートしてはいけなくなるということです。nsICertTree.isHostPortOverride()
が削除されました。ViewHelpers.L10N
とMultiL10N
がそれぞれモジュールへ移されました。
新機能
- 一時アドオンの再読み込みが可能となりました。一時アドオンの詳細は Andy のブログ記事 を参照してください。
この一覧に載っていない変更点や間違いを見つけたらコメント欄でお知らせください。もしあなたのアドオンが Firefox 48 で動かなくなった場合は、筆者の方でも調査したいと思います。
AMO に登録されているアドオンの 自動互換性テストと対応バージョンの更新 は数週間以内に行われますので、AMO に Firefox 47 対応のアドオンを登録している方は後日メールをチェックしてみてください。