From afccb775f8d2a2a40bd8a30f60d3c736c80b8302 Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Tue, 22 Jun 2021 15:21:58 -0500 Subject: [PATCH] Chrome's XHR progress event can't compute `total` with compression, so let's estimate it --- src/packager/large-assets.js | 2 ++ src/packager/lib/xhr.js | 7 ++++++- src/packager/packager.js | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/packager/large-assets.js b/src/packager/large-assets.js index 60dc6bc..061038b 100644 --- a/src/packager/large-assets.js +++ b/src/packager/large-assets.js @@ -20,10 +20,12 @@ module.exports = { }, scaffolding: { src: 'scaffolding.js', + estimatedSize: 4775503, type: 'text' }, addons: { src: 'addons.js', + estimatedSize: 14339, type: 'text' } }; diff --git a/src/packager/lib/xhr.js b/src/packager/lib/xhr.js index 81e1580..918029c 100644 --- a/src/packager/lib/xhr.js +++ b/src/packager/lib/xhr.js @@ -1,8 +1,11 @@ +const clampProgress = (n) => Math.max(0, Math.min(1, n)); + const xhr = ({ url, type, progressCallback, - timeout + timeout, + estimatedSize }) => new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.onload = () => { @@ -19,6 +22,8 @@ const xhr = ({ xhr.onprogress = (e) => { if (e.lengthComputable) { progressCallback(e.loaded / e.total); + } else if (estimatedSize) { + progressCallback(clampProgress(e.loaded / estimatedSize)); } }; } diff --git a/src/packager/packager.js b/src/packager/packager.js index 5034fb7..763c096 100644 --- a/src/packager/packager.js +++ b/src/packager/packager.js @@ -83,6 +83,7 @@ class Packager extends EventTarget { result = await xhr({ url: asset.src, type: asset.type, + estimatedSize: asset.estimatedSize, progressCallback: (progress) => { dispatchProgress(progress); }