mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 09:57:35 +00:00
LibWebView+WebContent: Make the DOM node inspection IPC async
This commit is contained in:
parent
4c3bff264e
commit
760ba5932b
9 changed files with 80 additions and 53 deletions
|
@ -49,6 +49,32 @@ InspectorClient::InspectorClient(ViewImplementation& content_web_view, ViewImple
|
|||
select_default_node();
|
||||
};
|
||||
|
||||
m_content_web_view.on_received_dom_node_properties = [this](auto const& inspected_node_properties) {
|
||||
StringBuilder builder;
|
||||
|
||||
// FIXME: Support box model metrics and ARIA properties.
|
||||
auto generate_property_script = [&](auto const& computed_style, auto const& resolved_style, auto const& custom_properties) {
|
||||
builder.append("inspector.createPropertyTables(\""sv);
|
||||
builder.append_escaped_for_json(computed_style);
|
||||
builder.append("\", \""sv);
|
||||
builder.append_escaped_for_json(resolved_style);
|
||||
builder.append("\", \""sv);
|
||||
builder.append_escaped_for_json(custom_properties);
|
||||
builder.append("\");"sv);
|
||||
};
|
||||
|
||||
if (inspected_node_properties.has_value()) {
|
||||
generate_property_script(
|
||||
inspected_node_properties->computed_style_json,
|
||||
inspected_node_properties->resolved_style_json,
|
||||
inspected_node_properties->custom_properties_json);
|
||||
} else {
|
||||
generate_property_script("{}"sv, "{}"sv, "{}"sv);
|
||||
}
|
||||
|
||||
m_inspector_web_view.run_javascript(builder.string_view());
|
||||
};
|
||||
|
||||
m_content_web_view.on_received_accessibility_tree = [this](auto const& accessibility_tree) {
|
||||
auto result = parse_json_tree(accessibility_tree);
|
||||
if (result.is_error()) {
|
||||
|
@ -101,31 +127,7 @@ InspectorClient::InspectorClient(ViewImplementation& content_web_view, ViewImple
|
|||
};
|
||||
|
||||
m_inspector_web_view.on_inspector_selected_dom_node = [this](auto node_id, auto const& pseudo_element) {
|
||||
auto inspected_node_properties = m_content_web_view.inspect_dom_node(node_id, pseudo_element);
|
||||
|
||||
StringBuilder builder;
|
||||
|
||||
// FIXME: Support box model metrics and ARIA properties.
|
||||
auto generate_property_script = [&](auto const& computed_style, auto const& resolved_style, auto const& custom_properties) {
|
||||
builder.append("inspector.createPropertyTables(\""sv);
|
||||
builder.append_escaped_for_json(computed_style);
|
||||
builder.append("\", \""sv);
|
||||
builder.append_escaped_for_json(resolved_style);
|
||||
builder.append("\", \""sv);
|
||||
builder.append_escaped_for_json(custom_properties);
|
||||
builder.append("\");"sv);
|
||||
};
|
||||
|
||||
if (inspected_node_properties.is_error()) {
|
||||
generate_property_script("{}"sv, "{}"sv, "{}"sv);
|
||||
} else {
|
||||
generate_property_script(
|
||||
inspected_node_properties.value().computed_style_json,
|
||||
inspected_node_properties.value().resolved_style_json,
|
||||
inspected_node_properties.value().custom_properties_json);
|
||||
}
|
||||
|
||||
m_inspector_web_view.run_javascript(builder.string_view());
|
||||
m_content_web_view.inspect_dom_node(node_id, pseudo_element);
|
||||
};
|
||||
|
||||
m_inspector_web_view.on_inspector_set_dom_node_text = [this](auto node_id, auto const& text) {
|
||||
|
|
|
@ -131,28 +131,19 @@ void ViewImplementation::inspect_dom_tree()
|
|||
client().async_inspect_dom_tree();
|
||||
}
|
||||
|
||||
void ViewImplementation::inspect_dom_node(i32 node_id, Optional<Web::CSS::Selector::PseudoElement::Type> pseudo_element)
|
||||
{
|
||||
client().async_inspect_dom_node(node_id, move(pseudo_element));
|
||||
}
|
||||
|
||||
void ViewImplementation::inspect_accessibility_tree()
|
||||
{
|
||||
client().async_inspect_accessibility_tree();
|
||||
}
|
||||
|
||||
ErrorOr<ViewImplementation::DOMNodeProperties> ViewImplementation::inspect_dom_node(i32 node_id, Optional<Web::CSS::Selector::PseudoElement::Type> pseudo_element)
|
||||
{
|
||||
auto response = client().inspect_dom_node(node_id, pseudo_element);
|
||||
if (!response.has_style())
|
||||
return Error::from_string_view("Inspected node returned no style"sv);
|
||||
return DOMNodeProperties {
|
||||
.computed_style_json = TRY(String::from_byte_string(response.take_computed_style())),
|
||||
.resolved_style_json = TRY(String::from_byte_string(response.take_resolved_style())),
|
||||
.custom_properties_json = TRY(String::from_byte_string(response.take_custom_properties())),
|
||||
.node_box_sizing_json = TRY(String::from_byte_string(response.take_node_box_sizing())),
|
||||
.aria_properties_state_json = TRY(String::from_byte_string(response.take_aria_properties_state())),
|
||||
};
|
||||
}
|
||||
|
||||
void ViewImplementation::clear_inspected_dom_node()
|
||||
{
|
||||
client().inspect_dom_node(0, {});
|
||||
inspect_dom_node(0, {});
|
||||
}
|
||||
|
||||
i32 ViewImplementation::get_hovered_node_id()
|
||||
|
|
|
@ -59,8 +59,8 @@ public:
|
|||
void get_source();
|
||||
|
||||
void inspect_dom_tree();
|
||||
void inspect_dom_node(i32 node_id, Optional<Web::CSS::Selector::PseudoElement::Type> pseudo_element);
|
||||
void inspect_accessibility_tree();
|
||||
ErrorOr<DOMNodeProperties> inspect_dom_node(i32 node_id, Optional<Web::CSS::Selector::PseudoElement::Type> pseudo_element);
|
||||
void clear_inspected_dom_node();
|
||||
i32 get_hovered_node_id();
|
||||
|
||||
|
@ -141,6 +141,7 @@ public:
|
|||
Function<void()> on_request_dismiss_dialog;
|
||||
Function<void(const AK::URL&, ByteString const&)> on_received_source;
|
||||
Function<void(ByteString const&)> on_received_dom_tree;
|
||||
Function<void(Optional<DOMNodeProperties>)> on_received_dom_node_properties;
|
||||
Function<void(ByteString const&)> on_received_accessibility_tree;
|
||||
Function<void(i32 message_id)> on_received_console_message;
|
||||
Function<void(i32 start_index, Vector<ByteString> const& message_types, Vector<ByteString> const& messages)> on_received_console_messages;
|
||||
|
|
|
@ -187,6 +187,26 @@ void WebContentClient::did_inspect_dom_tree(ByteString const& dom_tree)
|
|||
m_view.on_received_dom_tree(dom_tree);
|
||||
}
|
||||
|
||||
void WebContentClient::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)
|
||||
{
|
||||
if (!m_view.on_received_dom_node_properties)
|
||||
return;
|
||||
|
||||
Optional<ViewImplementation::DOMNodeProperties> properties;
|
||||
|
||||
if (has_style) {
|
||||
properties = ViewImplementation::DOMNodeProperties {
|
||||
.computed_style_json = MUST(String::from_byte_string(computed_style)),
|
||||
.resolved_style_json = MUST(String::from_byte_string(resolved_style)),
|
||||
.custom_properties_json = MUST(String::from_byte_string(custom_properties)),
|
||||
.node_box_sizing_json = MUST(String::from_byte_string(node_box_sizing)),
|
||||
.aria_properties_state_json = MUST(String::from_byte_string(aria_properties_state)),
|
||||
};
|
||||
}
|
||||
|
||||
m_view.on_received_dom_node_properties(move(properties));
|
||||
}
|
||||
|
||||
void WebContentClient::did_inspect_accessibility_tree(ByteString const& accessibility_tree)
|
||||
{
|
||||
if (m_view.on_received_accessibility_tree)
|
||||
|
|
|
@ -53,6 +53,7 @@ private:
|
|||
virtual void did_request_media_context_menu(Gfx::IntPoint, ByteString const&, unsigned, Web::Page::MediaContextMenu const&) override;
|
||||
virtual void did_get_source(AK::URL const&, ByteString const&) override;
|
||||
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_output_js_console_message(i32 message_index) override;
|
||||
virtual void did_get_js_console_messages(i32 start_index, Vector<ByteString> const& message_types, Vector<ByteString> const& messages) override;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue