From 4556adde82a1a80a0e3b7e189dadeacecd4e6a41 Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Thu, 17 Mar 2022 14:07:16 +0100 Subject: [PATCH] fix: ensure external memory adjustments are balanced (#33305) Co-authored-by: David Sanders --- shell/common/api/electron_api_native_image.cc | 17 +++++++++++------ shell/common/api/electron_api_native_image.h | 3 ++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/shell/common/api/electron_api_native_image.cc b/shell/common/api/electron_api_native_image.cc index 3543a13585509..0dbda357a755c 100644 --- a/shell/common/api/electron_api_native_image.cc +++ b/shell/common/api/electron_api_native_image.cc @@ -109,7 +109,7 @@ base::win::ScopedHICON ReadICOFromPath(int size, const base::FilePath& path) { NativeImage::NativeImage(v8::Isolate* isolate, const gfx::Image& image) : image_(image), isolate_(isolate) { - AdjustAmountOfExternalAllocatedMemory(true); + UpdateExternalAllocatedMemoryUsage(); } #if BUILDFLAG(IS_WIN) @@ -120,22 +120,27 @@ NativeImage::NativeImage(v8::Isolate* isolate, const base::FilePath& hicon_path) electron::util::ReadImageSkiaFromICO(&image_skia, GetHICON(256)); image_ = gfx::Image(image_skia); - AdjustAmountOfExternalAllocatedMemory(true); + UpdateExternalAllocatedMemoryUsage(); } #endif NativeImage::~NativeImage() { - AdjustAmountOfExternalAllocatedMemory(false); + isolate_->AdjustAmountOfExternalAllocatedMemory(-memory_usage_); } -void NativeImage::AdjustAmountOfExternalAllocatedMemory(bool add) { +void NativeImage::UpdateExternalAllocatedMemoryUsage() { + int32_t new_memory_usage = 0; + if (image_.HasRepresentation(gfx::Image::kImageRepSkia)) { auto* const image_skia = image_.ToImageSkia(); if (!image_skia->isNull()) { - int64_t size = image_skia->bitmap()->computeByteSize(); - isolate_->AdjustAmountOfExternalAllocatedMemory(add ? size : -size); + new_memory_usage = image_skia->bitmap()->computeByteSize(); } } + + isolate_->AdjustAmountOfExternalAllocatedMemory(new_memory_usage - + memory_usage_); + memory_usage_ = new_memory_usage; } // static diff --git a/shell/common/api/electron_api_native_image.h b/shell/common/api/electron_api_native_image.h index a322631f9cfe2..7be02ad27b7af 100644 --- a/shell/common/api/electron_api_native_image.h +++ b/shell/common/api/electron_api_native_image.h @@ -121,7 +121,7 @@ class NativeImage : public gin::Wrappable { float GetAspectRatio(const absl::optional scale_factor); void AddRepresentation(const gin_helper::Dictionary& options); - void AdjustAmountOfExternalAllocatedMemory(bool add); + void UpdateExternalAllocatedMemoryUsage(); // Mark the image as template image. void SetTemplateImage(bool setAsTemplate); @@ -136,6 +136,7 @@ class NativeImage : public gin::Wrappable { gfx::Image image_; v8::Isolate* isolate_; + int32_t memory_usage_ = 0; }; } // namespace api