Я хочу сделать простой пример дополнения Firefox, используя Native Messaging. Вот мой код:
Родное приложение:
void SendDataToExtension(string message)
{
_setmode(_fileno(stdout), O_BINARY);
try {
unsigned int len = message.length();
std::string message = "{\"text\": \"This is a response message\"}";
unsigned int lenStr = str.length();
std::cout << char(((lenStr >> 0) & 0xFF))
<< char(((lenStr >> 8) & 0xFF))
<< char(((lenStr >> 16) & 0xFF))
<< char(((lenStr >> 24) & 0xFF));
std::cout << str.c_str();
std::cout.flush();
}
catch (...) {
throw;
}
}
string OpenStandardStreamIn()
{
std::cout.setf(std::ios_base::unitbuf);
_setmode(_fileno(stdin), _O_BINARY);
unsigned int c, t = 0;
size_t pos = 0, m = 0;
std::string inp;
inp = "";
t = 0;
for (int i = 0; i <= 3; i++) {
t += (unsigned int)pow(256.0f, i) * getchar();
}
for (int i = 0; i < (int)t; i++) {
c = getchar();
inp += c;
}
return inp;
}
int _tmain(int argc, _TCHAR* argv[])
{
string input = "";
while ((input = OpenStandardStreamIn()) != "")
{
try
{
if (input.compare("ping")) {
SendDataToExtension("pong");
}
}
catch (...) { throw; }
}
return 0;
}
JS код:
var port = browser.runtime.connectNative("ping_pong");
port.onMessage.addListener((response) => {
console.log("Received: " + response);
});
browser.browserAction.onClicked.addListener(() => {
console.log("Sending: ping");
port.postMessage("ping");
});
Когда я добавил дополнение к Firefox, я получил 2 ошибки:
stderr output from native app ping_pong: File "ping_pong.exe", line 1
stderr output from native app ping_pong: SyntaxError: Non-ASCII character '\x90' in file ping_pong.exe on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
(У меня нет тега native-messaging. Поэтому я использовал тег chrome-native-messaging, но я хочу, чтобы этот пример работал на Firefox)
EDIT1:
Эти 2 ошибки — моя ошибка. Я просто удалил ‘python’ на ping_pong_win.bat, чтобы решить их.
Но у меня есть другая проблема. Когда я запускаю этот тест, это результат:
Sending: ping
Received: [object Object]
Похоже, родное приложение не работает.
EDIT2:
Я отладил, родное приложение получило сообщение «ping», но оно не может отправить ответное сообщение «pong»
Решено:
Собственное приложение отправило ответ в браузер, я просто напечатал неправильно: @@
port.onMessage.addListener((response) => {
console.log("Received: " + response.text);
});
Задача ещё не решена.
Других решений пока нет …