私はこれを自分で解決しました。最初はプロセス API を使用してみましたが、キオスクで使用している chrome のバージョンにはありません。他のもの (TUIO タッチ入力など) を処理するために作成した拡張機能を使用してキオスクを構成したので、既にそれを追加する場所がありました。
私のキオスクは、ローカルで小さな Web サーバーを実行しています。なぜなら、chrome を取得して file:// 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);
}
);
基本的に、これは ping レスポンダーです。メッセージを送信すると、すぐに返信されます。
これが 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);
私のページが表示されるのをリッスンし、タブ ID を取得します。レスポンダに ping を送信します。ドキュメントには、エラーが発生した場合、sendMessage が応答なしで呼び出されると書かれていますが、そうではありません。実際にはまったく呼び出されません。どちらの場合も処理できるようにコーディングしました。
なお、もともとハンドラ内で ++recv_count と言っていましたが、考えてみれば上記の方が受信側の遅さにはもう少し強いと思います。
あなたのキオスクが Linux であると仮定すると (つまり、あなたは正気ではありません)、キオスクに ssh 接続し、ps axfww |grep render
リストにある最初のプロセスを実行して強制終了することで、これを簡単にテストできます。病気のコンピューター画面が数秒間表示された後、リロードされます。