diff --git a/Tests/LibWeb/Text/expected/navigation/history-replace-push-state-race-3.txt b/Tests/LibWeb/Text/expected/navigation/history-replace-push-state-race-3.txt
new file mode 100644
index 00000000000..173c92ab806
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/navigation/history-replace-push-state-race-3.txt
@@ -0,0 +1 @@
+test done!
diff --git a/Tests/LibWeb/Text/input/navigation/history-replace-push-state-race-3.html b/Tests/LibWeb/Text/input/navigation/history-replace-push-state-race-3.html
new file mode 100644
index 00000000000..b1102c77f10
--- /dev/null
+++ b/Tests/LibWeb/Text/input/navigation/history-replace-push-state-race-3.html
@@ -0,0 +1,22 @@
+
+
diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp
index ad6a9b30f60..f6b987169d1 100644
--- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp
+++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp
@@ -587,10 +587,18 @@ TraversableNavigable::HistoryStepResult TraversableNavigable::apply_the_history_
});
}
- main_thread_event_loop().spin_processing_tasks_with_source_until(Task::Source::NavigationAndTraversal, [&] {
+ auto check_if_document_population_tasks_completed = JS::SafeFunction([&] {
return changing_navigable_continuations.size() + completed_change_jobs == total_change_jobs;
});
+ if (synchronous_navigation == SynchronousNavigation::Yes) {
+ // NOTE: Synchronous navigation should never require document population, so it is safe to process only NavigationAndTraversal source.
+ main_thread_event_loop().spin_processing_tasks_with_source_until(Task::Source::NavigationAndTraversal, move(check_if_document_population_tasks_completed));
+ } else {
+ // NOTE: Process all task sources while waiting because reloading or back/forward navigation might require fetching to populate a document.
+ main_thread_event_loop().spin_until(move(check_if_document_population_tasks_completed));
+ }
+
// 13. Let navigablesThatMustWaitBeforeHandlingSyncNavigation be an empty set.
Vector> navigables_that_must_wait_before_handling_sync_navigation;