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) =|