「互換性がありません」と出て、インストールできない場合は、まず上記を参考にアドオンを修正してください。
インストールできたが動作しない場合(ほとんどがそうだと思いますが)、ソースコードの修正が必要になります。
基本的には、以下に記載された内容に対応していく必要があります。
ここでは、実際に私がやったことも踏まえて、修正方法をまとめていきたいと思います。
XUL/Javascriptの知識が必要ですが、HTML/他のプログラミング言語にふれたことがある方であれば、なんとなくわかると思います。
あわせて、エラーコンソール(Ctrl+Shift+Jで開きます)のエラーメッセージも確認しておいてください。どの修正をしたらいいかのヒントになります。
今回は、比較的どのアドオンにも共通するものを4つ書きます。UI回りなど、ほかにもありますが、それはまたの機会に。
0.前提- Thunderbird 60対応はできていることを前提とします。Thunderbird 60にも対応できていない場合は、以下のページに記載された修正も必要です。
- アドオンの解凍、再パッケージのやり方はわかっている方を想定しています。わからない方は、Thunderbird 68に未対応アドオンをインストールする方法 を確認してください。(といっても、zipで解凍/圧縮するだけです)また、今回の修正対象の*.xul, *.jsファイルは、解凍してできた「content」フォルダの中にあることが多いです。
1.グローバル変数の定義
以下のグローバル変数の定義がなくなりました。
エラーコンソールで、「nsIXXXXXの定義がない」と言われているときは、だいたいこれです。
ここに挙がっていないものもあるかもしれないですが、同様の対応でよいです。
実際、nsMsgViewCommandType は、オフィシャルには説明はありませんでしたが、定義がなくなっていました。
メインウィンドウ:
- NsMsgFolderFlags
- nsMsgViewCommandType
メール編集ウィンドウ:
- nsIMsgCompDeliverMode
- nsIMsgCompSendFormat
- nsIMsgCompConvertible
- nsIMsgCompType
- nsIMsgCompFormat
- nsIAbPreferMailFormat
- nsIPlaintextEditorMail
- nsISupportsString
- mozISpellCheckingEngine
「Components.interfaces.」を頭につけたものに全部置き換えるか、
Components.interfaces.NsMsgFolderFlags
自分で定義しなおします。
const NsMsgFolderFlags = Components.interfaces.NsMsgFolderFlags;
2.Importの変更
Javascriptモジュールのインポートの仕方が変わっています。
インポートでエラーになるか、「XXX is not a function」のようなエラーの場合は、この修正でなおる可能性があります。
import文によって、修正の仕方が変わります。
まずは、*.jsファイルのimport文を確認してください。
Case 0:
まず、
- MailUtils.js
- mailServices.js
- MailUtils.jsm
- mailServices.jsm
(拡張子がjsmにかわっている)
また、MailUtils.js の MailUtils.getFolderForUri 関数は、MailUtils.getExistingFolder に変わっているので、使っている場合は修正してください。
Case 1:
以下の場合、
以下のように修正します。
3.Stringbundleの修正
4.Dialogのondialogaccept/ondialogcancelイベントハンドラの修正
オプション画面などのダイアログが閉じれない/変更が反映されない場合は、この修正が必要かもしれません。
Components.utils.import("resource://foo/modules/Foo.jsm");
// または
ChromeUtils.import("resource://foo/modules/Foo.jsm");
以下のように修正します。
var {Foo, Bar} = ChromeUtils.import("resource://foo/modules/Foo.jsm");
「Foo」「Bar」は、使用する関数名を書きます。
よくわからない場合は、インポートファイルに定義してある全てを書いてしまえばOKです。
で、何が定義されているかはインポートファイルを確認します。
インポートファイルの確認の仕方は、以下の通り。
- Thunderbirdのインストールフォルダにある「omni.jar」をzipで解凍
- 解凍してできた「modules」フォルダの中から、ファイルを探す
- 見つけたファイルの冒頭にある「EXPORTED_SYMBOLS」を確認する
iteratorUtils.jsmを例にすると、EXPORTED_SYMBOLSは以下のようになっています。
this.EXPORTED_SYMBOLS = ["fixIterator", "toXPCOMArray", "toArray"];
なので、そのインポートは以下のようになります。(「"」は削除してください)
var {fixIterator, toXPCOMArray, toArray} = ChromeUtils.import("resource:///modules/iteratorUtils.jsm");
Case 2:
以下の場合、
ChromeUtils.import("resource://foo/modules/Foo.jsm", scope);
var scope = ChromeUtils.import("resource://foo/modules/Foo.jsm");
単に2番目の引数に書いているものを、import関数の戻り値にもってくるだけです。
<stringbundleset> と <stringbundle> の削除対応です。
多言語化されているアドオンの場合は、対応が必要です。
ワークアラウンドが準備されているので、修正は簡単です。
<stringbundle>が定義されているxulファイルに、以下の定義を追加するだけです。
<script type="application/x-javascript" src="chrome://global/content/elements/stringbundle.js"/>
4.Dialogのondialogaccept/ondialogcancelイベントハンドラの修正
オプション画面などのダイアログが閉じれない/変更が反映されない場合は、この修正が必要かもしれません。
以下のように、ダイアログのOK/Cancelを押したときに呼び出す処理をXULファイルで指定している場合、
<dialog buttons="accept,cancel"
ondialogaccept="return onAccept();"
ondialogcancel="return onCancel();>
</dialog>
Javascriptでのイベントハンドラ登録に変更します。
document.addEventListener("dialogaccept", function(event) {
let ret = onAccept();
if (ret == -1) { //onAccept()がエラーを返したときに、ダイアログを閉じない場合
event.preventDefault();
}
});
document.addEventListener("dialogcancel", function(event) {
let ret = onCancel();
if (ret == -1) { //onCancel()がエラーを返したときに、ダイアログを閉じない場合
event.preventDefault();
}
});
0 件のコメント:
コメントを投稿