mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-29 04:09:13 +00:00
LibDevTools+LibWebView: Implement requests to edit DOM node text
This commit is contained in:
parent
8bcc3d3797
commit
57e0a3f8b5
Notes:
github-actions[bot]
2025-03-08 00:27:26 +00:00
Author: https://github.com/trflynn89
Commit: 57e0a3f8b5
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/3850
5 changed files with 70 additions and 1 deletions
|
@ -8,6 +8,8 @@
|
||||||
#include <LibDevTools/Actors/NodeActor.h>
|
#include <LibDevTools/Actors/NodeActor.h>
|
||||||
#include <LibDevTools/Actors/TabActor.h>
|
#include <LibDevTools/Actors/TabActor.h>
|
||||||
#include <LibDevTools/Actors/WalkerActor.h>
|
#include <LibDevTools/Actors/WalkerActor.h>
|
||||||
|
#include <LibDevTools/DevToolsDelegate.h>
|
||||||
|
#include <LibDevTools/DevToolsServer.h>
|
||||||
|
|
||||||
namespace DevTools {
|
namespace DevTools {
|
||||||
|
|
||||||
|
@ -42,7 +44,7 @@ NodeActor::NodeActor(DevToolsServer& devtools, String name, NodeIdentifier node_
|
||||||
|
|
||||||
NodeActor::~NodeActor() = default;
|
NodeActor::~NodeActor() = default;
|
||||||
|
|
||||||
void NodeActor::handle_message(StringView type, JsonObject const&)
|
void NodeActor::handle_message(StringView type, JsonObject const& message)
|
||||||
{
|
{
|
||||||
JsonObject response;
|
JsonObject response;
|
||||||
response.set("from"sv, name());
|
response.set("from"sv, name());
|
||||||
|
@ -55,7 +57,40 @@ void NodeActor::handle_message(StringView type, JsonObject const&)
|
||||||
return;
|
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);
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,8 @@ public:
|
||||||
private:
|
private:
|
||||||
NodeActor(DevToolsServer&, String name, NodeIdentifier, WeakPtr<WalkerActor>);
|
NodeActor(DevToolsServer&, String name, NodeIdentifier, WeakPtr<WalkerActor>);
|
||||||
|
|
||||||
|
void finished_editing_dom_node(BlockToken);
|
||||||
|
|
||||||
NodeIdentifier m_node_identifier;
|
NodeIdentifier m_node_identifier;
|
||||||
|
|
||||||
WeakPtr<WalkerActor> m_walker;
|
WeakPtr<WalkerActor> m_walker;
|
||||||
|
|
|
@ -41,6 +41,9 @@ public:
|
||||||
virtual void listen_for_dom_mutations(TabDescription const&, OnDOMMutationReceived) const { }
|
virtual void listen_for_dom_mutations(TabDescription const&, OnDOMMutationReceived) const { }
|
||||||
virtual void stop_listening_for_dom_mutations(TabDescription const&) 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>)>;
|
using OnScriptEvaluationComplete = Function<void(ErrorOr<JsonValue>)>;
|
||||||
virtual void evaluate_javascript(TabDescription const&, String, OnScriptEvaluationComplete) const { }
|
virtual void evaluate_javascript(TabDescription const&, String, OnScriptEvaluationComplete) const { }
|
||||||
|
|
||||||
|
|
|
@ -437,6 +437,34 @@ void Application::stop_listening_for_dom_mutations(DevTools::TabDescription cons
|
||||||
view->set_listen_for_dom_mutations(false);
|
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
|
void Application::evaluate_javascript(DevTools::TabDescription const& description, String script, OnScriptEvaluationComplete on_complete) const
|
||||||
{
|
{
|
||||||
auto view = ViewImplementation::find_view_by_id(description.id);
|
auto view = ViewImplementation::find_view_by_id(description.id);
|
||||||
|
|
|
@ -98,6 +98,7 @@ private:
|
||||||
virtual void clear_highlighted_dom_node(DevTools::TabDescription const&) const override;
|
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 listen_for_dom_mutations(DevTools::TabDescription const&, OnDOMMutationReceived) const override;
|
||||||
virtual void stop_listening_for_dom_mutations(DevTools::TabDescription const&) 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 evaluate_javascript(DevTools::TabDescription const&, String, OnScriptEvaluationComplete) const override;
|
||||||
virtual void listen_for_console_messages(DevTools::TabDescription const&, OnConsoleMessageAvailable, OnReceivedConsoleMessages) 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;
|
virtual void stop_listening_for_console_messages(DevTools::TabDescription const&) const override;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue