2012-02-18 10 views
0

私は、コンテキストメニュー項目を追加する簡単な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これが行われますか?注射スクリプトやディスパッチされたメッセージの仕方に何か不足していますか?

答えて

1

global.htmlはシングルトンであるため、すべてのタブで変数が1つだけcontextMenuDisabledになります。 Safariにはこのタスクの特別なAPIがあります - safari.self.tab.setContextMenuEventUserInfo

私の内線で次のコードを使用します。 global.jsで

document.addEventListener('contextmenu', onContextMenu, false); 

function onContextMenu(ev) { 
    var UserInfo = { 
    pageId: pageId 
    }; 
    var sel = document.getSelection(); 
    if (sel && !sel.isCollapsed) 
    UserInfo.isSel = true; 

    safari.self.tab.setContextMenuEventUserInfo(ev, UserInfo); 
}; 

:inject.jsで

safari.application.addEventListener('validate', onValidate, false); 

function onValidate(ev) { 
    switch (ev.command) { 
    case 'DownloadSel': 
    if (!ev.userInfo || !ev.userInfo.isSel) 
     ev.target.disabled = true; 
    break; 
    }; 
}; 
+0

おかげで、それは私が後だったまさにです! 'global.html'はシングルトンであり、各タブのユニークなインスタンスは、いくつかの方法で拡張の可能性を制限していたというのは理にかなっています。 – Simon

関連する問題