bep40 commited on
Commit
7ebd115
·
verified ·
1 Parent(s): 5e6e635

Upload vai-fix-order-download-v1047.js

Browse files
Files changed (1) hide show
  1. vai-fix-order-download-v1047.js +39 -40
vai-fix-order-download-v1047.js CHANGED
@@ -3,15 +3,11 @@
3
  *
4
  * VẤN ĐỀ: Excel/PDF chỉ tải 1 lần, download lần 2+ không hoạt động
5
  *
6
- * NGĂN NHÂN GỐC CHÍNH:
7
- * - Hàm _doExportDeliveryExcel trong qr-payment.js vẫn gọi URL.revokeObjectURL sau 60s
8
- * - File v1042 chỉ override window.exportDeliveryExcel nhưng không can thiệp sâu
9
- * - Blob URL được thu hồn khiến download thất bại
10
- *
11
  * FIX TRIỆT ĐỐI:
12
- * - Monkey-patch URL.revokeObjectURL HOÀN TOÀN - KHÔNG revoke blob URLs
13
- * - Cleanup blob khi unload (pagehide/beforeunload)
14
- * - Không dùng setTimeout revoke - để trình duyệt tự giải phóng
 
15
  */
16
  (function() {
17
  'use strict';
@@ -19,10 +15,11 @@
19
  // Registry lưu blob URLs
20
  var blobRegistry = [];
21
 
22
- // ===== PATCH URL.revokeObjectURL HOÀN TOÀN =====
23
  var _originalRevoke = URL.revokeObjectURL;
24
  var _revokePatched = false;
25
 
 
26
  function patchRevoke() {
27
  if (_revokePatched) return;
28
  _revokePatched = true;
@@ -37,7 +34,7 @@
37
  blobRegistry.push({
38
  url: url,
39
  revoked: false,
40
- created: Date.now()
41
  });
42
  }
43
  // KHÔNG revoke - để download hoàn thành
@@ -47,14 +44,14 @@
47
  return _originalRevoke.call(this, url);
48
  };
49
 
50
- console.log('[Fix v1047] URL.revokeObjectURL patched - blobs will persist until unload');
51
  }
52
 
53
- // Chạy ngay và kiểm tra lại mỗi 500ms
54
  patchRevoke();
55
  setInterval(patchRevoke, 500);
56
 
