瀏覽代碼

LibWeb+WebContent: Add on_load_finish hook to web views

This isn't entirely symmetrical with on_load_start as it will also fire
on reloads and back/forward navigations. However, it's good enough for
some basic use cases, and we can do more sophisticated notifications
later on when we need them.
Andreas Kling 4 年之前
父節點
當前提交
eda9fb13cc

+ 6 - 0
Libraries/LibWeb/InProcessWebView.cpp

@@ -150,6 +150,12 @@ void InProcessWebView::page_did_start_loading(const URL& url)
         on_load_start(url);
 }
 
+void InProcessWebView::page_did_finish_loading(const URL& url)
+{
+    if (on_load_finish)
+        on_load_finish(url);
+}
+
 void InProcessWebView::page_did_change_selection()
 {
     update();

+ 1 - 0
Libraries/LibWeb/InProcessWebView.h

@@ -88,6 +88,7 @@ private:
     virtual void page_did_change_title(const String&) override;
     virtual void page_did_set_document_in_main_frame(DOM::Document*) override;
     virtual void page_did_start_loading(const URL&) override;
+    virtual void page_did_finish_loading(const URL&) override;
     virtual void page_did_change_selection() override;
     virtual void page_did_request_cursor_change(Gfx::StandardCursor) override;
     virtual void page_did_request_context_menu(const Gfx::IntPoint&) override;

+ 3 - 0
Libraries/LibWeb/Loader/FrameLoader.cpp

@@ -274,6 +274,9 @@ void FrameLoader::resource_did_load()
         ASSERT(is<HTML::HTMLIFrameElement>(*host_element));
         downcast<HTML::HTMLIFrameElement>(*host_element).content_frame_did_load({});
     }
+
+    if (auto* page = frame().page())
+        page->client().page_did_finish_loading(url);
 }
 
 void FrameLoader::resource_did_fail()

+ 7 - 0
Libraries/LibWeb/OutOfProcessWebView.cpp

@@ -209,6 +209,13 @@ void OutOfProcessWebView::notify_server_did_start_loading(Badge<WebContentClient
         on_load_start(url);
 }
 
