Chrome 扩展 - 如何使用清单 v3 访问本地 file://

2024-02-29

我有一个 Chrome 扩展程序,可以(如果您允许访问文件 URL)抓取您在 Chrome 中打开的本地 pdf 文件,并将其发送到我们的 API 进行处理。这是通过获取 pdf 来完成的XMLHttpRequest to file:///Users/user/whatever/testfile.pdf来自后台脚本。

当 Chrome 扩展迁移到清单 v3 时,后台脚本将成为服务工作人员。仅在 Service Worker 中fetch可用,不可用XMLHttpRequest。问题是,fetch 仅支持 http 和 https,不支持 file:// url。那么我怎样才能实现让 Chrome 扩展获取/获取本地文件的相同功能呢?

编辑:我也尝试过的事情:

  1. Making the XMLHttpRequest from injected iframe as suggested by answer. This gives error net:ERR_UNKNOWN_URL_SCHEME when making the request net:ERR_UNKNOWN_URL_SCHEME

  2. Making the XMLHttpRequest from injected content script. This gives error Access to XMLHttpRequest at 'file:///.../testfile1.docx.pdf' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, chrome-untrusted, https. Access to XMLHttpRequest at 'file:///Users/clara.attermo/Downloads/testfile1.docx.pdf' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, chrome-untrusted, https.

据我从大量研究中了解到file://通常会被阻止,而 Chrome 扩展后台脚本曾经是一个例外。在我看来,内容脚本或操作弹出窗口从来不允许这样做。

我的manifest.json供参考:

{
  "manifest_version": 3,
  "name": "..",
  "version": "0.1",
  "icons": {
    "16": "assets/icon-16x16.png",
    "48": "assets/icon-48x48.png",
    "128": "assets/icon-128x128.png"
  },
  "action": {
    "default_title": ".."
  },
  "background": {
    "service_worker": "background.js"
  },
  "permissions": [
    "webRequest",
    "activeTab",
    "scripting",
    "storage",
    "unlimitedStorage",
    "identity",
    "pageCapture"
  ],
  "host_permissions": [
    "<all_urls>"
  ],
  "web_accessible_resources": [{
    "resources": ["iframe.html"],
    "matches": [],
    "extension_ids": []
  }]
}

内容脚本以编程方式注入(使用webextension-polyfill用于承诺支持)

browser.action.onClicked.addListener(async (tab: Tab) => {
  await browser.scripting.executeScript({files: [ "inject.js" ], target: {tabId: tab.id}});
});

由于您提到的原因,Chrome 98 及更早版本无法在后台服务工作人员中执行此操作。

还有一个bug https://crbug.com/1179732这阻止了在正常可见的情况下执行此操作chrome-extension://页面或 iframe。它已在 Chrome 91 中修复。

Solution

Use fetch在 Chrome 中99 及更新版本 https://chromiumdash.appspot.com/commit/268e65004215716c3957b229794357da23acaf2d.
在旧版本中使用以下解决方法。

解决方法 1:文件系统 API,Chrome 86+

Manifest V3 扩展可以使用新的文件系统API https://web.dev/file-system-access/读取文件的内容,例如通过暴露的 iframe 内部网络可访问资源 https://developer.chrome.com/docs/extensions/mv3/manifest/web_accessible_resources/.

解决方法 2. 扩展框架,Chrome 91+

使用在该 pdf 选项卡中运行的内容脚本:

  1. matches在manifest.json中应该包含<all_urls> or file://*/*并且文件访问应该由用户启用 chrome://extensions UI 用于您的扩展。或者你可以使用activeTab许可和程序化注入 https://crbug.com/1179732当用户 单击您的扩展程序的图标或通过上下文菜单调用它。
  2. 内容脚本添加了一个不可见的 iframe,指向iframe.html文件暴露于网络可访问资源 https://developer.chrome.com/docs/extensions/mv3/manifest/web_accessible_resources/
  3. The iframe.html loads iframe.js像往常一样使用 XMLHttpRequest。由于 iframe 有chrome-extension://URL 其环境 与您的旧后台脚本相同,因此您可以执行所有操作 你之前就在那里做过。

解决方法 3. 扩展窗口/选项卡,Chrome 91+

