标签: chrome-extension-manifest-v3

如何避免 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
查看次数

事件处理程序中出现错误:ReferenceError:窗口未使用清单 v3 定义 chrome 扩展

我正在使用清单版本 3 进行 chrome 扩展,我在后台 js 中遇到此错误: 事件处理程序中的错误:ReferenceError:窗口未使用清单 v3 定义 chrome 扩展

“manifest_version”:3,“权限”:[“contextMenus”,“存储”,“activeTab”,“选项卡”,“脚本”,“webRequest”],

var posLeft = ( window.width - winWidth ) / 2 ;

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

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

在 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
查看次数

未捕获(承诺中)错误:错误:适配器“http”在构建中不可用

我正在尝试在 React chrome 扩展模块中使用 axios,但我遇到了这个问题。

未捕获(承诺中)错误:错误:适配器“http”在构建中不可用

// background.ts

import axios from "axios"
...
axios.get<SerInyResponse>("https://realtor.p.rapidapi.com/locations/v2/auto-complete")
            .then(response => {
                this.Storage.setLocalStorage(response.data).then( (re) => {
                    resolve(response.data.Listeners)
                })
                
            })
            .catch( err => {
                reject(new Error(err))
            })
Run Code Online (Sandbox Code Playgroud)

谁能帮我?

google-chrome-extension reactjs axios chrome-extension-manifest-v3

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

谷歌浏览器扩展清单 v3 中的弹出设置在哪里

我正在使用清单 v3 开发一个 google chrome 扩展,我从这里阅读了清单文档,但发现不包含弹出窗口设置,在清单 v2 中,我们可以像这样设置弹出窗口:

"browser_action" : {
    "default_icon" : {
      "19" : "/logo.png" ,
      "38" : "/logo.png"
    } ,
    "default_popup" : "/popup/index.html"
  } ,
Run Code Online (Sandbox Code Playgroud)

如何在 google chrome 扩展的清单 v3 中设置默认弹出页面?

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

8
推荐指数
1
解决办法
7254
查看次数

如何从 Chrome Extension Service Workers 使用 IndexedDB

我“很高兴”将我的一些 Chrome 扩展重建为 MV3。但我陷入困境,因为我无法理解如何从服务人员那里使用IndexedDB 。更具体地说,我还没有找到任何从 JS 服务工作脚本访问 IndexedDB 的工作示例。

参考这个页面,我曾经像这样打开一个数据库:

var idb = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.shimIndexedDB;
var dbName = "DatabaseName";
var open = idb.open(dbName, 1);
Run Code Online (Sandbox Code Playgroud)

但众所周知,MV3 中的 Service Worker 无法再访问窗口。

简而言之,背景页面为扩展作者提供了一个独立于任何其他窗口或选项卡的环境。

https://developer.chrome.com/docs/extensions/mv3/migration_to_service_workers/#state

我该怎么做呢?

感谢您的帮助、时间和耐心。周末愉快!

javascript indexeddb service-worker chrome-extension-manifest-v3

8
推荐指数
1
解决办法
3403
查看次数

ManifestV3 新承诺错误:消息端口在收到响应之前关闭

我正在开发一个扩展,它在其内容脚本和后台服务工作人员(清单 V3)之间进行大量消息传递,并且我注意到新的基于 Promise 的 V3 API 存在一个奇怪的问题,特别是 sendResponse () 功能。

对于需要响应的 API 调用,一切正常。但是,如果我不需要响应并且不提供回调函数或使用 Promise 的 .then() 方法(或 async/await),则会引发 Promise 错误 - 它表示“消息端口在响应之前关闭”已收到。”

奇怪的是,调用仍然有效,所以我猜这个错误更像是一个警告。

代码示例:

在内容脚本中,向后台发送消息:

chrome.runtime.sendMessage({ type: 'toggle_setting' })
Run Code Online (Sandbox Code Playgroud)

后台脚本获取消息并执行某些操作,然后退出而不发送响应:

chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => {
  if (message.type === 'toggle-setting') {
    //* do whatever it does
  }
})
Run Code Online (Sandbox Code Playgroud)

该后台代码是引发上述错误的原因。但是,如果我向其中添加一行并调用不带参数的 sendResponse() 函数,则不会发生错误。

chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => {
  sendResponse()
  if (message.type === 'toggle-setting') {
    //* do whatever it does
  }
})
Run Code Online (Sandbox Code Playgroud)

因此,这消除了错误消息,但我不太清楚为什么在不需要或不需要响应时有必要这样做。是否有其他方法可以向基于 Promise 的 V3 API 发出信号,或者现在是否有必要调用 sendResponse(),即使您不需要?

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

8
推荐指数
1
解决办法
2608
查看次数

“content_security_policy.extension Pages”:指令“script-src”中不安全的 CSP 值“https://google.com”

我正在尝试将内容安全策略添加到我的 V3 清单文件中,以便将 reCaptcha v3 应用于我的 chrome 扩展,但我不断收到以下错误

“content_security_policy.extension_pages”:指令“script-src”中不安全的 CSP 值“https://google.com”。

下面给出了我的 CSP,我做错了什么?

"content_security_policy": {
  "extension_pages": "script-src 'self' https://*.google.com https://*.gstatic.com; object-src 'self'"
}
Run Code Online (Sandbox Code Playgroud)

manifest recaptcha recaptcha-v3 chrome-extension-manifest-v3

8
推荐指数
0
解决办法
1545
查看次数

如何使用 Manifest v3 要求在 Firefox 中启用权限?

截至 1 月 17 日,Firefox 现已在Firefox 109.0中支持 Manifest v3 。

我正在使用 Manifest v3 测试一个附加组件,它需要访问 reddit.com 上的变量。

我想设置“访问 *://reddit.com 域中网站的数据”权限因为如果没有它,扩展程序将无法工作。

需要做什么才能使它不显示为可选,因为我希望用户不必从“权限”选项卡显式打开权限?

在此输入图像描述

我希望它按要求显示,类似于此图片(来源):

在此输入图像描述

下面是示例清单文件的精简版本,其中将权限显示为可选。

{
    "manifest_version": 3,
    "name": "Example",
    "description": "Example",
    "version": "3.16.1",
    "content_scripts": [
        {
            "run_at": "document_idle",
            "matches": ["*://*.reddit.com/"],
            "js": ["script.js"]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我尝试添加"permissions": ["https://*.reddit.com/*"],但它仍然显示为可选。

我也尝试过"permissions": ["*://reddit.com"]"host_permissions": ["*://reddit.com"]但没有什么导致需要它。

我有一个 Chrome 扩展程序,它使用相同的清单 v3 文件。

firefox firefox-addon manifest.json chrome-extension-manifest-v3

8
推荐指数
1
解决办法
835
查看次数

后台 Chrome 扩展 Manifest V3 库

我正在将我的 chrome 扩展从清单 v2 更新到 v3。这是旧的清单:

清单 V2:

{
"manifest_version": 2,
"name": "Legacy Search Assistant",
"version": "0.1.1",
"content_scripts": [
    {
        "matches": [
            "https://*.legacysite.io/*","*://*/api*"
        ],
        "js": ["jquery-3.6.0.min.js","content.js"]
    }
],
"options_page": "options.html",
"background": {
    "scripts": ["jsencrypt.min.js", "jquery-3.6.0.min.js", "background.js"]
},
"browser_action": {
    "default_icon":  "icon.png",
    "default_popup": "popup.html",
    "default_title": "Legacy Search"
},
"permissions": [
    "storage"
]
}
Run Code Online (Sandbox Code Playgroud)

由于 jsencrypt.min.js 已加载到清单中,我可以在 background.js 中调用它的函数,但现在我已经转到清单 v3,我在让服务工作人员访问此库时遇到问题。

例如,当我在background.js中进行此调用时:

importScripts("/scripts/jsencrypt.min.js");
Run Code Online (Sandbox Code Playgroud)

它抛出以下错误:

Error handling response: Error: Failed to execute 'importScripts' on 'WorkerGlobalScope': The script at 'chrome-extension://<extension ID>/scripts/jsencrypt.min.js' failed to load.
Run Code Online (Sandbox Code Playgroud)

如果我单击错误中的链接,它会将我直接带到我想要加载的库。 …

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

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