+
+void OutOfProcessWebView::notify_server_did_finish_loading(Badge<WebContentClient>, const URL& url)
+{
+    if (on_load_finish)
+        on_load_finish(url);
+}
+
 void OutOfProcessWebView::notify_server_did_request_context_menu(Badge<WebContentClient>, const Gfx::IntPoint& content_position)
 {
     if (on_context_menu_request)

+ 1 - 0
Libraries/LibWeb/OutOfProcessWebView.h

@@ -60,6 +60,7 @@ public:
     void notify_server_did_click_link(Badge<WebContentClient>, const URL&, const String& target, unsigned modifiers);
     void notify_server_did_middle_click_link(Badge<WebContentClient>, const URL&, const String& target, unsigned modifiers);
     void notify_server_did_start_loading(Badge<WebContentClient>, const URL&);
+    void notify_server_did_finish_loading(Badge<WebContentClient>, const URL&);
     void notify_server_did_request_context_menu(Badge<WebContentClient>, const Gfx::IntPoint&);
     void notify_server_did_request_link_context_menu(Badge<WebContentClient>, const Gfx::IntPoint&, const URL&, const String& target, unsigned modifiers);
     void notify_server_did_request_alert(Badge<WebContentClient>, const String& message);

+ 1 - 0
Libraries/LibWeb/Page/Page.h

@@ -85,6 +85,7 @@ public:
     virtual void page_did_set_document_in_main_frame(DOM::Document*) { }
     virtual void page_did_change_title(const String&) { }
     virtual void page_did_start_loading(const URL&) { }
+    virtual void page_did_finish_loading(const URL&) { }
     virtual void page_did_change_selection() { }
     virtual void page_did_request_cursor_change(Gfx::StandardCursor) { }
     virtual void page_did_request_context_menu(const Gfx::IntPoint&) { }

+ 2 - 4
Libraries/LibWeb/WebContentClient.cpp

@@ -52,11 +52,9 @@ void WebContentClient::handle(const Messages::WebContentClient::DidPaint& messag
     m_view.notify_server_did_paint({}, message.shbuf_id());
 }
 
-void WebContentClient::handle([[maybe_unused]] const Messages::WebContentClient::DidFinishLoad& message)
+void WebContentClient::handle([[maybe_unused]] const Messages::WebContentClient::DidFinishLoading& message)
 {
-#ifdef DEBUG_SPAM
-    dbg() << "handle: WebContentClient::DidFinishLoad! url=" << message.url();
-#endif
+    m_view.notify_server_did_finish_loading({}, message.url());
 }
 
 void WebContentClient::handle(const Messages::WebContentClient::DidInvalidateContentRect& message)

+ 1 - 1
Libraries/LibWeb/WebContentClient.h

@@ -47,7 +47,7 @@ private:
     WebContentClient(OutOfProcessWebView&);
 
     virtual void handle(const Messages::WebContentClient::DidPaint&) override;
-    virtual void handle(const Messages::WebContentClient::DidFinishLoad&) override;
+    virtual void handle(const Messages::WebContentClient::DidFinishLoading&) override;
     virtual void handle(const Messages::WebContentClient::DidInvalidateContentRect&) override;
     virtual void handle(const Messages::WebContentClient::DidChangeSelection&) override;
     virtual void handle(const Messages::WebContentClient::DidLayout&) override;

+ 1 - 0
Libraries/LibWeb/WebViewHooks.h

@@ -42,6 +42,7 @@ public:
     Function<void(const URL&)> on_link_hover;
     Function<void(const String&)> on_title_change;
     Function<void(const URL&)> on_load_start;
+    Function<void(const URL&)> on_load_finish;
     Function<void(const Gfx::Bitmap&)> on_favicon_change;
     Function<void(const URL&)> on_url_drop;
     Function<void(DOM::Document*)> on_set_document;

+ 5 - 0
Services/WebContent/PageHost.cpp

@@ -159,6 +159,11 @@ void PageHost::page_did_start_loading(const URL& url)
     m_client.post_message(Messages::WebContentClient::DidStartLoading(url));
 }
 
+void PageHost::page_did_finish_loading(const URL& url)
+{
+    m_client.post_message(Messages::WebContentClient::DidFinishLoading(url));
+}
+
 void PageHost::page_did_request_context_menu(const Gfx::IntPoint& content_position)
 {
     m_client.post_message(Messages::WebContentClient::DidRequestContextMenu(content_position));

+ 1 - 0
Services/WebContent/PageHost.h

@@ -63,6 +63,7 @@ private:
     virtual void page_did_request_context_menu(const Gfx::IntPoint&) override;
     virtual void page_did_request_link_context_menu(const Gfx::IntPoint&, const URL&, const String& target, unsigned modifiers) override;
     virtual void page_did_start_loading(const URL&) override;
+    virtual void page_did_finish_loading(const URL&) override;
     virtual void page_did_request_alert(const String&) override;
 
     explicit PageHost(ClientConnection&);

+ 2 - 2
Services/WebContent/WebContentClient.ipc

@@ -1,6 +1,7 @@
 endpoint WebContentClient = 90
 {
-    DidFinishLoad(URL url) =|
+    DidStartLoading(URL url) =|
+    DidFinishLoading(URL url) =|
     DidPaint(Gfx::IntRect content_rect, i32 shbuf_id) =|
     DidInvalidateContentRect(Gfx::IntRect content_rect) =|
     DidChangeSelection() =|
@@ -11,7 +12,6 @@ endpoint WebContentClient = 90
     DidUnhoverLink() =|
     DidClickLink(URL url, String target, unsigned modifiers) =|
     DidMiddleClickLink(URL url, String target, unsigned modifiers) =|
-    DidStartLoading(URL url) =|
     DidRequestContextMenu(Gfx::IntPoint content_position) =|
     DidRequestLinkContextMenu(Gfx::IntPoint content_position, URL url, String target, unsigned modifiers) =|
     DidRequestAlert(String message) => ()