diff --git a/Ladybird/AppKit/UI/Inspector.mm b/Ladybird/AppKit/UI/Inspector.mm index 5f8efe14792..6d843ab771a 100644 --- a/Ladybird/AppKit/UI/Inspector.mm +++ b/Ladybird/AppKit/UI/Inspector.mm @@ -171,6 +171,11 @@ static constexpr NSInteger CONTEXT_MENU_COPY_ATTRIBUTE_VALUE_TAG = 3; m_inspector_client->context_menu_copy_dom_node(); } +- (void)screenshotDOMNode:(id)sender +{ + m_inspector_client->context_menu_screenshot_dom_node(); +} + - (void)deleteDOMNode:(id)sender { m_inspector_client->context_menu_remove_dom_node(); @@ -240,6 +245,9 @@ static constexpr NSInteger CONTEXT_MENU_COPY_ATTRIBUTE_VALUE_TAG = 3; [_dom_node_tag_context_menu addItem:[[NSMenuItem alloc] initWithTitle:@"Copy HTML" action:@selector(copyDOMNode:) keyEquivalent:@""]]; + [_dom_node_tag_context_menu addItem:[[NSMenuItem alloc] initWithTitle:@"Take node screenshot" + action:@selector(screenshotDOMNode:) + keyEquivalent:@""]]; } return _dom_node_tag_context_menu; @@ -282,6 +290,9 @@ static constexpr NSInteger CONTEXT_MENU_COPY_ATTRIBUTE_VALUE_TAG = 3; [_dom_node_attribute_context_menu addItem:[[NSMenuItem alloc] initWithTitle:@"Copy HTML" action:@selector(copyDOMNode:) keyEquivalent:@""]]; + [_dom_node_attribute_context_menu addItem:[[NSMenuItem alloc] initWithTitle:@"Take node screenshot" + action:@selector(screenshotDOMNode:) + keyEquivalent:@""]]; } return _dom_node_attribute_context_menu; diff --git a/Ladybird/Qt/InspectorWidget.cpp b/Ladybird/Qt/InspectorWidget.cpp index eeb48fcae07..a7762f7b580 100644 --- a/Ladybird/Qt/InspectorWidget.cpp +++ b/Ladybird/Qt/InspectorWidget.cpp @@ -33,6 +33,9 @@ InspectorWidget::InspectorWidget(QWidget* tab, WebContentView& content_view) m_copy_node_action = new QAction("&Copy HTML", this); connect(m_copy_node_action, &QAction::triggered, [this]() { m_inspector_client->context_menu_copy_dom_node(); }); + m_screenshot_node_action = new QAction("Take node &screenshot", this); + connect(m_screenshot_node_action, &QAction::triggered, [this]() { m_inspector_client->context_menu_screenshot_dom_node(); }); + m_delete_node_action = new QAction("&Delete node", this); connect(m_delete_node_action, &QAction::triggered, [this]() { m_inspector_client->context_menu_remove_dom_node(); }); @@ -58,6 +61,7 @@ InspectorWidget::InspectorWidget(QWidget* tab, WebContentView& content_view) m_dom_node_tag_context_menu->addAction(m_delete_node_action); m_dom_node_tag_context_menu->addSeparator(); m_dom_node_tag_context_menu->addAction(m_copy_node_action); + m_dom_node_tag_context_menu->addAction(m_screenshot_node_action); m_dom_node_attribute_context_menu = new QMenu("DOM attribute context menu", this); m_dom_node_attribute_context_menu->addAction(m_edit_node_action); @@ -68,6 +72,7 @@ InspectorWidget::InspectorWidget(QWidget* tab, WebContentView& content_view) m_dom_node_attribute_context_menu->addAction(m_delete_node_action); m_dom_node_attribute_context_menu->addSeparator(); m_dom_node_attribute_context_menu->addAction(m_copy_node_action); + m_dom_node_attribute_context_menu->addAction(m_screenshot_node_action); m_inspector_client->on_requested_dom_node_text_context_menu = [this](auto position) { m_edit_node_action->setText("&Edit text"); diff --git a/Ladybird/Qt/InspectorWidget.h b/Ladybird/Qt/InspectorWidget.h index b4b3a4ee91a..2c9289b40ab 100644 --- a/Ladybird/Qt/InspectorWidget.h +++ b/Ladybird/Qt/InspectorWidget.h @@ -45,6 +45,7 @@ private: QAction* m_edit_node_action { nullptr }; QAction* m_copy_node_action { nullptr }; + QAction* m_screenshot_node_action { nullptr }; QAction* m_delete_node_action { nullptr }; QAction* m_add_attribute_action { nullptr }; QAction* m_remove_attribute_action { nullptr }; diff --git a/Userland/Applications/Browser/InspectorWidget.cpp b/Userland/Applications/Browser/InspectorWidget.cpp index 5b90ac52c64..1252d860e53 100644 --- a/Userland/Applications/Browser/InspectorWidget.cpp +++ b/Userland/Applications/Browser/InspectorWidget.cpp @@ -31,6 +31,7 @@ InspectorWidget::InspectorWidget(WebView::OutOfProcessWebView& content_view) m_edit_node_action = GUI::Action::create("&Edit node"sv, [this](auto&) { m_inspector_client->context_menu_edit_dom_node(); }); m_copy_node_action = GUI::Action::create("&Copy HTML"sv, [this](auto&) { m_inspector_client->context_menu_copy_dom_node(); }); + m_screenshot_node_action = GUI::Action::create("Take node &screenshot"sv, [this](auto&) { m_inspector_client->context_menu_screenshot_dom_node(); }); m_delete_node_action = GUI::Action::create("&Delete node"sv, [this](auto&) { m_inspector_client->context_menu_remove_dom_node(); }); m_add_attribute_action = GUI::Action::create("&Add attribute"sv, [this](auto&) { m_inspector_client->context_menu_add_dom_node_attribute(); }); m_remove_attribute_action = GUI::Action::create("&Remove attribute"sv, [this](auto&) { m_inspector_client->context_menu_remove_dom_node_attribute(); }); @@ -49,6 +50,7 @@ InspectorWidget::InspectorWidget(WebView::OutOfProcessWebView& content_view) m_dom_node_tag_context_menu->add_action(*m_delete_node_action); m_dom_node_tag_context_menu->add_separator(); m_dom_node_tag_context_menu->add_action(*m_copy_node_action); + m_dom_node_tag_context_menu->add_action(*m_screenshot_node_action); m_dom_node_attribute_context_menu = GUI::Menu::construct(); m_dom_node_attribute_context_menu->add_action(*m_edit_node_action); @@ -59,6 +61,7 @@ InspectorWidget::InspectorWidget(WebView::OutOfProcessWebView& content_view) m_dom_node_attribute_context_menu->add_action(*m_delete_node_action); m_dom_node_attribute_context_menu->add_separator(); m_dom_node_attribute_context_menu->add_action(*m_copy_node_action); + m_dom_node_attribute_context_menu->add_action(*m_screenshot_node_action); m_inspector_client->on_requested_dom_node_text_context_menu = [this](auto position) { m_edit_node_action->set_text("&Edit text"); diff --git a/Userland/Applications/Browser/InspectorWidget.h b/Userland/Applications/Browser/InspectorWidget.h index 9419f576e5b..41b4c5acdf4 100644 --- a/Userland/Applications/Browser/InspectorWidget.h +++ b/Userland/Applications/Browser/InspectorWidget.h @@ -41,6 +41,7 @@ private: RefPtr m_edit_node_action; RefPtr m_copy_node_action; + RefPtr m_screenshot_node_action; RefPtr m_delete_node_action; RefPtr m_add_attribute_action; RefPtr m_remove_attribute_action; diff --git a/Userland/Libraries/LibWebView/InspectorClient.cpp b/Userland/Libraries/LibWebView/InspectorClient.cpp index e6aff3ccf78..f15e561ff87 100644 --- a/Userland/Libraries/LibWebView/InspectorClient.cpp +++ b/Userland/Libraries/LibWebView/InspectorClient.cpp @@ -245,6 +245,15 @@ void InspectorClient::context_menu_copy_dom_node() m_context_menu_data.clear(); } +void InspectorClient::context_menu_screenshot_dom_node() +{ + VERIFY(m_context_menu_data.has_value()); + + m_content_web_view.take_dom_node_screenshot(m_context_menu_data->dom_node_id).release_value_but_fixme_should_propagate_errors(); + + m_context_menu_data.clear(); +} + void InspectorClient::context_menu_remove_dom_node() { VERIFY(m_context_menu_data.has_value()); diff --git a/Userland/Libraries/LibWebView/InspectorClient.h b/Userland/Libraries/LibWebView/InspectorClient.h index e99b050da90..cdc1d3e5374 100644 --- a/Userland/Libraries/LibWebView/InspectorClient.h +++ b/Userland/Libraries/LibWebView/InspectorClient.h @@ -28,6 +28,7 @@ public: void context_menu_edit_dom_node(); void context_menu_copy_dom_node(); + void context_menu_screenshot_dom_node(); void context_menu_remove_dom_node(); void context_menu_add_dom_node_attribute(); void context_menu_remove_dom_node_attribute();