commit 62ef49b69a61ea57faf47232262aeb3ae680cf00
parent 896b57f2e72e189a651ba0837581f9f0d5931b96
Author: Tom Schuster <tschuster@mozilla.com>
Date: Thu, 20 Nov 2025 10:14:42 +0000
Bug 2001129 - Add nsContentUtils::IPCImageToImage helper. r=tnikkel
Differential Revision: https://phabricator.services.mozilla.com/D273216
Diffstat:
4 files changed, 29 insertions(+), 52 deletions(-)
diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp
@@ -8939,10 +8939,10 @@ nsresult nsContentUtils::IPCTransferableDataToTransferable(
}
case IPCTransferableDataType::TIPCTransferableDataImageContainer: {
const auto& data = item.data().get_IPCTransferableDataImageContainer();
- nsCOMPtr<imgIContainer> container;
- rv = DeserializeTransferableDataImageContainer(
- data, getter_AddRefs(container));
- NS_ENSURE_SUCCESS(rv, rv);
+ nsCOMPtr<imgIContainer> container = IPCImageToImage(data.image());
+ if (!container) {
+ return NS_ERROR_FAILURE;
+ }
transferData = container;
break;
}
@@ -9016,10 +9016,10 @@ nsresult nsContentUtils::IPCTransferableDataItemToVariant(
}
case IPCTransferableDataType::TIPCTransferableDataImageContainer: {
const auto& data = aItem.data().get_IPCTransferableDataImageContainer();
- nsCOMPtr<imgIContainer> container;
- nsresult rv = DeserializeTransferableDataImageContainer(
- data, getter_AddRefs(container));
- NS_ENSURE_SUCCESS(rv, rv);
+ nsCOMPtr<imgIContainer> container = IPCImageToImage(data.image());
+ if (!container) {
+ return NS_ERROR_FAILURE;
+ }
return aVariant->SetAsISupports(container);
}
case IPCTransferableDataType::TIPCTransferableDataBlob: {
@@ -9093,23 +9093,6 @@ static already_AddRefed<DataSourceSurface> BigBufferToDataSurface(
aStride);
}
-nsresult nsContentUtils::DeserializeTransferableDataImageContainer(
- const IPCTransferableDataImageContainer& aData,
- imgIContainer** aContainer) {
- RefPtr<DataSourceSurface> surface = IPCImageToSurface(aData.image());
- if (!surface) {
- return NS_ERROR_FAILURE;
- }
-
- RefPtr<gfxDrawable> drawable =
- new gfxSurfaceDrawable(surface, surface->GetSize());
- nsCOMPtr<imgIContainer> imageContainer =
- image::ImageOps::CreateFromDrawable(drawable);
- imageContainer.forget(aContainer);
-
- return NS_OK;
-}
-
bool nsContentUtils::IsFlavorImage(const nsACString& aFlavor) {
return aFlavor.EqualsLiteral(kNativeImageMime) ||
aFlavor.EqualsLiteral(kJPEGImageMime) ||
@@ -9376,6 +9359,20 @@ already_AddRefed<DataSourceSurface> nsContentUtils::IPCImageToSurface(
aImage.size().ToUnknownSize(), aImage.format());
}
+already_AddRefed<imgIContainer> nsContentUtils::IPCImageToImage(
+ const IPCImage& aImage) {
+ RefPtr<DataSourceSurface> surface = IPCImageToSurface(aImage);
+ if (!surface) {
+ return nullptr;
+ }
+
+ RefPtr<gfxDrawable> drawable =
+ new gfxSurfaceDrawable(surface, surface->GetSize());
+ nsCOMPtr<imgIContainer> imageContainer =
+ image::ImageOps::CreateFromDrawable(drawable);
+ return imageContainer.forget();
+}
+
Modifiers nsContentUtils::GetWidgetModifiers(int32_t aModifiers) {
Modifiers result = 0;
if (aModifiers & nsIDOMWindowUtils::MODIFIER_SHIFT) {
diff --git a/dom/base/nsContentUtils.h b/dom/base/nsContentUtils.h
@@ -2975,14 +2975,6 @@ class nsContentUtils {
aCallback);
/**
- * Given an IPCDataTransferImageContainer construct an imgIContainer for the
- * image encoded by the transfer item.
- */
- static nsresult DeserializeTransferableDataImageContainer(
- const mozilla::dom::IPCTransferableDataImageContainer& aData,
- imgIContainer** aContainer);
-
- /**
* Given a flavor obtained from an IPCDataTransferItem or nsITransferable,
* returns true if we should treat the data as an image.
*/
@@ -3031,6 +3023,8 @@ class nsContentUtils {
mozilla::gfx::DataSourceSurface&);
static already_AddRefed<mozilla::gfx::DataSourceSurface> IPCImageToSurface(
const mozilla::dom::IPCImage&);
+ static already_AddRefed<imgIContainer> IPCImageToImage(
+ const mozilla::dom::IPCImage&);
// Helpers shared by the implementations of nsContentUtils methods and
// nsIDOMWindowUtils methods.
diff --git a/dom/ipc/BrowserParent.cpp b/dom/ipc/BrowserParent.cpp
@@ -106,14 +106,12 @@
#include "ColorPickerParent.h"
#include "FilePickerParent.h"
#include "IHistory.h"
-#include "ImageOps.h"
#include "MMPrinter.h"
#include "PermissionMessageUtils.h"
#include "ProcessPriorityManager.h"
#include "StructuredCloneData.h"
#include "UnitTransforms.h"
#include "VsyncSource.h"
-#include "gfxDrawable.h"
#include "gfxUtils.h"
#include "mozilla/NullPrincipal.h"
#include "mozilla/ProfilerLabels.h"
@@ -2371,15 +2369,10 @@ mozilla::ipc::IPCResult BrowserParent::RecvSetCursor(
nsCOMPtr<imgIContainer> customCursorImage;
if (aCustomCursor) {
- RefPtr<gfx::DataSourceSurface> customCursorSurface =
- nsContentUtils::IPCImageToSurface(*aCustomCursor);
- if (!customCursorSurface) {
+ customCursorImage = nsContentUtils::IPCImageToImage(*aCustomCursor);
+ if (!customCursorImage) {
return IPC_FAIL(this, "Invalid custom cursor data");
}
-
- RefPtr<gfxDrawable> drawable = new gfxSurfaceDrawable(
- customCursorSurface, customCursorSurface->GetSize());
- customCursorImage = image::ImageOps::CreateFromDrawable(drawable);
}
mCursor = nsIWidget::Cursor{aCursor,
diff --git a/image/remote/RemoteImageProtocolHandler.cpp b/image/remote/RemoteImageProtocolHandler.cpp
@@ -5,8 +5,6 @@
#include "RemoteImageProtocolHandler.h"
-#include "gfxDrawable.h"
-#include "ImageOps.h"
#include "imgITools.h"
#include "nsContentUtils.h"
#include "nsIPipe.h"
@@ -71,17 +69,12 @@ static nsresult EncodeImage(const dom::IPCImage& aImage,
do_GetService("@mozilla.org/image/tools;1", &rv);
MOZ_TRY(rv);
- RefPtr<gfx::DataSourceSurface> surface =
- nsContentUtils::IPCImageToSurface(aImage);
- if (!surface) {
+ nsCOMPtr<imgIContainer> imgContainer =
+ nsContentUtils::IPCImageToImage(aImage);
+ if (!imgContainer) {
return NS_ERROR_FAILURE;
}
- RefPtr<gfxDrawable> drawable =
- new gfxSurfaceDrawable(surface, surface->GetSize());
- nsCOMPtr<imgIContainer> imgContainer =
- image::ImageOps::CreateFromDrawable(drawable);
-
nsCOMPtr<nsIInputStream> stream;
MOZ_TRY(imgTools->EncodeImage(imgContainer, nsLiteralCString(IMAGE_PNG),
u"png-zlib-level=0"_ns,