@DmitriyH
С++ разработчик

Google Chrome Extension: вывести данные в новой вкладке по нажатию кнопки

В разрабатываемом расширении для Google Chrome необходимо реализовать следующую функциональность: по нажатию на кнопку из browser_action вывести popup, а по нажатию на ссылку в popup-е, открыть новую вкладку и вывести туда некоторую динамически формируемую информацию из скриптов.
Вопрос такой: какой общепринятый способ реализации подобного функционала? Интересует набор частей расширения и способы их взаимодействия (т.е. основные имена классов/методов и ключевые слова).
Прежде чем задать вопрос, перепробовал множество вариантов, но в итоге наталкивался на различного рода ограничения.
Пример того, что попробовал:
- в popup.js открываю новую вкладку ("about:blank", "chrome://newtab", "chrome://extension/my_extension_page.html", "http:://something.com/") через chrome.tabs.create.
- в callback-е создания вкладки подписываюсь на событие обновления содержимого вкладки
- обработчике обновления вкладки, когда "completed" делаю предположение, что content_script.js уже запустился (в manifest-е он прописан как on_document_start) и подписался на custom-сообщения через chrome.runtime.onMessage.addListener.
- посылаю из popup.js сообщение в content_script.js созданной вкладки, в содержимом сообщения передаю информацию, которую нужно отобразить на созданной вкладке
- ожидаемый результат: в popup.js сработает обработчик custom-сообщения, получит необходимую информацию и обновит содержимое вкладки.
Пройти этот путь не получилось из-за следующих фактов:
- в about:blank, chrome::/extension/page.html не происходит инжекция content_script.js
- при создании новой вкладки в chrome::/newtab сообщение onUpdate не приходит для созданной вкладки. Несмотря на то, что content_script.js инжектируется в такую вкладку, он инжектируется слишком поздно. Поэтому сообщение из popup.js приходит слишком рано в content_script.js и, таким образом, пропускается.
- при открытии реально существующей интернет-страницы все работает, но считаю это ужасным костылем и не думаю, что это единственный способ реализации.
Пробовал также открывать некоторую страницу из extension-a, но из нее не получилось подписаться на custom-сообщения: chrome.runtime.onMessage для нее, похоже, недоступен. Костыль в виде "подождать секунду, пока content_script инжектируется в новой вкладке" тоже не хочу использовать.
Как сделать это с помощью background.js, не придумал, т.к. согласно документации, chrome.tabs.sendMessage() отправляется только в content_scripts.
  • Вопрос задан
  • 3793 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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