diff --git a/Libraries/LibWeb/HTML/Navigation.cpp b/Libraries/LibWeb/HTML/Navigation.cpp
index 88723ae4876..edeee71e9e2 100644
--- a/Libraries/LibWeb/HTML/Navigation.cpp
+++ b/Libraries/LibWeb/HTML/Navigation.cpp
@@ -1320,26 +1320,35 @@ bool Navigation::fire_a_push_replace_reload_navigate_event(
if (!navigation_api_state.has_value())
navigation_api_state = MUST(structured_serialize_for_storage(vm, JS::js_null()));
- // 1. Let event be the result of creating an event given NavigateEvent, in navigation's relevant realm.
- // 2. Set event's classic history API state to classicHistoryAPIState.
+ // 1. If isSameDocument is true:
+ if (is_same_document) {
+ // 1. While navigation's ongoing navigate event is not null:
+ while (m_ongoing_navigate_event) {
+ // 1. Abort the ongoing navigation given navigation.
+ abort_the_ongoing_navigation();
+ }
+ }
+
+ // 2. Let event be the result of creating an event given NavigateEvent, in navigation's relevant realm.
+ // 3. Set event's classic history API state to classicHistoryAPIState.
// AD-HOC: These are handled in the inner algorithm
- // 3. Let destination be a new NavigationDestination created in navigation's relevant realm.
+ // 4. Let destination be a new NavigationDestination created in navigation's relevant realm.
auto destination = NavigationDestination::create(realm);
- // 4. Set destination's URL to destinationURL.
+ // 5. Set destination's URL to destinationURL.
destination->set_url(destination_url);
- // 5. Set destination's entry to null.
+ // 6. Set destination's entry to null.
destination->set_entry(nullptr);
- // 6. Set destination's state to navigationAPIState.
+ // 7. Set destination's state to navigationAPIState.
destination->set_state(*navigation_api_state);
- // 7. Set destination's is same document to isSameDocument.
+ // 8. Set destination's is same document to isSameDocument.
destination->set_is_same_document(is_same_document);
- // 8. Return the result of performing the inner navigate event firing algorithm given navigation,
+ // 9. Return the result of performing the inner navigate event firing algorithm given navigation,
// navigationType, event, destination, userInvolvement, sourceElement, formDataEntryList, and null.
// AD-HOC: We don't pass the event, but we do pass the classic_history_api state at the end to be set later
return inner_navigate_event_firing_algorithm(navigation_type, destination, user_involvement, source_element, move(form_data_entry_list), {}, move(classic_history_api_state));
diff --git a/Tests/LibWeb/Text/expected/wpt-import/navigation-api/navigate-event/navigate-multiple-history-pushState.txt b/Tests/LibWeb/Text/expected/wpt-import/navigation-api/navigate-event/navigate-multiple-history-pushState.txt
new file mode 100644
index 00000000000..5351ef0d2d4
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/wpt-import/navigation-api/navigate-event/navigate-multiple-history-pushState.txt
@@ -0,0 +1,6 @@
+Harness status: OK
+
+Found 1 tests
+
+1 Pass
+Pass history.pushState() called multiple times gives correct event order
\ No newline at end of file
diff --git a/Tests/LibWeb/Text/input/wpt-import/navigation-api/navigate-event/navigate-multiple-history-pushState.html b/Tests/LibWeb/Text/input/wpt-import/navigation-api/navigate-event/navigate-multiple-history-pushState.html
new file mode 100644
index 00000000000..ef0d93ef595
--- /dev/null
+++ b/Tests/LibWeb/Text/input/wpt-import/navigation-api/navigate-event/navigate-multiple-history-pushState.html
@@ -0,0 +1,37 @@
+
+
+
+