diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp index 21fd28a53c5..4ca0f5818a0 100644 --- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp +++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp @@ -560,9 +560,24 @@ TraversableNavigable::HistoryStepResult TraversableNavigable::apply_the_history_ // 6. Let oldOrigin be targetEntry's document state's origin. auto old_origin = target_entry->document_state()->origin(); - // FIXME: 7. If navigable is not traversable, and targetEntry is not navigable's current session history entry, - // and oldOrigin is the same as navigable's current session history entry's document state's origin, - // then fire a traverse navigate event given targetEntry and userInvolvementForNavigateEvents. + // 7. If all of the following are true: + // * navigable is not traversable; + // * targetEntry is not navigable's current session history entry; and + // * oldOrigin is the same as navigable's current session history entry's document state's origin, + // then: + if (!navigable->is_traversable() + && target_entry != navigable->current_session_history_entry() + && old_origin == navigable->current_session_history_entry()->document_state()->origin()) { + + // 1. Assert: userInvolvementForNavigateEvents is not null. + VERIFY(user_involvement_for_navigate_events.has_value()); + + // 2. Let navigation be navigable's active window's navigation API. + auto navigation = active_window()->navigation(); + + // 3. Fire a traverse navigate event at navigation given targetEntry and userInvolvementForNavigateEvents. + navigation->fire_a_traverse_navigate_event(*target_entry, *user_involvement_for_navigate_events); + } auto after_document_populated = [old_origin, changing_navigable_continuation, &changing_navigable_continuations, &vm, &navigable](bool populated_cloned_target_she, JS::NonnullGCPtr target_entry) mutable { changing_navigable_continuation->populated_target_entry = target_entry;