diff --git a/extension/extension-downloads.js b/extension/extension-downloads.js index c6712e6a..9bdcedfe 100644 --- a/extension/extension-downloads.js +++ b/extension/extension-downloads.js @@ -1,161 +1,154 @@ /* Copyright (C) 2017-2019 Kai Uwe Broulik This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ var activeDownloads = [] var downloadUpdateInterval = 0; function startSendingDownloadUpdates() { if (!downloadUpdateInterval) { downloadUpdateInterval = setInterval(sendDownloadUpdates, 1000); } } function stopSendingDownloadUpdates() { if (downloadUpdateInterval) { clearInterval(downloadUpdateInterval); downloadUpdateInterval = 0; } } function sendDownloadUpdates() { chrome.downloads.search({ state: 'in_progress', paused: false }, function (results) { if (!results.length) { stopSendingDownloadUpdates(); return; } results.forEach(function (download) { if (activeDownloads.indexOf(download.id) === -1) { return; } var payload = { id: download.id, bytesReceived: download.bytesReceived, estimatedEndTime: download.estimatedEndTime, // Firefox ends along "-1" as totalBytes on download creation // but then never updates it, so we send this along periodically, too totalBytes: download.totalBytes }; port.postMessage({subsystem: "downloads", event: "update", download: payload}); }); }); } -// only forward certain download properties back to our host -var whitelistedDownloadProperties = [ - "id", "url", "finalUrl", "filename", "mime", "startTime", "estimatedEndTime", "totalBytes", "bytesReceived", "state", "error", /*"canResume"*/, "paused", "incognito" -]; - function createDownload(download) { // don't bother telling us about completed downloads... // otherwise on browser startup we'll spawn a gazillion download progress notification if (download.state === "complete" || download.state === "interrupted") { return; } - var filteredDownload = filterObject(download, whitelistedDownloadProperties); - activeDownloads.push(download.id); startSendingDownloadUpdates(); - port.postMessage({subsystem: "downloads", event: "created", download: filteredDownload}); + port.postMessage({subsystem: "downloads", event: "created", download: download}); } function sendDownloads() { // When extension is (re)loaded, create each download initially chrome.downloads.search({ state: 'in_progress', }, function (results) { results.forEach(createDownload); }); } chrome.downloads.onCreated.addListener(createDownload); chrome.downloads.onChanged.addListener(function (delta) { if (activeDownloads.indexOf(delta.id) === -1) { return; } // An interrupted download was resumed. When a download is interrupted, we finish (and delete) // the job but the browser re-uses the existing download, so when this happen, // pretend a new download was created. if (delta.state) { if (delta.state.previous === "interrupted" && delta.state.current === "in_progress") { console.log("Resuming previously interrupted download, pretending a new download was created"); chrome.downloads.search({ id: delta.id }, function (downloads) { createDownload(downloads[0]); }); return; } } // The update timer stops automatically when there are no running downloads // so make sure to restart it when a download is unpaused if (delta.paused) { if (delta.paused.previous && !delta.paused.current) { startSendingDownloadUpdates(); } } var payload = {}; - whitelistedDownloadProperties.forEach(function (item) { - if (delta[item]) { - payload[item] = delta[item].current; + Object.keys(delta).forEach((key) => { + if (delta[key]) { + payload[key] = delta[key].current; } }); payload.id = delta.id; // not a delta, ie. has no current and thus isn't added by the loop below port.postMessage({subsystem: "downloads", event: "update", download: payload}); }); addCallback("downloads", "cancel", function (message) { var downloadId = message.downloadId; console.log("Requested to cancel download", downloadId); chrome.downloads.cancel(downloadId); }); addCallback("downloads", "suspend", function (message) { var downloadId = message.downloadId; console.log("Requested to suspend download", downloadId); chrome.downloads.pause(downloadId); }); addCallback("downloads", "resume", function (message) { var downloadId = message.downloadId; console.log("Requested to resume download", downloadId); chrome.downloads.resume(downloadId); }); addCallback("downloads", "createAll", () => { sendDownloads(); });