Инициировать сообщение из хост-приложения в расширение Chrome

0

Мне удалось отправить сообщение с расширения chrome в приложение native (C++) благодаря хорошим людям. Когда приложение-хозяин получает сообщение, оно может возвращать любые данные ответа. Тем не менее, это в ответ на родное приложение, получающее данные от расширения. Кроме того, сообщение, отправленное расширением, не является синхронным, и поэтому расширение не ожидает ответа от основного приложения.

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

Я в основном хочу добиться следующего: я хочу опубликовать сообщение о таких событиях, как webRequest.OnBeforeSendHeaders, и я хочу, чтобы ответ на сообщение решил, должен ли я блокировать запрос url. Если получение ответа будет вызвано обратным вызовом, это будет главным образом в другом потоке, и это не позволит мне ждать ответа в потоке webRequest.OnBeforeSendHeaders. Есть ли способ, которым я могу приостановить webRequest.OnBeforeSendHeaders, пока я жду, когда родное приложение ответит на мой запрос? Или может webRequest.OnBeforeSendHeaders заглянуть в буфер сообщений (в цикле), чтобы узнать, ответили ли родное приложение?

Или есть альтернативный способ добиться этого?

  • 0
    Действительно, кажется, что вы столкнулись с проблемой асинхронного обратного вызова. Я не думаю, что это возможно без большого взлома, см. Обсуждение здесь: stackoverflow.com/questions/15124995/…
  • 0
    Теперь это совсем другой вопрос. Пожалуйста, сделайте и то, и другое: 1) откатите правку, 2) задайте другой вопрос.
Теги:
google-chrome-extension
chrome-native-messaging

2 ответа

1

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

Описание того, как работать с родными приложениями, приведено здесь: https://developer.chrome.com/extensions/messaging#native-messaging. Описано, что вы можете передать, например, stdio параметру type. Затем, когда вы отправляете данные в приложение, Chrome записывает в stdin. Вы можете отправлять сообщения назад (т.е. Отвечать на что-либо) с помощью stdout (в случае C++: распечатать его через cout). В родном приложении вам не нужно знать, что ваше родное приложение на самом деле является родным для Chrome. Он просто должен знать, что он получил данные от stdin и отправляет данные через stdout.

  • 0
    Я понимаю, что вы говорите о том, что все в chrome асинхронно. Несмотря на то, что это эффективно, для меня это проблема из-за следующего:
  • 0
    Я хочу опубликовать сообщение о таких событиях, как webRequest.OnBeforeSendHeaders, и я хочу, чтобы ответ на сообщение решил, следует ли мне блокировать запрос URL. Если получение ответа будет происходить по обратному вызову, это будет в основном в другом потоке, и это не позволит мне ждать ответа в потоке webRequest.OnBeforeSendHeaders. Есть ли способ приостановить webRequest.OnBeforeSendHeaders, пока я жду, пока собственное приложение ответит на мой запрос? Или webRequest.OnBeforeSendHeaders может заглянуть в буфер сообщений (в цикле), чтобы увидеть, ответило ли нативное приложение?
Показать ещё 1 комментарий
0

По дизайну вы не можете инициировать подключение из собственного приложения.

Для каждого открытого порта Chrome запускает экземпляр вашего приложения. Если вы хотите, чтобы приложение отправляло обновления, вам нужно открыть порт на стороне Chrome и оставить его открытым.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню