Я нахожусь в процессе создания моего первого расширения Safari - очень простого - но я столкнулся с несколькими проблемами. Расширение сводится к единственному, введенному сценарию, который пытается обойти собственный обработчик каналов и перенаправление к URI http://. Мои проблемы до сих пор являются двукратными:
beforeload
обработчик событий, но не может получить доступ к моим настройкам с помощью safari.extension.settings
путь обозначается в документации.Я не нашел, что что-либо в документации Apple указывает, что настройки не должны быть доступными из моего сценария. Так как расширения являются такой новой возможностью, даже возвраты Google, которые ограниченные релевантные результаты и большинство из тех из официальной документации.
Что я пропускаю?
ОБНОВИТЕ, Таким образом, я надеюсь, что документация является неполной, потому что это - плачевная граница, но я узнал немного о настройках. Оказывается что, из инжекционных сценариев, SafariExtensionSettings
объект не доступен. Инжекционные сценарии только имеют доступ к SafariContentExtension
объект (который не полезен вообще), но это искажается точно тем же способом (safari.extension.settings
) - плохая идея, IMO. Как указано в инжекционной документации сценария:
Важный: при использовании safari.extension из введенного сценария Вы не обращаетесь к классу SafariExtension. Вы обращаетесь к классу SafariContentExtension.
Необходимо использовать систему обмена сообщениями, чтобы говорить с глобальным файлом HTML, который имеет доступ к настройкам. Это является довольно сдвинутым, но у меня есть сообщение, отправляемое в a global.html
файл, который получает настройки и передаст сообщение обратно моему инжекционному сценарию, как только я выясняю, как пойти о выполнении этого.
Так как я делаю всю свою работу перед загрузками документа, все методы, которые я нашел для передачи сообщения обратно, полагаются на объект страницы, который я не имею.
Это заняло у меня несколько дней, но я думаю, что нашел работоспособное решение, используя метод обмена сообщениями canLoad ()
. Мой сценарий внедрения извлекает настройки, вызывая глобальную HTML-страницу следующим образом:
settings = safari.self.tab.canLoad( event );
Мой глобальный HTML-файл, в свою очередь, возвращает эти настройки как:
settings = {
'setting1': safari.extension.settings.getItem( 'setting1' )
}
msgEvent.message = settings;
Это все еще немного более «взломано», чем мне бы хотелось. Кажется, я не могу просто вернуть сам объект настроек, поэтому мне приходится скомпилировать новый объект, извлекая каждый параметр вручную. Не идеально, но кажется эффективным.
Как и все остальные на данный момент, я все еще поднимаюсь по кривой обучения, но вот как я справился с этой проблемой:
У меня есть простое расширение без хрома и один внедренный конечный скрипт (script.js) . Для загрузки настроек я добавил простую глобальную страницу (proxy.html). Когда вводится script.js, он отправляет сообщение getSettings
в proxy.html. proxy.html отвечает сообщением setSettings
, и script.js продолжает инициализацию.
Самая полезная страница, которую я нашел в документации по этой теме, - это Сообщения и прокси .
proxy.html:
<!doctype html>
<html lang="en">
<head>
<script type="text/javascript">
safari.application.addEventListener( "message", function( e ) {
if( e.name === "getSettings" ) {
e.target.page.dispatchMessage( "setSettings", {
sort_keys: safari.extension.settings.getItem( "sort_keys" )
} );
}
}, false );
</script>
</head>
<body></body>
</html>
script.js:
( function() {
var settings, init = function() {
// do extension stuff
};
// listen for an incoming setSettings message
safari.self.addEventListener( "message", function( e ) {
if( e.name === "setSettings" ) {
settings = e.message;
init();
}
}, false );
// ask proxy.html for settings
safari.self.tab.dispatchMessage( "getSettings" );
}() )
РЕДАКТИРОВАТЬ: как вы сказали в своем первоначальном пост-обновлении, внедренный скрипт не имеет такого же типа доступа, как глобальная HTML-страница. Это мое рабочее решение. Представьте, что вы хотите узнать значение параметра «foo» во внедренном скрипте:
Введенный код скрипта:
function getMessage(msgEvent) {
if (msgEvent.name == "settingValueIs")
alert("Value for asked setting is: " + msgEvent.message);
}
safari.self.tab.dispatchMessage("getSettingValue", "foo"); // ask for value
safari.self.addEventListener("message", getMessage, false); // wait for reply
Глобальный HTML-код:
function respondToMessage(messageEvent) {
if (messageEvent.name == "getSettingValue") {
// getItem("foo");
var value = safari.extension.settings.getItem(messageEvent.message);
// return value of foo to injected script
safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("settingValueIs", value);
}
}
safari.application.addEventListener("message",respondToMessage,false);
Надеюсь, это поможет!
Первоначальное сообщение: У меня такая же вторая проблема, как и у вас, я не могу получить доступ к своим настройкам (или secureSettings) из внедренного скрипта. В моем случае скрипт загружается после загрузки страницы, но даже в этом случае я не могу использовать safari.extension.settings
.
Единственный способ, которым это работает, - это панель / кнопка, HTML-код этого элемента может getItem
и setItem
, как и ожидалось.
Я пришел к выводу, что по какой-то причине внедренные скрипты не могут получить доступ к настройкам (на самом деле, похоже, они даже не имеют доступа к элементу safari
). Ошибка или предполагаемая функция, которую еще предстоит выяснить.