1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-09 09:34:57 +09:00

LibWebView + WebContent: Add fonts to be transferable to inspector

This patch adds all the needed plumbing to transfer information
regarding fonts of the selected DOM node to the inspector.
This commit is contained in:
Tobias Christiansen 2024-08-09 17:07:27 +02:00 committed by Sam Atkins
parent 049a261782
commit 5621f34062
Notes: github-actions[bot] 2024-08-09 17:59:05 +00:00
5 changed files with 31 additions and 9 deletions

View file

@ -38,6 +38,7 @@ public:
String custom_properties_json;
String node_box_sizing_json;
String aria_properties_state_json;
String fonts_json;
};
void set_url(Badge<WebContentClient>, URL::URL url) { m_url = move(url); }

View file

@ -282,7 +282,7 @@ void WebContentClient::did_inspect_dom_tree(u64 page_id, ByteString const& dom_t
}
}
void WebContentClient::did_inspect_dom_node(u64 page_id, 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)
void WebContentClient::did_inspect_dom_node(u64 page_id, 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, ByteString const& fonts)
{
auto view = view_for_page_id(page_id);
if (!view.has_value() || !view->on_received_dom_node_properties)
@ -297,6 +297,7 @@ void WebContentClient::did_inspect_dom_node(u64 page_id, bool has_style, ByteStr
.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)),
.fonts_json = MUST(String::from_byte_string(fonts))
};
}

View file

@ -70,7 +70,7 @@ private:
virtual void did_request_media_context_menu(u64 page_id, Gfx::IntPoint, ByteString const&, unsigned, Web::Page::MediaContextMenu const&) override;
virtual void did_get_source(u64 page_id, URL::URL const&, ByteString const&) override;
virtual void did_inspect_dom_tree(u64 page_id, ByteString const&) override;
virtual void did_inspect_dom_node(u64 page_id, 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_dom_node(u64 page_id, 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, ByteString const& fonts) override;
virtual void did_inspect_accessibility_tree(u64 page_id, ByteString const&) override;
virtual void did_get_hovered_node_id(u64 page_id, i32 node_id) override;
virtual void did_finish_editing_dom_node(u64 page_id, Optional<i32> const& node_id) override;

View file

@ -453,7 +453,7 @@ void ConnectionFromClient::inspect_dom_node(u64 page_id, i32 node_id, Optional<W
Web::DOM::Node* node = Web::DOM::Node::from_unique_id(node_id);
// Note: Nodes without layout (aka non-visible nodes, don't have style computed)
if (!node || !node->layout_node()) {
async_did_inspect_dom_node(page_id, false, {}, {}, {}, {}, {});
async_did_inspect_dom_node(page_id, false, {}, {}, {}, {}, {}, {});
return;
}
@ -462,7 +462,7 @@ void ConnectionFromClient::inspect_dom_node(u64 page_id, i32 node_id, Optional<W
if (node->is_element()) {
auto& element = verify_cast<Web::DOM::Element>(*node);
if (!element.computed_css_values()) {
async_did_inspect_dom_node(page_id, false, {}, {}, {}, {}, {});
async_did_inspect_dom_node(page_id, false, {}, {}, {}, {}, {}, {});
return;
}
@ -546,10 +546,28 @@ void ConnectionFromClient::inspect_dom_node(u64 page_id, i32 node_id, Optional<W
return builder.to_byte_string();
};
auto serialize_fonts_json = [](Web::CSS::StyleProperties const& properties) -> ByteString {
StringBuilder builder;
auto serializer = MUST(JsonArraySerializer<>::try_create(builder));
auto const& font_list = properties.computed_font_list();
font_list.for_each_font_entry([&serializer](Gfx::FontCascadeList::Entry const& entry) {
auto const& font = entry.font;
auto font_json_object = MUST(serializer.add_object());
MUST(font_json_object.add("name"sv, font->family()));
MUST(font_json_object.add("size"sv, font->point_size()));
MUST(font_json_object.add("weight"sv, font->weight()));
MUST(font_json_object.add("variant"sv, font->variant()));
MUST(font_json_object.finish());
});
MUST(serializer.finish());
return builder.to_byte_string();
};
if (pseudo_element.has_value()) {
auto pseudo_element_node = element.get_pseudo_element_node(pseudo_element.value());
if (!pseudo_element_node) {
async_did_inspect_dom_node(page_id, false, {}, {}, {}, {}, {});
async_did_inspect_dom_node(page_id, false, {}, {}, {}, {}, {}, {});
return;
}
@ -558,8 +576,9 @@ void ConnectionFromClient::inspect_dom_node(u64 page_id, i32 node_id, Optional<W
ByteString resolved_values = serialize_json(*element.resolved_css_values(pseudo_element.value()));
ByteString custom_properties_json = serialize_custom_properties_json(element, pseudo_element);
ByteString node_box_sizing_json = serialize_node_box_sizing_json(pseudo_element_node.ptr());
ByteString fonts_json = serialize_fonts_json(*pseudo_element_style);
async_did_inspect_dom_node(page_id, true, move(computed_values), move(resolved_values), move(custom_properties_json), move(node_box_sizing_json), {});
async_did_inspect_dom_node(page_id, true, move(computed_values), move(resolved_values), move(custom_properties_json), move(node_box_sizing_json), {}, move(fonts_json));
return;
}
@ -568,12 +587,13 @@ void ConnectionFromClient::inspect_dom_node(u64 page_id, i32 node_id, Optional<W
ByteString custom_properties_json = serialize_custom_properties_json(element, {});
ByteString node_box_sizing_json = serialize_node_box_sizing_json(element.layout_node());
ByteString aria_properties_state_json = serialize_aria_properties_state_json(element);
ByteString fonts_json = serialize_fonts_json(*element.computed_css_values());
async_did_inspect_dom_node(page_id, true, move(computed_values), move(resolved_values), move(custom_properties_json), move(node_box_sizing_json), move(aria_properties_state_json));
async_did_inspect_dom_node(page_id, true, move(computed_values), move(resolved_values), move(custom_properties_json), move(node_box_sizing_json), move(aria_properties_state_json), move(fonts_json));
return;
}
async_did_inspect_dom_node(page_id, false, {}, {}, {}, {}, {});
async_did_inspect_dom_node(page_id, false, {}, {}, {}, {}, {}, {});
}
void ConnectionFromClient::inspect_accessibility_tree(u64 page_id)

View file

@ -48,7 +48,7 @@ endpoint WebContentClient
did_get_source(u64 page_id, URL::URL url, ByteString source) =|
did_inspect_dom_tree(u64 page_id, ByteString dom_tree) =|
did_inspect_dom_node(u64 page_id, bool has_style, ByteString computed_style, ByteString resolved_style, ByteString custom_properties, ByteString node_box_sizing, ByteString aria_properties_state) =|
did_inspect_dom_node(u64 page_id, bool has_style, ByteString computed_style, ByteString resolved_style, ByteString custom_properties, ByteString node_box_sizing, ByteString aria_properties_state, ByteString fonts) =|
did_inspect_accessibility_tree(u64 page_id, ByteString accessibility_tree) =|
did_get_hovered_node_id(u64 page_id, i32 node_id) =|
did_finish_editing_dom_node(u64 page_id, Optional<i32> node_id) =|