summaryrefslogtreecommitdiff
path: root/Ladybird/Tab.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Ladybird/Tab.cpp')
-rw-r--r--Ladybird/Tab.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/Ladybird/Tab.cpp b/Ladybird/Tab.cpp
index ee19ef1593..26186eff59 100644
--- a/Ladybird/Tab.cpp
+++ b/Ladybird/Tab.cpp
@@ -9,8 +9,12 @@
#include "BrowserWindow.h"
#include "Settings.h"
#include "Utilities.h"
+#include <AK/LexicalPath.h>
#include <Browser/History.h>
+#include <LibCore/DateTime.h>
+#include <LibCore/StandardPaths.h>
#include <LibGfx/ImageFormats/BMPWriter.h>
+#include <LibGfx/ImageFormats/PNGWriter.h>
#include <QClipboard>
#include <QCoreApplication>
#include <QFont>
@@ -18,6 +22,7 @@
#include <QGuiApplication>
#include <QImage>
#include <QMenu>
+#include <QMessageBox>
#include <QPainter>
#include <QPlainTextEdit>
#include <QPoint>
@@ -183,6 +188,24 @@ Tab::Tab(BrowserWindow* window, StringView webdriver_content_ipc_path, WebView::
return Gfx::IntRect { m_window->x(), m_window->y(), m_window->width(), m_window->height() };
});
+ auto* take_visible_screenshot_action = new QAction("Take &Visible Screenshot", this);
+ take_visible_screenshot_action->setIcon(QIcon(QString("%1/res/icons/16x16/filetype-image.png").arg(s_serenity_resource_root.characters())));
+ QObject::connect(take_visible_screenshot_action, &QAction::triggered, this, [this]() {
+ if (auto result = take_screenshot(ScreenshotType::Visible); result.is_error()) {
+ auto error = String::formatted("{}", result.error()).release_value_but_fixme_should_propagate_errors();
+ QMessageBox::warning(this, "Ladybird", qstring_from_ak_string(error));
+ }
+ });
+
+ auto* take_full_screenshot_action = new QAction("Take &Full Screenshot", this);
+ take_full_screenshot_action->setIcon(QIcon(QString("%1/res/icons/16x16/filetype-image.png").arg(s_serenity_resource_root.characters())));
+ QObject::connect(take_full_screenshot_action, &QAction::triggered, this, [this]() {
+ if (auto result = take_screenshot(ScreenshotType::Full); result.is_error()) {
+ auto error = String::formatted("{}", result.error()).release_value_but_fixme_should_propagate_errors();
+ QMessageBox::warning(this, "Ladybird", qstring_from_ak_string(error));
+ }
+ });
+
m_page_context_menu = make<QMenu>("Context menu", this);
m_page_context_menu->addAction(&m_window->go_back_action());
m_page_context_menu->addAction(&m_window->go_forward_action());
@@ -191,6 +214,9 @@ Tab::Tab(BrowserWindow* window, StringView webdriver_content_ipc_path, WebView::
m_page_context_menu->addAction(&m_window->copy_selection_action());
m_page_context_menu->addAction(&m_window->select_all_action());
m_page_context_menu->addSeparator();
+ m_page_context_menu->addAction(take_visible_screenshot_action);
+ m_page_context_menu->addAction(take_full_screenshot_action);
+ m_page_context_menu->addSeparator();
m_page_context_menu->addAction(&m_window->view_source_action());
m_page_context_menu->addAction(&m_window->inspect_dom_node_action());
@@ -424,6 +450,33 @@ void Tab::copy_link_url(URL const& url)
clipboard->setText(qstring_from_ak_deprecated_string(url.to_deprecated_string()));
}
+ErrorOr<void> Tab::take_screenshot(ScreenshotType type)
+{
+ Gfx::ShareableBitmap bitmap;
+
+ switch (type) {
+ case ScreenshotType::Visible:
+ bitmap = view().take_screenshot();
+ break;
+ case ScreenshotType::Full:
+ bitmap = view().take_document_screenshot();
+ break;
+ }
+
+ if (!bitmap.is_valid())
+ return Error::from_string_view("Failed to take a screenshot of the current tab"sv);
+
+ LexicalPath path { Core::StandardPaths::downloads_directory() };
+ path = path.append(TRY(Core::DateTime::now().to_string("screenshot-%Y-%m-%d-%H-%M-%S.png"sv)));
+
+ auto encoded = TRY(Gfx::PNGWriter::encode(*bitmap.bitmap()));
+
+ auto screenshot_file = TRY(Core::File::open(path.string(), Core::File::OpenMode::Write));
+ TRY(screenshot_file->write_until_depleted(encoded));
+
+ return {};
+}
+
void Tab::location_edit_return_pressed()
{
navigate(m_location_edit->text());