diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp index 70d21aa1a8..6cd0efefe7 100644 --- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp +++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp @@ -117,4 +117,36 @@ bool TraversableNavigable::is_top_level_traversable() const return parent() == nullptr; } +// https://html.spec.whatwg.org/multipage/browsing-the-web.html#getting-all-used-history-steps +Vector TraversableNavigable::get_all_used_history_steps() const +{ + // FIXME: 1. Assert: this is running within traversable's session history traversal queue. + + // 2. Let steps be an empty ordered set of non-negative integers. + OrderedHashTable steps; + + // 3. Let entryLists be the ordered set « traversable's session history entries ». + Vector>> entry_lists { session_history_entries() }; + + // 4. For each entryList of entryLists: + while (!entry_lists.is_empty()) { + auto entry_list = entry_lists.take_first(); + + // 1. For each entry of entryList: + for (auto& entry : entry_list) { + // 1. Append entry's step to steps. + steps.set(entry->step.get()); + + // 2. 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); + } + } + + // 5. Return steps, sorted. + auto sorted_steps = steps.values(); + quick_sort(sorted_steps); + return sorted_steps; +} + } diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h index 79c64315a4..80b2c685d9 100644 --- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h +++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h @@ -30,6 +30,8 @@ public: bool running_nested_apply_history_step() const { return m_running_nested_apply_history_step; }; VisibilityState system_visibility_state() const { return m_system_visibility_state; }; + Vector get_all_used_history_steps() const; + private: TraversableNavigable();