Currently Blink and WebKit both delay popstate events that would occur before the load event, and queue them up to fire after the load event. This causes undesirable nondeterminism, as if you change a page's fragment before the load event, sometimes you will get events in the order [popstate, hashchange], and sometimes [hashchange, popstate], depending on how long it takes for the page to load. Firefox has a simpler model of always firing popstate synchronously. We are speccing that in https://github.com/whatwg/html/pull/7815 and Chromium will be working to align in https://bugs.chromium.org/p/chromium/issues/detail?id=1254926 / https://chromium-review.googlesource.com/c/chromium/src/+/3580022 . (Note that the current spec, before that spec PR, matched no browser.) Web platform tests are available at https://github.com/web-platform-tests/wpt/pull/33746 .
<rdar://problem/92613897>