我试图在 Chrome 扩展清单版本 3 中结束(并在进行一些分析后重新启动)文件下载之前停止。我使用 chrome.downloads.OnDeterminingFileName 和 chrome.downloads.OnCreated 事件来检测下载何时开始,然后检测第一个下载我的代码在该事件处理程序中执行的操作是使用 chrome.downloads.pause 方法来停止下载。 添加:
chrome.downloads.onDeterminingFilename.addListener(function (downloadItem) {
if(downloadItem.fileSize < 20971520 && downloadItem.filename.endsWith('.exe') ){
chrome.downloads.pause(downloadItem.id);
console.log(downloadItem.id)
}
});
问题是它无法处理小文件(小于 1MB),因为它正在下载。对于更大的,它工作得很好。我可以做些什么来解决这个问题吗?我可以避免这种行为吗? 预先感谢。
我可以重现该问题,但我没有解决方案。
If the listener calls suggest asynchronously, then it must return true.
The DownloadItem will not complete until all listeners have called suggest.
因此,以下代码应该自动暂停所有下载。
manifest.json
{
"manifest_version": 3,
"name": "Pause Downloads",
"version": "0.0.1",
"action": {
},
"background": {
"service_worker": "background.js"
},
"permissions": [
"downloads"
]
}
背景.js
function onChanged(downloadDelta) {
console.log("onChanged", downloadDelta);
}
function onCreated(downloadItem) {
console.log("onCreated", downloadItem);
}
function onDeterminingFilename(downloadItem, suggest) {
console.log("onDeterminingFilename", downloadItem, suggest);
chrome.downloads.pause(downloadItem.id)
.then(function() {
suggest();
})
.catch(function(error) {
console.error("background.js", "onDeterminingFilename", error);
suggest();
});
return true;
}
chrome.downloads.onChanged.addListener(onChanged);
chrome.downloads.onCreated.addListener(onCreated);
chrome.downloads.onDeterminingFilename.addListener(onDeterminingFilename);
我使用 https://fastest.fish/test-files 来测试不同文件大小的下载。
但正如你所说,扩展程序仅暂停> = 1 MB 的下载。
当我下载 1 KB 文件时,扩展程序会记录:
换句话说:扩展程序暂停下载,但 Chrome 会忽略这一点并完成下载。
如果其他人没有解决方案,您可能应该将此报告为错误,并链接到问题中的错误报告。
@Thomas Mueller 听起来是对的。但是,只是补充一下,与 chrome 不同,我尝试暂停多个文件的下载,即使对于大小为 1 字节的文件也是如此。 Firefox,似乎在所有情况下都运行良好。
function onPaused(downloadId) {
console.log(`Paused download`);
const myTimeout = setTimeout(() => {
let resuming = browser.downloads.resume(downloadId)
resuming.then( (res) => {
console.log({ res })
}, (err) => console.error( err ) )
}, 3000);
}
function onError(error) {
console.log(`Error: ${error}`);
}
// DETECTING DOWNLOAD
function handleCreated(downloadItem) {
const downloadId = downloadItem?.id
let pausing = browser.downloads.pause(downloadId);
pausing.then(() => onPaused(downloadId) , onError);
}
browser.downloads.onCreated.addListener(handleCreated);