Упрощенный способ выполнить повторное использование вашего сообщения на основе коды сценария содержания в вашем пироге является обертыванием 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 или скрипт контента отправляет сообщение на глобальную страницу, а глобальная страница отвечает другим сообщением. Существуют и другие подходы, которые могут справиться с этим.
Вы правы, вам просто нужно жить с тем фактом, что некоторые аспекты архитектуры браузера отличаются друг от друга, пусть даже немного. –