另一种解决方案是使用您的任何其他可见页面 扩展名就像action弹出窗口或选项页面或任何其他 chrome-extension:// 属于您的扩展的页面,因为它们可以 访问file://通过 XMLHttpRequest 的 URL 与以前相同。

Notes

  • 应在以下位置启用文件访问chrome://extensions此扩展的页面。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Chrome 扩展 - 如何使用清单 v3 访问本地 file:// 的相关文章

  • 在 Chrome 中从用户脚本转换时保持相同的 ID

    我目前正在将用户脚本更新为 chrome 扩展程序 但由于新 ID 不同 因此不会更新旧扩展程序 而是添加一个新扩展程序 有没有办法将用户脚本转换为 Chrome 扩展程序并保持相同的 ID 由于没有用户脚本的密钥文件 我认为这是可能的 但
  • Chrome 调试协议:HeapProfiler.getHeapSnapshot 忽略回调

    我正在开发一个测试套件 作为 Chrome 扩展实现 该套件使用 Chrome Chromium 的远程调试协议以编程方式获取和分析堆快照 因为Profiler 似乎不是公共协议的一部分 我正在使用这一页 http trac webkit
  • 带有异步等待的 chrome.runtime.onMessage 响应

    我想在 onMessage 侦听器中使用异步等待 chrome runtime onMessage addListener async request sender sendResponse gt var key await getKey
  • 被 chrome 扩展内的 jquery 调用难住了

    在我的 chrome 扩展中 我称之为 jsonPost email email protected cdn cgi l email protection password demo content selected text val no
  • 如何从 Chrome 扩展中的 bg 页面访问弹出页面 DOM?

    在谷歌浏览器中扩展开发者部分 http code google com chrome extensions overview html 它说 扩展内的 HTML 页面 可以完全访问彼此的 DOM 它们可以调用函数 彼此 弹出窗口的内容 是由
  • 内容脚本仅在重新加载/刷新时加载

    这是我第一次创建 Google Chrome 扩展程序 我无法找到一种方法来可靠地让内容脚本在单击 YouTube 上的建议视频或任何相关视频时运行一次 我尝试将 all frames 设置为 true 但这会多次调用脚本 浏览 YouTu
  • Ajax请求成功但结果为空

    我正在构建一个 Google Chrome 浏览器扩展 它使用 ajax请求将数据从网页发送到我的服务器 当前使用本地主机托管 这content script js在网页上下文中执行的文件 有关内容脚本的更多信息 http develope
  • Chrome消息传递错误:尝试使用断开连接的端口对象

    我的 Chrome 扩展使用长期存在的 端口 对象在 内容脚本 和 弹出 页面之间传递消息 弹出窗口 能够向 内容脚本 事件监听器发送消息 但是 内容脚本 中的 端口 对象无法将消息发送到 弹出 页面 var port chrome ext
  • 覆盖 Chrome 扩展页面 CSS

    我正在尝试使用 Chrome 扩展程序页面上的时尚扩展程序 但由于某种原因它不起作用 我试图用谷歌搜索这个 但我只得到关于使用扩展覆盖 CSS 的答案 而不是覆盖 Chrome 扩展页面 有什么想法为什么它不起作用吗 或者我怎样才能强迫它
  • 将 chrome api 与 React.js 结合使用

    我一直在尝试使用 React 制作一个简单的 Chrome 扩展 清单看起来像这样 name New Tab version 1 0 manifest version 2 description A minimalist replaceme
  • 将带有我的 URL 的 ExtensionInstallSources 首选项添加到 Chrome 首选项后,仍然不允许安装“.crx”打包应用程序

    我添加了偏好设置ExtensionInstallSources 按照 http www chromium org administrators policy list 3 ExtensionInstallSources http www c
  • 如何访问 Chrome 的拼写检查词典?

    显然 Chrome 有一个内置字典 用于拼写检查 有 API 或某种方式来访问这本字典吗 我感兴趣的不是检查拼写 而是实际访问字典 例如 我想写Chrome 的词典自动完成扩展 https stackoverflow com questio
  • Chrome 扩展 - 使用 javascript 定期运行并永久记录数据

    目前 我有一个脚本 当单击右上角托盘中的图像 仅适用于一个特定允许的网站 时 它会扫描 HTML 页面 然后输出一些值 此扫描和输出是单个 JS 文件中的函数 称为 checkData js 即使用户没有主动使用选项卡但它已打开 是否有可能
  • Chrome 扩展程序中的 SWFobject - API 不可用

    Hi 我正在构建一个 Chrome 扩展程序 其中我需要在后台页面中嵌入一个 SWF 对象 除了 SWF 对象和事件监听器的 JavaScript 控件之外 一切正常 我的猜测是 这与跨域策略有关 因为在网络服务器上测试页面时一切正常 无论
  • 如何更改 Firefox 插件上的脚本位置?

    制作 Firefox 插件的最简单方法是什么 它重复了这个 chrome 功能 chrome webRequest onBeforeRequest addListener function info if info url indexOf
  • 将 Chrome 扩展上的权限移至可选

    我了解到 Chrome 在添加新权限时会禁用扩展程序 当我向扩展添加新功能时 我需要在permissions列表 现在我知道我应该使用optional permissions 我的问题是 如果我将网站列表从permissions to op
  • chrome 扩展弹出窗口和背景 ajax

    我有一个要求 background html 每 10 分钟持续更新一次 当我单击弹出窗口时 它应该触发后台立即更新并在弹出窗口中显示结果 我有使用 ajax 工作的后台更新 并且我有弹出窗口触发后台以使用 ajax 工作进行立即更新 但是
  • DOM 解析器 Chrome 扩展内存泄漏

    问题 我开发了一个扩展程序 可以拦截 Web 请求 获取 Web 请求来源的 HTML 并对其进行处理 我使用 DOMParser 来解析 HTML 并且意识到 DOMParser 正在导致大量内存泄漏问题 最终导致 chrome 扩展崩溃
  • 如何保护 Chrome 扩展

    Chrome 扩展程序被打包为 zip 存档 设置完成后 它将安装在文件夹中 用户可以访问它 他还可以重写扩展 甚至克隆到新的扩展 如何保护扩展免受用户修改和克隆 我发现了 dll 文件的可能性 可以编译 但它不是很好 如果您有一些专有代码
  • Chrome 扩展 - 消息传递到批处理文件

    我使用了示例项目https developer chrome com extensions samples https developer chrome com extensions samples我能够运行 python 本机应用程序 有

