Сценарии содержимого sendMessage получает ноль назад, если на странице параметров есть прослушиватель onMessage - PullRequest
0 голосов
/ 19 мая 2018

У меня есть аддон с веб-расширением, который состоит из моих фоновых скриптов, скриптов контента и страницы options_ui.Сценарии содержимого сообщают фоновому сценарию, используя browser.runtime.sendMessage, и ожидают ответ от него с информацией, которая ему нужна, довольно часто.Фоновый сценарий слушает с browser.runtime.onMessage.addListener.

. На странице параметров выполняется действие, которое может занять от 1 до 5 минут, поэтому он сообщает фоновому сценарию об этом, а фоновый сценарий отвечает обновлением каждые1% до browser.tabs.sendMessage.Пейджер параметров регистрирует прослушиватель browser.runtime.onMessage для прослушивания этого обновления.

Проблема заключается в том, что, пока страница параметров открыта, сценарии содержимого не могут получать ответы от фонового сценария.Любой ответ, который он получает, всегда нулевой.Фоновый сценарий определенно получает запрос от сценария содержимого и ответ с правильной информацией, но сценарий не получает ответ.Даже если у меня открыто несколько скриптов контента, и если я регистрирую слушателя browser.runtime.onMessage на каждом из них, как я делаю для страницы параметров, он работает , пока страница параметров закрыта .

Я не совсем уверен, что здесь происходит или каковы следующие шаги.Я знаю, что в документации для runtime.onMessage говорится, что только один слушатель может ответить, если два зарегистрированы в одном и том же документе, но если страница параметров не считается тем же документом, что и фоновый скрипт, это на самом деле не имеет смысла.Я знаю, что это проблема не только Firefox, так же как и в Chrome.

1 Ответ

0 голосов
/ 29 мая 2018

Я не смог найти никакой документации, которая объясняет или документирует, что страница параметров также является частью страниц

Примечание: Если несколько страниц прослушивают события onMessage, только первый вызов sendResponse () для конкретного события удастся отправить ответ.Все остальные ответы на это событие будут игнорироваться.

Но, как указано в документации

https://developer.chrome.com/extensions/messaging#connect

Долгоживущие соединения

Иногда полезно иметь разговор, который длится дольше, чем один запрос и ответ.В этом случае вы можете открыть долгоживущий канал из вашего скрипта контента на страницу расширения или наоборот, используя runtime.connect или tabs.connect, соответственно.При желании канал может иметь имя, позволяющее различать различные типы соединений.

Вы должны использовать connect для своего варианта использования

...