我有一个Chrome扩展程序,可以(如果您允许访问文件URL)抓取您在Chrome中打开的本地pdf文件,并将其发送到我们的API进行处理。这是通过从后台脚本使用
当迁移到Chrome扩展程序的manifest v3时,后台脚本变成了服务工作者。在服务工作者中,只有
编辑:我还尝试过以下操作:
以下是参考我的manifest.json:
内容脚本是通过编程方式注入的(使用
XMLHttpRequest
来获取PDF文件file:///Users/user/whatever/testfile.pdf
完成的。当迁移到Chrome扩展程序的manifest v3时,后台脚本变成了服务工作者。在服务工作者中,只有
fetch
可用,而没有XMLHttpRequest
。问题是,fetch仅支持http和https,不支持file:// URL。那么我该如何实现与Chrome扩展程序相同的功能,即获取本地文件?编辑:我还尝试过以下操作:
按照答案建议从注入的iframe中发出XMLHttpRequest请求。 这会在发出请求时产生错误
net:ERR_UNKNOWN_URL_SCHEME
。从注入的内容脚本中发出XMLHttpRequest请求。 这将会产生错误
访问 'file:///.../testfile1.docx.pdf' 被CORS策略阻止,源为 'null' 的跨域请求仅支持以下协议方案: 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
支持Promise)。browser.action.onClicked.addListener(async (tab: Tab) => {
await browser.scripting.executeScript({files: [ "inject.js" ], target: {tabId: tab.id}});
});
fetch
支持file://
协议。 - wOxxOm