The fact there isn't a straightforward back-pressure mechanism in browsers to get live updates on how much time is left for an upload or a download is why loading spinners are used everywhere instead of progress bars. You can implement it yourself using websockets and a ton of complexity, but then you need the entire socket tooling and security to be in place. It's one of few the things browsers are really missing in my opinion.