次のような関数でページ情報をロードする Firefox 拡張機能があります。
var title = content.document.title;
var url = content.document.location.href;
この関数は、拡張機能が作成するコンテキスト メニュー項目をユーザーが選択すると実行されます。マルチプロセス Firefox ( Electrolysis、別名 e10s) はコンテンツへの直接アクセスをサポートしていないため、これは機能しなくなりました。このコードをフレーム スクリプトに分解しようとしていますが、すべてが非同期に見えるため、このコードを "呼び出す" 方法を理解するのに問題があります。これが私の単純なフレームスクリプトであるべきだと思うものです:
// Frame script
function getPageInfo()
{
sendSyncMessage("my-add-on@me.com:page-info-loaded", {
pageURL : content.document.location.href,
pageTitle : content.document.title
});
}
addMessageListener("my-add-on@me.com:get-page-info", getPageInfo);
関連するクロムコードは次のようになるはずです。
// Chrome script
function onContextItem()
{
let browserMM = gBrowser.selectedBrowser.messageManager;
browserMM.loadFrameScript("chrome://my-add-on/content/frame-script.js", true);
browserMM.sendAsyncMessage("my-add-on@me.com:get-page-info");
}
function onInfoLoaded(message)
{
var url = message.data.pageURL;
var title = message.data.pageTitle;
// Do something with url and title
}
gBrowser.selectedBrowser.messageManager
.addMessageListener("my-add-on@me.com:page-info-loaded", onInfoLoaded);
私が抱えている問題は、(a)これがこれを処理する正しい方法なのか、(b)ここでのタイミングがどのように機能するのかを完全に理解していないことです。このメッセージング システムは非同期であるため、関心のあるデータが使用できる時間内に戻ってくる保証はありません。Mozilla が提供する例はどれも、私がやろうとしていることに適合していないようです。明らかな何かが欠けていますか?拡張コードを変換して e10s をサポートする方法を示すより良い例はどこにありますか?