Проверить пункт контекстного меню для каждой вкладки - PullRequest
0 голосов
/ 18 февраля 2012

Я разрабатываю простое расширение 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 Ответ

1 голос
/ 18 февраля 2012

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;
  };
};
...