2013-05-13 2 views
3

У меня есть расширитель Safari, который должен связываться со своей глобальной страницей. Из сценария содержания я используюОтправка сообщений с расширением Safari на глобальную страницу

safari.self.tab.dispatchMessage(name,data); 

для этого. Из popover я не нашел способ сделать это. Я знаю, что я могу получить доступ к методам в глобальной странице непосредственно

safari.extension.globalPage.contentWindow 

, но моя цель состояла в том, чтобы повторно использовать фрагменты кода, которые уже используются в контент-скриптов. Я делаю то же самое для версии chrome для плагина.

Есть код немного умный прокси-сервер, который эмулирует

safari.self.tab.dispatchMessage(name,data); 

из пирога?

ответ

3

Чтобы быть честным, вероятно, просто проще иметь другой код в своем popover и вставлять скрипты. Если вы действительно хотите, вы могли бы сделать что-то вроде этого:

function dispatchMessage(name, message) { 
    if (safari.self.tab) { 
     safari.self.tab.dispatchMessage(name, message); 
    } else if (safari.extension.globalPage.contentWindow) { 
     safari.extension.globalPage.contentWindow.handleMessage({name: name, message: message}); 
    } 
} 

Тогда просто использовать dispatchMessage('foo', 'bar') как в вашем пироге и впрыскивается сценарии. Это немного взломанно, потому что объект события сообщения обычно имеет больше информации об этом, чем только name и message, и вы должны убедиться, что ваша функция handleMessage на самом деле является той же функцией, которая назначается как прослушиватель событий message на глобальной странице ,

+0

Вы правы, вам просто нужно жить с тем фактом, что некоторые аспекты архитектуры браузера отличаются друг от друга, пусть даже немного. –

2

Упрощенный способ выполнить повторное использование вашего сообщения на основе коды сценария содержания в вашем пироге является обертыванием safari.self.tab.dispatchMessage вызовов в функции абстракции, которые я опишу ниже ...

Но первый, что вам нужно сделать обязательно иметь один с именем функции обработчика в вашей глобальной странице, которая обрабатывает все сообщения, как это:

function handleMessage(evt) { 
    switch (evt.name) { 
     case 'Message1': 
      // do something with evt.message 
     break; 
     case 'Message2': 
      // do something else with evt.message 
     break; 
    } 
} 

safari.application.addEventListener('message', handleMessage, false); 

Если у вас есть отдельные обработчики для каждого отдельного сообщения, или если вы используете анонимные функции, этот подход будет не работа.

Теперь функция обертка, которая идет в вашем и пирог сценариев контента очень проста:

function tellGlobalPage(msgName, msgData) { 
    if (safari.self instanceof SafariExtensionPopover) { 
     // this script is running in a popover 
     var fakeMsgEvt = { name: msgName, message: msgData }; 
     safari.extension.globalPage.contentWindow.handleMessage(fakeMsgEvt); 
    } else { 
     // this script is a content script 
     safari.self.tab.dispatchMessage(msgName, msgData); 
    } 
} 

И тогда вместо safari.self.tab.dispatchMessage(name, data), вы используете tellGlobalPage(name, data).

Пожалуйста, обратите внимание, что этот упрощенный подход не занимается с обменом сообщениями туда и обратно, где popover или скрипт контента отправляет сообщение на глобальную страницу, а глобальная страница отвечает другим сообщением. Существуют и другие подходы, которые могут справиться с этим.

+0

К сожалению ... Мэтт Суэйн опубликовал тот же ответ, пока я сочинял мой. – canisbos