相关疑难解决方法(0)

带有manifestv3的Chrome扩展 - 服务工作线程无法唤醒

我有一个背景脚本定义如下

"background": {
    "service_worker": "background.js"
  },
Run Code Online (Sandbox Code Playgroud)

和内容脚本

"content_scripts": [
    {
      "matches": [
        "*://youtube.com/*"
      ],
      "js": ["content-script.js"]
    }
Run Code Online (Sandbox Code Playgroud)

背景与往常一样

runtime.onMessage.addListener
Run Code Online (Sandbox Code Playgroud)

和内容脚本

chrome.runtime.sendMessage({
Run Code Online (Sandbox Code Playgroud)

但是,在某些罕见的情况下(大约 2-5% 的用户),尽管 YouTube 的选项卡已打开,但 Service Worker 仍保持不活动状态,因此 sendMessage 调用不会返回任何内容。

这只能通过关闭并重新打开扩展来解决。

如果服务工作者睡着了,有没有办法以编程方式唤醒它?是否有可能导致 Service Worker 无法醒来的原因?未捕获的异常,清单设置?

我真的很迷失在这里,调试起来非常困难,因为在一个月内我从未发生过这种情况,而且只有当用户同意进行通话和共享屏幕时我才能调试它。

该扩展程序拥有超过一百万用户,但这简直要了我的命。

该扩展可以在https://github.com/Anarios/return-youtube-dislike/tree/main/Extensions/combined看到

最新版本的 chrome 上已确认发生此情况。

google-chrome google-chrome-extension chrome-extension-manifest-v3

10
推荐指数
0
解决办法
2719
查看次数

如何避免 MV3 Chrome 扩展中同时存在多个 Service Worker?

我正在将 Chrome 扩展程序从清单版本 2 (MV2) 转换为清单版本 3 (MV3)。在MV2版本中,后台页面脚本在扩展中具有突出的作用:启动时,后台脚本从IndexedDB读取大量数据到RAM,然后(在运行期间)处理注入到页面中的内容脚本的查询用户访问的。要迁移到 MV3,MV2 后台脚本提供的功能现在需要转换为由 MV3 Service Worker 执行。

由于将数据从 IndexedDB 读取到 RAM 的速度很慢(相对而言),因此根据内容脚本的查询动态执行此操作是不可行的;相反,它必须由服务工作线程执行一次,然后保留数据,以便为来自内容脚本的传入请求提供服务。因此,Service Worker 应该是持久的(并且不会被浏览器终止);为此,至少存在一种解决方案:/sf/answers/4663278861/

然而,在某些情况下(我无法准确指出在什么情况下),当内容脚本向 Service Worker 发送消息时,Chrome 会启动 Service Worker 的第二个副本,即使第一个副本仍在运行。活着,并且两个服务人员共存了一段时间。是否有某种方法可以避免这种情况,并确保如果服务工作人员仍然活着(在内存中),则任何活动(通过内容脚本)都不会导致创建服务工作人员的第二个副本,而是创建内容的所有请求因此,脚本将由先前存在的服务工作者处理?

谢谢你的帮助!

google-chrome-extension service-worker chrome-extension-manifest-v3

9
推荐指数
0
解决办法
1285
查看次数

在 MV3 Chrome 扩展程序中维护持久连接

我正在尝试构建一个 chrome 扩展程序,每当我的服务器上发生某些事件时,它都会更新其徽章 - 在这种情况下,我的服务器正在从 Zoom 接收 webhook,然后通知我的 chrome 扩展程序发生了事件。从那里我的 Chrome 扩展将更新其徽章上的计数器,以显示事件发生。我正在尝试根据 chrome 扩展 Manifest V3 构建它,但我找不到任何有关如何正确执行此操作的信息。

据我了解,在 Manifest V3 中,所有客户端脚本都必须在 Service Worker 中运行。该服务工作人员启动,运行一些代码,然后再次关闭。我计划在我的后台脚本中打开一个 websocket,这在清单 v2 下应该没问题,但我认为你不能再这样做了。

我的问题是:如何在 Chrome 扩展程序中保持连接以接收数据?当我在这种情况下说数据时,我实际上只是指一个通知我的 chrome 扩展更新其徽章上的计数器的事件。

除了在后台保持 websocket 打开之外,还有其他途径吗?我已经研究过诸如 Google Cloud Messaging 之类的东西,但我认为这并不是我想要的用途。

websocket google-chrome-extension chrome-extension-manifest-v3

9
推荐指数
1
解决办法
2418
查看次数

chrome扩展,每x分钟执行一次

我只是做一个简单的chrome扩展.

我希望我的后台页面(或部分)每5分钟执行一次,以获取一些数据并显示桌面通知(如果有的话).我怎么能这样做

javascript google-chrome-extension

7
推荐指数
2
解决办法
4472
查看次数

如果清单是 MV3,Chrome 扩展程序在浏览器重新启动后始终显示“服务工作线程不活动”

我正在使用最新的 chrome:Win 10 Pro 上的版本 100.0.4896.60(官方版本)(64 位)

当我安装扩展时一切正常。

当我关闭 chrome 并重新打开时,扩展程序不再起作用。扩展选项卡显示所有扩展:“辅助服务(非活动)”

单击扩展程序的重新加载按钮后一切正常。

我还测试了它:

https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/examples/hello-world

为了确保这可能适用于某些设置,我卸载了 chrome,删除了所有 chrome 文件并重新安装。

问题仍然存在。

我的朋友使用相同的 chrome 版本似乎没有这个问题。

关于如何解决这个问题有什么建议吗?

这里是代码:

    "use strict";

async function sendRequest(request, sendResponse) {
  try {
    const startTime = Date.now();
    const response = await fetch(request.url, request.options);
    const time = Date.now() - startTime;
    const body = await response.text();
    const headers = [...response.headers].map((el) => ({
      key: el[0],
      value: el[1],
    }));
    sendResponse({
      status: response.status,
      body,
      headers,
      time,
    });
  } catch (err) {
    sendResponse({
      err: err.message
    }); …
Run Code Online (Sandbox Code Playgroud)

google-chrome-extension

7
推荐指数
1
解决办法
1万
查看次数

Chrome 扩展 - 从清单 v2 迁移到 v3

我需要将一些 chrome 扩展迁移到清单 v3。我有一个扩展,它使用后台脚本来拦截一些ajax 请求以获取相关视频文件。我已经开始修改清单文件,但我不确定如何继续处理清单background部分及其相关的 JavaScript 文件。

目前我已经通过以下方式修改了清单:

{
  "manifest_version": 3,
  "name": "__MSG_extName__",
  "description": "__MSG_extDescription__",
  "default_locale": "en",
  "permissions": [
    "tabs",
    "activeTab",
    "webRequest"
  ],
  "host_permissions": [
    "https://*"
  ],
  "icons": {
    "16": "icons/16.png",
    "48": "icons/48.png",
    "128": "icons/128.png"
  },
  "background": {
    "scripts": [
      "js/background.js"
    ],
    "persistent": true
  },
  "web_accessible_resources": [{
    "resources": ["room.html"]
  }],
  "action": {},
  "version": "2.1.0",
  "content_security_policy": {
    "extension_pages": "script-src 'self' ; object-src 'self'"
  }
}
Run Code Online (Sandbox Code Playgroud)

persistent如果我知道我需要删除并替换scriptsservice_workers字符串,我不清楚如何修改背景部分,对吗?

对于background.js文件内容,我不知道它是否会按原样工作,或者我是否需要注册服务人员?

//
let payload = {} …
Run Code Online (Sandbox Code Playgroud)

javascript google-chrome manifest google-chrome-extension

6
推荐指数
1
解决办法
8503
查看次数

如何使 Chrome 扩展永久有效

我正在 Chrome 中构建一个扩展,但如果我不打开插件的调试模式,它总是处于非活动状态,这会导致当我进入目标页面时插件无法工作,例如:dms.mydomain-inc.com

在此输入图像描述

当我访问注册页面时如何使其永久有效manifest.json?这是我的manifest.json

{
    "name": "Tool for test",
    "description": "Build an Extension!",
    "version": "1.0",
    "manifest_version": 3,
    "background": {
      "service_worker": "background.js",
      "persistent": true
    },
    "options_page": "options.html",
    "permissions": ["storage", 
        "activeTab", 
        "scripting",
        "webRequest"],
    "host_permissions": [
        "*://*.mydomain.vn/*",
        "*://dms.mydomain-inc.com/",
        "wss://news.mydomain-inc.com/"
        ],
    "content_scripts": [
        {
            "matches": ["*://news.mydomain-inc.com/"],
            "css": ["css/style.css"],
            "js": ["contentScript.js", "jquery-3.5.1.min.js"]
        }
        ],
    "action": {
      "default_popup": "popup.html",
      "default_icon": {
        "16": "/images/get_started16.png",
        "32": "/images/get_started32.png",
        "48": "/images/get_started48.png",
        "128": "/images/get_started128.png"
      }
    },
    "icons": {
      "16": "/images/get_started16.png",
      "32": "/images/get_started32.png",
      "48": "/images/get_started48.png",
      "128": "/images/get_started128.png"
    } …
Run Code Online (Sandbox Code Playgroud)

google-chrome-extension

6
推荐指数
1
解决办法
4904
查看次数

从 Service Worker 创建沙盒窗口

我有一个 Chrome 扩展程序,它需要一个沙箱,以便我可以使用自定义内容安全策略,并且还需要一个 Service Worker,以便我有一个持久运行的脚本。我希望 Service Worker 打开一个新的(沙箱)窗口,然后能够使用postMessage.

我尝试了三种方法来创建此窗口,但没有一种方法对我有用:

  • 我尝试了chrome.windows.create哪个能够创建窗口,但我无法访问postMessage(或者至少我不知道如何以postMessage这种方式访问​​)。
  • 我尝试window.open返回一个WindowProxy我可以调用的对象postMessage。然而,这仅适用于window上下文可用的情况,而在 Service Worker 中并非如此。
  • 我尝试过clients.openWindow,但最终出现错误“不允许打开窗口”。

无论如何,有没有办法创建一个(沙盒)窗口,允许我postMessage在 Chrome 扩展中的 Service Worker 中使用?

postmessage sandbox google-chrome-extension service-worker

5
推荐指数
0
解决办法
663
查看次数

如何在 Chrome Extension Manifest V3 后台服务工作线程中每秒调用一个函数?

Service Worker 替换了 Manifest v3 Google Chrome 扩展程序中的后台页面,并且我\xe2\x80\x99m 尝试为我的扩展程序使用其中一个。文档说应该避免使用计时器 (setTimeoutsetInterval),因为当服务工作人员终止时计时器会被取消(这可能随时发生)。与后台页面不同,Service Worker 不能持久存在,并且始终会被终止。文档建议使用Alarms API

\n

我需要能够在 Manifest v3 Service Worker 中定期运行某个函数,但警报不适合我的用例,因为它们很慢。允许的最短警报持续时间是 1 分钟,但我想以更短的时间间隔 \xe2\x80\x94a 秒或几秒运行一个函数。

\n

我尝试event.waitUntil根据这个 Stack Overflow 答案来保持服务工作者的生命setIntervalHere\xe2\x80\x99是我尝试通过重复调用来模仿 1 秒的解决方案waitUntil

\n
var e;\n\nfunction doThisEachSecond(resolver) {\n\n    console.log(\'running function\')\n\n    // \xe2\x80\xa6 CODE \xe2\x80\xa6\n\n    e.waitUntil(new Promise(resolve => setTimeout(() => {doThisEachSecond(resolve);}, 1000)));\n    resolver();\n}\n\nself.onactivate = event => {\n\n    event.waitUntil(new Promise(resolve => {\n        e = event;\n        doThisEachSecond(resolve);\n    }));\n\n    console.log(\'activated\');\n};\n
Run Code Online (Sandbox Code Playgroud)\n

它有很大的问题: …

javascript google-chrome-extension service-worker service-worker-events chrome-extension-manifest-v3

4
推荐指数
1
解决办法
2208
查看次数

如何使用清单 v3 在 chrome 扩展中执行定期后台工作

background.js 机制在清单 v3 中被删除,我正在寻找如何在后台执行周期性操作,因为它已经消失了。

此升级指南说使用 chrome 警报 api: https://developer.chrome.com/docs/extensions/mv3/migration_to_service_workers/

具体来说,它说:

相反,我们可以使用 Alarms API。与其他侦听器一样,警报侦听器应在脚本的顶层注册。

目前尚不清楚它需要成为哪个脚本的顶层,但是当使用我的 chrome 扩展的入口点“popup.js”时,它会定期执行,但仅当 chrome 弹出窗口实际打开时才执行。即使弹出窗口关闭,我也需要它在后台执行。附带说明的是,我对 chrome.alarms 未定义,直到我将“警报”添加到清单文件中的权限,然后它不会阻塞,但我仍然遇到它不运行后台的问题。

由于上面的文章是在 Service Worker 的上下文中,我假设您需要将警报侦听器放在 service-worker.js 文件的顶层。只是这个不行。我在这里未定义 chrome.alarms (即使授予了“警报”权限):

service-worker.js

console.log("inside service worker")

// getting chrome.alarms undefined here
chrome.alarms.create("alarm", { periodInMinutes: 1 });
Run Code Online (Sandbox Code Playgroud)

将其放入安装事件侦听器中也没有帮助:

self.addEventListener('install', event => {
    console.log("Installing service worker")
    // still getting chrome.alarms undefined here
    chrome.alarms.create("alarm", { periodInMinutes: 1 });
    chrome.alarms.onAlarm.addListener((alarm) => {
        if (alarm.name === "alarm") {
            let milliseconds = new Date().getTime();
            console.log(milliseconds)
            chrome.action.setTitle({
                title: "Hello "+ milliseconds …
Run Code Online (Sandbox Code Playgroud)

manifest google-chrome-extension service-worker

3
推荐指数
1
解决办法
3555
查看次数

使用异步 chrome.storage 时如何重构全局变量?

要在迁移到 MV2 事件页面或 MV3 Service Worker 时删除持久 MV2 后台脚本中使用的全局变量,我找到的所有指南都只给出了一个示例,用几行设置替换单个全局变量,然后正在使用chrome.storage,但我仍然不清楚如何在更复杂的场景中使用它。

例如:

const activatedTabs = [];
let lastActiveTabInfo;
chrome.tabs.onActivated.addListener((activeInfo) => {
  if (activatedTabs.length === 0) {
    activatedTabs.push(activeInfo.tabId);
    lastActiveTabInfo = activeInfo;
  }
}
Run Code Online (Sandbox Code Playgroud)

如何重构上面的代码片段以使用chrome.storage和删除全局变量?

javascript google-chrome-extension chrome-extension-manifest-v3

3
推荐指数
1
解决办法
2528
查看次数

每次唤醒时,清单 v3 Service Worker 顶层的整个代码是否都会重复运行?

经过测试:为了避免重复执行某些代码(比如chrome.contextMenus.create重复执行使得

未选中的runtime.lastError:无法创建具有重复ID的项目

),需要将其移至chrome.runtime.onInstalled.addListener. 但是chrome.action.onClicked.addListener移入的某些代码(例如 )chrome.runtime.onInstalled.addListener将不会在下次唤醒时运行。

如果chrome.action.onClicked.addListener放在Service Worker的最顶层,

每次 Service Worker 唤醒时是否会再次添加 Listener,

会有多个重复的听众吗?

新添加的Listener和之前添加的Listener中的函数会同时执行吗?

https://developer.chrome.com/docs/extensions/mv3/service_workers/说:

后台 Service Worker 在需要时加载,在空闲时卸载。一些例子包括:

  • 扩展首先安装或更新到新版本。
  • 后台页面正在监听一个事件,并且该事件被调度。
  • 内容脚本或其他扩展发送消息。
  • 扩展中的另一个视图(例如弹出窗口)调用runtime.getBackgroundPage。

“空闲时卸载”,之前添加的监听器也会被卸载吗?___如果是这样,如何再次唤醒服务人员?

或者只卸载前面添加的Listener中的功能,并保留Listener空壳只是为了唤醒service worker?

service-worker chrome-extension-manifest-v3

3
推荐指数
1
解决办法
715
查看次数