From ff386ec755678ee740f284c85e66e45a951a67f7 Mon Sep 17 00:00:00 2001 From: Nika Layzell Date: Fri, 26 Aug 2022 16:08:05 +0000 Subject: [PATCH] Bug 1781129 - Part 2: Use BigBuffer for ShmemImage, r=edgar The ShmemImage type was previously implemented using a Shmem, however due to the usage patterns, `BigBuffer` is probably a better fit, and allows unifying more code in nsContentUtils. Differential Revision: https://phabricator.services.mozilla.com/D151853 --- dom/base/nsContentUtils.cpp | 29 +++++++++++++---------------- dom/base/nsContentUtils.h | 8 ++++---- dom/ipc/ContentParent.cpp | 4 ++-- dom/ipc/ContentParent.h | 2 +- dom/ipc/PContent.ipdl | 6 +++--- widget/TextRecognition.cpp | 4 ++-- 6 files changed, 25 insertions(+), 28 deletions(-) diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp index 6d8f3d51a7ba..4563d1a55c45 100644 --- a/dom/base/nsContentUtils.cpp +++ b/dom/base/nsContentUtils.cpp @@ -7942,10 +7942,10 @@ nsresult nsContentUtils::CalculateBufferSizeForImage( return NS_OK; } -static already_AddRefed ShmemToDataSurface( - Shmem& aData, uint32_t aStride, const IntSize& aImageSize, +static already_AddRefed BigBufferToDataSurface( + BigBuffer& aData, uint32_t aStride, const IntSize& aImageSize, SurfaceFormat aFormat) { - if (!aData.IsReadable() || !aImageSize.width || !aImageSize.height) { + if (!aData.Size() || !aImageSize.width || !aImageSize.height) { return nullptr; } @@ -7956,11 +7956,11 @@ static already_AddRefed ShmemToDataSurface( aStride, aImageSize, aFormat, &maxBufLen, &imageBufLen))) { return nullptr; } - if (imageBufLen > aData.Size()) { + if (imageBufLen > aData.Size()) { return nullptr; } - return CreateDataSourceSurfaceFromData(aImageSize, aFormat, - aData.get(), aStride); + return CreateDataSourceSurfaceFromData(aImageSize, aFormat, aData.Data(), + aStride); } nsresult nsContentUtils::DeserializeDataTransferImageContainer( @@ -8307,24 +8307,21 @@ Maybe nsContentUtils::GetSurfaceData(DataSourceSurface& aSurface, GetSurfaceDataShmem(aAllocator)); } -Maybe nsContentUtils::SurfaceToIPCImage( - DataSourceSurface& aSurface, IShmemAllocator* aAllocator) { +Maybe nsContentUtils::SurfaceToIPCImage(DataSourceSurface& aSurface) { size_t len = 0; int32_t stride = 0; - auto mem = GetSurfaceData(aSurface, &len, &stride, aAllocator); + auto mem = GetSurfaceData(aSurface, &len, &stride); if (!mem) { return Nothing(); } - return Some(ShmemImage{*mem, uint32_t(stride), aSurface.GetFormat(), - ImageIntSize::FromUnknownSize(aSurface.GetSize())}); + return Some(IPCImage{std::move(*mem), uint32_t(stride), aSurface.GetFormat(), + ImageIntSize::FromUnknownSize(aSurface.GetSize())}); } already_AddRefed nsContentUtils::IPCImageToSurface( - ShmemImage&& aImage, IShmemAllocator* aAllocator) { - auto release = - MakeScopeExit([&] { aAllocator->DeallocShmem(aImage.data()); }); - return ShmemToDataSurface(aImage.data(), aImage.stride(), - aImage.size().ToUnknownSize(), aImage.format()); + IPCImage&& aImage) { + return BigBufferToDataSurface(aImage.data(), aImage.stride(), + aImage.size().ToUnknownSize(), aImage.format()); } Modifiers nsContentUtils::GetWidgetModifiers(int32_t aModifiers) { diff --git a/dom/base/nsContentUtils.h b/dom/base/nsContentUtils.h index 6cd2248d117a..6db26bc5f453 100644 --- a/dom/base/nsContentUtils.h +++ b/dom/base/nsContentUtils.h @@ -162,7 +162,7 @@ template class StaticRefPtr; namespace dom { -class ShmemImage; +class IPCImage; struct AutocompleteInfo; class BrowserChild; class BrowserParent; @@ -2928,10 +2928,10 @@ class nsContentUtils { mozilla::gfx::DataSourceSurface& aSurface, size_t* aLength, int32_t* aStride, mozilla::ipc::IShmemAllocator* aAlloc); - static mozilla::Maybe SurfaceToIPCImage( - mozilla::gfx::DataSourceSurface&, mozilla::ipc::IShmemAllocator*); + static mozilla::Maybe SurfaceToIPCImage( + mozilla::gfx::DataSourceSurface&); static already_AddRefed IPCImageToSurface( - mozilla::dom::ShmemImage&&, mozilla::ipc::IShmemAllocator*); + mozilla::dom::IPCImage&&); // Helpers shared by the implementations of nsContentUtils methods and // nsIDOMWindowUtils methods. diff --git a/dom/ipc/ContentParent.cpp b/dom/ipc/ContentParent.cpp index cf0f3c8fef34..e8a941139198 100644 --- a/dom/ipc/ContentParent.cpp +++ b/dom/ipc/ContentParent.cpp @@ -4993,10 +4993,10 @@ mozilla::ipc::IPCResult ContentParent::RecvCopyFavicon( } mozilla::ipc::IPCResult ContentParent::RecvFindImageText( - ShmemImage&& aImage, nsTArray&& aLanguages, + IPCImage&& aImage, nsTArray&& aLanguages, FindImageTextResolver&& aResolver) { RefPtr surf = - nsContentUtils::IPCImageToSurface(std::move(aImage), this); + nsContentUtils::IPCImageToSurface(std::move(aImage)); if (!surf) { aResolver(TextRecognitionResultOrError("Failed to read image"_ns)); return IPC_OK(); diff --git a/dom/ipc/ContentParent.h b/dom/ipc/ContentParent.h index 96f1a24290d8..0d77591a72e3 100644 --- a/dom/ipc/ContentParent.h +++ b/dom/ipc/ContentParent.h @@ -1114,7 +1114,7 @@ class ContentParent final : public PContentParent, mozilla::ipc::IPCResult RecvCopyFavicon(nsIURI* aOldURI, nsIURI* aNewURI, const bool& aInPrivateBrowsing); - mozilla::ipc::IPCResult RecvFindImageText(ShmemImage&&, nsTArray&&, + mozilla::ipc::IPCResult RecvFindImageText(IPCImage&&, nsTArray&&, FindImageTextResolver&&); virtual void ProcessingError(Result aCode, const char* aMsgName) override; diff --git a/dom/ipc/PContent.ipdl b/dom/ipc/PContent.ipdl index f7cc62a2c172..5be2d7ec772f 100644 --- a/dom/ipc/PContent.ipdl +++ b/dom/ipc/PContent.ipdl @@ -443,8 +443,8 @@ union TextRecognitionResultOrError { nsCString; }; -struct ShmemImage { - Shmem data; +struct IPCImage { + BigBuffer data; uint32_t stride; SurfaceFormat format; ImageIntSize size; @@ -1243,7 +1243,7 @@ parent: async CopyFavicon(nsIURI oldURI, nsIURI newURI, bool isPrivate); - async FindImageText(ShmemImage image, nsCString[] languages) + async FindImageText(IPCImage image, nsCString[] languages) returns (TextRecognitionResultOrError result); /** diff --git a/widget/TextRecognition.cpp b/widget/TextRecognition.cpp index 08c041e487d7..3d4a053bec8a 100644 --- a/widget/TextRecognition.cpp +++ b/widget/TextRecognition.cpp @@ -41,13 +41,13 @@ auto TextRecognition::FindText(gfx::DataSourceSurface& aSurface, -> RefPtr { if (XRE_IsContentProcess()) { auto* contentChild = ContentChild::GetSingleton(); - auto image = nsContentUtils::SurfaceToIPCImage(aSurface, contentChild); + auto image = nsContentUtils::SurfaceToIPCImage(aSurface); if (!image) { return NativePromise::CreateAndReject("Failed to share data surface"_ns, __func__); } auto promise = MakeRefPtr(__func__); - contentChild->SendFindImageText(*image, aLanguages) + contentChild->SendFindImageText(std::move(*image), aLanguages) ->Then( GetCurrentSerialEventTarget(), __func__, [promise](TextRecognitionResultOrError&& aResultOrError) {