diff --git a/tools/chrome-rdp/src/main/js/chrome/main.js b/tools/chrome-rdp/src/main/js/chrome/main.js index d754d1367..c5fb0e07d 100644 --- a/tools/chrome-rdp/src/main/js/chrome/main.js +++ b/tools/chrome-rdp/src/main/js/chrome/main.js @@ -12,7 +12,9 @@ class DebuggerAgent { this.debuggee = { tabId : tab.id }; this.port = port; + this.tab = tab; debuggerAgentMap[tab.id] = this; + this.contentScriptPingListener = (message, sender) => this.onContentScriptPing(message, sender); } attach() { @@ -20,6 +22,17 @@ class DebuggerAgent { this.attachedToDebugger = true; chrome.debugger.sendCommand(this.debuggee, "Debugger.enable", {}, () => this.connectToServer()); }); + chrome.scripting.executeScript({ + target: { tabId: this.tab.id }, + files: ['ping.js'] + }); + chrome.runtime.onMessage.addListener(this.contentScriptPingListener); + } + + onContentScriptPing(message, sender) { + if (message.comand === "ping" && typeof sender.tab !== "undefined" && sender.tab.id === this.tab.id) { + chrome.tabs.sendMessage(this.tab.id, { command: "pong" }); + } } connectToServer() { @@ -94,16 +107,18 @@ class DebuggerAgent { } disconnect(callback) { + chrome.runtime.onMessage.removeListener(this.contentScriptPingListener); + chrome.tabs.sendMessage(this.tab.id, { command: "quitPingPong" }); if (this.connection) { this.stopPing(); const conn = this.connection; this.connection = null; conn.close(); } + delete debuggerAgentMap[this.debuggee.tabId]; if (this.attachedToDebugger) { chrome.debugger.detach(this.debuggee, () => { if (this.debuggee) { - delete debuggerAgentMap[this.debuggee.tabId]; this.debuggee = null; } for (const callback of this.disconnectCallbacks) { diff --git a/tools/chrome-rdp/src/main/js/chrome/ping.js b/tools/chrome-rdp/src/main/js/chrome/ping.js new file mode 100644 index 000000000..c01df5017 --- /dev/null +++ b/tools/chrome-rdp/src/main/js/chrome/ping.js @@ -0,0 +1,28 @@ +/* + * Copyright 2022 Alexey Andreev. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +function sendPing() { + chrome.runtime.sendMessage({ command: "ping" }); +} +function listener(message) { + if (message.command === "pong") { + setTimeout(sendPing, 2000); + } else if (message.command === "quitPingPong") { + chrome.runtime.onMessage.removeListener(listener); + } +} +chrome.runtime.onMessage.addListener(listener); +sendPing(); \ No newline at end of file