Может ли файл манифеста быть динамическим в приложениях Chrome?

Я пишу приложение Chrome, которое взаимодействует с веб-страницей. Для этого я добавил нечто подобное в свой файл манифеста.

"externally_connectable": {
  "matches": ["*://*.example.com/*"]
}

Но «example.com» должен быть динамичным, поскольку у отдельных клиентов есть свой один веб-сервер.

Есть ли возможность, пользователь (который установил приложение) может изменить внешний_подключаемый сайт / ы.


person Hiran    schedule 08.12.2015    source источник
comment
Нет. Его нельзя редактировать после упаковки / установки расширения. И API для установки доменов в скрипте тоже нет.   -  person Moin    schedule 08.12.2015
comment
Я предполагаю, что вам придется изменить архитектуру связи и использовать сценарии содержимого, которые вводятся динамически, когда URL-адрес соответствует настроенному значению, сохраненному в локальном хранилище расширения.   -  person wOxxOm    schedule 08.12.2015
comment
Мони. Есть ли у вас альтернативные предложения по решению моей проблемы?   -  person Hiran    schedule 09.12.2015
comment
Вы нашли рабочее решение с этим?   -  person Mouneer    schedule 09.08.2016
comment
@Mouneer нет, я не видел, и, кажется, ты не можешь.   -  person Hiran    schedule 10.08.2016


Ответы (2)


Существует альтернативный способ связи веб-страницы с расширением через сценарий содержимого. Этот подход можно использовать, если и веб-страница, и расширение созданы вами.

E.g.

веб-страница ‹--> сценарий содержимого расширения ‹--> фоновый сценарий расширения ‹--> собственное приложение

Для сценария связи веб-страницы с содержимым расширения используйте window.postMessage и window.addEventListener

Для браузера Google Chrome

Для сценария содержимого расширения к фоновому сценарию связи расширения используйте chrome.runtime.sendMessage и chrome.runtime.onMessage.addListener

Для фонового сценария расширения для взаимодействия с собственным приложением используйте chrome.runtime.sendNativeMessage

Убедитесь, что в вашем коде есть необходимая защита.

person Chamit Arachchi    schedule 07.06.2019

Насколько мне известно, "externally_connectable" - единственный официальный способ отправки сообщений (с данными) с веб-страницы, как упоминалось здесь

Это требует предопределенных значений для каждого отдельного домена. Но что, если вы хотите сделать только одно расширение для приема сообщений с любой веб-страницы?

Если вы просто хотите уведомить другую сторону о чем-то, вы можете использовать нативный JS Event, отправляя его на document с одной стороны и прослушивая его на document также с другой стороны, поскольку document совместно используется страницами расширения content script и страница в Интернете.

Вы не можете использовать JS CustomEvent для отправки данных, поскольку каждый раз, когда вы отправляете данные, вы получаете их пустыми в результате sandbox эффекта любого расширения.

Если вы хотите обмениваться данными, то единственный обходной путь, который я знаю до сих пор, - после того, как я потратил около месяца на разработку расширения - должен иметь комбинацию между каким-то хранилищем и JS собственным механизмом событий.

Пошаговое решение (предположим, вам нужна веб-страница для отправки некоторых данных в расширение):

  1. Сделайте событие document с веб-страницы.
  2. Временно сохраните данные в любой технологии хранения, которую вы предпочитаете (localStorage, сам DOM или что-то еще ...)
  3. Получите событие на другой стороне (расширение), прослушивая document.
  4. Прочтите данные и удалите их.

Надеюсь, это поможет кому-то или откроет дверь для обсуждения, как это лучше сделать.

person Mouneer    schedule 09.09.2016