You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome扩展激活后启动浏览器时自动下载历史记录的问题求助

Chrome扩展下载历史自动触发问题排查与修复

我开发了一款Chrome扩展,通过监听chrome.downloads.onCreated事件,将指定网站的下载请求重定向到带有从URL提取编号的特定文件夹。核心逻辑是:当下载URL以目标网站开头时,修改下载路径和文件名。

目前遇到的问题:扩展处于激活状态时,启动Chrome会自动触发下载历史中的任务重新下载。现在只能靠清除下载历史解决,但这显然不适合推广,而且不确定会不会复发。试过在代码里加chrome.downloads.erase方法,没用。困惑的是我的代码根本没操作下载历史,求熟悉Chrome API的人帮忙分析原因。

附上我的service-worker.js代码:

chrome.downloads.onCreated.addListener(function(downloadItem) {


    console.log("Download has been triggered");




    //Checks for downloads from Example.com
  if (downloadItem.url.startsWith("https.www.example.com")){ 
        console.log("The download is from Example.com");

        //need to cancel original download
        chrome.downloads.cancel(downloadItem.id)

        //Gets ID of Current Tab
        var currentTab
        chrome.tabs.query({currentWindow: true, active: true }, function(tabs1){
        currentTab = tabs1[0];                      

        //Splits URL into an Array so it can pull Case Number
        const myArray = currentTab.url.split("/");
        let CaseNumber = myArray[myArray.length - 1];
        console.log("Case Number:", CaseNumber);


        //Splits URL into an Array so it can pull File Name
        const myArray1 = downloadItem.url.split("/")
        let NewFileName = myArray1[myArray1.length - 1] 
        
        
        //Sets Directory and adds Case Number to it
        const dir = "Cases\\"
        let FullPath = dir.concat(CaseNumber);
        //console.log(FullPath);

        //Adds the Filename to the Path
        let FileNameAndPath = FullPath.concat("\\");
        FileNameAndPath = FileNameAndPath.concat(NewFileName)


        //remove File from Downloads of Chrome
        chrome.downloads.erase({id: downloadItem.id}, function() {      
        });

        console.log("Path:", FileNameAndPath);

            //Sets download location and filename
            
            chrome.downloads.download({
                url: downloadItem.finalUrl,
                filename: FileNameAndPath,          
            });

        }); 

    }

});

问题根源分析

  1. onCreated事件触发逻辑:Chrome启动时会自动加载历史中未完成的下载任务(比如之前中断、暂停的任务),这些任务会触发onCreated事件,你的扩展监听到后执行了取消+重新下载的逻辑,相当于把历史遗留任务重新发起了。
  2. 异步操作顺序混乱:你先调用cancel,紧接着调用erase,然后立刻发起新下载——这三个都是异步操作,可能原任务还没被彻底删除,新下载请求已经发出去了,导致历史任务被重复触发。
  3. 任务状态判断缺失:代码没有区分新发起的下载和历史遗留任务,不管任务状态是interrupted(中断)还是in_progress(进行中),都会走处理逻辑。
  4. URL匹配错误:代码里downloadItem.url.startsWith("https.www.example.com")少了冒号和斜杠,应该是https://www.example.com,这会导致匹配失败,可能引发其他逻辑异常。

修复方案

1. 过滤任务状态,只处理新发起的下载

在代码开头增加状态判断,只处理真正的新下载任务:

chrome.downloads.onCreated.addListener(function(downloadItem) {
    // 只处理刚发起的下载,排除历史遗留的中断/完成任务
    if (downloadItem.state !== 'in_progress') return;
    console.log("Download has been triggered");
    // 后续原有逻辑...
});

2. 调整异步操作顺序,确保原任务彻底删除后再发起新下载

把新下载的逻辑放在erase的回调里,保证原任务被清除后再执行:

// 替换原有的erase和download代码块
chrome.downloads.erase({id: downloadItem.id}, function() {      
    console.log("Path:", FileNameAndPath);
    // 原任务删除后再发起新下载
    chrome.downloads.download({
        url: downloadItem.finalUrl || downloadItem.url, // 兼容finalUrl为空的情况
        filename: FileNameAndPath,          
    });
});

3. 修正URL匹配规则

把错误的URL开头改成正确的格式:

if (downloadItem.url.startsWith("https://www.example.com")){ 
    // 后续逻辑...
}

4. 避免依赖当前Tab的潜在风险

代码通过当前活跃Tab获取CaseNumber,但Chrome启动时可能没有活跃Tab,或者下载请求来自后台,会导致currentTab为undefined。建议直接从下载URL提取编号:

// 示例:根据实际下载URL结构调整索引,比如CaseNumber在倒数第2位
const downloadUrlParts = downloadItem.url.split("/");
let CaseNumber = downloadUrlParts[downloadUrlParts.length - 2];

完整修复后的代码示例

chrome.downloads.onCreated.addListener(function(downloadItem) {
    // 只处理新发起的下载任务
    if (downloadItem.state !== 'in_progress') return;
    console.log("Download has been triggered");

    // 修正URL匹配规则
    if (downloadItem.url.startsWith("https://www.example.com")){ 
        console.log("The download is from Example.com");

        // 先取消原下载
        chrome.downloads.cancel(downloadItem.id);

        // 直接从下载URL提取CaseNumber(根据实际URL结构调整索引)
        const downloadUrlParts = downloadItem.url.split("/");
        let CaseNumber = downloadUrlParts[downloadUrlParts.length - 2];
        console.log("Case Number:", CaseNumber);

        // 提取文件名
        const fileNameParts = downloadItem.url.split("/");
        let NewFileName = fileNameParts[fileNameParts.length - 1]; 
        
        // 用模板字符串简化路径拼接
        const FileNameAndPath = `Cases\\${CaseNumber}\\${NewFileName}`;

        // 先删除原任务,再发起新下载
        chrome.downloads.erase({id: downloadItem.id}, function() {      
            console.log("Path:", FileNameAndPath);
            chrome.downloads.download({
                url: downloadItem.finalUrl || downloadItem.url,
                filename: FileNameAndPath,          
            });
        });
    }
});

内容的提问来源于stack exchange,提问作者Jordan Simpson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:30:45