From 281991057c84c15509282fe55b1e7c07c3189fc5 Mon Sep 17 00:00:00 2001 From: Tobias Christiansen Date: Tue, 18 Oct 2022 12:40:14 +0200 Subject: [PATCH] WebContent: Add more IPC endpoints for getting Elements This patch adds `get_document_element()` and `query_selector_all()` which return Node's IDs. `get_document_element` returns the ID of the document element `query_selector_all` returns the IDs of all elements matching the selector starting at the Node associated with the start_node_id --- .../WebContent/ConnectionFromClient.cpp | 35 +++++++++++++++++++ .../WebContent/ConnectionFromClient.h | 3 ++ .../Services/WebContent/WebContentServer.ipc | 3 ++ 3 files changed, 41 insertions(+) diff --git a/Userland/Services/WebContent/ConnectionFromClient.cpp b/Userland/Services/WebContent/ConnectionFromClient.cpp index 852a54150a..9f34b8144d 100644 --- a/Userland/Services/WebContent/ConnectionFromClient.cpp +++ b/Userland/Services/WebContent/ConnectionFromClient.cpp @@ -2,6 +2,7 @@ * Copyright (c) 2020-2022, Andreas Kling * Copyright (c) 2021, Sam Atkins * Copyright (c) 2021-2022, Linus Groh + * Copyright (c) 2022, Tobias Christiansen * * SPDX-License-Identifier: BSD-2-Clause */ @@ -19,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -438,6 +440,39 @@ void ConnectionFromClient::js_console_request_messages(i32 start_index) m_console_client->send_messages(start_index); } +Messages::WebContentServer::GetDocumentElementResponse ConnectionFromClient::get_document_element() +{ + auto* document = page().top_level_browsing_context().active_document(); + if (!document) + return { {} }; + return { document->id() }; +} + +Messages::WebContentServer::QuerySelectorAllResponse ConnectionFromClient::query_selector_all(i32 start_node_id, String const& selector) +{ + auto* start_node = Web::DOM::Node::from_id(start_node_id); + if (!start_node) + return { {} }; + + if (!start_node->is_element() && !start_node->is_document()) + return { {} }; + + auto& start_element = verify_cast(*start_node); + + auto result = start_element.query_selector_all(selector); + if (result.is_error()) + return { {} }; + + auto element_list = result.release_value(); + Vector return_list; + for (u32 i = 0; i < element_list->length(); i++) { + auto node = element_list->item(i); + return_list.append(node->id()); + } + + return { return_list }; +} + Messages::WebContentServer::GetSelectedTextResponse ConnectionFromClient::get_selected_text() { return page().focused_context().selected_text(); diff --git a/Userland/Services/WebContent/ConnectionFromClient.h b/Userland/Services/WebContent/ConnectionFromClient.h index 206b06aecc..7033926340 100644 --- a/Userland/Services/WebContent/ConnectionFromClient.h +++ b/Userland/Services/WebContent/ConnectionFromClient.h @@ -79,6 +79,9 @@ private: virtual void run_javascript(String const&) override; virtual void js_console_request_messages(i32) override; + virtual Messages::WebContentServer::GetDocumentElementResponse get_document_element() override; + virtual Messages::WebContentServer::QuerySelectorAllResponse query_selector_all(i32 start_node_id, String const& selector) override; + virtual Messages::WebContentServer::GetLocalStorageEntriesResponse get_local_storage_entries() override; virtual Messages::WebContentServer::GetSessionStorageEntriesResponse get_session_storage_entries() override; diff --git a/Userland/Services/WebContent/WebContentServer.ipc b/Userland/Services/WebContent/WebContentServer.ipc index 7c7fb44cc3..d54bd22737 100644 --- a/Userland/Services/WebContent/WebContentServer.ipc +++ b/Userland/Services/WebContent/WebContentServer.ipc @@ -37,6 +37,9 @@ endpoint WebContentServer js_console_input(String js_source) =| js_console_request_messages(i32 start_index) =| + get_document_element() => (Optional node_id) + query_selector_all(i32 start_node_id, String selector) => (Optional> elements_ids) + run_javascript(String js_source) =| dump_layout_tree() => (String dump)