1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 23:17:45 +00:00

Browser+Ladybird+LibWebView: Move some common functions to LibWebView

The implementations of handle_web_content_process_crash and
take_screenshot are exactly the same across Browser and Ladybird. Let's
reduce some code duplication and move them to LibWebView.
This commit is contained in:
Timothy Flynn 2023-05-17 09:53:13 -04:00 committed by Andreas Kling
parent 5312a140fe
commit d8b14da380
12 changed files with 90 additions and 188 deletions

View file

@ -9,12 +9,8 @@
#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>
@ -191,7 +187,7 @@ Tab::Tab(BrowserWindow* window, StringView webdriver_content_ipc_path, WebView::
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()) {
if (auto result = view().take_screenshot(WebView::ViewImplementation::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));
}
@ -200,7 +196,7 @@ Tab::Tab(BrowserWindow* window, StringView webdriver_content_ipc_path, WebView::
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()) {
if (auto result = view().take_screenshot(WebView::ViewImplementation::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));
}
@ -450,33 +446,6 @@ 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());

View file

@ -60,12 +60,6 @@ private:
void open_link_in_new_tab(URL const&);
void copy_link_url(URL const&);
enum class ScreenshotType {
Visible,
Full,
};
ErrorOr<void> take_screenshot(ScreenshotType);
QBoxLayout* m_layout;
QToolBar* m_toolbar { nullptr };
QToolButton* m_reset_zoom_button { nullptr };

View file

@ -637,43 +637,6 @@ void WebContentView::create_client(WebView::EnableCallgrindProfiling enable_call
client().async_connect_to_webdriver(m_webdriver_content_ipc_path);
}
Gfx::ShareableBitmap WebContentView::take_screenshot() const
{
if (auto* bitmap = m_client_state.has_usable_bitmap ? m_client_state.front_bitmap.bitmap.ptr() : m_backup_bitmap.ptr())
return bitmap->to_shareable_bitmap();
return {};
}
Gfx::ShareableBitmap WebContentView::take_document_screenshot()
{
return client().take_document_screenshot();
}
void WebContentView::handle_web_content_process_crash()
{
dbgln("WebContent process crashed!");
create_client();
VERIFY(m_client_state.client);
// Don't keep a stale backup bitmap around.
m_backup_bitmap = nullptr;
handle_resize();
StringBuilder builder;
builder.append("<html><head><title>Crashed: "sv);
builder.append(escape_html_entities(m_url.to_deprecated_string()));
builder.append("</title></head><body>"sv);
builder.append("<h1>Web page crashed"sv);
if (!m_url.host().is_empty()) {
builder.appendff(" on {}", escape_html_entities(m_url.host()));
}
builder.append("</h1>"sv);
auto escaped_url = escape_html_entities(m_url.to_deprecated_string());
builder.appendff("The web page <a href=\"{}\">{}</a> has crashed.<br><br>You can reload the page to try again.", escaped_url, escaped_url);
builder.append("</body></html>"sv);
load_html(builder.to_deprecated_string(), m_url);
}
void WebContentView::notify_server_did_paint(Badge<WebContentClient>, i32 bitmap_id, Gfx::IntSize size)
{
if (m_client_state.back_bitmap.id == bitmap_id) {

View file

@ -113,9 +113,6 @@ public:
Gfx::IntPoint to_content(Gfx::IntPoint) const;
Gfx::IntPoint to_widget(Gfx::IntPoint) const;
Gfx::ShareableBitmap take_screenshot() const;
Gfx::ShareableBitmap take_document_screenshot();
enum class PaletteMode {
Default,
Dark,
@ -223,7 +220,5 @@ private:
Gfx::IntRect m_viewport_rect;
void handle_web_content_process_crash();
StringView m_webdriver_content_ipc_path;
};