私は、コンテキストメニュー項目を追加する簡単なSafari拡張機能を開発しています。このメニュー項目をクリックすると、現在のページのデータで特定のタスクを実行できます。私のinjected-scripts.js
には、クリックしたタブのコンテキストメニューを表示するかどうかを決定する関数validForContextMenu
があります。この機能に加えて、私のglobal.html
に次のメッセージを送り、タブが私のコンテキストメニュー項目を表示するかどうかを知らせます。各タブのコンテキストメニュー項目を検証する
var contextMenuDisabled = true;
function respondToMessage(theMessageEvent) {
if (theMessageEvent.name === "validate") {
contextMenuDisabled = theMessageEvent.message;
}
}
safari.application.activeBrowserWindow.activeTab.addEventListener("message", respondToMessage, false);
function validateCommand(event) {
event.target.disabled = contextMenuDisabled;
}
safari.application.addEventListener("validate", validateCommand, false);
これがすべてという事実から離れて、かなり罰金を動作します:私は、メッセージに耳を傾けるinjected-scripts.js
によって返されたデータを格納し、実際の検証を実行するには、次のようにやっているglobal.html
で
safari.self.tab.dispatchMessage("validate", validForContextMenu());
バリデーションは一度だけ実行され、拡張機能がロードされたときに最前面にあるタブ/ページに対してのみ実行されます。そのページがコンテキストメニューに有効な場合は、他のすべてのページにもその逆のページが表示されます。私はバリデーションをSafarisタブごとに個別に実行したいと思います。
Caこれが行われますか?注射スクリプトやディスパッチされたメッセージの仕方に何か不足していますか?
おかげで、それは私が後だったまさにです! 'global.html'はシングルトンであり、各タブのユニークなインスタンスは、いくつかの方法で拡張の可能性を制限していたというのは理にかなっています。 – Simon