Я просто решил это сам. Сначала я попытался использовать API процессов, но это не относится к той версии Chrome, которую я использую в киоске. Я настроил свой киоск с расширением, которое я написал для обработки других вещей (сенсорный ввод TUIO и т. Д.), Поэтому у меня уже было место для его добавления.
В моем киоске локально запущен небольшой веб-сервер, потому что я обнаружил, что хром для отображения файла: // urls - это слишком большая боль в шее. Если вы используете URL-адреса файлов, то ваш манифест должен соответствовать им, а не http-URL.
Вот критический материал из manifest.json:
"content_scripts": [
{
"matches": ["http://*/*"],
"js": ["kiosk.js"]
}
],
"background": {
"scripts": [
"background.js"
]
},
"permissions": [
"webNavigation",
"tabs",
"runtime",
"<all_urls>"
],
Это входит в kiosk.js:
chrome.runtime.onMessage.addListener(
function(message, sender, response) {
response(message);
}
);
По сути, это ответчик на пинг. Если вы отправите ему сообщение, оно отправит его обратно.
Вот полностью background.js:
var tab_id = -1;
var send_count = 0;
var recv_count = 0;
chrome.webNavigation.onBeforeNavigate.addListener(function (details) {
tab_id = details.tabId;
});
setInterval(function() {
if (tab_id == -1) return;
if (send_count > recv_count+2) {
chrome.tabs.reload(tab_id);
send_count = recv_count = 0;
}
++send_count;
chrome.tabs.sendMessage(tab_id, "heartbeat", function(resp) {
if (resp) {
recv_count = send_count;
}
});
}, 1000);
Он прослушивает показ моей страницы и захватывает идентификатор вкладки. Это пингует ответчика. В документации говорится, что если произойдет ошибка, sendMessage будет вызван без ответа, но это не так. Это на самом деле не вызывается вообще. Я запрограммировал его на любой случай.
Обратите внимание, что я первоначально сказал ++ recv_count в обработчике, но если вы подумаете об этом, вышеприведенное будет немного более устойчивым к медлительности на принимающей странице.
Предполагая, что ваш киоск - это linux (то есть вы не ненормальный), тогда вы можете достаточно легко это проверить, выполнив команду ssh'ing в вашем киоске, и набрав ps axfww |grep render
, а затем убейте первый процесс в списке. Вы увидите экран больного компьютера на секунду, а затем он перезагрузится.