diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp
index f0f42a696f0..c53edb776b1 100644
--- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp
+++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp
@@ -782,6 +782,12 @@ TraversableNavigable::HistoryStepResult TraversableNavigable::apply_the_history_
// 20. Set traversable's current session history step to targetStep.
m_current_session_history_step = target_step;
+ // 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;
+ page().client().page_did_update_navigation_buttons_state(back_enabled, forward_enabled);
+
// 21. Return "applied".
return HistoryStepResult::Applied;
}
diff --git a/Userland/Libraries/LibWeb/Page/Page.h b/Userland/Libraries/LibWeb/Page/Page.h
index 868dd9b7151..b4cb6185423 100644
--- a/Userland/Libraries/LibWeb/Page/Page.h
+++ b/Userland/Libraries/LibWeb/Page/Page.h
@@ -299,6 +299,7 @@ public:
virtual NewWebViewResult page_did_request_new_web_view(HTML::ActivateTab, HTML::WebViewHints, HTML::TokenizedFeature::NoOpener) { return {}; }
virtual void page_did_request_activate_tab() { }
virtual void page_did_close_top_level_traversable() { }
+ virtual void page_did_update_navigation_buttons_state([[maybe_unused]] bool back_enabled, [[maybe_unused]] bool forward_enabled) { }
virtual void request_file(FileRequest) = 0;
diff --git a/Userland/Libraries/LibWebView/ViewImplementation.cpp b/Userland/Libraries/LibWebView/ViewImplementation.cpp
index 49c6c50d163..2d97a817dd7 100644
--- a/Userland/Libraries/LibWebView/ViewImplementation.cpp
+++ b/Userland/Libraries/LibWebView/ViewImplementation.cpp
@@ -355,6 +355,12 @@ void ViewImplementation::did_change_audio_play_state(Badge, We
on_audio_play_state_changed(m_audio_play_state);
}
+void ViewImplementation::did_update_navigation_buttons_state(Badge, bool back_enabled, bool forward_enabled) const
+{
+ if (on_navigation_buttons_state_changed)
+ on_navigation_buttons_state_changed(back_enabled, forward_enabled);
+}
+
void ViewImplementation::handle_resize()
{
resize_backing_stores_if_needed(WindowResizeInProgress::Yes);
diff --git a/Userland/Libraries/LibWebView/ViewImplementation.h b/Userland/Libraries/LibWebView/ViewImplementation.h
index 848b8a2018f..0d85ed8dad1 100644
--- a/Userland/Libraries/LibWebView/ViewImplementation.h
+++ b/Userland/Libraries/LibWebView/ViewImplementation.h
@@ -110,6 +110,8 @@ public:
void did_change_audio_play_state(Badge, Web::HTML::AudioPlayState);
Web::HTML::AudioPlayState audio_play_state() const { return m_audio_play_state; }
+ void did_update_navigation_buttons_state(Badge, bool back_enabled, bool forward_enabled) const;
+
enum class ScreenshotType {
Visible,
Full,
@@ -189,6 +191,7 @@ public:
Function on_theme_color_change;
Function on_insert_clipboard_entry;
Function on_audio_play_state_changed;
+ Function on_navigation_buttons_state_changed;
Function on_inspector_loaded;
Function const&)> on_inspector_selected_dom_node;
Function on_inspector_set_dom_node_text;
diff --git a/Userland/Libraries/LibWebView/WebContentClient.cpp b/Userland/Libraries/LibWebView/WebContentClient.cpp
index e4bb524e033..7f3d43f1ed3 100644
--- a/Userland/Libraries/LibWebView/WebContentClient.cpp
+++ b/Userland/Libraries/LibWebView/WebContentClient.cpp
@@ -588,6 +588,12 @@ void WebContentClient::did_change_audio_play_state(u64 page_id, Web::HTML::Audio
view->did_change_audio_play_state({}, play_state);
}
+void WebContentClient::did_update_navigation_buttons_state(u64 page_id, bool back_enabled, bool forward_enabled)
+{
+ if (auto view = view_for_page_id(page_id); view.has_value())
+ view->did_update_navigation_buttons_state({}, back_enabled, forward_enabled);
+}
+
void WebContentClient::inspector_did_load(u64 page_id)
{
if (auto view = view_for_page_id(page_id); view.has_value()) {
diff --git a/Userland/Libraries/LibWebView/WebContentClient.h b/Userland/Libraries/LibWebView/WebContentClient.h
index 02752777638..58ef673adcf 100644
--- a/Userland/Libraries/LibWebView/WebContentClient.h
+++ b/Userland/Libraries/LibWebView/WebContentClient.h
@@ -101,6 +101,7 @@ private:
virtual void did_change_theme_color(u64 page_id, Gfx::Color color) override;
virtual void did_insert_clipboard_entry(u64 page_id, String const& data, String const& presentation_style, String const& mime_type) override;
virtual void did_change_audio_play_state(u64 page_id, Web::HTML::AudioPlayState) override;
+ virtual void did_update_navigation_buttons_state(u64 page_id, bool back_enabled, bool forward_enabled) override;
virtual void inspector_did_load(u64 page_id) override;
virtual void inspector_did_select_dom_node(u64 page_id, i32 node_id, Optional const& pseudo_element) override;
virtual void inspector_did_set_dom_node_text(u64 page_id, i32 node_id, String const& text) override;
diff --git a/Userland/Services/WebContent/PageClient.cpp b/Userland/Services/WebContent/PageClient.cpp
index af8b5678307..0b2ff33a5eb 100644
--- a/Userland/Services/WebContent/PageClient.cpp
+++ b/Userland/Services/WebContent/PageClient.cpp
@@ -562,6 +562,11 @@ void PageClient::page_did_close_top_level_traversable()
m_owner.remove_page({}, m_id);
}
+void PageClient::page_did_update_navigation_buttons_state(bool back_enabled, bool forward_enabled)
+{
+ client().async_did_update_navigation_buttons_state(m_id, back_enabled, forward_enabled);
+}
+
void PageClient::request_file(Web::FileRequest file_request)
{
client().request_file(m_id, move(file_request));
diff --git a/Userland/Services/WebContent/PageClient.h b/Userland/Services/WebContent/PageClient.h
index 88a8b2fdc32..d70a5d94d8d 100644
--- a/Userland/Services/WebContent/PageClient.h
+++ b/Userland/Services/WebContent/PageClient.h
@@ -137,6 +137,7 @@ private:
virtual NewWebViewResult page_did_request_new_web_view(Web::HTML::ActivateTab, Web::HTML::WebViewHints, Web::HTML::TokenizedFeature::NoOpener) override;
virtual void page_did_request_activate_tab() override;
virtual void page_did_close_top_level_traversable() override;
+ virtual void page_did_update_navigation_buttons_state(bool back_enabled, bool forward_enabled) override;
virtual void request_file(Web::FileRequest) override;
virtual void page_did_request_color_picker(Color current_color) override;
virtual void page_did_request_file_picker(Web::HTML::FileFilter accepted_file_types, Web::HTML::AllowMultipleFiles) override;
diff --git a/Userland/Services/WebContent/WebContentClient.ipc b/Userland/Services/WebContent/WebContentClient.ipc
index 776c5098f9e..bd0f6c0c632 100644
--- a/Userland/Services/WebContent/WebContentClient.ipc
+++ b/Userland/Services/WebContent/WebContentClient.ipc
@@ -83,6 +83,7 @@ endpoint WebContentClient
did_finish_handling_input_event(u64 page_id, bool event_was_accepted) =|
did_change_theme_color(u64 page_id, Gfx::Color color) =|
did_insert_clipboard_entry(u64 page_id, String data, String presentation_style, String mime_type) =|
+ did_update_navigation_buttons_state(u64 page_id, bool back_enabled, bool forward_enabled) =|
did_change_audio_play_state(u64 page_id, Web::HTML::AudioPlayState play_state) =|