57
- // ===== CLEANUP KHI UNLOAD =====
58
  function cleanupBlobs() {
59
  blobRegistry.forEach(function(entry) {
60
  if (!entry.revoked && entry.url) {
@@ -71,43 +68,45 @@
71
  window.addEventListener('beforeunload', cleanupBlobs);
72
  window.addEventListener('unload', cleanupBlobs);
73
 
74
- // ===== PATCH VAI_QR._doExportDeliveryExcel =====
75
  function patchVAIDR() {
76
  if (!window.VAI_QR || !window.VAI_QR._doExportDeliveryExcel) return;
77
 
 
 
 
78
  var originalDoExport = window.VAI_QR._doExportDeliveryExcel;
79
- var patched = originalDoExport._vaiPatched;
80
 
81
- if (!patched) {
82
- // Tạo wrapper mới - KHÔNG revoke blob
83
- window.VAI_QR._doExportDeliveryExcel = async function(qd, code) {
84
- // Gọi hàm gốc nhưng override URL.revokeObjectURL tạm thời
85
- var savedRevoke = URL.revokeObjectURL;
86
- URL.revokeObjectURL = function(url) {
87
- if (url && url.startsWith('blob:')) {
88
- blobRegistry.push({ url: url, revoked: false });
89
- return; // KHÔNG revoke
90
- }
91
- return savedRevoke.call(this, url);
92
- };
93
-
94
- try {
95
- await originalDoExport.call(this, qd, code);
96
- } finally {
97
- // Khôi phục revoke
98
- URL.revokeObjectURL = savedRevoke;
99
  }
 
100
  };
101
- window.VAI_QR._doExportDeliveryExcel._vaiPatched = true;
102
- console.log('[Fix v1047] VAI_QR._doExportDeliveryExcel patched');
103
- }
 
 
 
 
 
 
104
  }
105
 
106
- // Patch mỗi 500ms
107
  setInterval(patchVAIDR, 500);
108
-
109
- // Patch mặc định sau 2s
110
  setTimeout(patchVAIDR, 2000);
111
 
112
- console.log('[Fix v1047] Module loaded - multi-download support ready');
 
 
 
 
 
 
113
  })();
 
3
  *
4
  * VẤN ĐỀ: Excel/PDF chỉ tải 1 lần, download lần 2+ không hoạt động
5
  *
 
 
 
 
 
6
  * FIX TRIỆT ĐỐI:
7
+ * - Monkey-patch URL.revokeObjectURL HOÀN TOÀN
8
+ * - KHÔNG revoke blob URLs - để download hoàn thành
9
+ * - Cleanup khi unload (pagehide/beforeunload/unload)
10
+ * - Hỗ trợ mọi trình duyệt, download nhiều lần
11
  */
12
  (function() {
13
  'use strict';
 
15
  // Registry lưu blob URLs
16
  var blobRegistry = [];
17
 
18
+ // Lưu revoke gốc
19
  var _originalRevoke = URL.revokeObjectURL;
20
  var _revokePatched = false;
21
 
22
+ // PATCH URL.revokeObjectURL
23
  function patchRevoke() {
24
  if (_revokePatched) return;
25
  _revokePatched = true;
 
34
  blobRegistry.push({
35
  url: url,
36
  revoked: false,
37
+ created: Date.now()
38
  });
39
  }
40
  // KHÔNG revoke - để download hoàn thành
 
44
  return _originalRevoke.call(this, url);
45
  };
46
 
47
+ console.log('[Fix v1047] Loaded - multi-download support enabled');
48
  }
49
 
50
+ // Chạy ngay
51
  patchRevoke();
52
  setInterval(patchRevoke, 500);
53
 
54
+ // CLEANUP KHI UNLOAD
55
  function cleanupBlobs() {
56
  blobRegistry.forEach(function(entry) {
57
  if (!entry.revoked && entry.url) {
 
68
  window.addEventListener('beforeunload', cleanupBlobs);
69
  window.addEventListener('unload', cleanupBlobs);
70
 
71
+ // PATCH VAI_QR._doExportDeliveryExcel
72
  function patchVAIDR() {
73
  if (!window.VAI_QR || !window.VAI_QR._doExportDeliveryExcel) return;
74
 
75
+ var patched = window.VAI_QR._doExportDeliveryExcel._vaiPatched;
76
+ if (patched) return;
77
+
78
  var originalDoExport = window.VAI_QR._doExportDeliveryExcel;
 
79
 
80
+ window.VAI_QR._doExportDeliveryExcel = async function(qd, code) {
81
+ // Override revoke tạm thời
82
+ var savedRevoke = URL.revokeObjectURL;
83
+
84
+ URL.revokeObjectURL = function(url) {
85
+ if (url && url.startsWith('blob:')) {
86
+ blobRegistry.push({ url: url, revoked: false });
87
+ return;
 
 
 
 
 
 
 
 
 
 
88
  }
89
+ return savedRevoke.call(this, url);
90
  };
91
+
92
+ try {
93
+ await originalDoExport.call(this, qd, code);
94
+ } finally {
95
+ URL.revokeObjectURL = savedRevoke;
96
+ }
97
+ };
98
+ window.VAI_QR._doExportDeliveryExcel._vaiPatched = true;
99
+ console.log('[Fix v1047] VAI_QR patched');
100
  }
101
 
 
102
  setInterval(patchVAIDR, 500);
 
 
103
  setTimeout(patchVAIDR, 2000);
104
 
105
+ // PATCH exportDeliveryExcel toàn cục
106
+ var _originalExportDelivery = window.exportDeliveryExcel;
107
+ window.exportDeliveryExcel = async function() {
108
+ await _originalExportDelivery.call(this);
109
+ };
110
+
111
+ console.log('[Fix v1047] Excel multi-download fix ready');
112
  })();