Prevent Chrome debugger extension from disconnecting after timeout

This commit is contained in:
Alexey Andreev 2022-12-15 17:26:22 +01:00
parent 6c91192794
commit fb39de72cc
2 changed files with 44 additions and 1 deletions

View File

@ -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) {

View File

@ -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();