Синхронная передача сообщений в расширениях Chrome? - PullRequest
10 голосов
/ 22 октября 2010

Я пытаюсь заблокировать загрузку файла сценария на определенные пользователем веб-сайты. Чтобы заблокировать файл скрипта, я использую beforeload event и event.preventDefault(); в скрипте контента, который работает нормально, если я уже знаю список веб-сайтов. Моя проблема в том, что я не знаю список веб-сайтов заранее, поэтому, чтобы получить список веб-сайтов, я отправляю запрос на фоновую страницу, но ответ является асинхронным и не может использоваться.

Есть ли какие-либо синхронные сообщения, передаваемые в расширениях Chrome, которые я, возможно, пропустил в документах Google?

// my (simplified) code from content script:
document.addEventListener("beforeload", function(event)
{
  chrome.extension.sendRequest({fnc:"is_owner"}, function(response)
  {
    // asynchronous response is not usable because
    // all scripts have already been loaded
    if (response.is_owner) event.preventDefault();
  });
}, true);

Ответы [ 2 ]

8 голосов
/ 22 октября 2010

К сожалению, нет. Существует отчет об ошибке , открытый об отсутствии синхронной передачи сообщений, возможно, если достаточное количество людей отметит это, они что-то предпримут.

1 голос
/ 09 июля 2014

Вы можете использовать файловый API HTML5 (navigator.webkitTevenStorage или устаревший устаревший window.webkitStorageInfo с параметром TEMPORARY) для сохранения настроек в файле.Эта часть является асинхронной, но вы можете сделать это из фона, страницы настроек или всплывающего окна.Этот API может измениться на вас, так как он еще не стандартизирован.Поскольку это временное хранилище, вашей фоновой странице может потребоваться постоянная работа, чтобы Chrome не удалял файл.

Затем из сценария содержимого вы можете использовать синхронный XMLHttpRequest для получения файла из "filesystem:" + chrome.extension.getURL ("временный /" + имя файла).Префикс «filesystem:» в URL-адресе довольно важен.

Лучше всего использовать API-интерфейс chrome.storage (или localStorage) для своих настроек и перехватить событие onChanged, чтобы обновить временный файл.Если вам нужно перезагрузить страницу после изменения настроек, вы захотите сделать это в обратном вызове из операции записи FileSystem, чтобы вы знали, что скрипт содержимого может увидеть это изменение.

Это не требует каких-либоспециальные разрешения в манифесте.Я лично проверил это в Chrome 35, но я знаю, что это работало и в более ранних версиях.Однако я не знаю требования к минимальной версии.Я помню упоминание о регрессе, связанном с изменением безопасности, в Chrome 33, где он не работал, но был быстро исправлен.

Я видел несколько других обходных путей (например, перенаправление на URL-адрес BLOB-объекта или URI данных из onBeforeWebRequest) для настройки параметров в сценариях содержимого до запуска собственных сценариев страницы, но, насколько я могу судить, все они были намеренно повреждены в последних версиях Chrome из-за общих улучшений безопасности XSS и расширений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...