Вопросы о расширении Safari

Я нахожусь в процессе создания моего первого расширения Safari - очень простого - но я столкнулся с несколькими проблемами. Расширение сводится к единственному, введенному сценарию, который пытается обойти собственный обработчик каналов и перенаправление к URI http://. Мои проблемы до сих пор являются двукратными:

  1. "Белый список" не прокладывает себе путь, я ожидал бы. Так как всю подачу показывают под "feed://" протокол, я попытался получить это в белом списке как "feed://*/*" (ни с чем в черном списке), но я заканчиваю в цикле запроса, который я не могу понять. Если я установил значения черного списка "http://*/*" и "https://*/*", все работает как ожидалось.
  2. Я не могу выяснить, как получить доступ к моим настройкам из моего введенного сценария. Сценарий создает a beforeload обработчик событий, но не может получить доступ к моим настройкам с помощью safari.extension.settings путь обозначается в документации.

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

Что я пропускаю?

ОБНОВИТЕ, Таким образом, я надеюсь, что документация является неполной, потому что это - плачевная граница, но я узнал немного о настройках. Оказывается что, из инжекционных сценариев, SafariExtensionSettings объект не доступен. Инжекционные сценарии только имеют доступ к SafariContentExtension объект (который не полезен вообще), но это искажается точно тем же способом (safari.extension.settings) - плохая идея, IMO. Как указано в инжекционной документации сценария:

Важный: при использовании safari.extension из введенного сценария Вы не обращаетесь к классу SafariExtension. Вы обращаетесь к классу SafariContentExtension.

Необходимо использовать систему обмена сообщениями, чтобы говорить с глобальным файлом HTML, который имеет доступ к настройкам. Это является довольно сдвинутым, но у меня есть сообщение, отправляемое в a global.html файл, который получает настройки и передаст сообщение обратно моему инжекционному сценарию, как только я выясняю, как пойти о выполнении этого.

Так как я делаю всю свою работу перед загрузками документа, все методы, которые я нашел для передачи сообщения обратно, полагаются на объект страницы, который я не имею.

12
задан Cœur 15 June 2019 в 10:17
поделиться

3 ответа

Это заняло у меня несколько дней, но я думаю, что нашел работоспособное решение, используя метод обмена сообщениями canLoad () . Мой сценарий внедрения извлекает настройки, вызывая глобальную HTML-страницу следующим образом:

settings = safari.self.tab.canLoad( event );

Мой глобальный HTML-файл, в свою очередь, возвращает эти настройки как:

settings = {
  'setting1': safari.extension.settings.getItem( 'setting1' )
}

msgEvent.message = settings;

Это все еще немного более «взломано», чем мне бы хотелось. Кажется, я не могу просто вернуть сам объект настроек, поэтому мне приходится скомпилировать новый объект, извлекая каждый параметр вручную. Не идеально, но кажется эффективным.

2
ответ дан 2 December 2019 в 21:42
поделиться

Как и все остальные на данный момент, я все еще поднимаюсь по кривой обучения, но вот как я справился с этой проблемой:

У меня есть простое расширение без хрома и один внедренный конечный скрипт (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" );
}() )
6
ответ дан 2 December 2019 в 21:42
поделиться

РЕДАКТИРОВАТЬ: как вы сказали в своем первоначальном пост-обновлении, внедренный скрипт не имеет такого же типа доступа, как глобальная 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 ). Ошибка или предполагаемая функция, которую еще предстоит выяснить.

3
ответ дан 2 December 2019 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: