Introduce FXGCScopedHeap type.

Ensures that global refcounts are adjusted when deleted.

-- move test setup/teardown into HeapEmbedderTest class.

Change-Id: I3c3c9abbdb18452484faadbd43c246df68a17c96
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/70515
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/gc/heap.cpp b/fxjs/gc/heap.cpp
index 02319eb..757d932 100644
--- a/fxjs/gc/heap.cpp
+++ b/fxjs/gc/heap.cpp
@@ -54,12 +54,13 @@
   }
 }
 
-std::unique_ptr<cppgc::Heap> FXGC_CreateHeap() {
+FXGCScopedHeap FXGC_CreateHeap() {
   ++g_platform_ref_count;
-  return cppgc::Heap::Create(std::make_shared<CFXGC_Platform>());
+  auto heap = cppgc::Heap::Create(std::make_shared<CFXGC_Platform>());
+  return FXGCScopedHeap(heap.release());
 }
 
-void FXGC_ReleaseHeap(std::unique_ptr<cppgc::Heap> heap) {
+void FXGCHeapDeleter::operator()(cppgc::Heap* heap) {
   --g_platform_ref_count;
-  // |heap| destroyed when it goes out of scope.
+  delete heap;
 }
diff --git a/fxjs/gc/heap.h b/fxjs/gc/heap.h
index 2e25517..7792cbc 100644
--- a/fxjs/gc/heap.h
+++ b/fxjs/gc/heap.h
@@ -10,10 +10,14 @@
 #include "v8/include/cppgc/heap.h"
 #include "v8/include/libplatform/libplatform.h"
 
+struct FXGCHeapDeleter {
+  void operator()(cppgc::Heap* heap);
+};
+
+using FXGCScopedHeap = std::unique_ptr<cppgc::Heap, FXGCHeapDeleter>;
+
 void FXGC_Initialize(v8::Platform* platform);
 void FXGC_Release();
-
-std::unique_ptr<cppgc::Heap> FXGC_CreateHeap();
-void FXGC_ReleaseHeap(std::unique_ptr<cppgc::Heap> heap);
+FXGCScopedHeap FXGC_CreateHeap();
 
 #endif  // FXJS_GC_HEAP_H_
diff --git a/fxjs/gc/heap_embeddertest.cpp b/fxjs/gc/heap_embeddertest.cpp
index 8ee42ca..77dc90b 100644
--- a/fxjs/gc/heap_embeddertest.cpp
+++ b/fxjs/gc/heap_embeddertest.cpp
@@ -9,23 +9,26 @@
 #include "testing/embedder_test.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-class HeapEmbedderTest : public EmbedderTest {};
+class HeapEmbedderTest : public EmbedderTest {
+ public:
+  void SetUp() override {
+    EmbedderTest::SetUp();
+    FXGC_Initialize(EmbedderTestEnvironment::GetInstance()->platform());
+  }
 
-TEST(HeapEmbedderTest, SeveralHeaps) {
-  FXGC_Initialize(EmbedderTestEnvironment::GetInstance()->platform());
+  void TearDown() override {
+    FXGC_Release();
+    EmbedderTest::TearDown();
+  }
+};
 
-  std::unique_ptr<cppgc::Heap> heap1 = FXGC_CreateHeap();
+TEST_F(HeapEmbedderTest, SeveralHeaps) {
+  FXGCScopedHeap heap1 = FXGC_CreateHeap();
   EXPECT_TRUE(heap1);
 
-  std::unique_ptr<cppgc::Heap> heap2 = FXGC_CreateHeap();
+  FXGCScopedHeap heap2 = FXGC_CreateHeap();
   EXPECT_TRUE(heap2);
 
-  std::unique_ptr<cppgc::Heap> heap3 = FXGC_CreateHeap();
+  FXGCScopedHeap heap3 = FXGC_CreateHeap();
   EXPECT_TRUE(heap2);
-
-  FXGC_ReleaseHeap(std::move(heap1));
-  FXGC_ReleaseHeap(std::move(heap2));
-  FXGC_ReleaseHeap(std::move(heap3));
-
-  FXGC_Release();
 }