Browse Source

fix: download handler

Ahmad Kholid 3 years ago
parent
commit
479e743bf7

+ 2 - 4
src/background/index.js

@@ -344,8 +344,7 @@ if (chrome.downloads) {
   chrome.downloads.onDeterminingFilename.addListener((item, suggest) => {
     const filesname =
       JSON.parse(sessionStorage.getItem('rename-downloaded-files')) || {};
-    const referrer = new URL(item.referrer).origin.replace(/\/$/, '');
-    const suggestion = filesname[referrer];
+    const suggestion = filesname[item.id];
 
     if (!suggestion) return;
 
@@ -356,8 +355,7 @@ if (chrome.downloads) {
       suggestion.filename += `.${filExtension}`;
     }
 
-    suggestion.id = item.id;
-    if (!suggestion.waitForDownload) delete filesname[referrer];
+    if (!suggestion.waitForDownload) delete filesname[item.id];
     sessionStorage.setItem(
       'rename-downloaded-files',
       JSON.stringify(filesname)

+ 19 - 10
src/background/workflow-engine/blocks-handler/handler-handle-download.js

@@ -9,11 +9,19 @@ function handleDownload({ data, outputs }) {
   return new Promise((resolve) => {
     if (!this.activeTab.id) throw new Error('no-tab');
 
-    const names = getFilesname();
-    const { origin } = new URL(this.activeTab.url);
+    let downloadId = null;
+    const handleCreated = ({ id }) => {
+      if (downloadId) return;
 
-    names[origin] = data;
-    sessionStorage.setItem('rename-downloaded-files', JSON.stringify(names));
+      const names = getFilesname();
+
+      downloadId = id;
+      names[id] = data;
+      sessionStorage.setItem('rename-downloaded-files', JSON.stringify(names));
+
+      browser.downloads.onCreated.removeListener(handleCreated);
+    };
+    browser.downloads.onCreated.addListener(handleCreated);
 
     if (!data.waitForDownload) {
       resolve({
@@ -26,6 +34,7 @@ function handleDownload({ data, outputs }) {
 
     let isResolved = false;
     let currentFilename = data.filename;
+
     const timeout = setTimeout(() => {
       if (isResolved) return;
 
@@ -37,7 +46,7 @@ function handleDownload({ data, outputs }) {
       });
     }, data.timeout);
 
-    const resolvePromise = () => {
+    const resolvePromise = (id) => {
       if (data.saveData) {
         this.addDataToColumn(data.dataColumn, currentFilename);
       }
@@ -49,7 +58,7 @@ function handleDownload({ data, outputs }) {
       isResolved = true;
 
       const filesname = getFilesname();
-      delete filesname[origin];
+      delete filesname[id];
       sessionStorage.setItem(
         'rename-downloaded-files',
         JSON.stringify(filesname)
@@ -67,21 +76,21 @@ function handleDownload({ data, outputs }) {
         return;
       }
 
-      const file = getFilesname()[origin];
-      if (!file || file.id !== id) return;
+      if (downloadId !== id) return;
 
       if (filename) currentFilename = filename.current;
 
       if (state && state.current === 'complete') {
-        resolvePromise();
+        resolvePromise(id);
       } else {
         browser.downloads.search({ id }).then(([download]) => {
           if (!download || !download.endTime) return;
 
-          resolvePromise();
+          resolvePromise(id);
         });
       }
     };
+
     browser.downloads.onChanged.addListener(handleChanged);
   });
 }