google-chrome-extension - Chrome 扩展后台脚本有时在安装或更新后不运行

标签 google-chrome-extension

我最近收到有关我开发的 chrome 扩展程序的报告,该扩展程序在更新或全新安装后停止工作。后台脚本似乎根本没有启动。

  • 从内容脚本发送给它的消息没有响应。
  • 任务管理器中没有它的进程。
  • 从 chrome://extensions 打开后台页面不会在控制台中显示任何事件,也不会显示任何源文件。
  • 分析、内存快照按钮被禁用。

  • 一旦出现此问题,即使在重新加载或卸载/重新安装扩展程序后,chrome 配置文件也仍然存在。

    重新启动 chrome 可以解决问题。

    该问题已在 chrome v79 上看到。但我不能肯定地说它是这个版本独有的,因为这个问题很难重现,而且似乎是随机的。

    有没有人看到过这样的问题,或者有任何想法要寻找什么?我很高兴用我拥有的任何新信息或您需要的任何信息更新我的问题。

    编辑:

    这是我的 webNavigation listener,用于注入(inject)内容脚本。这个处理程序连接在后台脚本的“根”上下文中(不是在事件处理程序中异步)
    chrome.webNavigation.onCompleted.addListener((details) ⇒ { 
       if(details.frameId === 0) { 
         injectScript( 
           'js/contentScript.js', 
           details.tabId, 
           details.frameId, 
           details.url 
         ).catch((e) ⇒ {}); 
       }
    }
    
    injectScript功能如下
    export const injectScript = ƒ (scriptPath,tab,frame,tabUrl) { 
      return new Promise((res,rej) ⇒ {  
        let options = { 
          file : scriptPath, 
          allFrames : false, 
          frameId : frame, 
          matchAboutBlank: false, 
          runAt : 'document_idle', 
        }; 
        const cb = ƒ () { 
          if (chrome.runtime.lastError) { 
            let err = new Error('Could not inject script'); 
            capture(err,{ 
              ...options, 
              tabUrl, 
              lastError : chrome.runtime.lastError.message, 
            }); 
            rej(err); 
          }else{ 
            res(); 
          } 
        }; 
        if (tabUrl.indexOf('.salesforce.com') !== -1) { 
          window.setTimeout(() => { 
            chrome.tabs.executeScript(tab,options,cb); 
          },500); 
        }else{ 
          chrome.tabs.executeScript(tab,options,cb); 
        } 
      }); 
    };
    

    注意上面,capture函数将错误报告给后端,我也看不到它也在那里报告。如上所述,无法在代码中添加断点,因为后台页面中没有显示源。

    最佳答案

    Doc
    后台服务 worker 在需要时加载,并在空闲时卸载。
    https://developer.chrome.com/docs/extensions/mv3/service_workers/
    您可以使用以下方法:

    // Keep heartbeat
    let heartTimer;
    const keepAlive = () => {
        heartTimer && clearTimeout(heartTimer);
        heartTimer = setTimeout(() => {
            chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
                console.info('[heartbeat]')
                tabs.length && chrome.tabs.sendMessage(
                    tabs[0].id,
                    { action: "heartbeat" }
                );
            });
            keepAlive();
        }, 10000);
    };
    keepAlive();
    

    关于google-chrome-extension - Chrome 扩展后台脚本有时在安装或更新后不运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59551551/

    相关文章:

    javascript - 如何使用 Chrome.Storage 设置和获取值?

    javascript - chrome.browserAction.onClicked.addListener() 弹出窗口

    javascript - 谷歌浏览器扩展 : copying base64 image data from <img> tag on page

    javascript - Chrome 扩展 API sendMessage(更新后 : 49. 0.2623.87)

    node.js - Puppeteer chrome 获取事件/可见选项卡

    google-chrome - 需要证明使用远程代码的理由。 - Chrome 扩展

    php - extension.binding 的 Lazy require 没有设置绑定(bind)字段

    javascript - (JavaScript 和 HTML)单击时更改按钮的不透明度

    google-chrome-extension - Chrome 扩展 : sharing an object between content scripts and background script

    google-chrome-extension - 如何判断脚本是作为内容脚本还是作为后台脚本运行?