Skip to content

Commit 2000fd3

Browse files
committed
DevTools+WebContent: Support the flexbox highlighter
1 parent 5b2c649 commit 2000fd3

11 files changed

Lines changed: 169 additions & 2 deletions

File tree

Libraries/LibDevTools/Actors/HighlighterActor.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,18 @@ HighlighterActor::~HighlighterActor() = default;
3131
void HighlighterActor::clear_current_highlight()
3232
{
3333
if (auto tab = InspectorActor::tab_for(m_inspector)) {
34-
if (m_type_name == "CssGridHighlighter"sv) {
34+
if (m_type_name == "FlexboxHighlighter"sv) {
35+
if (m_highlighted_flexbox_node_id.has_value())
36+
devtools().delegate().clear_flexbox_highlight(tab->description(), *m_highlighted_flexbox_node_id);
37+
} else if (m_type_name == "CssGridHighlighter"sv) {
3538
if (m_highlighted_grid_node_id.has_value())
3639
devtools().delegate().clear_grid_highlight(tab->description(), *m_highlighted_grid_node_id);
3740
} else if (m_is_highlighting_dom_node) {
3841
devtools().delegate().clear_highlighted_dom_node(tab->description());
3942
}
4043
}
4144

45+
m_highlighted_flexbox_node_id = {};
4246
m_highlighted_grid_node_id = {};
4347
m_is_highlighting_dom_node = false;
4448
}
@@ -55,7 +59,14 @@ void HighlighterActor::handle_message(Message const& message)
5559
response.set("value"sv, false);
5660

5761
if (auto dom_node = WalkerActor::dom_node_for(InspectorActor::walker_for(m_inspector), *node); dom_node.has_value()) {
58-
if (m_type_name == "CssGridHighlighter"sv) {
62+
if (m_type_name == "FlexboxHighlighter"sv) {
63+
if (m_highlighted_flexbox_node_id.has_value() && *m_highlighted_flexbox_node_id != dom_node->identifier.id)
64+
devtools().delegate().clear_flexbox_highlight(dom_node->tab->description(), *m_highlighted_flexbox_node_id);
65+
66+
auto options = message.data.get("options"sv).value_or(JsonObject {});
67+
devtools().delegate().highlight_flexbox(dom_node->tab->description(), dom_node->identifier.id, move(options));
68+
m_highlighted_flexbox_node_id = dom_node->identifier.id;
69+
} else if (m_type_name == "CssGridHighlighter"sv) {
5970
if (m_highlighted_grid_node_id.has_value() && *m_highlighted_grid_node_id != dom_node->identifier.id)
6071
devtools().delegate().clear_grid_highlight(dom_node->tab->description(), *m_highlighted_grid_node_id);
6172

Libraries/LibDevTools/Actors/HighlighterActor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class DEVTOOLS_API HighlighterActor final : public Actor {
3232

3333
WeakPtr<InspectorActor> m_inspector;
3434
String m_type_name;
35+
Optional<Web::UniqueNodeID> m_highlighted_flexbox_node_id;
3536
Optional<Web::UniqueNodeID> m_highlighted_grid_node_id;
3637
bool m_is_highlighting_dom_node { false };
3738
};

Libraries/LibDevTools/DevToolsDelegate.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ class DEVTOOLS_API DevToolsDelegate {
5656

5757
virtual void highlight_dom_node(TabDescription const&, Web::UniqueNodeID, Optional<Web::CSS::PseudoElement>) const { }
5858
virtual void clear_highlighted_dom_node(TabDescription const&) const { }
59+
virtual void highlight_flexbox(TabDescription const&, Web::UniqueNodeID, JsonValue) const { }
60+
virtual void clear_flexbox_highlight(TabDescription const&, Web::UniqueNodeID) const { }
5961
virtual void highlight_grid(TabDescription const&, Web::UniqueNodeID, JsonValue) const { }
6062
virtual void clear_grid_highlight(TabDescription const&, Web::UniqueNodeID) const { }
6163

Libraries/LibWebView/Application.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1834,6 +1834,18 @@ void Application::clear_highlighted_dom_node(DevTools::TabDescription const& des
18341834
view->clear_highlighted_dom_node();
18351835
}
18361836

1837+
void Application::highlight_flexbox(DevTools::TabDescription const& description, Web::UniqueNodeID node_id, JsonValue options) const
1838+
{
1839+
if (auto view = ViewImplementation::find_view_by_id(description.id); view.has_value())
1840+
view->highlight_flexbox(node_id, move(options));
1841+
}
1842+
1843+
void Application::clear_flexbox_highlight(DevTools::TabDescription const& description, Web::UniqueNodeID node_id) const
1844+
{
1845+
if (auto view = ViewImplementation::find_view_by_id(description.id); view.has_value())
1846+
view->clear_flexbox_highlight(node_id);
1847+
}
1848+
18371849
void Application::highlight_grid(DevTools::TabDescription const& description, Web::UniqueNodeID node_id, JsonValue options) const
18381850
{
18391851
if (auto view = ViewImplementation::find_view_by_id(description.id); view.has_value())

Libraries/LibWebView/Application.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,8 @@ class WEBVIEW_API Application : public DevTools::DevToolsDelegate {
263263
virtual void inspect_current_flexbox(DevTools::TabDescription const&, Web::UniqueNodeID, bool, OnCurrentFlexboxReceived) const override;
264264
virtual void highlight_dom_node(DevTools::TabDescription const&, Web::UniqueNodeID, Optional<Web::CSS::PseudoElement>) const override;
265265
virtual void clear_highlighted_dom_node(DevTools::TabDescription const&) const override;
266+
virtual void highlight_flexbox(DevTools::TabDescription const&, Web::UniqueNodeID, JsonValue) const override;
267+
virtual void clear_flexbox_highlight(DevTools::TabDescription const&, Web::UniqueNodeID) const override;
266268
virtual void highlight_grid(DevTools::TabDescription const&, Web::UniqueNodeID, JsonValue) const override;
267269
virtual void clear_grid_highlight(DevTools::TabDescription const&, Web::UniqueNodeID) const override;
268270
virtual void listen_for_dom_mutations(DevTools::TabDescription const&, OnDOMMutationReceived) const override;

Libraries/LibWebView/ViewImplementation.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,16 @@ void ViewImplementation::clear_highlighted_dom_node()
500500
highlight_dom_node(0, {});
501501
}
502502

503+
void ViewImplementation::highlight_flexbox(Web::UniqueNodeID node_id, JsonValue options)
504+
{
505+
client().async_highlight_flexbox(page_id(), node_id, move(options));
506+
}
507+
508+
void ViewImplementation::clear_flexbox_highlight(Web::UniqueNodeID node_id)
509+
{
510+
client().async_clear_flexbox_highlight(page_id(), node_id);
511+
}
512+
503513
void ViewImplementation::highlight_grid(Web::UniqueNodeID node_id, JsonValue options)
504514
{
505515
client().async_highlight_grid(page_id(), node_id, move(options));

Libraries/LibWebView/ViewImplementation.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ class WEBVIEW_API ViewImplementation
129129

130130
void highlight_dom_node(Web::UniqueNodeID node_id, Optional<Web::CSS::PseudoElement> pseudo_element);
131131
void clear_highlighted_dom_node();
132+
void highlight_flexbox(Web::UniqueNodeID node_id, JsonValue options);
133+
void clear_flexbox_highlight(Web::UniqueNodeID node_id);
132134
void highlight_grid(Web::UniqueNodeID node_id, JsonValue options);
133135
void clear_grid_highlight(Web::UniqueNodeID node_id);
134136

Services/WebContent/ConnectionFromClient.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
#include <LibWeb/Loader/ResourceLoader.h>
6363
#include <LibWeb/Loader/UserAgent.h>
6464
#include <LibWeb/Namespace.h>
65+
#include <LibWeb/Painting/FlexboxInspectorOverlay.h>
6566
#include <LibWeb/Painting/StackingContext.h>
6667
#include <LibWeb/Painting/ViewportPaintable.h>
6768
#include <LibWeb/PermissionsPolicy/AutoplayAllowlist.h>
@@ -988,6 +989,21 @@ void ConnectionFromClient::highlight_dom_node(u64 page_id, Web::UniqueNodeID nod
988989
node->document().set_highlighted_node(node, pseudo_element);
989990
}
990991

992+
static Web::Painting::FlexboxInspectorOverlayOptions flexbox_inspector_overlay_options_from_json(JsonValue const& options)
993+
{
994+
Web::Painting::FlexboxInspectorOverlayOptions result;
995+
996+
if (options.is_object()) {
997+
auto const& object = options.as_object();
998+
if (auto color = object.get_string("color"sv); color.has_value()) {
999+
if (auto parsed_color = Gfx::Color::from_string(*color); parsed_color.has_value())
1000+
result.color = *parsed_color;
1001+
}
1002+
}
1003+
1004+
return result;
1005+
}
1006+
9911007
static Web::Painting::GridInspectorOverlayOptions grid_inspector_overlay_options_from_json(JsonValue const& options)
9921008
{
9931009
Web::Painting::GridInspectorOverlayOptions result;
@@ -1011,6 +1027,38 @@ static Web::Painting::GridInspectorOverlayOptions grid_inspector_overlay_options
10111027
return result;
10121028
}
10131029

1030+
void ConnectionFromClient::highlight_flexbox(u64 page_id, Web::UniqueNodeID node_id, JsonValue options)
1031+
{
1032+
auto page = this->page(page_id);
1033+
if (!page.has_value())
1034+
return;
1035+
1036+
auto* node = Web::DOM::Node::from_unique_id(node_id);
1037+
if (!node || !node->layout_node())
1038+
return;
1039+
1040+
node->document().set_flexbox_highlighted_node(node, flexbox_inspector_overlay_options_from_json(options));
1041+
}
1042+
1043+
void ConnectionFromClient::clear_flexbox_highlight(u64 page_id, Web::UniqueNodeID node_id)
1044+
{
1045+
auto page = this->page(page_id);
1046+
if (!page.has_value())
1047+
return;
1048+
1049+
if (node_id != 0) {
1050+
auto* node = Web::DOM::Node::from_unique_id(node_id);
1051+
if (node)
1052+
node->document().clear_flexbox_highlighted_node(node);
1053+
return;
1054+
}
1055+
1056+
for (auto& navigable : Web::HTML::all_navigables()) {
1057+
if (navigable->active_document())
1058+
navigable->active_document()->clear_flexbox_highlighted_node(nullptr);
1059+
}
1060+
}
1061+
10141062
void ConnectionFromClient::highlight_grid(u64 page_id, Web::UniqueNodeID node_id, JsonValue options)
10151063
{
10161064
auto page = this->page(page_id);

Services/WebContent/ConnectionFromClient.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ class ConnectionFromClient final
9696
virtual void inspect_current_flexbox(u64 page_id, Web::UniqueNodeID node_id, bool only_look_at_parents) override;
9797
virtual void clear_inspected_dom_node(u64 page_id) override;
9898
virtual void highlight_dom_node(u64 page_id, Web::UniqueNodeID node_id, Optional<Web::CSS::PseudoElement> pseudo_element) override;
99+
virtual void highlight_flexbox(u64 page_id, Web::UniqueNodeID node_id, JsonValue options) override;
100+
virtual void clear_flexbox_highlight(u64 page_id, Web::UniqueNodeID node_id) override;
99101
virtual void highlight_grid(u64 page_id, Web::UniqueNodeID node_id, JsonValue options) override;
100102
virtual void clear_grid_highlight(u64 page_id, Web::UniqueNodeID node_id) override;
101103
virtual void inspect_accessibility_tree(u64 page_id) override;

Services/WebContent/WebContentServer.ipc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ endpoint WebContentServer
6363
inspect_current_flexbox(u64 page_id, Web::UniqueNodeID node_id, bool only_look_at_parents) =|
6464
clear_inspected_dom_node(u64 page_id) =|
6565
highlight_dom_node(u64 page_id, Web::UniqueNodeID node_id, Optional<Web::CSS::PseudoElement> pseudo_element) =|
66+
highlight_flexbox(u64 page_id, Web::UniqueNodeID node_id, JsonValue options) =|
67+
clear_flexbox_highlight(u64 page_id, Web::UniqueNodeID node_id) =|
6668
highlight_grid(u64 page_id, Web::UniqueNodeID node_id, JsonValue options) =|
6769
clear_grid_highlight(u64 page_id, Web::UniqueNodeID node_id) =|
6870
inspect_accessibility_tree(u64 page_id) =|

0 commit comments

Comments
 (0)