Everywhere: Transition ImageDecoder to be single-instance, owned by UI

This is the same behavior as RequestServer, with the added benefit that
we know how to gracefully reconnect ImageDecoder to all WebContent
processes on restart.
This commit is contained in:
Andrew Kaster
2024-06-26 13:44:42 -06:00
committed by Andrew Kaster
parent 343a3a0d7e
commit 4b5541e1b7
21 changed files with 250 additions and 31 deletions

View File

@@ -6,11 +6,6 @@
*/
#include "ImageCodecPlugin.h"
#ifdef AK_OS_ANDROID
# include <Ladybird/Android/src/main/cpp/WebContentService.h>
#else
# include "HelperProcess.h"
#endif
#include "Utilities.h"
#include <LibGfx/Bitmap.h>
#include <LibGfx/ImageFormats/ImageDecoder.h>
@@ -18,28 +13,37 @@
namespace Ladybird {
ImageCodecPlugin::ImageCodecPlugin(NonnullRefPtr<ImageDecoderClient::Client> client)
: m_client(move(client))
{
m_client->on_death = [this] {
m_client = nullptr;
};
}
void ImageCodecPlugin::set_client(NonnullRefPtr<ImageDecoderClient::Client> client)
{
m_client = move(client);
m_client->on_death = [this] {
m_client = nullptr;
};
}
ImageCodecPlugin::~ImageCodecPlugin() = default;
NonnullRefPtr<Core::Promise<Web::Platform::DecodedImage>> ImageCodecPlugin::decode_image(ReadonlyBytes bytes, Function<ErrorOr<void>(Web::Platform::DecodedImage&)> on_resolved, Function<void(Error&)> on_rejected)
{
if (!m_client) {
#ifdef AK_OS_ANDROID
m_client = MUST(bind_service<ImageDecoderClient::Client>(&bind_image_decoder_java));
#else
auto candidate_image_decoder_paths = get_paths_for_helper_process("ImageDecoder"sv).release_value_but_fixme_should_propagate_errors();
m_client = launch_image_decoder_process(candidate_image_decoder_paths).release_value_but_fixme_should_propagate_errors();
#endif
m_client->on_death = [&] {
m_client = nullptr;
};
}
auto promise = Core::Promise<Web::Platform::DecodedImage>::construct();
if (on_resolved)
promise->on_resolution = move(on_resolved);
if (on_rejected)
promise->on_rejection = move(on_rejected);
if (!m_client) {
promise->reject(Error::from_string_literal("ImageDecoderClient is disconnected"));
return promise;
}
auto image_decoder_promise = m_client->decode_image(
bytes,
[promise](ImageDecoderClient::DecodedImage& result) -> ErrorOr<void> {