From 1eba170d034321674ebcb06055b15e318d5530e2 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Sat, 30 Dec 2023 09:42:24 -0500 Subject: [PATCH] LibWebView+WebContent: Make the hovered node retrieval IPC async --- Userland/Libraries/LibWebView/InspectorClient.cpp | 7 +++++-- Userland/Libraries/LibWebView/ViewImplementation.cpp | 4 ++-- Userland/Libraries/LibWebView/ViewImplementation.h | 3 ++- Userland/Libraries/LibWebView/WebContentClient.cpp | 6 ++++++ Userland/Libraries/LibWebView/WebContentClient.h | 1 + .../Services/WebContent/ConnectionFromClient.cpp | 12 +++++++----- Userland/Services/WebContent/ConnectionFromClient.h | 2 +- Userland/Services/WebContent/WebContentClient.ipc | 1 + Userland/Services/WebContent/WebContentServer.ipc | 2 +- 9 files changed, 26 insertions(+), 12 deletions(-) diff --git a/Userland/Libraries/LibWebView/InspectorClient.cpp b/Userland/Libraries/LibWebView/InspectorClient.cpp index 1152e50aa3..0d2d95095a 100644 --- a/Userland/Libraries/LibWebView/InspectorClient.cpp +++ b/Userland/Libraries/LibWebView/InspectorClient.cpp @@ -89,6 +89,10 @@ InspectorClient::InspectorClient(ViewImplementation& content_web_view, ViewImple m_inspector_web_view.run_javascript(script); }; + m_content_web_view.on_received_hovered_node_id = [this](auto node_id) { + select_node(node_id); + }; + m_content_web_view.on_received_console_message = [this](auto message_index) { handle_console_message(message_index); }; @@ -198,8 +202,7 @@ void InspectorClient::reset() void InspectorClient::select_hovered_node() { - auto hovered_node_id = m_content_web_view.get_hovered_node_id(); - select_node(hovered_node_id); + m_content_web_view.get_hovered_node_id(); } void InspectorClient::select_default_node() diff --git a/Userland/Libraries/LibWebView/ViewImplementation.cpp b/Userland/Libraries/LibWebView/ViewImplementation.cpp index 2464eac9dd..8039f14e1d 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.cpp +++ b/Userland/Libraries/LibWebView/ViewImplementation.cpp @@ -146,9 +146,9 @@ void ViewImplementation::clear_inspected_dom_node() inspect_dom_node(0, {}); } -i32 ViewImplementation::get_hovered_node_id() +void ViewImplementation::get_hovered_node_id() { - return client().get_hovered_node_id(); + client().async_get_hovered_node_id(); } void ViewImplementation::set_dom_node_text(i32 node_id, String text) diff --git a/Userland/Libraries/LibWebView/ViewImplementation.h b/Userland/Libraries/LibWebView/ViewImplementation.h index 755955d05a..754f222eb7 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.h +++ b/Userland/Libraries/LibWebView/ViewImplementation.h @@ -62,7 +62,7 @@ public: void inspect_dom_node(i32 node_id, Optional pseudo_element); void inspect_accessibility_tree(); void clear_inspected_dom_node(); - i32 get_hovered_node_id(); + void get_hovered_node_id(); void set_dom_node_text(i32 node_id, String text); Optional set_dom_node_tag(i32 node_id, String name); @@ -143,6 +143,7 @@ public: Function on_received_dom_tree; Function)> on_received_dom_node_properties; Function on_received_accessibility_tree; + Function on_received_hovered_node_id; Function on_received_console_message; Function const& message_types, Vector const& messages)> on_received_console_messages; Function(AK::URL const& url)> on_get_all_cookies; diff --git a/Userland/Libraries/LibWebView/WebContentClient.cpp b/Userland/Libraries/LibWebView/WebContentClient.cpp index 2e1cae3076..fe6ac53dd2 100644 --- a/Userland/Libraries/LibWebView/WebContentClient.cpp +++ b/Userland/Libraries/LibWebView/WebContentClient.cpp @@ -213,6 +213,12 @@ void WebContentClient::did_inspect_accessibility_tree(ByteString const& accessib m_view.on_received_accessibility_tree(accessibility_tree); } +void WebContentClient::did_get_hovered_node_id(i32 node_id) +{ + if (m_view.on_received_hovered_node_id) + m_view.on_received_hovered_node_id(node_id); +} + void WebContentClient::did_output_js_console_message(i32 message_index) { if (m_view.on_received_console_message) diff --git a/Userland/Libraries/LibWebView/WebContentClient.h b/Userland/Libraries/LibWebView/WebContentClient.h index d363e44d97..e2f3e8f4b9 100644 --- a/Userland/Libraries/LibWebView/WebContentClient.h +++ b/Userland/Libraries/LibWebView/WebContentClient.h @@ -55,6 +55,7 @@ private: virtual void did_inspect_dom_tree(ByteString const&) override; virtual void did_inspect_dom_node(bool has_style, ByteString const& computed_style, ByteString const& resolved_style, ByteString const& custom_properties, ByteString const& node_box_sizing, ByteString const& aria_properties_state) override; virtual void did_inspect_accessibility_tree(ByteString const&) override; + virtual void did_get_hovered_node_id(i32 node_id) override; virtual void did_output_js_console_message(i32 message_index) override; virtual void did_get_js_console_messages(i32 start_index, Vector const& message_types, Vector const& messages) override; virtual void did_change_favicon(Gfx::ShareableBitmap const&) override; diff --git a/Userland/Services/WebContent/ConnectionFromClient.cpp b/Userland/Services/WebContent/ConnectionFromClient.cpp index d3bcafe022..ab66c3cf77 100644 --- a/Userland/Services/WebContent/ConnectionFromClient.cpp +++ b/Userland/Services/WebContent/ConnectionFromClient.cpp @@ -621,14 +621,16 @@ void ConnectionFromClient::inspect_accessibility_tree() } } -Messages::WebContentServer::GetHoveredNodeIdResponse ConnectionFromClient::get_hovered_node_id() +void ConnectionFromClient::get_hovered_node_id() { + i32 node_id = 0; + if (auto* document = page().page().top_level_browsing_context().active_document()) { - auto hovered_node = document->hovered_node(); - if (hovered_node) - return hovered_node->unique_id(); + if (auto* hovered_node = document->hovered_node()) + node_id = hovered_node->unique_id(); } - return (i32)0; + + async_did_get_hovered_node_id(node_id); } void ConnectionFromClient::set_dom_node_text(i32 node_id, String const& text) diff --git a/Userland/Services/WebContent/ConnectionFromClient.h b/Userland/Services/WebContent/ConnectionFromClient.h index bc8ceb4471..f946da0fe4 100644 --- a/Userland/Services/WebContent/ConnectionFromClient.h +++ b/Userland/Services/WebContent/ConnectionFromClient.h @@ -74,7 +74,7 @@ private: virtual void inspect_dom_tree() override; virtual void inspect_dom_node(i32 node_id, Optional const& pseudo_element) override; virtual void inspect_accessibility_tree() override; - virtual Messages::WebContentServer::GetHoveredNodeIdResponse get_hovered_node_id() override; + virtual void get_hovered_node_id() override; virtual void set_dom_node_text(i32 node_id, String const& text) override; virtual Messages::WebContentServer::SetDomNodeTagResponse set_dom_node_tag(i32 node_id, String const& name) override; diff --git a/Userland/Services/WebContent/WebContentClient.ipc b/Userland/Services/WebContent/WebContentClient.ipc index 37700c1971..5f2d29066f 100644 --- a/Userland/Services/WebContent/WebContentClient.ipc +++ b/Userland/Services/WebContent/WebContentClient.ipc @@ -44,6 +44,7 @@ endpoint WebContentClient did_inspect_dom_tree(ByteString dom_tree) =| did_inspect_dom_node(bool has_style, ByteString computed_style, ByteString resolved_style, ByteString custom_properties, ByteString node_box_sizing, ByteString aria_properties_state) =| did_inspect_accessibility_tree(ByteString accessibility_tree) =| + did_get_hovered_node_id(i32 node_id) =| did_change_favicon(Gfx::ShareableBitmap favicon) =| did_request_all_cookies(URL url) => (Vector cookies) diff --git a/Userland/Services/WebContent/WebContentServer.ipc b/Userland/Services/WebContent/WebContentServer.ipc index 561d91b5d0..751b00915c 100644 --- a/Userland/Services/WebContent/WebContentServer.ipc +++ b/Userland/Services/WebContent/WebContentServer.ipc @@ -40,7 +40,7 @@ endpoint WebContentServer inspect_dom_tree() =| inspect_dom_node(i32 node_id, Optional pseudo_element) =| inspect_accessibility_tree() =| - get_hovered_node_id() => (i32 node_id) + get_hovered_node_id() =| js_console_input(ByteString js_source) =| js_console_request_messages(i32 start_index) =|