d and sort by recency const downloadThreshold = Date.now() - threshold; let downloads = [...this._downloadItems.values()] .filter(download => download.endTime > downloadThreshold) .sort((download1, download2) => download1.endTime < download2.endTime); for (const download of downloads) { // Ignore blocked links, but allow long (data:) uris to avoid high CPU if ( download.source.url.length < 10000 && lazy.NewTabUtils.blockedLinks.isBlocked(download.source) ) { continue; } // Only include downloads where the file still exists if (onlyExists) { // Refresh download to ensure the 'exists' attribute is up to date await download.refresh(); if (!download.target.exists) { continue; } } // Only include downloads that were completed successfully if (onlySucceeded) { if (!download.succeeded) { continue; } } const formattedDownloadForHighlights = this.formatDownload(download); results.push(formattedDownloadForHighlights); if (results.length === numItems) { break; } } return results; } uninit() { if (this._downloadData) { this._downloadData.removeView(this); this._downloadData = null; } if (this._downloadTimer) { this._downloadTimer.cancel(); this._downloadTimer = null; } } onAction(action) { let doDownloadAction = callback => { let download = this._downloadItems.get(action.data.url); if (download) { callback(download); } }; switch (action.type) { case at.COPY_DOWNLOAD_LINK: doDownloadAction(download => { lazy.DownloadsCommon.copyDownloadLink(download); }); break; case at.REMOVE_DOWNLOAD_FILE: doDownloadAction(download => { lazy.DownloadsCommon.deleteDownload(download).catch(console.error); }); break; case at.SHOW_DOWNLOAD_FILE: doDownloadAction(download => { lazy.DownloadsCommon.showDownloadedFile( new lazy.FileUtils.File(download.target.path) ); }); break; case at.OPEN_DOWNLOAD_FILE: { const openWhere = lazy.BrowserUtils.whereToOpenLink(action.data.event); doDownloadAction(download => { lazy.DownloadsCommon.openDownload(download, { // Replace "current" or unknown value with "tab" as the default behavior // for opening downloads when handled internally openWhere: ["window", "tab", "tabshifted"].includes(openWhere) ? openWhere : "tab", }); }); break; } case at.UNINIT: this.uninit(); break; } } } PK