Где зарегистрировать собственный хост обмена сообщениями в 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) вы можете делать все, что захотите (например, запускать локальные скрипты). Убедитесь, что на сервере реализована правильная аутентификация (для предотвращения несанкционированного доступа других веб-сайтов или расширений) (и предпочтительно привязка к локальному адресу только для того, чтобы сделать сервер недоступным по сети).

Другие вопросы по тегам