将 MV2 迁移到 MV3 时,Chrome 抛出此错误:
Insecure CSP value "" in directive 'script-src'
Run Code Online (Sandbox Code Playgroud)
这是我的内容安全策略:
"content_security_policy": {
"extension_pages": "script-src 'self' 'https://www.fonts.googleapis.com' 'unsafe-eval'; object-src 'self'"
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
javascript google-chrome-extension content-security-policy reactjs chrome-extension-manifest-v3
对于 chrome 扩展清单 v2,我可以在 DevTools 中打开后台页面,打开“应用程序”选项卡,选择“IndexedDB”,然后我会看到数据。此方法不适用于 Service Worker(清单 v3)。不显示数据。我确信数据存在,但未显示。
如何检查 Chrome 扩展清单 v3 的 IndexedDB 数据?
我正在编写一个 chrome 扩展,我想完全禁用弹出窗口,或者在 v3 清单属性不允许当前选项卡的 url 时显示一条消息host_permissions
。
这是一个开发支持工具,我们不希望为生产 URL 启用它。所以如果我设置:
"host_permissions": [
"http://localhost:3000/",
"https://*.dev.some-site.com/",
"https://www.uat.some-site.com/"
]
Run Code Online (Sandbox Code Playgroud)
...然后,如果用户位于www.some-site.com(或其他任何地方),我希望禁用弹出窗口。
我可以很容易地获得相关的网址:
let [currentTab] = await chrome.tabs.query({ active: true, currentWindow: true });
const { url } = currentTab;
const cookieUrl = url.match(/https?:\/\/[^/]+\//)?.[0];
Run Code Online (Sandbox Code Playgroud)
...我可以通过以下方式获取允许的文件模式数组
chrome.runtime.getManifest().host_permissions
Run Code Online (Sandbox Code Playgroud)
但是我怎样才能使用这个或其他东西来防止弹出窗口呢?此外,将该通配符转换为真正的正则表达式会有点痛苦。难道没有一些开箱即用的方法来完成这一切吗?
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 答案来保持服务工作者的生命。setInterval
Here\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};\n
Run Code Online (Sandbox Code Playgroud)\n它有很大的问题: …
javascript google-chrome-extension service-worker service-worker-events chrome-extension-manifest-v3
请详细解释这一点。我正在使用下面的代码进行路由,但我没有在屏幕上渲染任何组件。我的屏幕是空白的。
这是我的 GitHub 链接,了解详细的代码结构。 https://github.com/nadimakhtar97/tatkal-extension
这是Layout.js
import { Flex } from '@chakra-ui/react'
import React from 'react'
import Welcome from './Welcome'
import Options from './Options'
import {
BrowserRouter,
Routes,
Route,
} from "react-router-dom";
function Layout() {
return (
<Flex>
<BrowserRouter>
<Routes>
<Route path='/' element={<Welcome />} />
<Route path="options" element={<Options />} />
</Routes>
</BrowserRouter>
</Flex>
)
}
export default Layout
Run Code Online (Sandbox Code Playgroud)
这是 Popup.js
import React from 'react'
import { render } from 'react-dom'
import { Box, ChakraProvider, Heading } from '@chakra-ui/react'
import Layout …
Run Code Online (Sandbox Code Playgroud) google-chrome google-chrome-extension reactjs react-router chrome-extension-manifest-v3
我正在尝试重用 Service Worker (background.js) 和 content script 之间的某些功能。
在带有 Manifest V3 (104.0b9 Developer Edition) 的 Firefox 中,我一直得到
未捕获的语法错误:导入声明只能出现在模块的顶层
...虽然它在 Chrome 下使用 MV3 (104.0.5112.79) 运行良好。
我尝试了https://javascript.info/import-export中找到的大多数变体,但没有成功。
这是我的示例代码。对于每个实验,我只import
在 中保留一行background.js
。但是错误消息总是相同的。
背景.js:
import {commonApartFunction} from './common_apart.js';
import * from './common.js';
import { commonFunction } from './common.js';
import * as commonObject from './common.js';
import defaultFunction from './default.js';
function commonCaller() {
commonApartFunction();
commonFunction();
defaultFunction();
commonObject.commonFunction();
}
Run Code Online (Sandbox Code Playgroud)
通用.js:
export function commonFunction() {
return 1;
}
Run Code Online (Sandbox Code Playgroud)
common_apart.js:
function commonApartFunction() { …
Run Code Online (Sandbox Code Playgroud) javascript import firefox-addon-webextensions chrome-extension-manifest-v3
因此,我正在将使用持久后台页面的 MV2 扩展迁移到 MV3。在 Chrome 迁移指南 [https://developer.chrome.com/docs/extensions/mv3/migration_to_service_workers/#event_listeners] 中,它说:
为了让 Chrome 成功地将事件分派给适当的侦听器,扩展程序必须在事件循环的第一轮注册侦听器。实现此目的最直接的方法是将事件注册移至 Service Worker 脚本的顶层。
当 Service Worker 终止时,与其关联的事件侦听器也会终止。由于事件是在 Service Worker 启动时分派的,因此异步注册事件会导致事件被丢弃,因为首次启动时没有注册侦听器。
我的问题:
// background.js(service worker)
chrome.storage.local.get(["badgeText"], ({ badgeText }) => {
chrome.action.setBadgeText({ text: badgeText });
// Listener is registered asynchronously
// This is NOT guaranteed to work in Manifest V3/service workers! Dont do this
chrome.action.onClicked.addListener(handleActionClick);
});
Run Code Online (Sandbox Code Playgroud) javascript event-loop google-chrome-extension chrome-extension-manifest-v3 chrome-extension-manifest-v2
我知道清单 v2 的答案:将上下文菜单项添加到 Chrome 扩展程序的浏览器操作按钮
在将清单从 v2 迁移到 v3 之前,它一直工作正常。
我目前的manifest.json
:
{
"manifest_version": 3,
"version": "0.1.1",
"background": {
"service_worker": "background.js"
},
"action": {
"default_popup": "popup.html"
},
"content_scripts": [
{
"all_frames": false,
"matches": ["http://*/*", "https://*/*"],
"js": ["content.js"]
}
],
"permissions": ["contextMenus"],
...
}
Run Code Online (Sandbox Code Playgroud)
现在,这不会向我的扩展程序的浏览器操作按钮添加上下文菜单项:
chrome.contextMenus.create({
id: 'foo',
title: 'first',
contexts: ['browser_action'],
onclick: function () {
alert('first')
}
})
Run Code Online (Sandbox Code Playgroud)
我检查'selection'
上下文是否正确地将上下文菜单添加到网页上的选定文本中。从 v2 迁移到 v3 需要做什么吗?
google-chrome contextmenu google-chrome-extension chrome-extension-manifest-v3
要在迁移到 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 ×10
javascript ×5
reactjs ×2
chrome-extension-manifest-v2 ×1
contextmenu ×1
event-loop ×1
firefox-addon-webextensions ×1
import ×1
react-router ×1