Где зарегистрировать собственный хост обмена сообщениями в Chrome OS
В этой документации есть расположение для Windows, Mac OS и Linux.
Я предполагал, что Chrome OS будет работать так же, как "стандартный" Linux, но я не мог заставить работать мое приложение...
com.my_app.host.json (находится в / etc / opt / chrome / native-messaging-hosts /)
{
"name": "com.my_app.host",
"description": "My Host",
"path": "/home/user/bfd93db2180e0d7645b1f4cce2d2c7ed9e0d835c/Downloads/host.sh",
"type": "stdio",
"allowed_origins": [
"chrome-extension://APP_ID/"
]
}
main.js
var port = null;
var getKeys = function(obj) {
var keys = [];
for (var key in obj) {
keys.push(key);
}
return keys;
}
function appendMessage(text) {
document.getElementById('response').innerHTML += "<p>" + text + "</p>";
}
function updateUiState() {
if (port) {
document.getElementById('connect-button').style.display = 'none';
document.getElementById('input-text').style.display = 'block';
document.getElementById('send-message-button').style.display = 'block';
} else {
document.getElementById('connect-button').style.display = 'block';
document.getElementById('input-text').style.display = 'none';
document.getElementById('send-message-button').style.display = 'none';
}
}
function sendNativeMessage() {
message = {
"text": document.getElementById('input-text').value
};
port.postMessage(message);
appendMessage("Sent message: <b>" + JSON.stringify(message) + "</b>");
}
function onNativeMessage(message) {
appendMessage("Received message: <b>" + JSON.stringify(message) + "</b>");
}
function onDisconnected() {
appendMessage("Failed to connect: " + chrome.runtime.lastError.message);
port = null;
updateUiState();
}
function connect() {
var hostName = "com.my_app.host";
appendMessage("Connecting to native messaging host <b>" + hostName + "</b>")
port = chrome.runtime.connectNative(hostName);
port.onMessage.addListener(onNativeMessage);
port.onDisconnect.addListener(onDisconnected);
updateUiState();
}
document.addEventListener('DOMContentLoaded', function() {
document.getElementById('connect-button').addEventListener(
'click', connect);
document.getElementById('send-message-button').addEventListener(
'click', sendNativeMessage);
updateUiState();
});
index.html
<html>
<head>
<script src='./main.js'></script>
</head>
<body>
<button id='connect-button'>Connect</button>
<input id='input-text' type='text' />
<button id='send-message-button'>Send</button>
<div id='response'></div>
</body>
</html>
Это просто говорит:
Подключение к собственному хосту обмена сообщениями com.my_app.host
Не удалось подключиться: указанный собственный узел обмена сообщениями не найден.
Также я не могу включить ведение журнала, как объяснено в документации, потому что в Chrome OS вы не можете просто открыть Chrome с помощью команды.
Было бы здорово, если бы кто-то мог мне помочь:)
По сути, я просто хочу создать небольшой графический интерфейс для запуска команд Crouton.
1 ответ
Chrome OS не поддерживает сторонние узлы обмена сообщениями. На момент написания статьи поддерживается только два собственных хоста обмена сообщениями. Один для тестирования, другой для удаленного рабочего стола Chrome (источник: native_message_host_chromeos.cc).
В Chrome OS журналы доступны по адресу /var/log/chrome/chrome
а также /var/log/ui/ui.LATEST
, Есть и другие способы чтения / переключения журнала (см. https://dev.chromium.org/chromium-os/how-tos-and-troubleshooting/building-chromium-browser устранение неисправностей/building-chromium-browser#TOC-Debugging и https://github.com/ds-hwang/wiki/wiki/Build-Chromium-for-Chromium-OS-and-Deploy-to-real-device).
Но отсутствие встроенной поддержки для хостов обмена сообщениями не означает, что вы не можете достичь того, чего хотите. Запустите локальный HTTP-сервер в Crouton и установите связь между расширением / приложением Chrome и HTTP-сервером через стандартные веб-API (XMLHttpRequest
, fetch
, WebSocket
...) На сервере (запущенном в Crouton) вы можете делать все, что захотите (например, запускать локальные скрипты). Убедитесь, что на сервере реализована правильная аутентификация (для предотвращения несанкционированного доступа других веб-сайтов или расширений) (и предпочтительно привязка к локальному адресу только для того, чтобы сделать сервер недоступным по сети).