Index: chrome/browser/image_decoder.cc |
diff --git a/chrome/browser/image_decoder.cc b/chrome/browser/image_decoder.cc |
index 261a5837cc26ecd0893ebeefef3192926ece0fd1..b8d70f695e516861743fe4c8e3d8ed47f397028c 100644 |
--- a/chrome/browser/image_decoder.cc |
+++ b/chrome/browser/image_decoder.cc |
@@ -9,9 +9,12 @@ |
#include "build/build_config.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/common/chrome_utility_messages.h" |
+#include "chrome/common/image_decoder.mojom.h" |
#include "chrome/grit/generated_resources.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/utility_process_host.h" |
+#include "content/public/common/service_registry.h" |
+#include "skia/public/type_converters.h" |
#include "ui/base/l10n/l10n_util.h" |
using content::BrowserThread; |
@@ -26,6 +29,21 @@ base::LazyInstance<ImageDecoder>::Leaky g_decoder = LAZY_INSTANCE_INITIALIZER; |
// batch mode. |
const int kBatchModeTimeoutSeconds = 5; |
+void OnDecodeImageDone( |
+ base::Callback<void(int)> fail_callback, |
+ base::Callback<void(const SkBitmap&, int)> success_callback, |
+ int request_id, skia::mojom::BitmapPtr image) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ if (image) { |
+ SkBitmap bitmap = image.To<SkBitmap>(); |
+ if (!bitmap.empty()) { |
+ success_callback.Run(bitmap, request_id); |
+ return; |
+ } |
+ } |
+ fail_callback.Run(request_id); |
+} |
+ |
} // namespace |
ImageDecoder::ImageDecoder() |
@@ -132,22 +150,21 @@ void ImageDecoder::DecodeImageInSandbox( |
} |
batch_mode_timer_->Reset(); |
- switch (image_codec) { |
+ mojom::ImageCodec mojo_codec = mojom::ImageCodec::DEFAULT; |
#if defined(OS_CHROMEOS) |
- case ROBUST_JPEG_CODEC: |
- utility_process_host_->Send(new ChromeUtilityMsg_RobustJPEGDecodeImage( |
- image_data, request_id)); |
- break; |
- case ROBUST_PNG_CODEC: |
- utility_process_host_->Send(new ChromeUtilityMsg_RobustPNGDecodeImage( |
- image_data, request_id)); |
- break; |
+ if (image_codec == ROBUST_JPEG_CODEC) |
+ mojo_codec = mojom::ImageCodec::ROBUST_JPEG; |
+ if (image_codec == ROBUST_PNG_CODEC) |
+ mojo_codec = mojom::ImageCodec::ROBUST_PNG; |
#endif // defined(OS_CHROMEOS) |
- case DEFAULT_CODEC: |
- utility_process_host_->Send(new ChromeUtilityMsg_DecodeImage( |
- image_data, shrink_to_fit, request_id)); |
- break; |
- } |
+ (*decoder_)->DecodeImage( |
+ mojo::Array<uint8_t>::From(image_data), |
+ mojo_codec, |
+ shrink_to_fit, |
+ base::Bind(&OnDecodeImageDone, |
+ base::Bind(&ImageDecoder::OnDecodeImageFailed, this), |
+ base::Bind(&ImageDecoder::OnDecodeImageSucceeded, this), |
+ request_id)); |
} |
void ImageDecoder::CancelImpl(ImageRequest* image_request) { |
@@ -169,10 +186,14 @@ void ImageDecoder::StartBatchMode() { |
this, base::ThreadTaskRunnerHandle::Get().get())->AsWeakPtr(); |
utility_process_host_->SetName(l10n_util::GetStringUTF16( |
IDS_UTILITY_PROCESS_IMAGE_DECODER_NAME)); |
- if (!utility_process_host_->StartBatchMode()) { |
- utility_process_host_.reset(); |
- return; |
+ decoder_.reset(new mojom::ImageDecoderPtr); |
+ if (!utility_process_host_->StartMojoMode()) { |
+ utility_process_host_.reset(); |
jam
2016/03/31 17:46:33
(this already existed)
should also delete utility_
Anand Mistry (off Chromium)
2016/04/01 05:35:11
Oops, yeah, this should be a delete (the reset wou
|
+ return; |
} |
+ content::ServiceRegistry* service_registry = |
+ utility_process_host_->GetServiceRegistry(); |
+ service_registry->ConnectToRemoteService(mojo::GetProxy(decoder_.get())); |
} |
void ImageDecoder::StopBatchMode() { |
@@ -187,7 +208,10 @@ void ImageDecoder::StopBatchMode() { |
} |
if (utility_process_host_) { |
- utility_process_host_->EndBatchMode(); |
+ // With Mojo, the utility process needs to be explicitly shut down by |
+ // deleting the host. |
+ delete utility_process_host_.get(); |
+ decoder_.reset(); |
utility_process_host_.reset(); |
} |
} |
@@ -219,17 +243,8 @@ void ImageDecoder::OnProcessLaunchFailed() { |
FailAllRequests(); |
} |
-bool ImageDecoder::OnMessageReceived( |
- const IPC::Message& message) { |
- bool handled = true; |
- IPC_BEGIN_MESSAGE_MAP(ImageDecoder, message) |
- IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_DecodeImage_Succeeded, |
- OnDecodeImageSucceeded) |
- IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_DecodeImage_Failed, |
- OnDecodeImageFailed) |
- IPC_MESSAGE_UNHANDLED(handled = false) |
- IPC_END_MESSAGE_MAP() |
- return handled; |
+bool ImageDecoder::OnMessageReceived(const IPC::Message& message) { |
+ return false; |
} |
void ImageDecoder::OnDecodeImageSucceeded( |