diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp index 6cd0efefe7..4322ee43a5 100644 --- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp +++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp @@ -149,4 +149,35 @@ Vector TraversableNavigable::get_all_used_history_steps() const return sorted_steps; } +// https://html.spec.whatwg.org/multipage/browsing-the-web.html#clear-the-forward-session-history +void TraversableNavigable::clear_the_forward_session_history() +{ + // FIXME: 1. Assert: this is running within navigable's session history traversal queue. + + // 2. Let step be the navigable's current session history step. + auto step = current_session_history_step(); + + // 3. Let entryLists be the ordered set « navigable's session history entries ». + Vector>&> entry_lists; + entry_lists.append(session_history_entries()); + + // 4. For each entryList of entryLists: + while (!entry_lists.is_empty()) { + auto& entry_list = entry_lists.take_first(); + + // 1. Remove every session history entry from entryList that has a step greater than step. + entry_list.remove_all_matching([step](auto& entry) { + return entry->step.template get() > step; + }); + + // 2. For each entry of entryList: + for (auto& entry : entry_list) { + // 1. For each nestedHistory of entry's document state's nested histories, append nestedHistory's entries list to entryLists. + for (auto& nested_history : entry->document_state->nested_histories()) { + entry_lists.append(nested_history.entries); + } + } + } +} + } diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h index 80b2c685d9..cbfad5964f 100644 --- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h +++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h @@ -31,6 +31,7 @@ public: VisibilityState system_visibility_state() const { return m_system_visibility_state; }; Vector get_all_used_history_steps() const; + void clear_the_forward_session_history(); private: TraversableNavigable();