Răsfoiți Sursa

fix: revoke downloaded blobs asynchronously

fixes #1163
tophf 5 ani în urmă
părinte
comite
ceae9a79c1
2 a modificat fișierele cu 11 adăugiri și 12 ștergeri
  1. 5 10
      src/common/download.js
  2. 6 2
      src/injected/web/gm-api.js

+ 5 - 10
src/common/download.js

@@ -1,15 +1,10 @@
-export function downloadUrl(url, name, callback) {
+import { makePause } from '#/common';
+
+export function downloadBlob(blob, name) {
+  const url = URL.createObjectURL(blob);
   const a = document.createElement('a');
   const a = document.createElement('a');
   a.href = url;
   a.href = url;
   a.download = name || '';
   a.download = name || '';
   a.dispatchEvent(new MouseEvent('click'));
   a.dispatchEvent(new MouseEvent('click'));
-  if (callback) setTimeout(callback, 3000);
-}
-
-export function downloadBlob(blob, name, callback) {
-  const url = URL.createObjectURL(blob);
-  downloadUrl(url, name, () => {
-    URL.revokeObjectURL(url);
-    if (callback) callback();
-  });
+  makePause(3000).then(() => URL.revokeObjectURL(url));
 }
 }

+ 6 - 2
src/injected/web/gm-api.js

@@ -234,14 +234,18 @@ function getResource(context, name, isBlob) {
   }
   }
 }
 }
 
 
-async function downloadBlob(res) {
+function downloadBlob(res) {
   const { context: { name, onload }, response } = res;
   const { context: { name, onload }, response } = res;
   const url = createObjectURL(response);
   const url = createObjectURL(response);
   const a = document::createElementNS(NS_HTML, 'a');
   const a = document::createElementNS(NS_HTML, 'a');
   a::setAttribute('href', url);
   a::setAttribute('href', url);
   if (name) a::setAttribute('download', name);
   if (name) a::setAttribute('download', name);
   a::dispatchEvent(new MouseEvent('click'));
   a::dispatchEvent(new MouseEvent('click'));
+  revokeBlobAfterTimeout(url);
+  onload?.(res);
+}
+
+async function revokeBlobAfterTimeout(url) {
   await bridge.send('SetTimeout', 3000);
   await bridge.send('SetTimeout', 3000);
   revokeObjectURL(url);
   revokeObjectURL(url);
-  onload?.(res);
 }
 }