问题描述
我正在开发这个 chrome 扩展程序,它应该记录用户访问的所有 URL 及其时间戳。我注意到的一个大问题是,有时在选项卡之间切换时,后台脚本会重新加载并停止触发 chrome.tabs.onActivated
侦听器。然而,当我切换到另一个选项卡时,该功能会恢复,但本应存储先前 URL 的数组被清空(表明脚本已重新加载)。控制台显示记录的 URL 一秒钟,当我切换到另一个选项卡时,控制台变为空白(这种情况非常不规律)。请注意,只有在不同选项卡之间切换时才会发生这种情况; chrome.tabs.onUpdated
侦听器始终运行顺畅。
Manifest.json:
{
"name": "Web Tracker","description": "Dummy extension","version": "1.0","manifest_version": 3,"background": {
"service_worker": "background.js"
},"permissions": ["storage","tabs"],"action": {
"default_popup": "popup.html"
}
}
Popup.html:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="button.css">
</head>
<body>
<button id="startTimer"></button>
<script src="popup.js"></script>
</body>
</html>
Popup.js:
startTimer.addEventListener("click",async () => {
chrome.tabs.query({
active: true,currentwindow: true
},function(tabs) {
var tab = tabs[0];
chrome.runtime.sendMessage({
click: "initiate",link: tab.url,timestamp: Date.Now()
});
});
});
背景.js:
var enabled;
chrome.runtime.onInstalled.addListener(() => {
console.log("Extension has been set up");
enabled = false;
});
let urls = [];
let times = []; //these arrays get emptied on reloading of the background script randomly
chrome.runtime.onMessage.addListener(
function(request) {
if (request.click == "initiate") {
enabled = !enabled;
if (enabled == true) {
console.log("Extension is Now on");
urls.push(request.link);
times.push(request.timestamp);
console.log(urls);
console.log(times);
} else {
console.log("Extension has been turned off");
}
}
});
chrome.tabs.onActivated.addListener(function(activeTab) {
if (enabled == false) {
return;
}
function doStuffWithTabs() {
setTimeout(() => {
chrome.tabs.get(activeTab.tabId,function(tab) {
if (chrome.runtime.lastError) {
console.log("Error,re-executing");
setTimeout(() => doStuffWithTabs(),100)
} else {
if (tab.url) {
urls.push(tab.url);
times.push(Date.Now());
console.log(urls);
console.log(times);
}
else {
console.log("No url set yet");
}
}
});
},2000)
}
doStuffWithTabs();
});
chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,tab) {
if (enabled == false) {
return;
}
setTimeout(() => {
if (changeInfo.url) {
urls.push(changeInfo.url);
times.push(Date.Now());
console.log(urls);
console.log(times);
}
},100);
})
这与在 MV3 中使用 Service Worker 有什么关系吗?我读到 Service Worker 有一个生命周期,在一段时间后他们会停止触发监听器,不确定这是否与这里的问题有关。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)