diff --git a/Libraries/LibDevTools/Actor.cpp b/Libraries/LibDevTools/Actor.cpp index 61ded21906d..427f589d320 100644 --- a/Libraries/LibDevTools/Actor.cpp +++ b/Libraries/LibDevTools/Actor.cpp @@ -18,6 +18,11 @@ Actor::Actor(DevToolsServer& devtools, String name) Actor::~Actor() = default; +void Actor::message_received(StringView type, JsonObject message) +{ + handle_message({ type, move(message) }); +} + void Actor::send_message(JsonObject message, Optional block_token) { if (m_block_responses && !block_token.has_value()) { @@ -41,11 +46,11 @@ void Actor::send_missing_parameter_error(StringView parameter) } // https://firefox-source-docs.mozilla.org/devtools/backend/protocol.html#error-packets -void Actor::send_unrecognized_packet_type_error(StringView type) +void Actor::send_unrecognized_packet_type_error(Message const& message) { JsonObject error; error.set("error"sv, "unrecognizedPacketType"sv); - error.set("message"sv, MUST(String::formatted("Unrecognized packet type: '{}'", type))); + error.set("message"sv, MUST(String::formatted("Unrecognized packet type: '{}'", message.type))); send_message(move(error)); } diff --git a/Libraries/LibDevTools/Actor.h b/Libraries/LibDevTools/Actor.h index 8b5460e6dfe..75040122986 100644 --- a/Libraries/LibDevTools/Actor.h +++ b/Libraries/LibDevTools/Actor.h @@ -24,10 +24,16 @@ class Actor : public RefCounted , public Weakable { public: + struct Message { + StringView type; + JsonObject data; + }; + virtual ~Actor(); String const& name() const { return m_name; } - virtual void handle_message(StringView type, JsonObject const&) = 0; + + void message_received(StringView type, JsonObject); class [[nodiscard]] BlockToken { public: @@ -46,31 +52,33 @@ public: void send_message(JsonObject, Optional block_token = {}); void send_missing_parameter_error(StringView parameter); - void send_unrecognized_packet_type_error(StringView type); + void send_unrecognized_packet_type_error(Message const&); void send_unknown_actor_error(StringView actor); protected: explicit Actor(DevToolsServer&, String name); + virtual void handle_message(Message const&) = 0; + DevToolsServer& devtools() { return m_devtools; } DevToolsServer const& devtools() const { return m_devtools; } BlockToken block_responses(); template - auto get_required_parameter(JsonObject const& message, StringView parameter) + auto get_required_parameter(Message const& message, StringView parameter) { auto result = [&]() { if constexpr (IsIntegral) - return message.get_integer(parameter); + return message.data.get_integer(parameter); else if constexpr (IsSame) - return message.get_bool(parameter); + return message.data.get_bool(parameter); else if constexpr (IsSame) - return message.get_string(parameter); + return message.data.get_string(parameter); else if constexpr (IsSame) - return message.get_object(parameter); + return message.data.get_object(parameter); else if constexpr (IsSame) - return message.get_array(parameter); + return message.data.get_array(parameter); else static_assert(DependentFalse); }(); diff --git a/Libraries/LibDevTools/Actors/CSSPropertiesActor.cpp b/Libraries/LibDevTools/Actors/CSSPropertiesActor.cpp index 8c4b74f404d..6287ec97050 100644 --- a/Libraries/LibDevTools/Actors/CSSPropertiesActor.cpp +++ b/Libraries/LibDevTools/Actors/CSSPropertiesActor.cpp @@ -24,11 +24,11 @@ CSSPropertiesActor::CSSPropertiesActor(DevToolsServer& devtools, String name) CSSPropertiesActor::~CSSPropertiesActor() = default; -void CSSPropertiesActor::handle_message(StringView type, JsonObject const&) +void CSSPropertiesActor::handle_message(Message const& message) { JsonObject response; - if (type == "getCSSDatabase"sv) { + if (message.type == "getCSSDatabase"sv) { auto css_property_list = devtools().delegate().css_property_list(); JsonObject properties; @@ -51,7 +51,7 @@ void CSSPropertiesActor::handle_message(StringView type, JsonObject const&) return; } - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } } diff --git a/Libraries/LibDevTools/Actors/CSSPropertiesActor.h b/Libraries/LibDevTools/Actors/CSSPropertiesActor.h index afe607ecf55..14cce55d6d8 100644 --- a/Libraries/LibDevTools/Actors/CSSPropertiesActor.h +++ b/Libraries/LibDevTools/Actors/CSSPropertiesActor.h @@ -24,10 +24,10 @@ public: static NonnullRefPtr create(DevToolsServer&, String name); virtual ~CSSPropertiesActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; - private: CSSPropertiesActor(DevToolsServer&, String name); + + virtual void handle_message(Message const&) override; }; } diff --git a/Libraries/LibDevTools/Actors/ConsoleActor.cpp b/Libraries/LibDevTools/Actors/ConsoleActor.cpp index 08f4371c6f7..80ebbf81ca3 100644 --- a/Libraries/LibDevTools/Actors/ConsoleActor.cpp +++ b/Libraries/LibDevTools/Actors/ConsoleActor.cpp @@ -39,18 +39,18 @@ ConsoleActor::ConsoleActor(DevToolsServer& devtools, String name, WeakPtr(message, "text"sv); if (!text.has_value()) return; @@ -61,7 +61,7 @@ void ConsoleActor::handle_message(StringView type, JsonObject const& message) send_message(move(response)); // FIXME: We do not support eager evaluation of scripts. Just bail for now. - if (message.get_bool("eager"sv).value_or(false)) { + if (message.data.get_bool("eager"sv).value_or(false)) { return; } @@ -75,7 +75,7 @@ void ConsoleActor::handle_message(StringView type, JsonObject const& message) return; } - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } } diff --git a/Libraries/LibDevTools/Actors/ConsoleActor.h b/Libraries/LibDevTools/Actors/ConsoleActor.h index 6cbd0cf5e7f..e7da0d7285b 100644 --- a/Libraries/LibDevTools/Actors/ConsoleActor.h +++ b/Libraries/LibDevTools/Actors/ConsoleActor.h @@ -18,11 +18,11 @@ public: static NonnullRefPtr create(DevToolsServer&, String name, WeakPtr); virtual ~ConsoleActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; - private: ConsoleActor(DevToolsServer&, String name, WeakPtr); + virtual void handle_message(Message const&) override; + WeakPtr m_tab; u64 m_execution_id { 0 }; diff --git a/Libraries/LibDevTools/Actors/DeviceActor.cpp b/Libraries/LibDevTools/Actors/DeviceActor.cpp index ae8501bdab9..aece6a8a391 100644 --- a/Libraries/LibDevTools/Actors/DeviceActor.cpp +++ b/Libraries/LibDevTools/Actors/DeviceActor.cpp @@ -24,9 +24,9 @@ DeviceActor::DeviceActor(DevToolsServer& devtools, String name) DeviceActor::~DeviceActor() = default; -void DeviceActor::handle_message(StringView type, JsonObject const&) +void DeviceActor::handle_message(Message const& message) { - if (type == "getDescription"sv) { + if (message.type == "getDescription"sv) { auto build_id = Core::Version::read_long_version_string(); static auto browser_name = String::from_utf8_without_validation({ BROWSER_NAME, __builtin_strlen(BROWSER_NAME) }); @@ -54,7 +54,7 @@ void DeviceActor::handle_message(StringView type, JsonObject const&) return; } - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } } diff --git a/Libraries/LibDevTools/Actors/DeviceActor.h b/Libraries/LibDevTools/Actors/DeviceActor.h index edf9286b4e0..f42b3691113 100644 --- a/Libraries/LibDevTools/Actors/DeviceActor.h +++ b/Libraries/LibDevTools/Actors/DeviceActor.h @@ -18,10 +18,10 @@ public: static NonnullRefPtr create(DevToolsServer&, String name); virtual ~DeviceActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; - private: DeviceActor(DevToolsServer&, String name); + + virtual void handle_message(Message const&) override; }; } diff --git a/Libraries/LibDevTools/Actors/FrameActor.cpp b/Libraries/LibDevTools/Actors/FrameActor.cpp index 6d6f13dea83..c8c2502b87d 100644 --- a/Libraries/LibDevTools/Actors/FrameActor.cpp +++ b/Libraries/LibDevTools/Actors/FrameActor.cpp @@ -51,11 +51,11 @@ FrameActor::~FrameActor() devtools().delegate().stop_listening_for_console_messages(tab->description()); } -void FrameActor::handle_message(StringView type, JsonObject const&) +void FrameActor::handle_message(Message const& message) { JsonObject response; - if (type == "detach"sv) { + if (message.type == "detach"sv) { if (auto tab = m_tab.strong_ref()) { devtools().delegate().stop_listening_for_dom_mutations(tab->description()); devtools().delegate().stop_listening_for_console_messages(tab->description()); @@ -66,12 +66,12 @@ void FrameActor::handle_message(StringView type, JsonObject const&) return; } - if (type == "listFrames"sv) { + if (message.type == "listFrames"sv) { send_message(move(response)); return; } - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } void FrameActor::send_frame_update_message() diff --git a/Libraries/LibDevTools/Actors/FrameActor.h b/Libraries/LibDevTools/Actors/FrameActor.h index 5fce83bb444..3f808ea3408 100644 --- a/Libraries/LibDevTools/Actors/FrameActor.h +++ b/Libraries/LibDevTools/Actors/FrameActor.h @@ -21,7 +21,6 @@ public: static NonnullRefPtr create(DevToolsServer&, String name, WeakPtr, WeakPtr, WeakPtr, WeakPtr, WeakPtr); virtual ~FrameActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; void send_frame_update_message(); JsonObject serialize_target() const; @@ -29,6 +28,8 @@ public: private: FrameActor(DevToolsServer&, String name, WeakPtr, WeakPtr, WeakPtr, WeakPtr, WeakPtr); + virtual void handle_message(Message const&) override; + void console_message_available(i32 message_index); void console_messages_received(i32 start_index, Vector); void request_console_messages(); diff --git a/Libraries/LibDevTools/Actors/HighlighterActor.cpp b/Libraries/LibDevTools/Actors/HighlighterActor.cpp index 9adef59e30f..169a85be2ab 100644 --- a/Libraries/LibDevTools/Actors/HighlighterActor.cpp +++ b/Libraries/LibDevTools/Actors/HighlighterActor.cpp @@ -27,11 +27,11 @@ HighlighterActor::HighlighterActor(DevToolsServer& devtools, String name, WeakPt HighlighterActor::~HighlighterActor() = default; -void HighlighterActor::handle_message(StringView type, JsonObject const& message) +void HighlighterActor::handle_message(Message const& message) { JsonObject response; - if (type == "show"sv) { + if (message.type == "show"sv) { auto node = get_required_parameter(message, "node"sv); if (!node.has_value()) return; @@ -47,7 +47,7 @@ void HighlighterActor::handle_message(StringView type, JsonObject const& message return; } - if (type == "hide"sv) { + if (message.type == "hide"sv) { if (auto tab = InspectorActor::tab_for(m_inspector)) devtools().delegate().clear_highlighted_dom_node(tab->description()); @@ -55,7 +55,7 @@ void HighlighterActor::handle_message(StringView type, JsonObject const& message return; } - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } JsonValue HighlighterActor::serialize_highlighter() const diff --git a/Libraries/LibDevTools/Actors/HighlighterActor.h b/Libraries/LibDevTools/Actors/HighlighterActor.h index a95fca28071..0dd6220372e 100644 --- a/Libraries/LibDevTools/Actors/HighlighterActor.h +++ b/Libraries/LibDevTools/Actors/HighlighterActor.h @@ -18,12 +18,13 @@ public: static NonnullRefPtr create(DevToolsServer&, String name, WeakPtr); virtual ~HighlighterActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; JsonValue serialize_highlighter() const; private: HighlighterActor(DevToolsServer&, String name, WeakPtr); + virtual void handle_message(Message const&) override; + WeakPtr m_inspector; }; diff --git a/Libraries/LibDevTools/Actors/InspectorActor.cpp b/Libraries/LibDevTools/Actors/InspectorActor.cpp index da86778141d..2f6d4ea5b5b 100644 --- a/Libraries/LibDevTools/Actors/InspectorActor.cpp +++ b/Libraries/LibDevTools/Actors/InspectorActor.cpp @@ -29,11 +29,11 @@ InspectorActor::InspectorActor(DevToolsServer& devtools, String name, WeakPtr(*this); @@ -42,7 +42,7 @@ void InspectorActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "getHighlighterByType"sv) { + if (message.type == "getHighlighterByType"sv) { auto type_name = get_required_parameter(message, "typeName"sv); if (!type_name.has_value()) return; @@ -56,7 +56,7 @@ void InspectorActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "getWalker"sv) { + if (message.type == "getWalker"sv) { if (auto tab = m_tab.strong_ref()) { devtools().delegate().inspect_tab(tab->description(), async_handler([](auto& self, auto dom_tree, auto& response) { @@ -72,13 +72,13 @@ void InspectorActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "supportsHighlighters"sv) { + if (message.type == "supportsHighlighters"sv) { response.set("value"sv, true); send_message(move(response)); return; } - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } void InspectorActor::received_dom_tree(JsonObject& response, JsonObject dom_tree) diff --git a/Libraries/LibDevTools/Actors/InspectorActor.h b/Libraries/LibDevTools/Actors/InspectorActor.h index a8a97015911..ae7c8df7a13 100644 --- a/Libraries/LibDevTools/Actors/InspectorActor.h +++ b/Libraries/LibDevTools/Actors/InspectorActor.h @@ -19,14 +19,14 @@ public: static NonnullRefPtr create(DevToolsServer&, String name, WeakPtr); virtual ~InspectorActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; - static RefPtr tab_for(WeakPtr const&); static RefPtr walker_for(WeakPtr const&); private: InspectorActor(DevToolsServer&, String name, WeakPtr); + virtual void handle_message(Message const&) override; + void received_dom_tree(JsonObject& response, JsonObject dom_tree); WeakPtr m_tab; diff --git a/Libraries/LibDevTools/Actors/LayoutInspectorActor.cpp b/Libraries/LibDevTools/Actors/LayoutInspectorActor.cpp index 1326c31142b..9473d173f55 100644 --- a/Libraries/LibDevTools/Actors/LayoutInspectorActor.cpp +++ b/Libraries/LibDevTools/Actors/LayoutInspectorActor.cpp @@ -22,23 +22,23 @@ LayoutInspectorActor::LayoutInspectorActor(DevToolsServer& devtools, String name LayoutInspectorActor::~LayoutInspectorActor() = default; -void LayoutInspectorActor::handle_message(StringView type, JsonObject const&) +void LayoutInspectorActor::handle_message(Message const& message) { JsonObject response; - if (type == "getCurrentFlexbox"sv) { + if (message.type == "getCurrentFlexbox"sv) { response.set("flexbox"sv, JsonValue {}); send_message(move(response)); return; } - if (type == "getGrids"sv) { + if (message.type == "getGrids"sv) { response.set("grids"sv, JsonArray {}); send_message(move(response)); return; } - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } } diff --git a/Libraries/LibDevTools/Actors/LayoutInspectorActor.h b/Libraries/LibDevTools/Actors/LayoutInspectorActor.h index 986bcbf572c..4200284018f 100644 --- a/Libraries/LibDevTools/Actors/LayoutInspectorActor.h +++ b/Libraries/LibDevTools/Actors/LayoutInspectorActor.h @@ -18,10 +18,10 @@ public: static NonnullRefPtr create(DevToolsServer&, String name); virtual ~LayoutInspectorActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; - private: LayoutInspectorActor(DevToolsServer&, String name); + + virtual void handle_message(Message const&) override; }; } diff --git a/Libraries/LibDevTools/Actors/NodeActor.cpp b/Libraries/LibDevTools/Actors/NodeActor.cpp index b972a856d19..27fe2aef829 100644 --- a/Libraries/LibDevTools/Actors/NodeActor.cpp +++ b/Libraries/LibDevTools/Actors/NodeActor.cpp @@ -93,11 +93,11 @@ NodeActor::NodeActor(DevToolsServer& devtools, String name, NodeIdentifier node_ NodeActor::~NodeActor() = default; -void NodeActor::handle_message(StringView type, JsonObject const& message) +void NodeActor::handle_message(Message const& message) { JsonObject response; - if (type == "getUniqueSelector"sv) { + if (message.type == "getUniqueSelector"sv) { auto dom_node = WalkerActor::dom_node_for(m_walker, name()); if (!dom_node.has_value()) { send_unknown_actor_error(name()); @@ -109,7 +109,7 @@ void NodeActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "modifyAttributes"sv) { + if (message.type == "modifyAttributes"sv) { auto modifications = get_required_parameter(message, "modifications"sv); if (!modifications.has_value()) return; @@ -132,7 +132,7 @@ void NodeActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "setNodeValue"sv) { + if (message.type == "setNodeValue"sv) { auto value = get_required_parameter(message, "value"sv); if (!value.has_value()) return; @@ -147,7 +147,7 @@ void NodeActor::handle_message(StringView type, JsonObject const& message) return; } - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } } diff --git a/Libraries/LibDevTools/Actors/NodeActor.h b/Libraries/LibDevTools/Actors/NodeActor.h index 71cc1a52378..dd081b7709f 100644 --- a/Libraries/LibDevTools/Actors/NodeActor.h +++ b/Libraries/LibDevTools/Actors/NodeActor.h @@ -29,13 +29,13 @@ public: static NonnullRefPtr create(DevToolsServer&, String name, NodeIdentifier, WeakPtr); virtual ~NodeActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; - NodeIdentifier const& node_identifier() const { return m_node_identifier; } private: NodeActor(DevToolsServer&, String name, NodeIdentifier, WeakPtr); + virtual void handle_message(Message const&) override; + NodeIdentifier m_node_identifier; WeakPtr m_walker; diff --git a/Libraries/LibDevTools/Actors/PageStyleActor.cpp b/Libraries/LibDevTools/Actors/PageStyleActor.cpp index 2bb74430c8b..e239cd1ca4d 100644 --- a/Libraries/LibDevTools/Actors/PageStyleActor.cpp +++ b/Libraries/LibDevTools/Actors/PageStyleActor.cpp @@ -85,11 +85,11 @@ PageStyleActor::PageStyleActor(DevToolsServer& devtools, String name, WeakPtr(message, "node"sv); if (!node.has_value()) return; @@ -109,7 +109,7 @@ void PageStyleActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "getLayout"sv) { + if (message.type == "getLayout"sv) { auto node = get_required_parameter(message, "node"sv); if (!node.has_value()) return; @@ -121,13 +121,13 @@ void PageStyleActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "isPositionEditable") { + if (message.type == "isPositionEditable") { response.set("value"sv, false); send_message(move(response)); return; } - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } JsonValue PageStyleActor::serialize_style() const diff --git a/Libraries/LibDevTools/Actors/PageStyleActor.h b/Libraries/LibDevTools/Actors/PageStyleActor.h index 855fabd547a..7d05f80d759 100644 --- a/Libraries/LibDevTools/Actors/PageStyleActor.h +++ b/Libraries/LibDevTools/Actors/PageStyleActor.h @@ -24,12 +24,13 @@ public: static NonnullRefPtr create(DevToolsServer&, String name, WeakPtr); virtual ~PageStyleActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; JsonValue serialize_style() const; private: PageStyleActor(DevToolsServer&, String name, WeakPtr); + virtual void handle_message(Message const&) override; + template void inspect_dom_node(StringView node_actor, Callback&&); diff --git a/Libraries/LibDevTools/Actors/PreferenceActor.cpp b/Libraries/LibDevTools/Actors/PreferenceActor.cpp index e893fd22cb7..e0164c3b1db 100644 --- a/Libraries/LibDevTools/Actors/PreferenceActor.cpp +++ b/Libraries/LibDevTools/Actors/PreferenceActor.cpp @@ -21,21 +21,21 @@ PreferenceActor::PreferenceActor(DevToolsServer& devtools, String name) PreferenceActor::~PreferenceActor() = default; -void PreferenceActor::handle_message(StringView type, JsonObject const&) +void PreferenceActor::handle_message(Message const& message) { // FIXME: During session initialization, Firefox DevTools asks for the following boolean configurations: // browser.privatebrowsing.autostart // devtools.debugger.prompt-connection // dom.serviceWorkers.enabled // We just blindly return `false` for these, but we will eventually want a real configuration manager. - if (type == "getBoolPref"sv) { + if (message.type == "getBoolPref"sv) { JsonObject response; response.set("value"sv, false); send_message(move(response)); return; } - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } } diff --git a/Libraries/LibDevTools/Actors/PreferenceActor.h b/Libraries/LibDevTools/Actors/PreferenceActor.h index b0a14e232cc..bc554c8ce6c 100644 --- a/Libraries/LibDevTools/Actors/PreferenceActor.h +++ b/Libraries/LibDevTools/Actors/PreferenceActor.h @@ -18,10 +18,10 @@ public: static NonnullRefPtr create(DevToolsServer&, String name); virtual ~PreferenceActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; - private: PreferenceActor(DevToolsServer&, String name); + + virtual void handle_message(Message const&) override; }; } diff --git a/Libraries/LibDevTools/Actors/ProcessActor.cpp b/Libraries/LibDevTools/Actors/ProcessActor.cpp index dd71536f917..5846e92eb24 100644 --- a/Libraries/LibDevTools/Actors/ProcessActor.cpp +++ b/Libraries/LibDevTools/Actors/ProcessActor.cpp @@ -22,9 +22,9 @@ ProcessActor::ProcessActor(DevToolsServer& devtools, String name, ProcessDescrip ProcessActor::~ProcessActor() = default; -void ProcessActor::handle_message(StringView type, JsonObject const&) +void ProcessActor::handle_message(Message const& message) { - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } JsonObject ProcessActor::serialize_description() const diff --git a/Libraries/LibDevTools/Actors/ProcessActor.h b/Libraries/LibDevTools/Actors/ProcessActor.h index 1fc9160884b..7a651b7b4e3 100644 --- a/Libraries/LibDevTools/Actors/ProcessActor.h +++ b/Libraries/LibDevTools/Actors/ProcessActor.h @@ -24,14 +24,14 @@ public: static NonnullRefPtr create(DevToolsServer&, String name, ProcessDescription); virtual ~ProcessActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; - ProcessDescription const& description() const { return m_description; } JsonObject serialize_description() const; private: ProcessActor(DevToolsServer&, String name, ProcessDescription); + virtual void handle_message(Message const&) override; + ProcessDescription m_description; }; diff --git a/Libraries/LibDevTools/Actors/RootActor.cpp b/Libraries/LibDevTools/Actors/RootActor.cpp index 473df7d01f9..0a2abb89585 100644 --- a/Libraries/LibDevTools/Actors/RootActor.cpp +++ b/Libraries/LibDevTools/Actors/RootActor.cpp @@ -41,16 +41,16 @@ RootActor::RootActor(DevToolsServer& devtools, String name) RootActor::~RootActor() = default; -void RootActor::handle_message(StringView type, JsonObject const& message) +void RootActor::handle_message(Message const& message) { JsonObject response; - if (type == "connect") { + if (message.type == "connect") { send_message(move(response)); return; } - if (type == "getRoot"sv) { + if (message.type == "getRoot"sv) { response.set("selected"sv, 0); for (auto const& actor : devtools().actor_registry()) { @@ -64,7 +64,7 @@ void RootActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "getProcess"sv) { + if (message.type == "getProcess"sv) { auto id = get_required_parameter(message, "id"sv); if (!id.has_value()) return; @@ -84,7 +84,7 @@ void RootActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "getTab"sv) { + if (message.type == "getTab"sv) { auto browser_id = get_required_parameter(message, "browserId"sv); if (!browser_id.has_value()) return; @@ -104,13 +104,13 @@ void RootActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "listAddons"sv) { + if (message.type == "listAddons"sv) { response.set("addons"sv, JsonArray {}); send_message(move(response)); return; } - if (type == "listProcesses"sv) { + if (message.type == "listProcesses"sv) { JsonArray processes; for (auto const& actor : devtools().actor_registry()) { @@ -123,13 +123,13 @@ void RootActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "listServiceWorkerRegistrations"sv) { + if (message.type == "listServiceWorkerRegistrations"sv) { response.set("registrations"sv, JsonArray {}); send_message(move(response)); return; } - if (type == "listTabs"sv) { + if (message.type == "listTabs"sv) { m_has_sent_tab_list_changed_since_last_list_tabs_request = false; JsonArray tabs; @@ -144,13 +144,13 @@ void RootActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "listWorkers"sv) { + if (message.type == "listWorkers"sv) { response.set("workers"sv, JsonArray {}); send_message(move(response)); return; } - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } void RootActor::send_tab_list_changed_message() diff --git a/Libraries/LibDevTools/Actors/RootActor.h b/Libraries/LibDevTools/Actors/RootActor.h index 4ace2e427d0..b600a899c8e 100644 --- a/Libraries/LibDevTools/Actors/RootActor.h +++ b/Libraries/LibDevTools/Actors/RootActor.h @@ -18,13 +18,13 @@ public: static NonnullRefPtr create(DevToolsServer&, String name); virtual ~RootActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; - void send_tab_list_changed_message(); private: RootActor(DevToolsServer&, String name); + virtual void handle_message(Message const&) override; + // https://firefox-source-docs.mozilla.org/devtools/backend/protocol.html#the-request-reply-notify-pattern // the root actor sends at most one "tabListChanged" notification after each "listTabs" request. bool m_has_sent_tab_list_changed_since_last_list_tabs_request { false }; diff --git a/Libraries/LibDevTools/Actors/TabActor.cpp b/Libraries/LibDevTools/Actors/TabActor.cpp index b3ff6d8fa77..429c67d2928 100644 --- a/Libraries/LibDevTools/Actors/TabActor.cpp +++ b/Libraries/LibDevTools/Actors/TabActor.cpp @@ -28,11 +28,11 @@ TabActor::~TabActor() reset_selected_node(); } -void TabActor::handle_message(StringView type, JsonObject const&) +void TabActor::handle_message(Message const& message) { JsonObject response; - if (type == "getFavicon"sv) { + if (message.type == "getFavicon"sv) { // FIXME: Firefox DevTools wants a favicon URL here, but supplying a URL seems to prevent this tab from being // listed on the about:debugging page. Both Servo and Firefox itself supply `null` here. response.set("favicon"sv, JsonValue {}); @@ -40,7 +40,7 @@ void TabActor::handle_message(StringView type, JsonObject const&) return; } - if (type == "getWatcher"sv) { + if (message.type == "getWatcher"sv) { if (!m_watcher) m_watcher = devtools().register_actor(this); @@ -50,7 +50,7 @@ void TabActor::handle_message(StringView type, JsonObject const&) return; } - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } JsonObject TabActor::serialize_description() const diff --git a/Libraries/LibDevTools/Actors/TabActor.h b/Libraries/LibDevTools/Actors/TabActor.h index 880accab913..ef6d480a37b 100644 --- a/Libraries/LibDevTools/Actors/TabActor.h +++ b/Libraries/LibDevTools/Actors/TabActor.h @@ -25,8 +25,6 @@ public: static NonnullRefPtr create(DevToolsServer&, String name, TabDescription); virtual ~TabActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; - TabDescription const& description() const { return m_description; } JsonObject serialize_description() const; @@ -35,6 +33,8 @@ public: private: TabActor(DevToolsServer&, String name, TabDescription); + virtual void handle_message(Message const&) override; + TabDescription m_description; WeakPtr m_watcher; }; diff --git a/Libraries/LibDevTools/Actors/TargetConfigurationActor.cpp b/Libraries/LibDevTools/Actors/TargetConfigurationActor.cpp index dcf2b2d0978..fc20703c24f 100644 --- a/Libraries/LibDevTools/Actors/TargetConfigurationActor.cpp +++ b/Libraries/LibDevTools/Actors/TargetConfigurationActor.cpp @@ -22,11 +22,11 @@ TargetConfigurationActor::TargetConfigurationActor(DevToolsServer& devtools, Str TargetConfigurationActor::~TargetConfigurationActor() = default; -void TargetConfigurationActor::handle_message(StringView type, JsonObject const& message) +void TargetConfigurationActor::handle_message(Message const& message) { JsonObject response; - if (type == "updateConfiguration"sv) { + if (message.type == "updateConfiguration"sv) { auto configuration = get_required_parameter(message, "configuration"sv); if (!configuration.has_value()) return; @@ -35,7 +35,7 @@ void TargetConfigurationActor::handle_message(StringView type, JsonObject const& return; } - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } JsonObject TargetConfigurationActor::serialize_configuration() const diff --git a/Libraries/LibDevTools/Actors/TargetConfigurationActor.h b/Libraries/LibDevTools/Actors/TargetConfigurationActor.h index ac37a93db7b..ee4d6dbf6e5 100644 --- a/Libraries/LibDevTools/Actors/TargetConfigurationActor.h +++ b/Libraries/LibDevTools/Actors/TargetConfigurationActor.h @@ -18,12 +18,12 @@ public: static NonnullRefPtr create(DevToolsServer&, String name); virtual ~TargetConfigurationActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; - JsonObject serialize_configuration() const; private: TargetConfigurationActor(DevToolsServer&, String name); + + virtual void handle_message(Message const&) override; }; } diff --git a/Libraries/LibDevTools/Actors/ThreadActor.cpp b/Libraries/LibDevTools/Actors/ThreadActor.cpp index 8862122cf1f..f602a1b014f 100644 --- a/Libraries/LibDevTools/Actors/ThreadActor.cpp +++ b/Libraries/LibDevTools/Actors/ThreadActor.cpp @@ -20,9 +20,9 @@ ThreadActor::ThreadActor(DevToolsServer& devtools, String name) ThreadActor::~ThreadActor() = default; -void ThreadActor::handle_message(StringView type, JsonObject const&) +void ThreadActor::handle_message(Message const& message) { - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } } diff --git a/Libraries/LibDevTools/Actors/ThreadActor.h b/Libraries/LibDevTools/Actors/ThreadActor.h index 6381043266c..c403a1a381f 100644 --- a/Libraries/LibDevTools/Actors/ThreadActor.h +++ b/Libraries/LibDevTools/Actors/ThreadActor.h @@ -18,10 +18,10 @@ public: static NonnullRefPtr create(DevToolsServer&, String name); virtual ~ThreadActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; - private: ThreadActor(DevToolsServer&, String name); + + virtual void handle_message(Message const&) override; }; } diff --git a/Libraries/LibDevTools/Actors/ThreadConfigurationActor.cpp b/Libraries/LibDevTools/Actors/ThreadConfigurationActor.cpp index 62c5ab39b9b..3a2bd7f7e1c 100644 --- a/Libraries/LibDevTools/Actors/ThreadConfigurationActor.cpp +++ b/Libraries/LibDevTools/Actors/ThreadConfigurationActor.cpp @@ -22,11 +22,11 @@ ThreadConfigurationActor::ThreadConfigurationActor(DevToolsServer& devtools, Str ThreadConfigurationActor::~ThreadConfigurationActor() = default; -void ThreadConfigurationActor::handle_message(StringView type, JsonObject const& message) +void ThreadConfigurationActor::handle_message(Message const& message) { JsonObject response; - if (type == "updateConfiguration"sv) { + if (message.type == "updateConfiguration"sv) { auto configuration = get_required_parameter(message, "configuration"sv); if (!configuration.has_value()) return; @@ -35,7 +35,7 @@ void ThreadConfigurationActor::handle_message(StringView type, JsonObject const& return; } - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } JsonObject ThreadConfigurationActor::serialize_configuration() const diff --git a/Libraries/LibDevTools/Actors/ThreadConfigurationActor.h b/Libraries/LibDevTools/Actors/ThreadConfigurationActor.h index 440d325b7ca..a3ada0c1139 100644 --- a/Libraries/LibDevTools/Actors/ThreadConfigurationActor.h +++ b/Libraries/LibDevTools/Actors/ThreadConfigurationActor.h @@ -18,12 +18,12 @@ public: static NonnullRefPtr create(DevToolsServer&, String name); virtual ~ThreadConfigurationActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; - JsonObject serialize_configuration() const; private: ThreadConfigurationActor(DevToolsServer&, String name); + + virtual void handle_message(Message const&) override; }; } diff --git a/Libraries/LibDevTools/Actors/WalkerActor.cpp b/Libraries/LibDevTools/Actors/WalkerActor.cpp index 58d95ae499d..12618e27c63 100644 --- a/Libraries/LibDevTools/Actors/WalkerActor.cpp +++ b/Libraries/LibDevTools/Actors/WalkerActor.cpp @@ -43,11 +43,11 @@ WalkerActor::~WalkerActor() devtools().delegate().stop_listening_for_dom_mutations(tab->description()); } -void WalkerActor::handle_message(StringView type, JsonObject const& message) +void WalkerActor::handle_message(Message const& message) { JsonObject response; - if (type == "children"sv) { + if (message.type == "children"sv) { auto node = get_required_parameter(message, "node"sv); if (!node.has_value()) return; @@ -73,7 +73,7 @@ void WalkerActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "duplicateNode"sv) { + if (message.type == "duplicateNode"sv) { auto node = get_required_parameter(message, "node"sv); if (!node.has_value()) return; @@ -88,7 +88,7 @@ void WalkerActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "editTagName"sv) { + if (message.type == "editTagName"sv) { auto node = get_required_parameter(message, "node"sv); if (!node.has_value()) return; @@ -107,7 +107,7 @@ void WalkerActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "getLayoutInspector"sv) { + if (message.type == "getLayoutInspector"sv) { if (!m_layout_inspector) m_layout_inspector = devtools().register_actor(); @@ -119,7 +119,7 @@ void WalkerActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "getMutations"sv) { + if (message.type == "getMutations"sv) { response.set("mutations"sv, serialize_mutations()); send_message(move(response)); @@ -127,13 +127,13 @@ void WalkerActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "getOffsetParent"sv) { + if (message.type == "getOffsetParent"sv) { response.set("node"sv, JsonValue {}); send_message(move(response)); return; } - if (type == "innerHTML"sv) { + if (message.type == "innerHTML"sv) { auto node = get_required_parameter(message, "node"sv); if (!node.has_value()) return; @@ -152,7 +152,7 @@ void WalkerActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "insertAdjacentHTML") { + if (message.type == "insertAdjacentHTML") { // FIXME: This message also contains `value` and `position` parameters, containing the HTML to insert and the // location to insert it. For the "Create New Node" action, this is always "
" and "beforeEnd", // which is exactly what our WebView implementation currently supports. @@ -182,7 +182,7 @@ void WalkerActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "insertBefore"sv) { + if (message.type == "insertBefore"sv) { auto node = get_required_parameter(message, "node"sv); if (!node.has_value()) return; @@ -204,7 +204,7 @@ void WalkerActor::handle_message(StringView type, JsonObject const& message) } Optional sibling_node_id; - if (auto sibling = message.get_string("sibling"sv); sibling.has_value()) { + if (auto sibling = message.data.get_string("sibling"sv); sibling.has_value()) { auto sibling_dom_node = WalkerActor::dom_node_for(*this, *sibling); if (!sibling_dom_node.has_value()) { send_unknown_actor_error(*sibling); @@ -218,7 +218,7 @@ void WalkerActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "isInDOMTree"sv) { + if (message.type == "isInDOMTree"sv) { auto node = get_required_parameter(message, "node"sv); if (!node.has_value()) return; @@ -228,7 +228,7 @@ void WalkerActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "outerHTML"sv) { + if (message.type == "outerHTML"sv) { auto node = get_required_parameter(message, "node"sv); if (!node.has_value()) return; @@ -247,7 +247,7 @@ void WalkerActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "previousSibling"sv) { + if (message.type == "previousSibling"sv) { auto node = get_required_parameter(message, "node"sv); if (!node.has_value()) return; @@ -267,7 +267,7 @@ void WalkerActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "querySelector"sv) { + if (message.type == "querySelector"sv) { auto node = get_required_parameter(message, "node"sv); if (!node.has_value()) return; @@ -298,7 +298,7 @@ void WalkerActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "removeNode"sv) { + if (message.type == "removeNode"sv) { auto node = get_required_parameter(message, "node"sv); if (!node.has_value()) return; @@ -325,12 +325,12 @@ void WalkerActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "retainNode"sv) { + if (message.type == "retainNode"sv) { send_message(move(response)); return; } - if (type == "setOuterHTML"sv) { + if (message.type == "setOuterHTML"sv) { auto node = get_required_parameter(message, "node"sv); if (!node.has_value()) return; @@ -349,7 +349,7 @@ void WalkerActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "watchRootNode"sv) { + if (message.type == "watchRootNode"sv) { response.set("type"sv, "root-available"sv); response.set("node"sv, serialize_root()); send_message(move(response)); @@ -358,7 +358,7 @@ void WalkerActor::handle_message(StringView type, JsonObject const& message) return; } - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } bool WalkerActor::is_suitable_for_dom_inspection(JsonValue const& node) diff --git a/Libraries/LibDevTools/Actors/WalkerActor.h b/Libraries/LibDevTools/Actors/WalkerActor.h index 1c7099ca6df..617bbeca948 100644 --- a/Libraries/LibDevTools/Actors/WalkerActor.h +++ b/Libraries/LibDevTools/Actors/WalkerActor.h @@ -24,8 +24,6 @@ public: static NonnullRefPtr create(DevToolsServer&, String name, WeakPtr, JsonObject dom_tree); virtual ~WalkerActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; - static bool is_suitable_for_dom_inspection(JsonValue const&); JsonValue serialize_root() const; @@ -40,6 +38,8 @@ public: private: WalkerActor(DevToolsServer&, String name, WeakPtr, JsonObject dom_tree); + virtual void handle_message(Message const&) override; + JsonValue serialize_node(JsonObject const&) const; Optional find_node_by_selector(JsonObject const& node, StringView selector); diff --git a/Libraries/LibDevTools/Actors/WatcherActor.cpp b/Libraries/LibDevTools/Actors/WatcherActor.cpp index e7bc6367fbe..272bb99d51c 100644 --- a/Libraries/LibDevTools/Actors/WatcherActor.cpp +++ b/Libraries/LibDevTools/Actors/WatcherActor.cpp @@ -33,11 +33,11 @@ WatcherActor::WatcherActor(DevToolsServer& devtools, String name, WeakPtr(message, "browsingContextID"sv); if (!browsing_context_id.has_value()) return; @@ -47,7 +47,7 @@ void WatcherActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "getTargetConfigurationActor"sv) { + if (message.type == "getTargetConfigurationActor"sv) { if (!m_target_configuration) m_target_configuration = devtools().register_actor(); @@ -56,7 +56,7 @@ void WatcherActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "getThreadConfigurationActor"sv) { + if (message.type == "getThreadConfigurationActor"sv) { if (!m_thread_configuration) m_thread_configuration = devtools().register_actor(); @@ -65,7 +65,7 @@ void WatcherActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "watchResources"sv) { + if (message.type == "watchResources"sv) { auto resource_types = get_required_parameter(message, "resourceTypes"sv); if (!resource_types.has_value()) return; @@ -83,7 +83,7 @@ void WatcherActor::handle_message(StringView type, JsonObject const& message) return; } - if (type == "watchTargets"sv) { + if (message.type == "watchTargets"sv) { auto target_type = get_required_parameter(message, "targetType"sv); if (!target_type.has_value()) return; @@ -108,7 +108,7 @@ void WatcherActor::handle_message(StringView type, JsonObject const& message) } } - send_unrecognized_packet_type_error(type); + send_unrecognized_packet_type_error(message); } JsonObject WatcherActor::serialize_description() const diff --git a/Libraries/LibDevTools/Actors/WatcherActor.h b/Libraries/LibDevTools/Actors/WatcherActor.h index 03c6017bf3a..812712eea05 100644 --- a/Libraries/LibDevTools/Actors/WatcherActor.h +++ b/Libraries/LibDevTools/Actors/WatcherActor.h @@ -18,13 +18,13 @@ public: static NonnullRefPtr create(DevToolsServer&, String name, WeakPtr); virtual ~WatcherActor() override; - virtual void handle_message(StringView type, JsonObject const&) override; - JsonObject serialize_description() const; private: WatcherActor(DevToolsServer&, String name, WeakPtr); + virtual void handle_message(Message const&) override; + WeakPtr m_tab; WeakPtr m_target; WeakPtr m_target_configuration; diff --git a/Libraries/LibDevTools/Connection.cpp b/Libraries/LibDevTools/Connection.cpp index 3bf9941893f..a748e8a4d91 100644 --- a/Libraries/LibDevTools/Connection.cpp +++ b/Libraries/LibDevTools/Connection.cpp @@ -88,9 +88,9 @@ ErrorOr Connection::on_ready_to_read() if (!message.is_object()) continue; - Core::deferred_invoke([this, message = move(message)]() { + Core::deferred_invoke([this, message = move(message)]() mutable { if (on_message_received) - on_message_received(message.as_object()); + on_message_received(move(message.as_object())); }); } diff --git a/Libraries/LibDevTools/Connection.h b/Libraries/LibDevTools/Connection.h index 9fe7490ee7c..4474eb5bf52 100644 --- a/Libraries/LibDevTools/Connection.h +++ b/Libraries/LibDevTools/Connection.h @@ -22,7 +22,7 @@ public: ~Connection(); Function on_connection_closed; - Function on_message_received; + Function on_message_received; void send_message(JsonValue const&); diff --git a/Libraries/LibDevTools/DevToolsServer.cpp b/Libraries/LibDevTools/DevToolsServer.cpp index ef6a419f3fc..adbbf605ac6 100644 --- a/Libraries/LibDevTools/DevToolsServer.cpp +++ b/Libraries/LibDevTools/DevToolsServer.cpp @@ -70,8 +70,8 @@ ErrorOr DevToolsServer::on_new_client() close_connection(); }; - m_connection->on_message_received = [this](auto const& message) { - on_message_received(message); + m_connection->on_message_received = [this](auto message) { + on_message_received(move(message)); }; m_root_actor = register_actor(); @@ -83,7 +83,7 @@ ErrorOr DevToolsServer::on_new_client() return {}; } -void DevToolsServer::on_message_received(JsonObject const& message) +void DevToolsServer::on_message_received(JsonObject message) { auto to = message.get_string("to"sv); if (!to.has_value()) { @@ -103,7 +103,7 @@ void DevToolsServer::on_message_received(JsonObject const& message) return; } - actor->value->handle_message(*type, message); + actor->value->message_received(*type, move(message)); } void DevToolsServer::close_connection() diff --git a/Libraries/LibDevTools/DevToolsServer.h b/Libraries/LibDevTools/DevToolsServer.h index 0d48ac99958..d256e518242 100644 --- a/Libraries/LibDevTools/DevToolsServer.h +++ b/Libraries/LibDevTools/DevToolsServer.h @@ -52,7 +52,7 @@ private: explicit DevToolsServer(DevToolsDelegate&, NonnullRefPtr); ErrorOr on_new_client(); - void on_message_received(JsonObject const&); + void on_message_received(JsonObject); void close_connection();