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 };