我有一个背景脚本定义如下
"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
我正在将 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
我正在尝试构建一个 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
我只是做一个简单的chrome扩展.
我希望我的后台页面(或部分)每5分钟执行一次,以获取一些数据并显示桌面通知(如果有的话).我怎么能这样做
我正在使用最新的 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)我需要将一些 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如果我知道我需要删除并替换scripts为service_workers字符串,我不清楚如何修改背景部分,对吗?
对于background.js文件内容,我不知道它是否会按原样工作,或者我是否需要注册服务人员?
//
let payload = {} …Run Code Online (Sandbox Code Playgroud) 我正在 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) 我有一个 Chrome 扩展程序,它需要一个沙箱,以便我可以使用自定义内容安全策略,并且还需要一个 Service Worker,以便我有一个持久运行的脚本。我希望 Service Worker 打开一个新的(沙箱)窗口,然后能够使用postMessage.
我尝试了三种方法来创建此窗口,但没有一种方法对我有用:
chrome.windows.create哪个能够创建窗口,但我无法访问postMessage(或者至少我不知道如何以postMessage这种方式访问)。window.open返回一个WindowProxy我可以调用的对象postMessage。然而,这仅适用于window上下文可用的情况,而在 Service Worker 中并非如此。clients.openWindow,但最终出现错误“不允许打开窗口”。无论如何,有没有办法创建一个(沙盒)窗口,允许我postMessage在 Chrome 扩展中的 Service Worker 中使用?
Service Worker 替换了 Manifest v3 Google Chrome 扩展程序中的后台页面,并且我\xe2\x80\x99m 尝试为我的扩展程序使用其中一个。文档说应该避免使用计时器 (setTimeout和setInterval),因为当服务工作人员终止时计时器会被取消(这可能随时发生)。与后台页面不同,Service Worker 不能持久存在,并且始终会被终止。文档建议使用Alarms API。
我需要能够在 Manifest v3 Service Worker 中定期运行某个函数,但警报不适合我的用例,因为它们很慢。允许的最短警报持续时间是 1 分钟,但我想以更短的时间间隔 \xe2\x80\x94a 秒或几秒运行一个函数。
\n我尝试event.waitUntil根据这个 Stack Overflow 答案来保持服务工作者的生命。setIntervalHere\xe2\x80\x99是我尝试通过重复调用来模仿 1 秒的解决方案waitUntil:
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};\nRun Code Online (Sandbox Code Playgroud)\n它有很大的问题: …
javascript google-chrome-extension service-worker service-worker-events chrome-extension-manifest-v3
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) 要在迁移到 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
经过测试:为了避免重复执行某些代码(比如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 在需要时加载,在空闲时卸载。一些例子包括:
说“空闲时卸载”,之前添加的监听器也会被卸载吗?___如果是这样,如何再次唤醒服务人员?
或者只卸载前面添加的Listener中的功能,并保留Listener空壳只是为了唤醒service worker?
chrome-extension-manifest-v3 ×6
javascript ×4
manifest ×2
postmessage ×1
sandbox ×1
websocket ×1