验证每个选项卡的上下文菜单项

时间:2012-02-18 15:52:26

标签: javascript macos safari safari-extension

我正在开发一个简单的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 个答案:

答案 0 :(得分: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;
  };
};