LibDevTools+LibWebView: Implement requests to edit DOM node text

This commit is contained in:
Timothy Flynn 2025-03-06 19:56:40 -05:00 committed by Andreas Kling
commit 57e0a3f8b5
Notes: github-actions[bot] 2025-03-08 00:27:26 +00:00
5 changed files with 70 additions and 1 deletions

View file

@ -8,6 +8,8 @@
#include <LibDevTools/Actors/NodeActor.h>
#include <LibDevTools/Actors/TabActor.h>
#include <LibDevTools/Actors/WalkerActor.h>
#include <LibDevTools/DevToolsDelegate.h>
#include <LibDevTools/DevToolsServer.h>
namespace DevTools {
@ -42,7 +44,7 @@ NodeActor::NodeActor(DevToolsServer& devtools, String name, NodeIdentifier node_
NodeActor::~NodeActor() = default;
void NodeActor::handle_message(StringView type, JsonObject const&)
void NodeActor::handle_message(StringView type, JsonObject const& message)
{
JsonObject response;
response.set("from"sv, name());
@ -55,7 +57,40 @@ void NodeActor::handle_message(StringView type, JsonObject const&)
return;
}
if (type == "setNodeValue"sv) {
auto value = message.get_string("value"sv);
if (!value.has_value()) {
send_missing_parameter_error("value"sv);
return;
}
if (auto dom_node = WalkerActor::dom_node_for(m_walker, name()); dom_node.has_value()) {
auto block_token = block_responses();
devtools().delegate().set_dom_node_text(
dom_node->tab->description(), dom_node->identifier.id, value.release_value(),
[weak_self = make_weak_ptr<NodeActor>(), block_token = move(block_token)](ErrorOr<Web::UniqueNodeID> node_id) mutable {
if (node_id.is_error()) {
dbgln_if(DEVTOOLS_DEBUG, "Unable to edit DOM node: {}", node_id.error());
return;
}
if (auto self = weak_self.strong_ref())
self->finished_editing_dom_node(move(block_token));
});
}
return;
}
send_unrecognized_packet_type_error(type);
}
void NodeActor::finished_editing_dom_node(BlockToken block_token)
{
JsonObject message;
message.set("from"sv, name());
send_message(move(message), move(block_token));
}
}

View file

@ -36,6 +36,8 @@ public:
private:
NodeActor(DevToolsServer&, String name, NodeIdentifier, WeakPtr<WalkerActor>);
void finished_editing_dom_node(BlockToken);
NodeIdentifier m_node_identifier;
WeakPtr<WalkerActor> m_walker;

View file

@ -41,6 +41,9 @@ public:
virtual void listen_for_dom_mutations(TabDescription const&, OnDOMMutationReceived) const { }
virtual void stop_listening_for_dom_mutations(TabDescription const&) const { }
using OnDOMNodeEditComplete = Function<void(ErrorOr<Web::UniqueNodeID>)>;
virtual void set_dom_node_text(TabDescription const&, Web::UniqueNodeID, String, OnDOMNodeEditComplete) const { }
using OnScriptEvaluationComplete = Function<void(ErrorOr<JsonValue>)>;
virtual void evaluate_javascript(TabDescription const&, String, OnScriptEvaluationComplete) const { }

View file

@ -437,6 +437,34 @@ void Application::stop_listening_for_dom_mutations(DevTools::TabDescription cons
view->set_listen_for_dom_mutations(false);
}
template<typename Edit>
static void edit_dom_node(DevTools::TabDescription const& description, Application::OnDOMNodeEditComplete on_complete, Edit&& edit)
{
auto view = ViewImplementation::find_view_by_id(description.id);
if (!view.has_value()) {
on_complete(Error::from_string_literal("Unable to locate tab"));
return;
}
view->on_finshed_editing_dom_node = [&view = *view, on_complete = move(on_complete)](auto node_id) {
view.on_finshed_editing_dom_node = nullptr;
if (node_id.has_value())
on_complete(*node_id);
else
on_complete(Error::from_string_literal("Unable to find DOM node to edit"));
};
edit(*view);
}
void Application::set_dom_node_text(DevTools::TabDescription const& description, Web::UniqueNodeID node_id, String value, OnDOMNodeEditComplete on_complete) const
{
edit_dom_node(description, move(on_complete), [&](auto& view) {
view.set_dom_node_text(node_id, move(value));
});
}
void Application::evaluate_javascript(DevTools::TabDescription const& description, String script, OnScriptEvaluationComplete on_complete) const
{
auto view = ViewImplementation::find_view_by_id(description.id);

View file

@ -98,6 +98,7 @@ private:
virtual void clear_highlighted_dom_node(DevTools::TabDescription const&) const override;
virtual void listen_for_dom_mutations(DevTools::TabDescription const&, OnDOMMutationReceived) const override;
virtual void stop_listening_for_dom_mutations(DevTools::TabDescription const&) const override;
virtual void set_dom_node_text(DevTools::TabDescription const&, Web::UniqueNodeID, String, OnDOMNodeEditComplete) const override;
virtual void evaluate_javascript(DevTools::TabDescription const&, String, OnScriptEvaluationComplete) const override;
virtual void listen_for_console_messages(DevTools::TabDescription const&, OnConsoleMessageAvailable, OnReceivedConsoleMessages) const override;
virtual void stop_listening_for_console_messages(DevTools::TabDescription const&) const override;