diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp
index c53edb776b1..43a74a7bc04 100644
--- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp
+++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp
@@ -788,6 +788,8 @@ TraversableNavigable::HistoryStepResult TraversableNavigable::apply_the_history_
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);
+ page().client().page_did_change_url(current_session_history_entry()->url());
+
// 21. Return "applied".
return HistoryStepResult::Applied;
}
diff --git a/Userland/Libraries/LibWeb/Page/Page.h b/Userland/Libraries/LibWeb/Page/Page.h
index 99d6497f3b6..c8aef0399cf 100644
--- a/Userland/Libraries/LibWeb/Page/Page.h
+++ b/Userland/Libraries/LibWeb/Page/Page.h
@@ -251,6 +251,7 @@ public:
virtual CSS::PreferredColorScheme preferred_color_scheme() const = 0;
virtual void paint(DevicePixelRect const&, Gfx::Bitmap&, PaintOptions = {}) = 0;
virtual void page_did_change_title(ByteString const&) { }
+ virtual void page_did_change_url(URL::URL const&) { }
virtual void page_did_request_navigate_back() { }
virtual void page_did_request_navigate_forward() { }
virtual void page_did_request_refresh() { }
diff --git a/Userland/Libraries/LibWebView/ViewImplementation.h b/Userland/Libraries/LibWebView/ViewImplementation.h
index fe9bcedab33..dc5cc250773 100644
--- a/Userland/Libraries/LibWebView/ViewImplementation.h
+++ b/Userland/Libraries/LibWebView/ViewImplementation.h
@@ -143,6 +143,7 @@ public:
Function on_link_click;
Function on_link_middle_click;
Function on_title_change;
+ Function on_url_change;
Function on_load_start;
Function on_load_finish;
Function on_history_api_push_or_replace;
diff --git a/Userland/Libraries/LibWebView/WebContentClient.cpp b/Userland/Libraries/LibWebView/WebContentClient.cpp
index 3c7c9ec8e50..5b113bde953 100644
--- a/Userland/Libraries/LibWebView/WebContentClient.cpp
+++ b/Userland/Libraries/LibWebView/WebContentClient.cpp
@@ -142,6 +142,14 @@ void WebContentClient::did_change_title(u64 page_id, ByteString const& title)
}
}
+void WebContentClient::did_change_url(u64 page_id, URL::URL const& url)
+{
+ if (auto view = view_for_page_id(page_id); view.has_value()) {
+ if (view->on_url_change)
+ view->on_url_change(url);
+ }
+}
+
void WebContentClient::did_request_scroll(u64 page_id, i32 x_delta, i32 y_delta)
{
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 803cd201d1c..e5211abb06e 100644
--- a/Userland/Libraries/LibWebView/WebContentClient.h
+++ b/Userland/Libraries/LibWebView/WebContentClient.h
@@ -47,6 +47,7 @@ private:
virtual void did_request_cursor_change(u64 page_id, i32) override;
virtual void did_layout(u64 page_id, Gfx::IntSize) override;
virtual void did_change_title(u64 page_id, ByteString const&) override;
+ virtual void did_change_url(u64 page_id, URL::URL const&) override;
virtual void did_request_scroll(u64 page_id, i32, i32) override;
virtual void did_request_scroll_to(u64 page_id, Gfx::IntPoint) override;
virtual void did_enter_tooltip_area(u64 page_id, Gfx::IntPoint, ByteString const&) override;
diff --git a/Userland/Services/WebContent/PageClient.cpp b/Userland/Services/WebContent/PageClient.cpp
index 18e081de713..113f9e22815 100644
--- a/Userland/Services/WebContent/PageClient.cpp
+++ b/Userland/Services/WebContent/PageClient.cpp
@@ -257,6 +257,11 @@ void PageClient::page_did_change_title(ByteString const& title)
client().async_did_change_title(m_id, title);
}
+void PageClient::page_did_change_url(URL::URL const& url)
+{
+ client().async_did_change_url(m_id, url);
+}
+
void PageClient::page_did_request_navigate_back()
{
client().async_did_request_navigate_back(m_id);
diff --git a/Userland/Services/WebContent/PageClient.h b/Userland/Services/WebContent/PageClient.h
index dae507375fb..9814baed2d1 100644
--- a/Userland/Services/WebContent/PageClient.h
+++ b/Userland/Services/WebContent/PageClient.h
@@ -95,6 +95,7 @@ private:
virtual void page_did_request_cursor_change(Gfx::StandardCursor) override;
virtual void page_did_layout() override;
virtual void page_did_change_title(ByteString const&) override;
+ virtual void page_did_change_url(URL::URL const&) override;
virtual void page_did_request_navigate_back() override;
virtual void page_did_request_navigate_forward() override;
virtual void page_did_request_refresh() override;
diff --git a/Userland/Services/WebContent/WebContentClient.ipc b/Userland/Services/WebContent/WebContentClient.ipc
index 47947b7d420..dca734f1d22 100644
--- a/Userland/Services/WebContent/WebContentClient.ipc
+++ b/Userland/Services/WebContent/WebContentClient.ipc
@@ -31,6 +31,7 @@ endpoint WebContentClient
did_request_cursor_change(u64 page_id, i32 cursor_type) =|
did_layout(u64 page_id, Gfx::IntSize content_size) =|
did_change_title(u64 page_id, ByteString title) =|
+ did_change_url(u64 page_id, URL::URL url) =|
did_request_scroll(u64 page_id, i32 x_delta, i32 y_delta) =|
did_request_scroll_to(u64 page_id, Gfx::IntPoint scroll_position) =|
did_enter_tooltip_area(u64 page_id, Gfx::IntPoint content_position, ByteString title) =|