随机推荐

  • Android Studio 的启动栏逐渐消失到主程序中

    我目前正在开发一个 Android 应用程序 刚刚开始 我就能够实现我的闪屏了 然而 我不喜欢它和主要活动之间的过渡 我希望初始屏幕淡出 主屏幕淡入 看起来它们混合在一起 因为我对两者都有相同的背景图像 做了一些研究 但未能找到正确的答案
  • 如何将数字转换为科学记数法?

    我想创建一个函数 它接受输入的值并将其转换为科学记数法 N x 10 a 我尝试了很多不同的事情 但我似乎无法做到正确 Example 我输入 200 转换器将其转换为 2 x 10 2 你可以这样做 a 200 a toExponenti
  • 解析错误:语法错误,意外的“mysql_query”(T_STRING)

    我是 php 新手 在更新表的某一列时遇到此错误 if isset POST approved change SELECT FROM workplan forchange mysql query change while infoChang
  • Grails 根据枚举列表属性中的枚举值选择域对象

    我在根据枚举列表中的值从域对象列表中选择项目时遇到问题 我的域对象如下所示 class Truck static hasMany makes Make 其中 Make 看起来像这样 enum Make KENWORTH MACK VOLVO
  • 非托管导出错误“RGiesecke.DllExport.MSBuild.DllExportAppDomainIsolatedTask”

    我在 Visual Studio 2017 编译 DLL 项目时遇到问题 我在包管理器控制台上执行了 Install Package UnmanagedExports 错误 无法从程序集 C Users Tom Desktop CSharp
  • NodeJS ping 端口

    我正在为我工 作的一家托管公司编写一个状态检查器 我们想知道如何使用 nodejs 检查端口的状态 如果可能的话 如果没有 你能建议任何其他想法 比如使用 PHP 和阅读 STDOUT 吗 是的 这可以很容易地使用net http node
  • Java EE 7 属性文件配置的最佳实践建议是什么?

    应用程序配置在现代 Java EE 应用程序中属于什么位置 人们有哪些最佳实践建议 通过应用程序配置 我的意思是诸如与其他设备上的服务的连接设置之类的设置 包括外部设备 例如 Twitter 和我们的内部 Cassandra 服务器 用于主
  • VS2015中如何设置工具提示颜色?

    我刚刚安装了 Visual Studio 2015 总体来说非常好 但是您可以在 工具 gt 选项 gt 字体和颜色 下配置的大量不同内容完全让我感到困惑 我需要找到允许我更改此工具提示颜色的设置 以便我可以实际阅读它 它在哪里 下载颜色主
  • php:: tmp 文件保留多长时间?

    我正在编写上传脚本 如果用户上传一个文件并且该文件已经存在 我想警告用户 这都是通过ajax 并让他们选择替换它或取消 而不是移动文件 我很好奇是否可以将文件保留在 tmp 中并在 ajax 响应中传回该文件的路径 如果用户说覆盖该 aja
  • Android 版 Chrome 无法正确显示 Google 网络字体

    我已经使用 CSS 重现了我遇到的问题font family以及 Android 版 Chrome Web 浏览器无法正确继承字体 而是使用后备字体 http jsbin com iyifah 1 edit http jsbin com i
  • RxJS - 使用成对确认和恢复输入字段

    所以我对可观察的东西有点陌生 我正在努力解决一个场景 我认为它可能是一个很好的候选问题 开始了 场景是这样的 我有一个下拉字段 当它改变时 我想要 检查基于条件以前的值和新的值领域的 如果条件通过 则请求用户确认 并且 如果用户未确认 则恢
  • Android 上的 Bootstrap 3 长模态滚动背景

    我有一个长模态框 无法在我的 Android 移动设备上完全显示 按钮位于屏幕底部下方 模态框根本不滚动 但模态框后面的灰色背景会滚动 是否有任何 css js锁定背景并允许模式在显示时滚动的技巧 可能是因为模态类位置是固定的 尝试将下面的
  • 当某些值丢失时如何绘制谷歌折线图?

    我在以下位置找到了以下 JavaScript 代码谷歌图表工具 http code google com apis chart interactive docs gallery imagelinechart html function dr
  • Colab 上的 gdrive 问题

    安装谷歌驱动器后 我正在使用 colab 在 cifar10 上训练 resnet 我克隆了存储库并且能够运行该脚本 然而 Tensorflow 已加载 数据文件已传递到网络 但我以以下内容结束 tensorflow python fram
  • Java中获取默认根目录

    我正在制作一个基本的文件浏览器 并且想知道如何获取默认根目录 我知道java io File listRoots 给出所有的根 对我来说是A C D E F G H I L T U X Y Z 但我想要用户主要使用的那个 即带有操作系统的那
  • XSD 中缺少响应和 DTO 对象

    我正在使用最新版本的 ServiceStack 和 NuGet 我已经有了一个基本的服务设置 可以与 JsonServiceClient 很好地配合 并且按预期通过了所有单元测试 不幸的是 我还尝试支持 SOAP 和 Visual Stud
  • 适用于 Microsoft Windows 的终端多路复用器 - GNU Screen 或 tmux 的安装程序 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找适用于 Microsoft Windows 的终端多路复用器 我无法找到 tmux 和 GNU Screen 的 Microso
  • AngularJS 指令根据指令名称的第一个字符而中断

    我编写了一个 Angular 指令 该指令表现出一些奇怪的行为 该指令向 parsers 添加了一个函数 以根据正则表达式模式限制用户输入的内容 如果当前文本与模式不匹配 解析器会将文本恢复为该字段的先前值 因此 当文本恢复时 Angula
  • 特定于平台的 std::chrono::high_resolution_clock::period::num

    我注意到了std chrono high resolution clock period num 1对于我测试过的每个系统 是否存在任何系统 嵌入式 桌面 移动或其他 它恰好是其他数字 在这样的系统上 1 秒不能用刻度来表示 有以下三种实现
  • Chrome 扩展 - 如何使用清单 v3 访问本地 file://

    我有一个 Chrome 扩展程序 可以 如果您允许访问文件 URL 抓取您在 Chrome 中打开的本地 pdf 文件 并将其发送到我们的 API 进行处理 这是通过获取 pdf 来完成的XMLHttpRequest to file Use