微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

后台脚本随机重新加载Chrome 扩展程序

如何解决后台脚本随机重新加载Chrome 扩展程序

我正在开发这个 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 举报,一经查实,本站将立刻删除。