diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp index 01bb438e1a9..21a26933f7f 100644 --- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp +++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp @@ -784,7 +784,7 @@ TraversableNavigable::HistoryStepResult TraversableNavigable::apply_the_history_ // Not in the spec: auto back_enabled = m_current_session_history_step > 0; VERIFY(m_session_history_entries.size() > 0); - auto forward_enabled = m_current_session_history_step < static_cast(m_session_history_entries.size()) - 1; + auto forward_enabled = can_go_forward(); page().client().page_did_update_navigation_buttons_state(back_enabled, forward_enabled); page().client().page_did_change_url(current_session_history_entry()->url()); @@ -895,6 +895,28 @@ void TraversableNavigable::clear_the_forward_session_history() } } +bool TraversableNavigable::can_go_forward() const +{ + auto step = current_session_history_step(); + + Vector> const&> entry_lists; + entry_lists.append(session_history_entries()); + + while (!entry_lists.is_empty()) { + auto const& entry_list = entry_lists.take_first(); + + for (auto const& entry : entry_list) { + if (entry->step().template get() > step) + return true; + + for (auto& nested_history : entry->document_state()->nested_histories()) + entry_lists.append(nested_history.entries); + } + } + + return false; +} + // https://html.spec.whatwg.org/multipage/browsing-the-web.html#traverse-the-history-by-a-delta void TraversableNavigable::traverse_the_history_by_delta(int delta, Optional source_document) { diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h index e6e8a4ebd3a..c330d6347ed 100644 --- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h +++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h @@ -102,6 +102,8 @@ private: Vector> get_session_history_entries_for_the_navigation_api(JS::NonnullGCPtr, int); + [[nodiscard]] bool can_go_forward() const; + // https://html.spec.whatwg.org/multipage/document-sequences.html#tn-current-session-history-step int m_current_session_history_step { 0 };