标签: chrome-extension-manifest-v3

加载 Chrome 扩展程序时出错 - 指令“script-src”中的 CSP 值“”不安全

将 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

5
推荐指数
1
解决办法
2937
查看次数

如何检查 Chrome 扩展清单 v3 的 IndexedDB 数据?

对于 chrome 扩展清单 v2,我可以在 DevTools 中打开后台页面,打开“应用程序”选项卡,选择“IndexedDB”,然后我会看到数据。此方法不适用于 Service Worker(清单 v3)。不显示数据。我确信数据存在,但未显示。

如何检查 Chrome 扩展清单 v3 的 IndexedDB 数据?

在此输入图像描述

在此输入图像描述

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

5
推荐指数
1
解决办法
733
查看次数

如果清单 v3 中不允许当前选项卡 url,则阻止弹出窗口

我正在编写一个 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)

但是我怎样才能使用这个或其他东西来防止弹出窗口呢?此外,将该通配符转换为真正的正则表达式会有点痛苦。难道没有一些开箱即用的方法来完成这一切吗?

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

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

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

如何在 Chrome 扩展中使用 React Router v6?

请详细解释这一点。我正在使用下面的代码进行路由,但我没有在屏幕上渲染任何组件。我的屏幕是空白的。

这是我的 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

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

无法使用 MV3 从 Firefox 下的通用脚本导出到 background.js

我正在尝试重用 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

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

为什么 MV3 Chrome 扩展(使用 Service Workers)必须“在事件循环的第一轮注册监听器”?

因此,我正在将使用持久后台页面的 MV2 扩展迁移到 MV3。在 Chrome 迁移指南 [https://developer.chrome.com/docs/extensions/mv3/migration_to_service_workers/#event_listeners] 中,它说:

为了让 Chrome 成功地将事件分派给适当的侦听器,扩展程序必须在事件循环的第一轮注册侦听器。实现此目的最直接的方法是将事件注册移至 Service Worker 脚本的顶层。

当 Service Worker 终止时,与其关联的事件侦听器也会终止。由于事件是在 Service Worker 启动时分派的,因此异步注册事件会导致事件被丢弃,因为首次启动时没有注册侦听器。

我的问题:

  1. 为什么我们必须这样注册呢?如果我们在等待异步操作后注册会有什么问题?
  2. 如果确实当一个 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

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

将上下文菜单项添加到 Chrome 扩展程序的浏览器操作按钮 (Manifest v3)

我知道清单 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

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

使用异步 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
查看次数