mirror of
https://github.com/fergalmoran/ladybird.git
synced 2026-01-06 16:45:03 +00:00
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:
committed by
Andrew Kaster
parent
343a3a0d7e
commit
4b5541e1b7
@@ -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> {
|
||||
|
||||
Reference in New Issue
Block a user