いいえ、別のイベント リスナーよりも優れたパフォーマンスを発揮し、セッションでのアドオンのアンロードと互換性のあるイベント リスナーを回避する適切な方法はありません。
フッキングnsContextMenu
既に述べたように、状態は を介して初期化されgContextMenu = new nsContextMenu(...)
ます。そのため、フックする必要がありますが、これは実際には非常に簡単です。
var newProto = Object.create(nsContextMenu.prototype);
newProto.initMenuOriginal = nsContextMenu.prototype.initMenu;
newProto.initMenu = function() {
let rv = this.initMenuOriginal.apply(this, arguments);
console.log("ctx", this.onImage, this); // Or whatever code you'd like to run.
return rv;
};
nsContextMenu.prototype = newProto;
さて、最初の質問は、実際にパフォーマンスが向上するかどうかです。結局のところ、これはプロトタイプチェーンに別のリンクを導入しただけです。もちろん、回避Object.create
して直接オーバーライドすることもできますnsContextMenu.prototype.initMenu
。
しかし、本当の問題は次のとおりです。フックを再び削除するにはどうすればよいでしょうか。回答: 他のアドオンがあなたの後に同じものをフックした可能性があり、フックを解除すると他のアドオンもフック解除されるため、実際にはできません。ただし、参照を削除する必要があります。削除しないと、アドオンを無効化/アンインストールしたときにメモリ リークが発生します。まあ、あなたは と戦うことができますがComponents.utils.makeObjectPropsNormal
、それは閉ざされた変数にはあまり役に立ちません。では、クロージャーは避けましょう...うーん...イベントリスナーやオブザーバーなど、何らかのメッセージが必要になるでしょう...そして振り出しに戻ります。
また、私はこれを正気とは呼びません
document.getElementById("contentAreaContextMenu").addEventListener(...)
私はそれを「測定可能な利益のないやり過ぎ」と呼んでいます。
オーバーライドonpopupshowing=
をオーバーライドできます<menupopup onpopupshowing=
。ええ、それは飛ぶかもしれません...他のアドオンが同じ考えを持っているかもしれないことを除いて、互換性地獄へようこそ. また、これには再びウィンドウへのプッシュが含まれます。これにより、クロスコンパートメント ラッパーが発生し、エラーが発生しやすくなります。
これは解決策ですか?たぶん、しかし正気ではありません。
ほかに何か?
それほど多くはありません。