2012-02-18 34 views
0

我正在開發一個簡單的Safari擴展程序,該擴展程序添加了一個上下文菜單項,點擊該按鈕後,可以使用當前頁面上的數據執行特定任務。在我的injected-scripts.js中,我有一個功能validForContextMenu,它確定是否應該爲點擊的選項卡顯示上下文菜單。隨着此功能,我正在向我的global.html發送以下消息,以便讓它知道該選項卡是否應顯示我的上下文菜單項。驗證每個選項卡的上下文菜單項

safari.self.tab.dispatchMessage("validate", validForContextMenu()); 

global.html我做下面來聽消息,存儲由injected-scripts.js返回的數據,並進行了實際驗證:

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); 

這一切都源自一個事實,即會感覺越來越天晴驗證只執行一次,並且只有在我的擴展程序加載時最前面的選項卡/頁面。如果該頁面對於上下文菜單有效,則所有其他頁面也是如此,反之亦然。我希望單獨爲每個Safaris選項卡執行驗證。

這可以做到嗎?我在注入腳本或派發消息的方式上錯過了一些東西嗎?

回答

1

global.html是單身人士,因此您的所有選項卡只有一個變量contextMenuDisabled。 Safari爲此任務提供了特殊的API - safari.self.tab.setContextMenuEventUserInfo

我在我的擴展中使用下一個代碼。在inject.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); 
}; 

在global.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 2012-02-19 11:05:46