Мне удалось отправить сообщение из расширения Chrome в собственное (C ++) приложение благодаря хорошим людям из-за переполнения стека.
Как только приложение для собственного хоста получит сообщение, оно может вернуть любые данные ответа. Однако это происходит в ответ на то, что собственное приложение получает данные от расширения. Кроме того, сообщение, отправляемое расширением, не является синхронным, и поэтому расширение не ожидает ответа от хост-приложения.
Мое требование состоит в том, чтобы инициировать соединение comms из собственного приложения, т.е. мое собственное приложение будет периодически отправлять обновления расширению chrome.
Есть ли какой-либо механизм для инициирования отправки сообщения из собственного приложения и передачи его соответствующему расширению Chrome?
Я в основном хочу добиться следующего:
Я хочу опубликовать сообщение о таких событиях, как webRequest.OnBeforeSendHeaders, и хочу, чтобы ответ на сообщение решил, следует ли мне блокировать запрос URL. Если получение ответа будет происходить по обратному вызову, это будет в основном в другом потоке, и это не позволит мне ждать ответа в потоке webRequest.OnBeforeSendHeaders.
Есть ли способ приостановить webRequest.OnBeforeSendHeaders, пока я жду, пока собственное приложение ответит на мой запрос? Или webRequest.OnBeforeSendHeaders может заглянуть в буфер сообщений (в цикле), чтобы увидеть, ответило ли нативное приложение?
Или есть альтернативный способ добиться этого?
Ничто в хроме не является синхронным. Это одна из причин, по которой хром вряд ли замерзнет. Но это не проблема. Вы можете легко достичь желаемого даже с помощью асинхронного кода, это просто еще один шаблон, которому вы должны следовать.
Описание того, как продолжить работу с нативными приложениями, находится здесь: https://developer.chrome.com/extensions/messaging#native-messaging. Там описано, что вы можете передать, например stdio
к параметру типа. Затем, когда вы отправляете данные в приложение, Chrome пишет stdin
, Вы можете отправлять сообщения обратно (т.е. отвечать на что-то), используя stdout
(в случае C ++: распечатайте это через cout
). В нативном приложении вам не нужно знать, что ваше нативное приложение на самом деле является нативным приложением Chrome. Нужно просто знать, что он получил данные от stdin
и отправляет данные через stdout
,
По замыслу вы не можете инициировать соединение из собственного приложения.
Для каждого открытого порта Chrome запускает экземпляр вашего приложения. Если вы хотите, чтобы приложение отправляло обновления, вам нужно открыть порт на стороне Chrome и оставить его открытым.