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;